Files
psp_panel/agents.md
T

830 lines
16 KiB
Markdown

# 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 <file> -> rtk read <file>
- grep <pattern> -> rtk grep <pattern>
- rg <pattern> -> rtk grep <pattern>
- 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 <file>
before:
- rtk read <file>
For large files:
- rtk read <file> -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 <file>
## 4. Large File Strategy
For files larger than ~300 lines:
bash
rtk read <file> -l aggressive
## 5. Fast Context Understanding
bash
rtk smart <file>
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.
## Recommended RTK Workflow
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<string>('');
@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.