Files
psp_panel/agents.md
T

16 KiB

AGENT.md

Purpose

  • This file defines repository-specific instructions for coding agents.
  • Scope is the full repo unless a deeper AGENT.md overrides it.
  • Use RTK to reduce token usage, avoid repeated context transfer, and preserve repository knowledge across sessions.

EXECUTION RULES (STRICT)

Minimize reasoning verbosity.

Response Style

Do not:

  • narrate thoughts
  • speculate
  • explain obvious steps
  • describe intentions before acting
  • write reflective/internal commentary

Avoid messages like:

  • "I think I need to..."
  • "I should inspect..."
  • "I'm going to..."
  • "I wonder if..."
  • "Let me check..."
  • "I'm curious about..."

Instead:

  • act immediately
  • use short operational updates only when necessary

Good:

Inspecting environment files and Angular configs.

Bad:

I think I should inspect the environment files first to understand how everything is connected before deciding what changes are necessary.


🔇 MINIMAL PLANNING MODE

Only create plans when:

  • task has multiple independent phases
  • task is ambiguous
  • task is large/refactor-level

Do not create plans for:

  • small fixes
  • single-file edits
  • obvious tasks

Avoid:

  • repeated plan updates
  • verbose planning
  • unnecessary decomposition

✂️ MINIMAL OUTPUT RULES

Keep responses compact.

Do not:

  • restate the user request
  • explain already-visible edits
  • summarize trivial findings
  • narrate file discovery
  • explain failed reads unless blocking
  • describe obvious implementation details

Prefer:

Updated environment files for development, staging, production, and tis.

Avoid:

I found a mismatch and then investigated several files before determining that...


📦 FINAL RESPONSE RULES

Final responses must be under 10 lines unless:

  • user explicitly asks for explanation
  • architectural decisions changed
  • validation failed
  • multiple systems were affected

Prefer:

Updated:

  • file1
  • file2

Validation:

  • pnpm tsc passed

Avoid:

  • long prose summaries
  • unnecessary explanations
  • repeating repository context

🚫 NO TEACHING MODE

Do not explain:

  • Angular basics
  • TypeScript basics
  • RxJS basics
  • obvious framework behavior
  • standard programming concepts

Assume repository maintainers already understand the stack.


🧠 CONTEXT PRESERVATION RULES

Avoid repeating previously established context.

Do not repeatedly mention:

  • repository structure
  • framework details
  • previously inspected files
  • known architecture
  • already-established conventions

Assume prior context remains valid unless changed.


🛑 EXPLORATION STOP RULE

If the likely edit location is identified:

  • stop searching
  • stop exploring
  • implement changes

Do not continue repository exploration after:

  • target component found
  • target service found
  • target config found
  • target store found
  • target route found

🎯 EDIT-FIRST BEHAVIOR

After identifying the target location:

  • edit quickly
  • avoid excessive inspection
  • avoid repeated verification reads
  • avoid speculative exploration

Prefer implementation over exploration.


✍️ EDIT CONFIDENCE RULES

Prefer direct implementation when:

  • existing patterns are obvious
  • nearby components establish conventions
  • requested change is localized
  • existing abstractions already match requirements

Do not over-investigate obvious implementations.


⚠️ FAILURE HANDLING RULES

If a file read fails:

  • do not retry repeatedly
  • verify path once
  • continue with nearest valid target

Do not:

  • repeatedly attempt missing files
  • scan nearby directories unnecessarily
  • speculate about missing files
  • retry identical commands

📏 HARD CONTEXT LIMITS

Do not:

  • read more than 2 files before first edit
  • read more than 1 sibling file unless required
  • reread unchanged files
  • inspect unrelated modules

For small tasks:

  • maximum 3 repository reads before editing

For medium tasks:

  • maximum 8 repository reads before editing

Large/refactor tasks may exceed limits only when necessary.


🚫 AVOID MULTI-FILE EAGER READS

Never chain multiple reads in one command unless necessary.

Avoid:

  • rtk read a.ts && rtk read b.ts && rtk read c.ts

Prefer sequential targeted reads.


RTK-FIRST RULES (STRICT)

Always prefer RTK commands for repository inspection, navigation, and code understanding.

Command Rewrite Rules

Prefer:

  • git status -> rtk git status
  • git diff -> rtk git diff
  • git log -> rtk git log
  • ls -> rtk ls
  • tree -> rtk ls
  • cat -> rtk read
  • grep -> rtk grep
  • rg -> rtk grep
  • find -> rtk find

Avoid raw commands for repository inspection when RTK equivalents exist.

Do not:

  • use raw cat for large files
  • use raw grep/rg across the repository
  • use recursive find blindly
  • inspect large diffs with raw git diff
  • scan directories manually before searching

Raw commands are allowed only when:

  • RTK cannot perform the operation
  • executing builds/tests/runtime commands
  • debugging environment/runtime issues
  • working outside indexed repository scope

🧩 FILE READING RULES (IMPORTANT)

Prefer minimal-context reads.

Preferred Order

  1. rtk grep
  2. rtk smart
  3. rtk read
  4. aggressive read only if required

