@tacuchi/agent-workflow-cli 11.0.1 → 12.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -95
- package/dist/application/artifacts-service.d.ts +3 -12
- package/dist/application/artifacts-service.d.ts.map +1 -1
- package/dist/application/artifacts-service.js +18 -19
- package/dist/application/artifacts-service.js.map +1 -1
- package/dist/application/branch-resolver.d.ts +16 -0
- package/dist/application/branch-resolver.d.ts.map +1 -0
- package/dist/application/branch-resolver.js +24 -0
- package/dist/application/branch-resolver.js.map +1 -0
- package/dist/application/check-branch-service.d.ts +0 -2
- package/dist/application/check-branch-service.d.ts.map +1 -1
- package/dist/application/check-branch-service.js +5 -40
- package/dist/application/check-branch-service.js.map +1 -1
- package/dist/application/checkpoint/markdown.d.ts.map +1 -1
- package/dist/application/checkpoint/markdown.js +1 -16
- package/dist/application/checkpoint/markdown.js.map +1 -1
- package/dist/application/checkpoint/state-reader.d.ts +1 -3
- package/dist/application/checkpoint/state-reader.d.ts.map +1 -1
- package/dist/application/checkpoint/state-reader.js +10 -31
- package/dist/application/checkpoint/state-reader.js.map +1 -1
- package/dist/application/checkpoint-service.d.ts +12 -14
- package/dist/application/checkpoint-service.d.ts.map +1 -1
- package/dist/application/checkpoint-service.js +36 -61
- package/dist/application/checkpoint-service.js.map +1 -1
- package/dist/application/checkpoint-write-service.d.ts +0 -2
- package/dist/application/checkpoint-write-service.d.ts.map +1 -1
- package/dist/application/checkpoint-write-service.js +5 -6
- package/dist/application/checkpoint-write-service.js.map +1 -1
- package/dist/application/history-update-service.js +3 -1
- package/dist/application/history-update-service.js.map +1 -1
- package/dist/application/hook-branch-check.d.ts.map +1 -1
- package/dist/application/hook-branch-check.js +5 -34
- package/dist/application/hook-branch-check.js.map +1 -1
- package/dist/application/hook-git-commit-advisor.d.ts.map +1 -1
- package/dist/application/hook-git-commit-advisor.js +18 -23
- package/dist/application/hook-git-commit-advisor.js.map +1 -1
- package/dist/application/markdown.d.ts.map +1 -1
- package/dist/application/markdown.js +0 -4
- package/dist/application/markdown.js.map +1 -1
- package/dist/application/parsers/project-block.d.ts +0 -8
- package/dist/application/parsers/project-block.d.ts.map +1 -1
- package/dist/application/parsers/project-block.js +13 -52
- package/dist/application/parsers/project-block.js.map +1 -1
- package/dist/application/paths-service.d.ts +7 -8
- package/dist/application/paths-service.d.ts.map +1 -1
- package/dist/application/paths-service.js +12 -8
- package/dist/application/paths-service.js.map +1 -1
- package/dist/application/project-md-upsert-service.d.ts +3 -11
- package/dist/application/project-md-upsert-service.d.ts.map +1 -1
- package/dist/application/project-md-upsert-service.js +6 -56
- package/dist/application/project-md-upsert-service.js.map +1 -1
- package/dist/application/project-tab-data.d.ts +14 -42
- package/dist/application/project-tab-data.d.ts.map +1 -1
- package/dist/application/project-tab-data.js +27 -113
- package/dist/application/project-tab-data.js.map +1 -1
- package/dist/application/release-data/artifacts.d.ts +0 -2
- package/dist/application/release-data/artifacts.d.ts.map +1 -1
- package/dist/application/release-data/artifacts.js +22 -12
- package/dist/application/release-data/artifacts.js.map +1 -1
- package/dist/application/release-data/sessions.d.ts +0 -2
- package/dist/application/release-data/sessions.d.ts.map +1 -1
- package/dist/application/release-data/sessions.js +36 -27
- package/dist/application/release-data/sessions.js.map +1 -1
- package/dist/application/release-data-service.d.ts +0 -3
- package/dist/application/release-data-service.d.ts.map +1 -1
- package/dist/application/release-data-service.js +3 -21
- package/dist/application/release-data-service.js.map +1 -1
- package/dist/application/render/history-row.d.ts +1 -9
- package/dist/application/render/history-row.d.ts.map +1 -1
- package/dist/application/render/history-row.js +3 -20
- package/dist/application/render/history-row.js.map +1 -1
- package/dist/application/render/project-block.d.ts +1 -3
- package/dist/application/render/project-block.d.ts.map +1 -1
- package/dist/application/render/project-block.js +4 -27
- package/dist/application/render/project-block.js.map +1 -1
- package/dist/application/self/doctor-self.d.ts.map +1 -1
- package/dist/application/self/doctor-self.js +15 -8
- package/dist/application/self/doctor-self.js.map +1 -1
- package/dist/application/self/install-hooks.d.ts +1 -1
- package/dist/application/self/install-hooks.d.ts.map +1 -1
- package/dist/application/self/install-hooks.js +3 -2
- package/dist/application/self/install-hooks.js.map +1 -1
- package/dist/application/self/install-skill.d.ts +9 -3
- package/dist/application/self/install-skill.d.ts.map +1 -1
- package/dist/application/self/install-skill.js +16 -16
- package/dist/application/self/install-skill.js.map +1 -1
- package/dist/application/self/uninstall-skill.js +14 -12
- package/dist/application/self/uninstall-skill.js.map +1 -1
- package/dist/application/self/uninstall.js +14 -12
- package/dist/application/self/uninstall.js.map +1 -1
- package/dist/application/session-artifacts.d.ts +7 -6
- package/dist/application/session-artifacts.d.ts.map +1 -1
- package/dist/application/session-artifacts.js +10 -15
- package/dist/application/session-artifacts.js.map +1 -1
- package/dist/application/session-close-service.d.ts +5 -22
- package/dist/application/session-close-service.d.ts.map +1 -1
- package/dist/application/session-close-service.js +20 -143
- package/dist/application/session-close-service.js.map +1 -1
- package/dist/application/session-create-service.d.ts +9 -29
- package/dist/application/session-create-service.d.ts.map +1 -1
- package/dist/application/session-create-service.js +44 -288
- package/dist/application/session-create-service.js.map +1 -1
- package/dist/application/session-resolver.d.ts +4 -25
- package/dist/application/session-resolver.d.ts.map +1 -1
- package/dist/application/session-resolver.js +33 -149
- package/dist/application/session-resolver.js.map +1 -1
- package/dist/application/session-resume-service.d.ts +3 -4
- package/dist/application/session-resume-service.d.ts.map +1 -1
- package/dist/application/session-resume-service.js +8 -26
- package/dist/application/session-resume-service.js.map +1 -1
- package/dist/application/sessions-service.d.ts +2 -3
- package/dist/application/sessions-service.d.ts.map +1 -1
- package/dist/application/sessions-service.js +9 -26
- package/dist/application/sessions-service.js.map +1 -1
- package/dist/application/skill-index-service.d.ts +0 -2
- package/dist/application/skill-index-service.d.ts.map +1 -1
- package/dist/application/skill-index-service.js +0 -1
- package/dist/application/skill-index-service.js.map +1 -1
- package/dist/application/skills-resolver-service.d.ts +22 -0
- package/dist/application/skills-resolver-service.d.ts.map +1 -0
- package/dist/application/skills-resolver-service.js +71 -0
- package/dist/application/skills-resolver-service.js.map +1 -0
- package/dist/application/sources-service.d.ts +0 -5
- package/dist/application/sources-service.d.ts.map +1 -1
- package/dist/application/sources-service.js +5 -44
- package/dist/application/sources-service.js.map +1 -1
- package/dist/application/templates/session.d.ts +24 -0
- package/dist/application/templates/session.d.ts.map +1 -0
- package/dist/application/templates/session.js +46 -0
- package/dist/application/templates/session.js.map +1 -0
- package/dist/application/upgrade-hub-mode-service.d.ts.map +1 -1
- package/dist/application/upgrade-hub-mode-service.js +0 -1
- package/dist/application/upgrade-hub-mode-service.js.map +1 -1
- package/dist/application/workspace-init-service.d.ts +60 -0
- package/dist/application/workspace-init-service.d.ts.map +1 -0
- package/dist/application/workspace-init-service.js +227 -0
- package/dist/application/workspace-init-service.js.map +1 -0
- package/dist/cli/commands/check-branch.d.ts.map +1 -1
- package/dist/cli/commands/check-branch.js +0 -3
- package/dist/cli/commands/check-branch.js.map +1 -1
- package/dist/cli/commands/plugin-doctor.d.ts.map +1 -1
- package/dist/cli/commands/plugin-doctor.js +0 -3
- package/dist/cli/commands/plugin-doctor.js.map +1 -1
- package/dist/cli/commands/project-md-upsert.d.ts.map +1 -1
- package/dist/cli/commands/project-md-upsert.js +5 -31
- package/dist/cli/commands/project-md-upsert.js.map +1 -1
- package/dist/cli/commands/session-close.d.ts.map +1 -1
- package/dist/cli/commands/session-close.js +1 -33
- package/dist/cli/commands/session-close.js.map +1 -1
- package/dist/cli/commands/session-create.d.ts.map +1 -1
- package/dist/cli/commands/session-create.js +5 -21
- package/dist/cli/commands/session-create.js.map +1 -1
- package/dist/cli/commands/session-resume.js +1 -1
- package/dist/cli/commands/session-resume.js.map +1 -1
- package/dist/cli/commands/set-working-branch.d.ts +3 -0
- package/dist/cli/commands/set-working-branch.d.ts.map +1 -0
- package/dist/cli/commands/set-working-branch.js +34 -0
- package/dist/cli/commands/set-working-branch.js.map +1 -0
- package/dist/cli/commands/skill-index.d.ts.map +1 -1
- package/dist/cli/commands/skill-index.js +0 -3
- package/dist/cli/commands/skill-index.js.map +1 -1
- package/dist/cli/commands/skills.d.ts +3 -0
- package/dist/cli/commands/skills.d.ts.map +1 -0
- package/dist/cli/commands/skills.js +10 -0
- package/dist/cli/commands/skills.js.map +1 -0
- package/dist/cli/commands/sources.d.ts.map +1 -1
- package/dist/cli/commands/sources.js +0 -3
- package/dist/cli/commands/sources.js.map +1 -1
- package/dist/cli/commands/workspace-init.d.ts +3 -0
- package/dist/cli/commands/workspace-init.d.ts.map +1 -0
- package/dist/cli/commands/workspace-init.js +69 -0
- package/dist/cli/commands/workspace-init.js.map +1 -0
- package/dist/cli/help-groups.d.ts.map +1 -1
- package/dist/cli/help-groups.js +8 -19
- package/dist/cli/help-groups.js.map +1 -1
- package/dist/cli/interactive-menu.d.ts +1 -1
- package/dist/cli/interactive-menu.d.ts.map +1 -1
- package/dist/cli/main.js +29 -37
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/parser.d.ts +0 -2
- package/dist/cli/parser.d.ts.map +1 -1
- package/dist/cli/parser.js +1 -13
- package/dist/cli/parser.js.map +1 -1
- package/dist/cli/tui/app.js +3 -38
- package/dist/cli/tui/app.js.map +1 -1
- package/dist/cli/tui/components/hub-init-alias.js +1 -1
- package/dist/cli/tui/components/hub-init-alias.js.map +1 -1
- package/dist/cli/tui/components/hub-init-form.d.ts.map +1 -1
- package/dist/cli/tui/components/hub-init-form.js +13 -12
- package/dist/cli/tui/components/hub-init-form.js.map +1 -1
- package/dist/cli/tui/components/workspace-init-alias.d.ts +5 -0
- package/dist/cli/tui/components/workspace-init-alias.d.ts.map +1 -0
- package/dist/cli/tui/components/workspace-init-alias.js +19 -0
- package/dist/cli/tui/components/workspace-init-alias.js.map +1 -0
- package/dist/cli/tui/components/workspace-init-form.d.ts +13 -0
- package/dist/cli/tui/components/workspace-init-form.d.ts.map +1 -0
- package/dist/cli/tui/components/workspace-init-form.js +87 -0
- package/dist/cli/tui/components/workspace-init-form.js.map +1 -0
- package/dist/cli/tui/data/activity.d.ts +1 -1
- package/dist/cli/tui/data/activity.d.ts.map +1 -1
- package/dist/cli/tui/data/activity.js +2 -2
- package/dist/cli/tui/data/activity.js.map +1 -1
- package/dist/cli/tui/data/workflow-content.d.ts.map +1 -1
- package/dist/cli/tui/data/workflow-content.js +67 -87
- package/dist/cli/tui/data/workflow-content.js.map +1 -1
- package/dist/cli/tui/tabs/project-tab.d.ts.map +1 -1
- package/dist/cli/tui/tabs/project-tab.js +23 -97
- package/dist/cli/tui/tabs/project-tab.js.map +1 -1
- package/dist/cli/tui/tabs/skills-tab.d.ts.map +1 -1
- package/dist/cli/tui/tabs/skills-tab.js +7 -7
- package/dist/cli/tui/tabs/skills-tab.js.map +1 -1
- package/dist/cli/tui/tabs/workflow-tab.d.ts +1 -3
- package/dist/cli/tui/tabs/workflow-tab.d.ts.map +1 -1
- package/dist/cli/tui/tabs/workflow-tab.js +2 -2
- package/dist/cli/tui/tabs/workflow-tab.js.map +1 -1
- package/dist/cli/types.d.ts +3 -0
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/domain/plugin.d.ts +2 -12
- package/dist/domain/plugin.d.ts.map +1 -1
- package/dist/domain/project.d.ts +0 -9
- package/dist/domain/project.d.ts.map +1 -1
- package/dist/domain/session.d.ts +7 -24
- package/dist/domain/session.d.ts.map +1 -1
- package/dist/domain/skills.d.ts +22 -0
- package/dist/domain/skills.d.ts.map +1 -0
- package/dist/domain/skills.js +37 -0
- package/dist/domain/skills.js.map +1 -0
- package/dist/domain/types.d.ts +6 -2
- package/dist/domain/types.d.ts.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/runtime/config-service.js +1 -1
- package/dist/runtime/config-service.js.map +1 -1
- package/dist/runtime/types.d.ts +0 -1
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/package.json +12 -3
- package/skills/w/README.md +65 -0
- package/skills/w/SKILL.md +153 -0
- package/skills/w/artifacts/README.md +60 -0
- package/skills/w/artifacts/artifacts-core/BACKLOG.md +12 -0
- package/skills/w/artifacts/artifacts-core/CHECKPOINT.md +22 -0
- package/skills/w/artifacts/artifacts-core/SCRIPTS.sql +39 -0
- package/skills/w/artifacts/artifacts-core/SESSION.md +27 -0
- package/skills/w/artifacts/artifacts-core/TASKS.md +18 -0
- package/skills/w/artifacts/artifacts-dev/DECISION.md +11 -0
- package/skills/w/artifacts/artifacts-dev/TECHNICAL-NOTE.md +81 -0
- package/skills/w/artifacts/artifacts-research/ANALYSIS-FILE.md +48 -0
- package/skills/w/artifacts/artifacts-research/CONCLUSIONS.md +20 -0
- package/skills/w/commands/README.md +116 -0
- package/skills/w/commands/export-diagrams.md +35 -0
- package/skills/w/commands/export-manuals.md +35 -0
- package/skills/w/commands/export-reports.md +35 -0
- package/skills/w/commands/export-scripts.md +35 -0
- package/skills/w/commands/plan-exec.md +46 -0
- package/skills/w/commands/plan-new.md +44 -0
- package/skills/w/commands/quick.md +39 -0
- package/skills/w/commands/spec-new.md +63 -0
- package/skills/w/commands/spec-refine.md +41 -0
- package/skills/w/commands/workspace-init.md +39 -0
- package/skills/w/exports/README.md +88 -0
- package/skills/w/exports/export-diagrams/SKILL.md +125 -0
- package/skills/w/exports/export-manuals/SKILL.md +127 -0
- package/skills/w/exports/export-reports/SKILL.md +115 -0
- package/skills/w/exports/export-scripts/SKILL.md +135 -0
- package/skills/w/hooks/README.md +15 -0
- package/skills/{agent-workflow → w}/hooks/hooks.template.json +2 -2
- package/skills/w/loops/README.md +118 -0
- package/skills/w/loops/plan-exec-loop/SKILL.md +161 -0
- package/skills/w/loops/plan-new-loop/SKILL.md +97 -0
- package/skills/w/loops/quick-loop/SKILL.md +102 -0
- package/skills/w/loops/spec-refine-loop/SKILL.md +222 -0
- package/skills/w/roles/README.md +154 -0
- package/skills/w/roles/coding-standards/SKILL.md +82 -0
- package/skills/w/roles/diagrams/SKILL.md +248 -0
- package/skills/w/roles/git/SKILL.md +98 -0
- package/skills/w/roles/research/SKILL.md +181 -0
- package/skills/w/roles/sql/SKILL.md +137 -0
- package/skills/w/roles/testing/SKILL.md +180 -0
- package/skills/w/roles/tools/SKILL.md +148 -0
- package/skills/w/roles/ui-spec/SKILL.md +136 -0
- package/skills/w/roles/writing/SKILL.md +90 -0
- package/skills/agent-workflow/LICENSE +0 -661
- package/skills/agent-workflow/MANUAL-FUNCIONAL.md +0 -298
- package/skills/agent-workflow/MANUAL-TECNICO.md +0 -271
- package/skills/agent-workflow/README.md +0 -74
- package/skills/agent-workflow/SKILL.md +0 -112
- package/skills/agent-workflow/commands/README.md +0 -26
- package/skills/agent-workflow/commands/compact.md +0 -24
- package/skills/agent-workflow/commands/doctor.md +0 -100
- package/skills/agent-workflow/commands/export-arq.md +0 -77
- package/skills/agent-workflow/commands/export-conclusions.md +0 -78
- package/skills/agent-workflow/commands/export-plan.md +0 -74
- package/skills/agent-workflow/commands/export-qa-note.md +0 -30
- package/skills/agent-workflow/commands/export-report.md +0 -78
- package/skills/agent-workflow/commands/export-requirement.md +0 -30
- package/skills/agent-workflow/commands/export-scripts.md +0 -82
- package/skills/agent-workflow/commands/export-tech-manuals.md +0 -75
- package/skills/agent-workflow/commands/export-tech-note.md +0 -30
- package/skills/agent-workflow/commands/hub-init.md +0 -58
- package/skills/agent-workflow/commands/migrate.md +0 -56
- package/skills/agent-workflow/commands/patch.md +0 -49
- package/skills/agent-workflow/commands/project-init.md +0 -60
- package/skills/agent-workflow/commands/resume.md +0 -22
- package/skills/agent-workflow/commands/rules.md +0 -41
- package/skills/agent-workflow/commands/session.md +0 -35
- package/skills/agent-workflow/docs/TEST-PLAN.md +0 -163
- package/skills/agent-workflow/doctrine/README.md +0 -15
- package/skills/agent-workflow/doctrine/compact/SKILL.md +0 -145
- package/skills/agent-workflow/doctrine/doctor/SKILL.md +0 -86
- package/skills/agent-workflow/doctrine/hub-init/SKILL.md +0 -77
- package/skills/agent-workflow/doctrine/hub-init/references/multiroot-manual.md +0 -51
- package/skills/agent-workflow/doctrine/implement/SKILL.md +0 -290
- package/skills/agent-workflow/doctrine/implement/references/branch-verification.md +0 -16
- package/skills/agent-workflow/doctrine/implement/references/design-md-template.md +0 -108
- package/skills/agent-workflow/doctrine/implement/references/rollback-guide.md +0 -83
- package/skills/agent-workflow/doctrine/migrate/SKILL.md +0 -281
- package/skills/agent-workflow/doctrine/project-init/SKILL.md +0 -100
- package/skills/agent-workflow/doctrine/refactor/SKILL.md +0 -208
- package/skills/agent-workflow/doctrine/refactor/references/refactor-md-template.md +0 -108
- package/skills/agent-workflow/doctrine/refactor/references/strangler-checklist.md +0 -116
- package/skills/agent-workflow/doctrine/resume/SKILL.md +0 -199
- package/skills/agent-workflow/doctrine/rules/SKILL.md +0 -250
- package/skills/agent-workflow/doctrine/session/SKILL.md +0 -471
- package/skills/agent-workflow/doctrine/session/references/auto-plan-rules.md +0 -63
- package/skills/agent-workflow/doctrine/session/references/backlog-template.md +0 -95
- package/skills/agent-workflow/doctrine/session/references/branch-verification.md +0 -198
- package/skills/agent-workflow/doctrine/session/references/commits-policy.md +0 -111
- package/skills/agent-workflow/doctrine/session/references/communication-style.md +0 -50
- package/skills/agent-workflow/doctrine/session/references/graduacion-routing.md +0 -88
- package/skills/agent-workflow/doctrine/session/references/lifecycle-deep.md +0 -160
- package/skills/agent-workflow/doctrine/session/references/prompts/C1-specialty-selection.md +0 -11
- package/skills/agent-workflow/doctrine/session/references/prompts/C2-cost-guard.md +0 -14
- package/skills/agent-workflow/doctrine/session/references/prompts/M1-closure-commit-prompt.md +0 -104
- package/skills/agent-workflow/doctrine/session/references/prompts/M10-next-step.md +0 -17
- package/skills/agent-workflow/doctrine/session/references/prompts/M11-context.md +0 -16
- package/skills/agent-workflow/doctrine/session/references/prompts/M13-closure-cleanup.md +0 -61
- package/skills/agent-workflow/doctrine/session/references/prompts/M2-branch-caso-A.md +0 -14
- package/skills/agent-workflow/doctrine/session/references/prompts/M3-branch-caso-C.md +0 -33
- package/skills/agent-workflow/doctrine/session/references/prompts/M4-cross-source-hard-gate.md +0 -33
- package/skills/agent-workflow/doctrine/session/references/prompts/M5-modality-analyze.md +0 -15
- package/skills/agent-workflow/doctrine/session/references/prompts/M6-phase-gate.md +0 -31
- package/skills/agent-workflow/doctrine/session/references/prompts/M7-refactor-legacy-detected.md +0 -28
- package/skills/agent-workflow/doctrine/session/references/prompts/M8-refactor-cleanup.md +0 -16
- package/skills/agent-workflow/doctrine/session/references/prompts/M9-contract-review.md +0 -39
- package/skills/agent-workflow/doctrine/session/references/prompts/S1-type-design.md +0 -15
- package/skills/agent-workflow/doctrine/session/references/prompts/S2-topic-change-detection.md +0 -14
- package/skills/agent-workflow/doctrine/session/references/prompts/S3-flow-detection.md +0 -28
- package/skills/agent-workflow/doctrine/session/references/prompts/S4-resume.md +0 -27
- package/skills/agent-workflow/doctrine/session/references/prompts/S5-post-compact.md +0 -17
- package/skills/agent-workflow/doctrine/session/references/prompts/S6-scope.md +0 -16
- package/skills/agent-workflow/doctrine/session/references/prompts/S7-design-review.md +0 -37
- package/skills/agent-workflow/doctrine/session/references/prompts-catalog.md +0 -213
- package/skills/agent-workflow/doctrine/session/references/sandbox-readonly-rules.md +0 -82
- package/skills/agent-workflow/doctrine/session/references/specialty-decision-tree.md +0 -56
- package/skills/agent-workflow/doctrine/session/references/topic-change-rules.md +0 -67
- package/skills/agent-workflow/exports/README.md +0 -15
- package/skills/agent-workflow/exports/export-arq/SKILL.md +0 -229
- package/skills/agent-workflow/exports/export-arq/references/lexico-tecnico.md +0 -94
- package/skills/agent-workflow/exports/export-arq/references/template-c4.md +0 -293
- package/skills/agent-workflow/exports/export-arq/references/template-plantuml.puml +0 -77
- package/skills/agent-workflow/exports/export-arq/references/template-structurizr.dsl +0 -72
- package/skills/agent-workflow/exports/export-arq/references/validations.md +0 -231
- package/skills/agent-workflow/exports/export-conclusions/SKILL.md +0 -169
- package/skills/agent-workflow/exports/export-conclusions/references/dedup-rules.md +0 -154
- package/skills/agent-workflow/exports/export-conclusions/references/template-conclusions.md +0 -158
- package/skills/agent-workflow/exports/export-plan/SKILL.md +0 -225
- package/skills/agent-workflow/exports/export-plan/references/state-transitions.md +0 -141
- package/skills/agent-workflow/exports/export-plan/references/template-plan.md +0 -132
- package/skills/agent-workflow/exports/export-qa-note/SKILL.md +0 -31
- package/skills/agent-workflow/exports/export-report/SKILL.md +0 -262
- package/skills/agent-workflow/exports/export-report/references/lexico.md +0 -174
- package/skills/agent-workflow/exports/export-report/references/template-a.md +0 -95
- package/skills/agent-workflow/exports/export-report/references/template-b.md +0 -221
- package/skills/agent-workflow/exports/export-report/references/template-c.md +0 -180
- package/skills/agent-workflow/exports/export-report/references/validations.md +0 -255
- package/skills/agent-workflow/exports/export-requirement/SKILL.md +0 -31
- package/skills/agent-workflow/exports/export-scripts/SKILL.md +0 -211
- package/skills/agent-workflow/exports/export-scripts/references/code-scan-recommendations.md +0 -83
- package/skills/agent-workflow/exports/export-scripts/references/deprecation-plan.md +0 -80
- package/skills/agent-workflow/exports/export-scripts/references/lexico-tecnico.md +0 -47
- package/skills/agent-workflow/exports/export-scripts/references/manifest-template.md +0 -265
- package/skills/agent-workflow/exports/export-scripts/references/readme-template.md +0 -49
- package/skills/agent-workflow/exports/export-scripts/references/theme-handling.md +0 -141
- package/skills/agent-workflow/exports/export-scripts/references/validations.md +0 -69
- package/skills/agent-workflow/exports/export-tech-manuals/SKILL.md +0 -214
- package/skills/agent-workflow/exports/export-tech-manuals/references/lexico-tecnico.md +0 -97
- package/skills/agent-workflow/exports/export-tech-manuals/references/template-index.md +0 -123
- package/skills/agent-workflow/exports/export-tech-manuals/references/template-manual.md +0 -143
- package/skills/agent-workflow/exports/export-tech-manuals/references/validations.md +0 -211
- package/skills/agent-workflow/exports/export-tech-note/SKILL.md +0 -31
- package/skills/agent-workflow/hooks/README.md +0 -15
- package/skills/agent-workflow/references/README.md +0 -12
- package/skills/agent-workflow/references/checkpoint.md +0 -59
- package/skills/agent-workflow/references/dev-only.md +0 -50
- package/skills/agent-workflow/references/doctor.md +0 -61
- package/skills/agent-workflow/references/history.md +0 -40
- package/skills/agent-workflow/references/hooks.md +0 -35
- package/skills/agent-workflow/references/legacy-anchors.md +0 -50
- package/skills/agent-workflow/references/mcp.md +0 -34
- package/skills/agent-workflow/references/objetivo-tasks.md +0 -64
- package/skills/agent-workflow/references/orchestration.md +0 -86
- package/skills/agent-workflow/references/profile-parametrization.md +0 -88
- package/skills/agent-workflow/references/self.md +0 -68
- package/skills/agent-workflow/references/session-mgmt.md +0 -109
- package/skills/agent-workflow/references/sources.md +0 -102
- package/skills/agent-workflow/specialties/README.md +0 -14
- package/skills/agent-workflow/specialties/analyze-conclude/SKILL.md +0 -181
- package/skills/agent-workflow/specialties/analyze-conclude/references/incident-classification.md +0 -61
- package/skills/agent-workflow/specialties/analyze-investigate/SKILL.md +0 -148
- package/skills/agent-workflow/specialties/analyze-investigate/references/cost-guard.md +0 -85
- package/skills/agent-workflow/specialties/analyze-synthesize/SKILL.md +0 -127
- package/skills/agent-workflow/specialties/design-brief/SKILL.md +0 -90
- package/skills/agent-workflow/specialties/design-deliver/SKILL.md +0 -121
- package/skills/agent-workflow/specialties/design-develop/SKILL.md +0 -115
- package/skills/agent-workflow/specialties/design-discover/SKILL.md +0 -103
- package/skills/agent-workflow/standards/README.md +0 -12
- package/skills/agent-workflow/standards/coding-standards/SKILL.md +0 -102
- package/skills/agent-workflow/standards/coding-standards/references/angular-typescript.md +0 -266
- package/skills/agent-workflow/standards/coding-standards/references/database-conventions.md +0 -170
- package/skills/agent-workflow/standards/coding-standards/references/fe-be-integration.md +0 -300
- package/skills/agent-workflow/standards/coding-standards/references/frontend-structure.md +0 -182
- package/skills/agent-workflow/standards/coding-standards/references/java-spring.md +0 -244
- package/skills/agent-workflow/standards/coding-standards/references/project-structure.md +0 -197
- package/skills/agent-workflow/standards/frontend-design/SKILL.md +0 -62
- package/skills/agent-workflow/standards/frontend-design/references/feedback-toasts-patterns.md +0 -249
- package/skills/agent-workflow/standards/frontend-design/references/form-patterns.md +0 -278
- package/skills/agent-workflow/standards/frontend-design/references/list-patterns.md +0 -256
- package/skills/agent-workflow/standards/frontend-design/references/modal-patterns.md +0 -220
- package/skills/agent-workflow/standards/frontend-design/references/navigation-patterns.md +0 -224
- package/skills/agent-workflow/standards/redaccion-simple/SKILL.md +0 -128
- package/skills/agent-workflow/standards/sql-rollback-generator/SKILL.md +0 -158
- package/skills/agent-workflow/standards/sql-rollback-generator/references/irreversible-checklist.md +0 -161
- package/skills/agent-workflow/standards/sql-rollback-generator/references/release-rollback.md +0 -133
- package/skills/agent-workflow/standards/sql-rollback-generator/references/rollback-patterns.md +0 -257
- package/skills/agent-workflow/standards/sql-script-organizer/SKILL.md +0 -243
- package/skills/agent-workflow/standards/sql-script-organizer/references/bundle-readme-template.md +0 -82
- package/skills/agent-workflow/standards/sql-script-organizer/references/categorization-rules.md +0 -122
- package/skills/agent-workflow/standards/sql-script-organizer/references/consolidation-cross-session.md +0 -125
- package/skills/agent-workflow/standards/sql-script-organizer/references/scripts-sql-format.md +0 -140
- package/skills/agent-workflow/standards/testing-strategy/SKILL.md +0 -113
- package/skills/agent-workflow/standards/testing-strategy/references/test-levels.md +0 -255
- package/skills/agent-workflow/workflows/README.md +0 -12
- package/skills/agent-workflow/workflows/analyze-workflow/SKILL.md +0 -94
- package/skills/agent-workflow/workflows/design-workflow/SKILL.md +0 -79
- package/skills/agent-workflow/workflows/dev-workflow/SKILL.md +0 -172
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
# Convenciones de Base de Datos
|
|
2
|
-
|
|
3
|
-
PostgreSQL. Todas las convenciones son snake_case en español.
|
|
4
|
-
|
|
5
|
-
## Esquemas
|
|
6
|
-
|
|
7
|
-
Prefijo `esq_` + dominio: `esq_credito`, `esq_seguridad`, `esq_motor`, `esq_contabilidad`, `esq_liquidacion`, `esq_pago`, `esq_movimiento`, `esq_reportes`, `esq_audit`, `esq_sistema`, `esq_pos`, `esq_promocion`, `esq_planeamiento`, `esq_seguro`, `esq_reclamo`, `esq_request`, `esq_kashio`.
|
|
8
|
-
|
|
9
|
-
Cada microservicio trabaja con 1-2 esquemas. Siempre referenciar el schema explícitamente en queries nativas y en `@Table`.
|
|
10
|
-
|
|
11
|
-
## Tablas
|
|
12
|
-
|
|
13
|
-
- Prefijo `tb_` + entidad: `tb_credito`, `tb_cliente`, `tb_solicitud`
|
|
14
|
-
- Relaciones: `tb_pago_cronograma`, `tb_usuario_sucursal`
|
|
15
|
-
- Cabecera/detalle: sufijo `_cab` / `_det` → `tb_lote_cab`, `tb_lote_det`
|
|
16
|
-
|
|
17
|
-
## Columnas
|
|
18
|
-
|
|
19
|
-
### Primary Keys
|
|
20
|
-
`id_` + entidad → `id_credito`, `id_cliente`, `id_solicitud`
|
|
21
|
-
|
|
22
|
-
### Foreign Keys
|
|
23
|
-
Mismo nombre que la PK referenciada → `id_cliente` en `tb_credito` apunta a `tb_cliente.id_cliente`
|
|
24
|
-
|
|
25
|
-
### Fechas
|
|
26
|
-
`fecha_` + acción → `fecha_registro`, `fecha_modificacion`, `fecha_solicitud`, `fecha_aprobacion`, `fecha_prestamo`
|
|
27
|
-
|
|
28
|
-
### Montos
|
|
29
|
-
`monto_` + concepto → `monto_prestamo`, `monto_cuota`, `monto_pagar`, `monto_desembolsado`
|
|
30
|
-
|
|
31
|
-
### Estados
|
|
32
|
-
- `estado` → integer genérico (1=activo, 0=inactivo)
|
|
33
|
-
- `estado_proceso`, `estado_aprobacion` → integer, referencia a `tb_maestra_detalle.id_maestra_detalle`
|
|
34
|
-
|
|
35
|
-
### Flags
|
|
36
|
-
`flag_` + concepto → `flag_extorno` (integer 0/1)
|
|
37
|
-
|
|
38
|
-
### Tipos de datos
|
|
39
|
-
- `integer` → IDs, estados, flags
|
|
40
|
-
- `numeric` → montos, tasas, porcentajes
|
|
41
|
-
- `character varying` → textos
|
|
42
|
-
- `timestamp without time zone` → fechas con hora
|
|
43
|
-
- `date` → fechas sin hora
|
|
44
|
-
- `boolean` → flags en tablas más nuevas
|
|
45
|
-
|
|
46
|
-
## Auditoría
|
|
47
|
-
|
|
48
|
-
Campos presentes en casi todas las tablas (mapeados por la clase base `Auditoria` en Java):
|
|
49
|
-
|
|
50
|
-
```
|
|
51
|
-
estado integer NOT NULL -- 1=activo, 0=inactivo
|
|
52
|
-
usuario_registro varchar NOT NULL -- usuario que creó
|
|
53
|
-
fecha_registro timestamp NOT NULL -- cuándo se creó
|
|
54
|
-
usuario_modificacion varchar NULL -- usuario última modificación
|
|
55
|
-
fecha_modificacion timestamp NULL -- cuándo se modificó
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
## Sequences
|
|
59
|
-
|
|
60
|
-
Patrón: `seq_tb_[entidad]` en el mismo esquema → `esq_credito.seq_tb_credito`
|
|
61
|
-
|
|
62
|
-
## Índices
|
|
63
|
-
|
|
64
|
-
- PK: `pk_tb_[entidad]`
|
|
65
|
-
- Índices: `idx_tb_[entidad]_[columna]` o `idx_[entidad]_[columnas]`
|
|
66
|
-
|
|
67
|
-
## Funciones y Stored Procedures
|
|
68
|
-
|
|
69
|
-
- Funciones: `fn_` + verbo + sustantivo → `fn_obtener_segmento`, `fn_calcular_cuota_oferta`
|
|
70
|
-
- Procedures: `sp_` + verbo + sustantivo → `sp_genera_credito`, `sp_recalcula_credito`
|
|
71
|
-
- Versionado: sufijo `_v2`, `_v3` para versiones nuevas (no se borran las anteriores)
|
|
72
|
-
|
|
73
|
-
## Patrón Maestra-Detalle
|
|
74
|
-
|
|
75
|
-
`tb_maestra` + `tb_maestra_detalle` es el catálogo centralizado. Estados, tipos de documento, tipos de crédito, etc. se referencian vía `id_maestra_detalle`. El campo `codprog` identifica el grupo funcional dentro de la maestra.
|
|
76
|
-
|
|
77
|
-
Al crear nuevos estados o tipos, siempre usar `tb_maestra_detalle` en lugar de hardcodear valores.
|
|
78
|
-
|
|
79
|
-
## Estilo de scripts SQL
|
|
80
|
-
|
|
81
|
-
Reglas de escritura para todos los scripts SQL de la sesión. Aplicar desde el primer `.sql`.
|
|
82
|
-
|
|
83
|
-
### Transacciones
|
|
84
|
-
|
|
85
|
-
```sql
|
|
86
|
-
BEGIN;
|
|
87
|
-
-- cuerpo del script
|
|
88
|
-
COMMIT;
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
`ROLLBACK` explícito en bloques con manejo de errores:
|
|
92
|
-
|
|
93
|
-
```sql
|
|
94
|
-
DO $$ BEGIN
|
|
95
|
-
-- lógica
|
|
96
|
-
EXCEPTION WHEN OTHERS THEN
|
|
97
|
-
RAISE;
|
|
98
|
-
END; $$;
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
### Idempotencia
|
|
102
|
-
|
|
103
|
-
| Operación | Forma idempotente |
|
|
104
|
-
|---|---|
|
|
105
|
-
| Crear tabla | `CREATE TABLE IF NOT EXISTS` |
|
|
106
|
-
| Eliminar objeto | `DROP ... IF EXISTS` |
|
|
107
|
-
| Crear/actualizar función | `CREATE OR REPLACE FUNCTION` |
|
|
108
|
-
| Insertar sin duplicar | `INSERT ... ON CONFLICT DO NOTHING` |
|
|
109
|
-
| Actualizar o insertar | `INSERT ... ON CONFLICT DO UPDATE` |
|
|
110
|
-
|
|
111
|
-
### CTEs sobre subqueries anidados
|
|
112
|
-
|
|
113
|
-
Usar CTE cuando hay ≥2 joins encadenados o cuando el mismo subquery se reutiliza:
|
|
114
|
-
|
|
115
|
-
```sql
|
|
116
|
-
-- Evitar:
|
|
117
|
-
SELECT * FROM tb_a WHERE id IN (SELECT id FROM tb_b WHERE id IN (SELECT id FROM tb_c));
|
|
118
|
-
|
|
119
|
-
-- Preferir:
|
|
120
|
-
WITH ids_c AS (SELECT id FROM tb_c),
|
|
121
|
-
ids_b AS (SELECT b.id FROM tb_b b JOIN ids_c c ON b.id = c.id)
|
|
122
|
-
SELECT * FROM tb_a a JOIN ids_b b ON a.id = b.id;
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
### Comentarios ligeros
|
|
126
|
-
|
|
127
|
-
Header canónico de 4 líneas (Script / Sesion / Objeto / Alcance) entre dos líneas de iguales:
|
|
128
|
-
|
|
129
|
-
```sql
|
|
130
|
-
-- ============================================================================
|
|
131
|
-
-- Script: 003-ddl-tb-solicitud-credito.sql
|
|
132
|
-
-- Sesion: s003
|
|
133
|
-
-- Objeto: Crear tabla de solicitudes de crédito.
|
|
134
|
-
-- Alcance: Esquema esq_credito; sin migración de datos.
|
|
135
|
-
-- ============================================================================
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
Detalles, separadores entre secciones del cuerpo y la regla "CTEs sobre `DO`/`LOOP`" en `sql-script-organizer/SKILL.md#header-canónico`. Autor / Fecha / Motor / "Defensa futura" no van adentro del header — si el caso lo amerita, van como nota libre en una línea suelta debajo. Solo comentar el **por qué** cuando no es obvio. Nunca documentar qué hace una línea si el nombre ya lo dice.
|
|
139
|
-
|
|
140
|
-
### Sin funciones utilitarias efímeras
|
|
141
|
-
|
|
142
|
-
No crear `fn_*` o `sp_*` solo para reusar lógica dentro de un script. Usar CTE o repetir inline. Las `fn_`/`sp_` permanentes siguen la convención versionada (`_v2`, `_v3`).
|
|
143
|
-
|
|
144
|
-
### Esquema siempre explícito
|
|
145
|
-
|
|
146
|
-
```sql
|
|
147
|
-
-- Correcto:
|
|
148
|
-
SELECT * FROM esq_credito.tb_credito;
|
|
149
|
-
|
|
150
|
-
-- Incorrecto:
|
|
151
|
-
SELECT * FROM public.tb_credito;
|
|
152
|
-
SELECT * FROM tb_credito; -- sin schema
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
### Portabilidad
|
|
156
|
-
|
|
157
|
-
PostgreSQL es el motor primario. Si el destino es otro motor, indicarlo en `Objeto:` o como nota libre debajo del header (no como campo nuevo). Ver `sql-rollback-generator/references/rollback-patterns.md` para equivalencias Oracle/SQL Server.
|
|
158
|
-
|
|
159
|
-
### Seguridad en SQL dinámico
|
|
160
|
-
|
|
161
|
-
Nunca concatenar strings en SQL dinámico. Usar `$1`/`$2` en queries parametrizados, o `%L` con `format()` en PL/pgSQL.
|
|
162
|
-
|
|
163
|
-
---
|
|
164
|
-
|
|
165
|
-
Para organización de scripts en sesiones de desarrollo: ver skill `sql-script-organizer`.
|
|
166
|
-
Para rollback de scripts: ver skill `sql-rollback-generator`.
|
|
167
|
-
|
|
168
|
-
## Scripts SQL
|
|
169
|
-
|
|
170
|
-
Modificaciones a BD solo mediante scripts SQL versionados en el proyecto. Nunca ejecutar INSERT/UPDATE/DELETE/DDL directamente contra la BD.
|
|
@@ -1,300 +0,0 @@
|
|
|
1
|
-
# FE-BE Integration — reglas transversales
|
|
2
|
-
|
|
3
|
-
> Anchor: `agent-workflow:fe-be-integration`. Reglas canónicas para la integración Frontend ↔ Backend en proyectos agent-workflow a partir de qtc-dev v2.6 (session013) — actualizado en v2.7 (session015) para reflejar el modelo phased extendido Phase 0-5. Aplica a sesiones `flow=dev` con `## Type: feature|refactor` y a refactors guiados por el skill `agent-workflow:refactor`.
|
|
4
|
-
>
|
|
5
|
-
> Origen: session013-dev-flujo-feature-refactor-phased + session015-dev-aplicar-flujo-fases-extendido. Prior art: [JSON Merge Patch RFC 7396](https://datatracker.ietf.org/doc/html/rfc7396), [Walking Skeleton — Cockburn](https://codeclimate.com/blog/kickstart-your-next-project-with-a-walking-skeleton), [CQRS — Microsoft Learn](https://learn.microsoft.com/en-us/azure/architecture/patterns/cqrs).
|
|
6
|
-
|
|
7
|
-
## Resumen ejecutivo
|
|
8
|
-
|
|
9
|
-
| Regla | Qué aplicar | Por qué |
|
|
10
|
-
|---|---|---|
|
|
11
|
-
| **R1 — Sparse DTO unificado** | Mismo DTO para create + edit, todos los campos nullable. `null` = "no tocar". | Reduce duplicación, hace explícita la intención del FE, simplifica el BE. |
|
|
12
|
-
| **R2 — PATCH para edit** | `@PatchMapping` en BE, `http.patch()` en FE. POST queda solo para create. | Semántica HTTP correcta. PATCH = mutación parcial; PUT = reemplazo total. |
|
|
13
|
-
| **R3 — FE envía solo cambios** | El FE construye el payload con campos modificados; el resto se omite o queda `null`. | Reduce payload, evita race conditions con campos no editados. |
|
|
14
|
-
| **R4 — Sin fallbacks que oculten errores** | Prohibido `catchError(() => of([]))` en FE. Prohibido `try/catch` que retorne mock en BE durante migraciones. | Los errores deben fallar ruidosamente para detectarse en cert antes de prod. |
|
|
15
|
-
| **R5 — Validación en BE con Bean Validation** | DTOs con `@NotNull`/`@Size`/etc. Errores → 400 estructurado con `field` y `message`. | El FE muestra el error sin lógica adicional. |
|
|
16
|
-
| **R6 — DB stub-first** | Funciones/SP nuevas arrancan en Phase 0 devolviendo mock. Implementación real en Phase 1/2. | Separación de cableado vs lógica; permite testear el contrato antes de comprometer SQL. |
|
|
17
|
-
|
|
18
|
-
## R1 — Sparse DTO unificado
|
|
19
|
-
|
|
20
|
-
### Patrón
|
|
21
|
-
|
|
22
|
-
Un único DTO `<Feature>SaveRequest` que sirve para POST (create) y PATCH (edit). Todos los campos son nullable. Convención:
|
|
23
|
-
|
|
24
|
-
- En **POST** (create): el FE envía todos los campos requeridos; los opcionales pueden venir `null`.
|
|
25
|
-
- En **PATCH** (edit): el FE envía solo los campos que cambian; el resto omitido o `null` significa "no tocar".
|
|
26
|
-
|
|
27
|
-
### Tradeoff aceptado
|
|
28
|
-
|
|
29
|
-
**No se puede setear un campo a `null` intencionalmente.** Si el dominio requiere "limpiar a null" un campo (ej. fecha de baja → null), modelarlo como:
|
|
30
|
-
- Endpoint dedicado (`POST /api/<feature>/{id}/limpiar-fecha-baja`) para semántica clara.
|
|
31
|
-
- O bien, campo separado `clearFechaBaja: boolean` en el DTO.
|
|
32
|
-
|
|
33
|
-
Esto es deliberado: optar por simplicidad sobre completitud (vs. JSON Patch RFC 6902 que sí permite operaciones explícitas pero añade complejidad).
|
|
34
|
-
|
|
35
|
-
### Ejemplo Java/Spring
|
|
36
|
-
|
|
37
|
-
```java
|
|
38
|
-
public record CategoriaSaveRequest(
|
|
39
|
-
@Size(max = 100) String nombre,
|
|
40
|
-
@Size(max = 500) String descripcion,
|
|
41
|
-
Boolean activo,
|
|
42
|
-
Integer ordenVisual
|
|
43
|
-
) {}
|
|
44
|
-
|
|
45
|
-
@RestController
|
|
46
|
-
@RequestMapping("/api/categorias")
|
|
47
|
-
@RequiredArgsConstructor
|
|
48
|
-
public class CategoriasController {
|
|
49
|
-
|
|
50
|
-
private final CategoriasService service;
|
|
51
|
-
|
|
52
|
-
@PostMapping
|
|
53
|
-
public ResponseEntity<CategoriaResponse> create(
|
|
54
|
-
@Valid @RequestBody CategoriaSaveRequest req
|
|
55
|
-
) {
|
|
56
|
-
return ResponseEntity.ok(service.create(req));
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
@PatchMapping("/{id}")
|
|
60
|
-
public ResponseEntity<CategoriaResponse> edit(
|
|
61
|
-
@PathVariable Long id,
|
|
62
|
-
@Valid @RequestBody CategoriaSaveRequest req
|
|
63
|
-
) {
|
|
64
|
-
return ResponseEntity.ok(service.patch(id, req));
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
En el service, el método `patch(id, req)` ignora campos `null` del request:
|
|
70
|
-
|
|
71
|
-
```java
|
|
72
|
-
@Transactional
|
|
73
|
-
public CategoriaResponse patch(Long id, CategoriaSaveRequest req) {
|
|
74
|
-
Categoria entity = repo.findById(id).orElseThrow(NotFoundException::new);
|
|
75
|
-
if (req.nombre() != null) entity.setNombre(req.nombre());
|
|
76
|
-
if (req.descripcion() != null) entity.setDescripcion(req.descripcion());
|
|
77
|
-
if (req.activo() != null) entity.setActivo(req.activo());
|
|
78
|
-
if (req.ordenVisual() != null) entity.setOrdenVisual(req.ordenVisual());
|
|
79
|
-
return mapper.toResponse(repo.save(entity));
|
|
80
|
-
}
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
### Ejemplo Angular/TypeScript
|
|
84
|
-
|
|
85
|
-
```typescript
|
|
86
|
-
export interface CategoriaSaveRequest {
|
|
87
|
-
nombre?: string | null;
|
|
88
|
-
descripcion?: string | null;
|
|
89
|
-
activo?: boolean | null;
|
|
90
|
-
ordenVisual?: number | null;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
@Injectable({ providedIn: 'root' })
|
|
94
|
-
export class CategoriasApiService {
|
|
95
|
-
private readonly base = `${environment.apiUrl}/api/categorias`;
|
|
96
|
-
|
|
97
|
-
constructor(private http: HttpClient) {}
|
|
98
|
-
|
|
99
|
-
create(req: CategoriaSaveRequest): Observable<CategoriaResponse> {
|
|
100
|
-
return this.http.post<CategoriaResponse>(this.base, req);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
edit(id: number, cambios: CategoriaSaveRequest): Observable<CategoriaResponse> {
|
|
104
|
-
return this.http.patch<CategoriaResponse>(`${this.base}/${id}`, cambios);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
En el componente de edit, el FE construye el payload solo con cambios:
|
|
110
|
-
|
|
111
|
-
```typescript
|
|
112
|
-
guardar(): void {
|
|
113
|
-
const original = this.categoriaOriginal;
|
|
114
|
-
const form = this.form.value;
|
|
115
|
-
const cambios: CategoriaSaveRequest = {};
|
|
116
|
-
if (form.nombre !== original.nombre) cambios.nombre = form.nombre;
|
|
117
|
-
if (form.descripcion !== original.descripcion) cambios.descripcion = form.descripcion;
|
|
118
|
-
if (form.activo !== original.activo) cambios.activo = form.activo;
|
|
119
|
-
if (form.ordenVisual !== original.ordenVisual) cambios.ordenVisual = form.ordenVisual;
|
|
120
|
-
|
|
121
|
-
if (Object.keys(cambios).length === 0) return; // nada cambió
|
|
122
|
-
|
|
123
|
-
this.api.edit(original.id, cambios).subscribe({
|
|
124
|
-
next: (res) => this.toast.success('Guardado'),
|
|
125
|
-
error: (err) => this.errorHandler.handle(err) // R4: no silenciar
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
## R2 — PATCH para edit
|
|
131
|
-
|
|
132
|
-
| Verbo | Cuándo | DTO | Idempotente |
|
|
133
|
-
|---|---|---|---|
|
|
134
|
-
| `POST /api/<feature>` | Crear nueva entidad | `<Feature>SaveRequest` (todos los required cargados) | No |
|
|
135
|
-
| `GET /api/<feature>` y `GET /api/<feature>/{id}` | Listar / obtener | — | Sí |
|
|
136
|
-
| `PATCH /api/<feature>/{id}` | Editar parcial | `<Feature>SaveRequest` (solo campos cambiados) | No (orden importa si dos PATCHes pisan el mismo campo) |
|
|
137
|
-
| `DELETE /api/<feature>/{id}` | Eliminar | — | Sí |
|
|
138
|
-
|
|
139
|
-
**No usar `PUT`** salvo casos excepcionales (replace total con todos los campos). El default es PATCH.
|
|
140
|
-
|
|
141
|
-
## R3 — FE envía solo cambios
|
|
142
|
-
|
|
143
|
-
Reduce payload y evita pisar campos no editados. Implementación: FE compara `formValue` con `entidadOriginal` y arma diff. Ver ejemplo en R1.
|
|
144
|
-
|
|
145
|
-
**Anti-pattern**: enviar todo el formulario incluyendo campos no editados — equivale a PUT y rompe la semántica de PATCH sparse.
|
|
146
|
-
|
|
147
|
-
## R4 — Sin fallbacks que oculten errores
|
|
148
|
-
|
|
149
|
-
### Prohibido en FE
|
|
150
|
-
|
|
151
|
-
```typescript
|
|
152
|
-
// ❌ NO HACER: silencia errores HTTP
|
|
153
|
-
this.api.list().pipe(
|
|
154
|
-
catchError(() => of([])) // <-- usuario nunca ve el error
|
|
155
|
-
).subscribe(items => this.items = items);
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
```typescript
|
|
159
|
-
// ✅ HACER: propagar al usuario via toast/handler
|
|
160
|
-
this.api.list().subscribe({
|
|
161
|
-
next: (items) => this.items = items,
|
|
162
|
-
error: (err) => this.errorHandler.handle(err)
|
|
163
|
-
});
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
### Prohibido en BE durante migraciones
|
|
167
|
-
|
|
168
|
-
```java
|
|
169
|
-
// ❌ NO HACER: fallback al método legacy oculta bugs
|
|
170
|
-
public List<Categoria> listar() {
|
|
171
|
-
try {
|
|
172
|
-
return nuevoListarConSparse();
|
|
173
|
-
} catch (Exception e) {
|
|
174
|
-
log.warn("Nuevo método falló, usando legacy", e);
|
|
175
|
-
return legacyListar(); // <-- usuario nunca se entera
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
```java
|
|
181
|
-
// ✅ HACER: dejar que el nuevo método falle ruidosamente
|
|
182
|
-
public List<Categoria> listar() {
|
|
183
|
-
return nuevoListarConSparse();
|
|
184
|
-
}
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
Si necesitás rollout gradual, usá feature flag explícita:
|
|
188
|
-
|
|
189
|
-
```java
|
|
190
|
-
public List<Categoria> listar() {
|
|
191
|
-
if (featureFlags.isEnabled("categorias-sparse-dto")) {
|
|
192
|
-
return nuevoListarConSparse();
|
|
193
|
-
}
|
|
194
|
-
return legacyListar();
|
|
195
|
-
}
|
|
196
|
-
```
|
|
197
|
-
|
|
198
|
-
La feature flag es **explícita y observable** (vs. fallback silencioso).
|
|
199
|
-
|
|
200
|
-
## R5 — Validación en BE con Bean Validation
|
|
201
|
-
|
|
202
|
-
> **Phase 3 marker (v2.7+)**: Bean Validation se materializa en **Phase 3 — Validaciones / Correcciones**, no en Phase 2 — Escritura. Phase 2 produce endpoints funcionales que mutan estado pero pueden devolver 500 ante input malformado. Phase 3 agrega `@NotNull`/`@Size`/etc. + handler global 400 estructurado. Trade-off aceptado: temporalmente el código de Phase 2 no es robusto contra input malformado; el usuario debe ser consciente de no testear edge cases hasta cerrar Phase 3.
|
|
203
|
-
|
|
204
|
-
```java
|
|
205
|
-
public record CategoriaSaveRequest(
|
|
206
|
-
@NotNull(message = "El nombre es obligatorio")
|
|
207
|
-
@Size(min = 1, max = 100, message = "Entre 1 y 100 caracteres")
|
|
208
|
-
String nombre,
|
|
209
|
-
|
|
210
|
-
@Size(max = 500)
|
|
211
|
-
String descripcion,
|
|
212
|
-
|
|
213
|
-
@NotNull
|
|
214
|
-
Boolean activo,
|
|
215
|
-
|
|
216
|
-
@PositiveOrZero(message = "Debe ser ≥0")
|
|
217
|
-
Integer ordenVisual
|
|
218
|
-
) {}
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
Handler global devuelve estructura uniforme:
|
|
222
|
-
|
|
223
|
-
```java
|
|
224
|
-
@RestControllerAdvice
|
|
225
|
-
public class GlobalExceptionHandler {
|
|
226
|
-
|
|
227
|
-
@ExceptionHandler(MethodArgumentNotValidException.class)
|
|
228
|
-
public ResponseEntity<ValidationErrorResponse> onValidation(MethodArgumentNotValidException ex) {
|
|
229
|
-
var fields = ex.getBindingResult().getFieldErrors().stream()
|
|
230
|
-
.map(fe -> new FieldError(fe.getField(), fe.getDefaultMessage()))
|
|
231
|
-
.toList();
|
|
232
|
-
return ResponseEntity.badRequest().body(new ValidationErrorResponse(fields));
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
public record ValidationErrorResponse(List<FieldError> errors) {}
|
|
237
|
-
public record FieldError(String field, String message) {}
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
El FE recibe 400 con estructura predecible y muestra los errores junto a cada campo.
|
|
241
|
-
|
|
242
|
-
**Limitación con Sparse DTO**: `@NotNull` en el DTO unificado **NO se valida en PATCH**, porque PATCH permite enviar campos `null`. Soluciones:
|
|
243
|
-
|
|
244
|
-
- **Validation groups**: `@NotNull(groups = OnCreate.class)` y aplicar grupo distinto en POST vs PATCH.
|
|
245
|
-
- **DTO separado solo para POST**: `<Feature>CreateRequest extends <Feature>SaveRequest` con campos requeridos no-null. Aceptable cuando el escenario lo justifica.
|
|
246
|
-
|
|
247
|
-
Documentar la decisión en DECISIONS.md de la sesión.
|
|
248
|
-
|
|
249
|
-
## R6 — DB stub-first
|
|
250
|
-
|
|
251
|
-
> **Flujo phased v2.7+**: Phase 0 mock → Phase 1 query real → Phase 3 validaciones de input/integridad referencial. El stub en Phase 0 permite probar el cableado e2e + routing sin comprometer SQL real.
|
|
252
|
-
|
|
253
|
-
En Phase 0 (contrato), funciones/SP nuevas devuelven mock:
|
|
254
|
-
|
|
255
|
-
```sql
|
|
256
|
-
-- Phase 0: stub
|
|
257
|
-
CREATE OR REPLACE FUNCTION fn_categorias_listar(
|
|
258
|
-
p_filtro TEXT DEFAULT NULL,
|
|
259
|
-
p_pagina INT DEFAULT 1,
|
|
260
|
-
p_tamanio INT DEFAULT 20
|
|
261
|
-
) RETURNS JSONB AS $$
|
|
262
|
-
BEGIN
|
|
263
|
-
-- TODO Phase 1: implementar query real con filtro y paginación
|
|
264
|
-
RETURN '[]'::jsonb;
|
|
265
|
-
END;
|
|
266
|
-
$$ LANGUAGE plpgsql STABLE;
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
```sql
|
|
270
|
-
-- Phase 1: implementación real
|
|
271
|
-
CREATE OR REPLACE FUNCTION fn_categorias_listar(
|
|
272
|
-
p_filtro TEXT DEFAULT NULL,
|
|
273
|
-
p_pagina INT DEFAULT 1,
|
|
274
|
-
p_tamanio INT DEFAULT 20
|
|
275
|
-
) RETURNS JSONB AS $$
|
|
276
|
-
WITH base AS (
|
|
277
|
-
SELECT id, nombre, descripcion, activo, orden_visual
|
|
278
|
-
FROM esq_admin.tb_categorias
|
|
279
|
-
WHERE p_filtro IS NULL OR nombre ILIKE '%' || p_filtro || '%'
|
|
280
|
-
)
|
|
281
|
-
SELECT COALESCE(jsonb_agg(row_to_json(base)), '[]'::jsonb)
|
|
282
|
-
FROM base
|
|
283
|
-
ORDER BY orden_visual
|
|
284
|
-
OFFSET (p_pagina - 1) * p_tamanio
|
|
285
|
-
LIMIT p_tamanio;
|
|
286
|
-
$$ LANGUAGE sql STABLE;
|
|
287
|
-
```
|
|
288
|
-
|
|
289
|
-
Reglas de `agent-workflow:coding-standards/references/database-conventions.md` siguen aplicando (header de 4 líneas, idempotencia, schema explícito, BEGIN/COMMIT en scripts).
|
|
290
|
-
|
|
291
|
-
## Refs
|
|
292
|
-
|
|
293
|
-
- `agent-workflow:coding-standards/references/java-spring.md` — convenciones Spring Boot (Constructor Injection, @Transactional, records).
|
|
294
|
-
- `agent-workflow:coding-standards/references/angular-typescript.md` — convenciones Angular (HttpClient, ApiService, environments).
|
|
295
|
-
- `agent-workflow:coding-standards/references/database-conventions.md` — convenciones BD agent-workflow (schemas, naming, scripts).
|
|
296
|
-
- `agent-workflow:implement/SKILL.md` — phased mode (Phase 0/1/2 + gate M6 entre phases; S7 design-review antes de Phase 0 desde planning closure).
|
|
297
|
-
- `agent-workflow:refactor/SKILL.md` — Strangler Fig para refactors completos.
|
|
298
|
-
- `agent-workflow:prompts-catalog#M6,S7` — gates phased (S7 design-review antes de Phase 0; M6 entre phases). M9 retirado v2.8+.
|
|
299
|
-
- [JSON Merge Patch RFC 7396](https://datatracker.ietf.org/doc/html/rfc7396) — spec del comportamiento PATCH sparse (agent-workflow usa **convención simple sparse** en lugar del Content-Type RFC 7396, pero la semántica conceptual es idéntica salvo el caso "set to null intencional").
|
|
300
|
-
- [JSON Patch RFC 6902](https://datatracker.ietf.org/doc/html/rfc6902) — alternativa con array de operaciones; descartada por complejidad.
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
# Estructura de Proyecto Frontend
|
|
2
|
-
|
|
3
|
-
Convenciones de estructura para aplicaciones Angular de tu ecosistema.
|
|
4
|
-
|
|
5
|
-
## Versiones en uso
|
|
6
|
-
|
|
7
|
-
- Angular 15 (pefectivo-front-angular)
|
|
8
|
-
- Angular 16 (core-frontend-miscuotas-externo)
|
|
9
|
-
- TypeScript 4.9 - 5.1
|
|
10
|
-
|
|
11
|
-
## Arquitectura `@data` / `@presentation`
|
|
12
|
-
|
|
13
|
-
```
|
|
14
|
-
src/app/
|
|
15
|
-
├── @data/ ← Capa de datos
|
|
16
|
-
│ ├── interfaces/ ← Interfaces TypeScript (espejean el backend)
|
|
17
|
-
│ ├── services/ ← ApiService central + services de datos
|
|
18
|
-
│ ├── guards/ ← Route guards
|
|
19
|
-
│ ├── interceptors/ ← HTTP interceptors
|
|
20
|
-
│ └── directive/ ← Directivas custom
|
|
21
|
-
├── @presentation/ ← Capa de presentación
|
|
22
|
-
│ ├── components/ ← Componentes de UI organizados por feature
|
|
23
|
-
│ ├── services/ ← Services de negocio/UI que consumen ApiService
|
|
24
|
-
│ ├── shared/ ← Componentes y módulos compartidos
|
|
25
|
-
│ ├── auth/ ← Módulo de autenticación (si aplica)
|
|
26
|
-
│ ├── home/ ← Página principal
|
|
27
|
-
│ └── pages/ ← Páginas de la aplicación
|
|
28
|
-
├── Utils/ ← Utilidades (armarPayload, requestFilter, etc.)
|
|
29
|
-
├── app.module.ts
|
|
30
|
-
├── app-routing.module.ts
|
|
31
|
-
└── app.component.ts
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## ApiService — Wrapper HTTP central
|
|
35
|
-
|
|
36
|
-
Todas las llamadas HTTP pasan por `@data/services/api.service.ts`. No usar `HttpClient` directamente en otros services.
|
|
37
|
-
|
|
38
|
-
```typescript
|
|
39
|
-
@Injectable({ providedIn: 'root' })
|
|
40
|
-
export class ApiService {
|
|
41
|
-
constructor(
|
|
42
|
-
private toast: ToastService,
|
|
43
|
-
private http: HttpClient,
|
|
44
|
-
private storageService: StorageService
|
|
45
|
-
) {}
|
|
46
|
-
|
|
47
|
-
get(path: string, params?: any): Observable<any> {
|
|
48
|
-
return this.http.get(path, { params }).pipe(
|
|
49
|
-
catchError((error: HttpErrorResponse) => {
|
|
50
|
-
if (error.status === 401) {
|
|
51
|
-
window.location.href = this.storage.url; // Redirección en 401
|
|
52
|
-
}
|
|
53
|
-
const errorMessage = error?.error?.status?.error?.messages?.[0] ?? 'Error inesperado';
|
|
54
|
-
this.toast.showToast(errorMessage, 'danger');
|
|
55
|
-
return this.formatErrors(error);
|
|
56
|
-
})
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
post(path: string, body: any): Observable<any> { /* mismo patrón */ }
|
|
61
|
-
put(path: string, body: object = {}): Observable<any> { /* mismo patrón */ }
|
|
62
|
-
patch(path: string, body: object = {}): Observable<any> { /* mismo patrón */ }
|
|
63
|
-
delete(path: string): Observable<any> { /* mismo patrón */ }
|
|
64
|
-
}
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
## Interfaces — Espejeo del backend
|
|
68
|
-
|
|
69
|
-
En `@data/interfaces/` se definen interfaces que reflejan las estructuras del backend:
|
|
70
|
-
|
|
71
|
-
```typescript
|
|
72
|
-
// generics.ts — Equivale a RespBase<T> del backend
|
|
73
|
-
export interface IResponsePayload<T> {
|
|
74
|
-
trace: Trace;
|
|
75
|
-
status: Status;
|
|
76
|
-
payload: T;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
export interface IPayloadListG<T> {
|
|
80
|
-
count: number;
|
|
81
|
-
total: number;
|
|
82
|
-
items: T[];
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
export interface ResponseDTO {
|
|
86
|
-
identificador: number;
|
|
87
|
-
cuerpo: string;
|
|
88
|
-
mensaje: string;
|
|
89
|
-
}
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
Cada entidad de negocio tiene su propia interface: `solicitud.ts`, `credito.ts`, `cliente.ts`, `oferta.ts`, etc.
|
|
93
|
-
|
|
94
|
-
## Services de presentación
|
|
95
|
-
|
|
96
|
-
En `@presentation/services/` se crean services que consumen `ApiService`:
|
|
97
|
-
|
|
98
|
-
```typescript
|
|
99
|
-
@Injectable({ providedIn: 'root' })
|
|
100
|
-
export class SolicitudService {
|
|
101
|
-
constructor(private apiService: ApiService) {}
|
|
102
|
-
|
|
103
|
-
generaSolicitud(solicitud: Solicitud): Observable<IResponsePayload<ResponseDTO>> {
|
|
104
|
-
const request = armarPayload<any>(solicitud);
|
|
105
|
-
const url = `${env.API_PRESTAMO}v1/solicitud`;
|
|
106
|
-
return this.apiService.post(url, request);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
Patrón: URL desde environment + payload armado con `armarPayload()` de `Utils/`.
|
|
112
|
-
|
|
113
|
-
## Utilidades
|
|
114
|
-
|
|
115
|
-
`Utils/utils.ts` provee funciones compartidas:
|
|
116
|
-
- `armarPayload<T>(data)` — Envuelve datos en la estructura `ReqBase` con trace
|
|
117
|
-
- `requestFilter(params)` — Convierte un objeto a query string
|
|
118
|
-
|
|
119
|
-
## Environments
|
|
120
|
-
|
|
121
|
-
Tres archivos de configuración con URLs de API:
|
|
122
|
-
|
|
123
|
-
- `environment.ts` — Base (vacío)
|
|
124
|
-
- `environment.dev.ts` — Desarrollo/certificación
|
|
125
|
-
- `environment.prod.ts` — Producción
|
|
126
|
-
|
|
127
|
-
```typescript
|
|
128
|
-
export const environment = {
|
|
129
|
-
production: false,
|
|
130
|
-
API_PRESTAMO: 'https://api-cert.example.com/',
|
|
131
|
-
API_SOLICITUD: 'https://api-solicitud-cert.example.com/',
|
|
132
|
-
API_IDENTIDAD: '',
|
|
133
|
-
API_MOTOR: '',
|
|
134
|
-
};
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
## Dependencias comunes
|
|
138
|
-
|
|
139
|
-
- **Angular Material** — Componentes UI (`@angular/material`, `@angular/cdk`)
|
|
140
|
-
- **Bootstrap** — Grid y utilidades CSS
|
|
141
|
-
- **ngx-toastr** — Notificaciones toast
|
|
142
|
-
- **RxJS** — Programación reactiva
|
|
143
|
-
- **moment** — Manejo de fechas
|
|
144
|
-
- **STOMP/SockJS** — WebSockets para notificaciones en tiempo real
|
|
145
|
-
|
|
146
|
-
## Componentes compartidos (`shared/`)
|
|
147
|
-
|
|
148
|
-
Convención: todo patrón que aparezca en **2+ vistas** vive en `@presentation/shared/` (o `@shared/` según convención del proyecto).
|
|
149
|
-
|
|
150
|
-
**Heurística de extracción:** al empezar una vista nueva, escanear `shared/` antes de codear. Si un patrón recurrente aún no está en `shared/`, proponer **extracción explícita con un diff aislado** — no mezclar con el feature nuevo (dos commits separados).
|
|
151
|
-
|
|
152
|
-
**Candidatos típicos:**
|
|
153
|
-
|
|
154
|
-
- `readonly-input` — input + candado + fondo atenuado.
|
|
155
|
-
- `section-card` — wrapper con section-title + icono + contenido.
|
|
156
|
-
- `switch-aligned` — switch con label alineado verticalmente.
|
|
157
|
-
- `combo-hint` — select + hint muted debajo.
|
|
158
|
-
- `primary-button-spinner` — botón de acción con estado de loading.
|
|
159
|
-
|
|
160
|
-
**Regla para el asistente:** al implementar un patrón del skill `frontend-design` en código, primero `grep`/`glob` por nombres similares en `shared/`; si existe, usar; si no, preguntar al usuario si vale extraerlo antes de inline-ar.
|
|
161
|
-
|
|
162
|
-
## Framework-first CSS
|
|
163
|
-
|
|
164
|
-
Aplicar el principio ~90/10 documentado en `frontend-design` (§11): utilities del framework primero, CSS custom sólo cuando el framework no da la variante o la combinación se repite 5+ veces y amerita una clase semántica.
|
|
165
|
-
|
|
166
|
-
En este monorepo: **SCSS + Bootstrap + Angular Material**. Regla práctica:
|
|
167
|
-
|
|
168
|
-
- **Spacing / flex / grid / tipografía / colores semánticos** → utilities Bootstrap (`p-3`, `d-flex align-items-center gap-2`, `text-muted small`, `fw-bold`, `text-danger`).
|
|
169
|
-
- **Componentes complejos** (autocomplete, datepicker, dialog) → Angular Material.
|
|
170
|
-
- **SCSS custom** reservado para **tema**: colores del sistema (en secciones específicas), dimensiones custom de switch (3em×1.5em), tema de readonly (fondo atenuado con candado).
|
|
171
|
-
|
|
172
|
-
**Anti-patrón:** reescribir `.my-card { border: 1px solid; padding: 1rem; box-shadow: ... }` cuando `border rounded-3 shadow-sm p-3` lo resuelve.
|
|
173
|
-
|
|
174
|
-
**Criterio práctico:** antes de escribir una regla CSS custom, revisar utilities del framework. Si no existe la utility, evaluar si el tema aplicará a 3+ lugares antes de crear clase.
|
|
175
|
-
|
|
176
|
-
## Build
|
|
177
|
-
|
|
178
|
-
- Producción: `npm run build:prod` → `ng build -c=production`
|
|
179
|
-
- Desarrollo: `npm run build:dev` → `ng build -c=development`
|
|
180
|
-
- Serve local: `npm run start:dev` → `ng serve -c=development`
|
|
181
|
-
- Tests: `ng test --watch=false`
|
|
182
|
-
- Estilos: SCSS
|