- Introduced PUBLIC_SALE_INVOICES_ROUTES for handling sale invoice routes. - Created PublicSaleInvoicesService to fetch single invoice data from the API. - Implemented PublicSaleInvoiceStore for managing invoice state. - Added PublicSaleInvoiceComponent to display invoice details. - Updated app routes to include public sale invoices. - Removed pre-invoice dialog component and its associated files. - Enhanced order submitted dialog with QR code for invoice sharing. - Updated sale invoice single view to reflect new data structure. - Refactored page data list component for improved layout and functionality.
11 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.
✅ 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
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
📂 CODE NAVIGATION WORKFLOW (MANDATORY)
Follow this order when working in the repository.
1. Discover Structure
rtk ls
2. Search Before Opening Files
rtk grep <symbol | class | function | DTO | service>
Examples:
rtk grep "InputComponent"
rtk grep "fieldControl"
rtk grep "breadcrumbItems"
3. Read Only Necessary Files
rtk read <file>
4. Large File Strategy
For files larger than ~300 lines:
rtk read <file> -l aggressive
5. Fast Context Understanding
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:
rtk git diff
For large diffs:
rtk git diff -l aggressive
Avoid raw:
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:
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
rtk search "selector: 'field-"
rtk search "standalone: true"
rtk search "InputComponent"
Forms & Controls
rtk search "fieldControl."
rtk search "ControlConfig"
rtk search "Validators.required"
Stores & Signals
rtk search "breadcrumbItems"
rtk search "computed("
rtk search "signal("
Tenant / Docker
rtk search "DIST_DIR"
rtk search "configuration tis"
rtk search "prebuild:tis"
List Configs
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:
@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:
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
@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:
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
pnpm -s exec tsc -p tsconfig.app.json --noEmit
Docker/build changes
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.