Rules

Never immediately read a full file after search.

Before reading:

  • identify exact symbol/component/function
  • inspect only relevant sections

Prefer:

  • rtk smart

before:

  • rtk read

For large files:

  • rtk read -l aggressive

Only when necessary.

Avoid:

  • reading TS + HTML + SCSS together
  • opening sibling files preemptively
  • rereading files already inspected
  • reading generated or unrelated files

Angular-Specific Strategy

For Angular components:

  1. grep component selector/class
  2. smart-read TS file
  3. read template only if UI changes required
  4. read styles only if styling changes required

Example:

bash rtk grep "invoice-type-card" rtk smart invoice-type-card.component.ts rtk read invoice-type-card.component.html

Avoid:

bash rtk read component.ts rtk read component.html rtk read component.scss

unless all files are actually needed.

📂 CODE NAVIGATION WORKFLOW (MANDATORY)

Follow this order when working in the repository.

1. Discover Structure

bash rtk ls

2. Search Before Opening Files

bash rtk grep <symbol | class | function | DTO | service>

Examples:

bash rtk grep "InputComponent" rtk grep "fieldControl" rtk grep "breadcrumbItems"

3. Read Only Necessary Files

bash rtk read

4. Large File Strategy

For files larger than ~300 lines:

bash rtk read -l aggressive

5. Fast Context Understanding

bash rtk smart

Never:

  • open many files blindly
  • read entire modules without searching first
  • inspect unrelated folders
  • load generated directories into context

🧠 DIFF INSPECTION RULES

For repository changes use:

bash rtk git diff

For large diffs:

bash rtk git diff -l aggressive

Avoid raw:

bash git diff

unless RTK diff is unavailable.


🚫 LOW-VALUE PATHS

Avoid loading:

dist/ .angular/ coverage/ node_modules/ .git/ .cache/ .tmp/

unless explicitly required.


RTK Usage Rules

Required RTK Usage

  • Always use RTK for:

    • repository indexing
    • semantic code search
    • symbol lookup
    • dependency tracing
    • architectural context
    • change impact analysis
  • Prefer RTK context retrieval over:

    • reading large files entirely
    • repeatedly scanning unchanged directories
    • re-sending full file contents
    • broad grep operations
  • Retrieve only the minimal relevant context before making changes.

  1. Index repository
  2. Search related symbols/files/components
  3. Retrieve minimal context
  4. Apply scoped changes
  5. Validate impacted areas only

Example workflow:

bash rtk index rtk search "InputComponent number normalization" rtk search "fieldControl" rtk refs "goodListConfig"

Token Reduction Rules

  • Never load entire large files unless required.
  • Never inspect generated folders (dist, .angular, coverage, etc.).
  • Prefer symbol-level retrieval over file-level retrieval.
  • Reuse previously retrieved RTK context whenever possible.
  • Avoid duplicate searches for the same symbols within one task.
  • Use targeted searches:
    • component name
    • selector
    • signal/store name
    • config constant
    • Angular route
    • injected service
    • form control key

Suggested RTK Queries

Angular Components

bash rtk search "selector: 'field-" rtk search "standalone: true" rtk search "InputComponent"

Forms & Controls

bash rtk search "fieldControl." rtk search "ControlConfig" rtk search "Validators.required"

Stores & Signals

bash rtk search "breadcrumbItems" rtk search "computed(" rtk search "signal("

Tenant / Docker

bash rtk search "DIST_DIR" rtk search "configuration tis" rtk search "prebuild:tis"

List Configs

bash rtk search "IListConfig" rtk search "columns:" rtk search "goodListConfig"


Stack Context

  • Frontend: Angular 20 standalone app.
  • Package manager: pnpm.
  • Deployment: Docker / Docker Compose with tenant-specific services.
  • AI-assisted repository navigation: RTK.

Current service mapping expectation

  • app_default on host port 8090
  • app_tis on host port 8091

