16 KiB
AGENT.md
Purpose
- This file defines repository-specific instructions for coding agents.
- Scope is the full repo unless a deeper
AGENT.mdoverrides 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
catfor large files - use raw
grep/rgacross the repository - use recursive
findblindly - 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
rtk greprtk smartrtk read- 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:
- grep component selector/class
- smart-read TS file
- read template only if UI changes required
- 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.
Recommended RTK Workflow
- Index repository
- Search related symbols/files/components
- Retrieve minimal context
- Apply scoped changes
- 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_defaulton host port8090app_tison host port8091
Tenant Build Rules
defaulttenant currently builds viang buildand outputs todist/production.tistenant builds viang build --configuration tisand outputs todist/tis.prebuild:tisis tenant-scoped and should keep using scripts underscripts/tis/*.- Keep Docker
DIST_DIRaligned with actual Angular output path. - Do not assume
defaultAngular configuration is usable unless verified (it may reference missing replacements). - Do not use Angular
fileReplacementsfor 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
manifestid,start_url, andscopematch actual deployment path:- root deploy:
/ - subpath deploy example:
/tis/
- root deploy:
- Keep
<link rel="manifest">path and branding configmanifestPathaligned.
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
fixedprecision 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-inputand set only required props:typelabelname- constraints
- Register every new field in:
src/app/shared/components/fields/index.tssrc/app/shared/constants/fields/index.ts
- Keep control keys consistent across:
- form group
- field component
name fieldControlkey
- 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.tssrc/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"ortype="price" - optional
[fixed]
- use
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.tssku-list.const.tscategory-list.const.ts
Requirements
Each config implements IListConfig:
pageTitleaddNewCtaLabelemptyPlaceholderTitleemptyPlaceholderDescriptioncolumns
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
breadcrumbItemsas 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:
- RTK symbol search
- Existing implementation discovery
- Shared abstraction verification
- Minimal scoped change
- 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.