Tenant Build Rules

  • default tenant currently builds via ng build and outputs to dist/production.
  • tis tenant builds via ng build --configuration tis and outputs to dist/tis.
  • prebuild:tis is tenant-scoped and should keep using scripts under scripts/tis/*.
  • Keep Docker DIST_DIR aligned with actual Angular output path.
  • Do not assume default Angular configuration is usable unless verified (it may reference missing replacements).
  • Do not use Angular fileReplacements for static assets (.png, .jpg, etc.); use tenant public assets or prebuild copy scripts.

Tenant PWA Rules

  • Keep tenant manifest files under tenant public assets (e.g. public-tis/favicon/site.webmanifest).
  • Ensure manifest id, start_url, and scope match actual deployment path:
    • root deploy: /
    • subpath deploy example: /tis/
  • Keep <link rel="manifest"> path and branding config manifestPath aligned.

Input Component Rules

File:

  • src/app/shared/components/input/input.component.ts

For:

  • type === 'number'
  • type === 'price'

Requirements:

  • Normalize Persian/Arabic digits to English digits.
  • Allow only digits and ..
  • Support fixed precision formatting when provided.

Additional rule:

  • Keep behavior for identifier fields (mobile, phone, postalCode, nationalId) string-safe.

Change Policy

  • Keep changes minimal and scoped to user request.
  • Prefer root-cause fixes over temporary workarounds.
  • Avoid unrelated refactors.
  • Reuse existing patterns and naming conventions.
  • Use RTK to understand existing patterns before introducing new ones.

Do / Don't

Do

  • Follow existing field wrapper style in:
    • src/app/shared/components/fields/*.component.ts
  • Reuse app-input and set only required props:
    • type
    • label
    • name
    • constraints
  • Register every new field in:
    • src/app/shared/components/fields/index.ts
    • src/app/shared/constants/fields/index.ts
  • Keep control keys consistent across:
    • form group
    • field component name
    • fieldControl key
  • Use RTK searches before creating new abstractions.

Don't

  • Don't add one-off field patterns when an existing field component can be reused.
  • Don't use invalid Angular file replacements for directories or empty paths.
  • Don't change tenant output directories without updating Docker DIST_DIR.
  • Don't scan unrelated folders/files when RTK can retrieve exact symbols.
  • Don't load full files if RTK symbol extraction is sufficient.

How To Create Form Fields

  • Create a wrapper component in:
    • src/app/shared/components/fields
  • Use the same pattern as existing files like:
    • src/app/shared/components/fields/name.component.ts
    • src/app/shared/components/fields/unit_price.component.ts

Minimal wrapper shape:

ts @Component({ selector: 'field-example', template: <app-input [label]="label" [control]="control" [name]="name" type="simple" />, imports: [ReactiveFormsModule, InputComponent], }) export class ExampleComponent { @Input({ required: true }) control = new FormControl(''); @Input() name = 'example'; @Input() label = 'Example'; }


Register New Fields

Export the component from:

  • src/app/shared/components/fields/index.ts

Add its form control factory in:

  • src/app/shared/constants/fields/index.ts

fieldControl entry shape:

  • key must match form control name
  • return tuple: [defaultValue, validators]

Example:

ts example: (value = '', isRequired = true): ControlConfig => [ value, isRequired ? [Validators.required] : [], ],


Using Fields In Forms

  • In form group builders, use:
    • fieldControl.<key>(initialValue, isRequired)
  • In templates, render matching wrapper component and pass matching control:
    • <field-example [control]="form.controls.example" />
  • For numeric/price behavior:
    • use app-input
    • use type="number" or type="price"
    • optional [fixed]

List Component Configs

Centralized list metadata is stored in:

  • src/app/shared/constants/list-configs/

Never store configs inside domain modules.

Structure

Structure by data type, not domain:

  • good-list.const.ts
  • sku-list.const.ts
  • category-list.const.ts

Requirements

Each config implements IListConfig:

  • pageTitle
  • addNewCtaLabel
  • emptyPlaceholderTitle
  • emptyPlaceholderDescription
  • columns

Usage

ts @Input() header: IColumn[] = goodListConfig.columns; listConfig = goodListConfig;

Rules

  • Any domain needing a list config imports from:
    • @/shared/constants/list-configs
  • No cross-domain dependencies.
  • Do not duplicate configs.

Breadcrumb Usage in Stores & Views

  • Entity stores expose breadcrumbItems as a computed signal.
  • Call store.breadcrumbItems() in view components and extend with current page:

ts setBreadcrumb() { this.breadcrumbService.setItems([ ...this.store.breadcrumbItems(), { title: 'Current Page' }, ]); }

  • Root page breadcrumbs are set in the store's getData() method once entity is loaded.

Validation Checklist

TypeScript-only changes

bash pnpm -s exec tsc -p tsconfig.app.json --noEmit

Docker/build changes

bash docker compose build app_default docker compose build app_tis

Validation Strategy

  • Start with targeted validation.
  • Run broader checks only if needed.
  • Validate only impacted tenants/features when possible.

Communication Expectations

  • Report exactly which files changed and why.
  • Call out assumptions and discovered config mismatches.
  • If validation is blocked:
    • explain why
    • provide next command
  • Mention RTK searches/symbols used when relevant to implementation decisions.

Preferred Investigation Order

Before editing code:

  1. RTK symbol search
  2. Existing implementation discovery
  3. Shared abstraction verification
  4. Minimal scoped change
  5. Targeted validation

Avoid:

  • broad exploratory reads
  • repeated file dumping
  • unnecessary context expansion

Angular Architecture Preferences

  • Prefer standalone components.
  • Prefer signals/computed over legacy observable-only state when consistent with current architecture.
  • Keep forms typed.
  • Keep reusable UI in shared.
  • Keep domain logic outside presentation components.
  • Preserve existing tenant separation model.

Performance & AI Efficiency

  • Optimize for:
    • minimal token usage
    • minimal file reads
    • scoped context retrieval
    • reusable architectural understanding

Prefer:

  • RTK symbol search
  • targeted reads
  • incremental inspection

Avoid:

  • dumping full files

  • repeated repository scans

  • repeated searches for the same symbols

  • unnecessary architectural exploration

  • RTK should be the primary repository understanding tool.