@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
package/skills/agent-workflow/standards/frontend-design/references/feedback-toasts-patterns.md
DELETED
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
# Patrones de feedback: toasts, alerts, loading, empty, errores
|
|
2
|
-
|
|
3
|
-
Principios de diseño para feedback al usuario: notificaciones transitorias, estados de carga, formularios con validación, estados vacíos, confirmación de acciones destructivas y propagación de errores HTTP. Agnóstico a framework.
|
|
4
|
-
|
|
5
|
-
Para el código del stack (`ToastService`, `LoadingService`, operadores RxJS para errores), ver `coding-standards/references/<stack>.md`.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## 1. Toasts: notificaciones transitorias
|
|
10
|
-
|
|
11
|
-
El toast es la forma por defecto de feedback tras una acción del usuario que tiene un resultado global (guardado exitoso, error de backend, confirmación no bloqueante).
|
|
12
|
-
|
|
13
|
-
**Cuatro tipos con títulos en español:**
|
|
14
|
-
|
|
15
|
-
| Tipo | Título mostrado | Uso típico |
|
|
16
|
-
|------|-----------------|------------|
|
|
17
|
-
| `success` | "Correcto" | Guardado, creación o actualización exitosa. |
|
|
18
|
-
| `info` | "Información" | Acciones informativas no críticas (p. ej. "copiado al portapapeles"). |
|
|
19
|
-
| `warning` | "Advertencia" | Validación fallida en client, límite de plan alcanzado, estado que requiere atención sin bloquear. |
|
|
20
|
-
| `danger` | "Error" | Errores HTTP, errores de negocio no capturables inline. |
|
|
21
|
-
|
|
22
|
-
**Reglas:**
|
|
23
|
-
|
|
24
|
-
- **Duración:** default del framework (~5 s). No extender arbitrariamente — si el mensaje es importante, va como alert inline, no toast.
|
|
25
|
-
- **Posición:** esquina superior-derecha (o top-center en mobile).
|
|
26
|
-
- **Singularidad:** evitar apilar varios toasts por una sola acción. Si la operación produce N mensajes, consolidarlos en uno o usar una alerta inline.
|
|
27
|
-
- **Mensajes específicos:** "Usuario guardado correctamente" > "Operación exitosa". "No se pudo cargar el listado" > "Error".
|
|
28
|
-
|
|
29
|
-
**Stack del proyecto:** `ToastService` wrapper de `ngx-toastr` centralizado. Ver detalles técnicos en `coding-standards/references/angular-typescript.md` (signature de `showToast(msg, type)` y guard de singleness).
|
|
30
|
-
|
|
31
|
-
---
|
|
32
|
-
|
|
33
|
-
## 2. Cuándo disparar cada tipo
|
|
34
|
-
|
|
35
|
-
**`success`:**
|
|
36
|
-
|
|
37
|
-
- Después de guardar/crear/actualizar exitoso.
|
|
38
|
-
- Después de completar un wizard.
|
|
39
|
-
- Después de copiar o exportar algo.
|
|
40
|
-
|
|
41
|
-
**`warning`:**
|
|
42
|
-
|
|
43
|
-
- Usuario intenta enviar formulario con errores de validación (siempre en conjunto con `markAllAsTouched()` — ver §4).
|
|
44
|
-
- Acción parcialmente exitosa ("Se eliminaron 3 de 5 elementos").
|
|
45
|
-
- Conflicto resuelto automáticamente por default.
|
|
46
|
-
|
|
47
|
-
**`danger`:**
|
|
48
|
-
|
|
49
|
-
- HTTP 4xx/5xx no silenciable (propagar al usuario, ver `coding-standards/SKILL.md` §Manejo de errores HTTP).
|
|
50
|
-
- Error de negocio devuelto por la API (`status.error.messages`).
|
|
51
|
-
- Operación crítica que falló (p. ej. sincronización de rol post-creación de usuario).
|
|
52
|
-
|
|
53
|
-
**`info`:**
|
|
54
|
-
|
|
55
|
-
- Feedback no crítico: "Se copió al portapapeles", "Sesión se cerrará en 5 minutos".
|
|
56
|
-
- Eventos de sistema con los que el usuario debe contar.
|
|
57
|
-
|
|
58
|
-
**Regla transversal:** nunca silenciar errores HTTP con `catchError → []`. Los errores **siempre** se propagan al usuario vía toast (u otro mecanismo explícito). Ver `coding-standards/SKILL.md` §Manejo de errores HTTP.
|
|
59
|
-
|
|
60
|
-
---
|
|
61
|
-
|
|
62
|
-
## 3. Loading: feedback de operaciones async
|
|
63
|
-
|
|
64
|
-
Dos niveles de loading, usar según contexto:
|
|
65
|
-
|
|
66
|
-
### 3.1 Page-level loading (recomendado para cargas de navegación)
|
|
67
|
-
|
|
68
|
-
Overlay global que cubre la aplicación mientras se resuelve una operación costosa (carga inicial de un listado, guardado de formulario que navega a otra vista).
|
|
69
|
-
|
|
70
|
-
**Reglas:**
|
|
71
|
-
|
|
72
|
-
- Mostrado/ocultado por un servicio centralizado (`LoadingService.show()` / `.hide()`).
|
|
73
|
-
- **Paired siempre:** cada `show()` tiene un `hide()` correspondiente en **next y error paths**. Nunca dejar el overlay colgado.
|
|
74
|
-
- El overlay se renderiza en la raíz de la app (no por vista), de forma que cubre sidebar, toolbar y contenido.
|
|
75
|
-
- Opcional: icono o mensaje breve centrado ("Cargando...") para evitar pantalla en blanco si la request tarda.
|
|
76
|
-
|
|
77
|
-
### 3.2 Inline loading (para operaciones localizadas)
|
|
78
|
-
|
|
79
|
-
Spinner embebido en el control que dispara la operación — no bloquea el resto de la UI.
|
|
80
|
-
|
|
81
|
-
**Patrones:**
|
|
82
|
-
|
|
83
|
-
- **Botón primario durante guardado:** spinner dentro del botón + texto cambiado a gerundio + `disabled` en ambos botones del footer:
|
|
84
|
-
```html
|
|
85
|
-
<button class="btn btn-primary" [disabled]="saving">
|
|
86
|
-
<span *ngIf="saving" class="spinner-border spinner-border-sm me-1"></span>
|
|
87
|
-
{{ saving ? 'Guardando...' : 'Guardar' }}
|
|
88
|
-
</button>
|
|
89
|
-
```
|
|
90
|
-
- **Tabla durante refresh:** overlay semitransparente sobre el `data-table` + spinner centrado, dejando filas visibles atrás con `opacity: 0.5`.
|
|
91
|
-
|
|
92
|
-
**Regla:** no mezclar overlay global + spinner inline para la misma acción. Elegir uno según el contexto:
|
|
93
|
-
|
|
94
|
-
- Acción que navega / es bloqueante → page-level.
|
|
95
|
-
- Acción en su vista, resultado en la misma vista → inline.
|
|
96
|
-
|
|
97
|
-
---
|
|
98
|
-
|
|
99
|
-
## 4. Validación inline de formularios
|
|
100
|
-
|
|
101
|
-
El usuario debe saber qué campo tiene problema **antes** de intentar guardar, y qué hacer si lo intenta con errores.
|
|
102
|
-
|
|
103
|
-
**Patrón:**
|
|
104
|
-
|
|
105
|
-
```html
|
|
106
|
-
<label class="form-label">Código</label>
|
|
107
|
-
<input type="text" class="form-control" formControlName="codigo"
|
|
108
|
-
[class.is-invalid]="form.controls.codigo.touched && form.controls.codigo.invalid">
|
|
109
|
-
<div class="invalid-message"
|
|
110
|
-
*ngIf="form.controls.codigo.touched && form.controls.codigo.invalid">
|
|
111
|
-
Ingresa un código válido con formato <code>modulo.accion</code>.
|
|
112
|
-
</div>
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
**Reglas:**
|
|
116
|
-
|
|
117
|
-
- Mensaje de error **debajo del campo**, específico al problema ("formato `modulo.accion`" > "valor inválido").
|
|
118
|
-
- Se muestra sólo cuando el control está `touched` (el usuario ya pasó por el campo). No mostrar errores al entrar a la vista.
|
|
119
|
-
- Color del texto del error: semánticamente `danger` (rojo del framework). Tipografía pequeña (`small` o equivalente).
|
|
120
|
-
- Al intentar guardar con `form.invalid`: `markAllAsTouched()` + toast `warning` "Completa los campos obligatorios del formulario" — esto revela **todos** los errores a la vez y guía al usuario a arreglarlos.
|
|
121
|
-
|
|
122
|
-
**Clase `.invalid-message`:** CSS custom justificado (color del texto + tipografía) si el framework no ofrece la variante. Si Bootstrap 5 está disponible, preferir `invalid-feedback` (utility nativa) + `is-invalid` en el input.
|
|
123
|
-
|
|
124
|
-
---
|
|
125
|
-
|
|
126
|
-
## 5. Empty states
|
|
127
|
-
|
|
128
|
-
Cuando una lista, tabla o sección no tiene datos, mostrar un empty state claro en lugar de un área vacía.
|
|
129
|
-
|
|
130
|
-
**Variantes:**
|
|
131
|
-
|
|
132
|
-
### 5.1 Lista vacía tras filtro
|
|
133
|
-
|
|
134
|
-
El usuario buscó y no hubo resultados — el estado es temporal y dependiente de los filtros:
|
|
135
|
-
|
|
136
|
-
```html
|
|
137
|
-
<tr>
|
|
138
|
-
<td [attr.colspan]="columns.length" class="text-center text-muted py-4">
|
|
139
|
-
No se encontraron resultados con los filtros aplicados.
|
|
140
|
-
</td>
|
|
141
|
-
</tr>
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
### 5.2 Lista vacía inicial (nunca hubo datos)
|
|
145
|
-
|
|
146
|
-
La entidad todavía no se creó — invitar a crear el primero:
|
|
147
|
-
|
|
148
|
-
```html
|
|
149
|
-
<div class="empty-state text-center py-5">
|
|
150
|
-
<i class="fa fa-inbox fa-3x text-muted mb-3"></i>
|
|
151
|
-
<h5>Aún no hay sucursales</h5>
|
|
152
|
-
<p class="text-muted">Crea la primera para empezar.</p>
|
|
153
|
-
<button class="btn btn-primary">+ Nueva sucursal</button>
|
|
154
|
-
</div>
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
**Reglas:**
|
|
158
|
-
|
|
159
|
-
- Mensaje **específico** al dominio ("No se encontraron usuarios" > "Sin datos").
|
|
160
|
-
- En empty inicial (5.2): ícono grande + título + descripción + call-to-action.
|
|
161
|
-
- En empty filtrado (5.1): sólo texto — el usuario sabe qué hizo para llegar acá.
|
|
162
|
-
- Evitar empty states alarmistas ("¡Atención! No hay datos"). El vacío es normal, no un error.
|
|
163
|
-
|
|
164
|
-
**[shared-candidato] `empty-state`** — componente reutilizable con `[icon]`, `[title]`, `[message]`, `[actionLabel]`, `[actionClick]`. Observado hoy duplicado en 5+ vistas con clases custom divergentes (`.empty-state`, `.empty-permissions`, `.empty-transfer`, `.empty-roles`, `.empty-roles`). Unificar.
|
|
165
|
-
|
|
166
|
-
---
|
|
167
|
-
|
|
168
|
-
## 6. Errores HTTP: propagación al usuario
|
|
169
|
-
|
|
170
|
-
**Regla fundamental (de `coding-standards/SKILL.md` §Manejo de errores HTTP):** nunca silenciar. Todos los errores HTTP llegan al usuario de alguna forma.
|
|
171
|
-
|
|
172
|
-
**Dos caminos según contexto:**
|
|
173
|
-
|
|
174
|
-
### 6.1 Errores que bloquean el flujo actual
|
|
175
|
-
|
|
176
|
-
La request falló y el usuario no puede continuar con lo que estaba haciendo (p. ej. guardar devolvió 500).
|
|
177
|
-
|
|
178
|
-
- Mostrar como **toast `danger`** con mensaje específico del backend (`status.error.messages[0]`) o genérico si no viene ("No se pudo guardar. Intenta de nuevo.").
|
|
179
|
-
- No cerrar el formulario / modal — el usuario debe poder reintentar o corregir.
|
|
180
|
-
|
|
181
|
-
### 6.2 Errores que afectan carga de sección (no bloquean toda la app)
|
|
182
|
-
|
|
183
|
-
La carga inicial de un sub-listado falló pero el resto de la vista funciona.
|
|
184
|
-
|
|
185
|
-
- Mostrar como **alerta inline** (`alert alert-warning` o equivalente) dentro del área afectada:
|
|
186
|
-
```html
|
|
187
|
-
<div class="alert alert-warning py-2" *ngIf="store.error()">
|
|
188
|
-
{{ store.error() }}
|
|
189
|
-
</div>
|
|
190
|
-
```
|
|
191
|
-
- Incluir opción de reintento si tiene sentido.
|
|
192
|
-
|
|
193
|
-
**Recomendación:** para errores de guardado/sincronización/creación → **toast** (camino 6.1). Para errores de carga de lista/árbol/catálogo que se pueden mostrar inline → **alerta en el área** (camino 6.2). No hacer ambas cosas para el mismo error.
|
|
194
|
-
|
|
195
|
-
---
|
|
196
|
-
|
|
197
|
-
## 7. Confirmación de acciones destructivas
|
|
198
|
-
|
|
199
|
-
Antes de eliminar, desactivar o archivar, mostrar un diálogo de confirmación con contexto (ver `modal-patterns.md` §7):
|
|
200
|
-
|
|
201
|
-
- Tamaño `sm` o `md`.
|
|
202
|
-
- Título con pregunta clara.
|
|
203
|
-
- Body con impacto explícito (qué se elimina, si es reversible).
|
|
204
|
-
- Botón destructivo (color danger) con verbo específico ("Eliminar", "Desactivar"), no "Sí".
|
|
205
|
-
- Cancelar a la izquierda (default seguro).
|
|
206
|
-
|
|
207
|
-
**[shared-candidato] `confirm-dialog`** — componente reutilizable. Observado hoy como tres caminos distintos (`window.confirm()` del browser, `Swal.fire()` de SweetAlert2, modales ad-hoc por componente). Unificar en uno.
|
|
208
|
-
|
|
209
|
-
**Post-acción:**
|
|
210
|
-
|
|
211
|
-
- Éxito → toast `success` ("Elemento eliminado") + refresh del listado.
|
|
212
|
-
- Fallo → toast `danger` con razón + el elemento sigue en el listado (no removerlo optimistamente si la operación falló).
|
|
213
|
-
|
|
214
|
-
---
|
|
215
|
-
|
|
216
|
-
## 8. Skeletons, placeholders y animaciones de carga
|
|
217
|
-
|
|
218
|
-
Para experiencias de carga más cuidadas:
|
|
219
|
-
|
|
220
|
-
- **Skeleton rows** en tablas: filas con bloques grises que "laten" (shimmer animation) mientras cargan los datos reales. Ideal para listados con muchos ítems.
|
|
221
|
-
- **Placeholder de card**: rectángulo con líneas grises en lugar del contenido real.
|
|
222
|
-
|
|
223
|
-
**Regla:** los skeletons son un **nice-to-have**. Si el loading global cubre la operación adecuadamente, no complicarse. Reservar para listas donde el usuario espera >500 ms y el área vacía se siente rota.
|
|
224
|
-
|
|
225
|
-
---
|
|
226
|
-
|
|
227
|
-
## 9. Decisiones implícitas (recomendadas hacia adelante)
|
|
228
|
-
|
|
229
|
-
- **Toast para errores que bloquean** el flujo del usuario; alerta inline para errores de sección.
|
|
230
|
-
- **Loading global** para navegación y carga inicial; inline para refresh en la misma vista.
|
|
231
|
-
- **Validación doble:** inline en cada campo + toast warning al intentar guardar con `form.invalid`.
|
|
232
|
-
- **SweetAlert2 es legado** para confirmación. El camino a futuro es el `confirm-dialog` shared cuando se extraiga.
|
|
233
|
-
- **`window.confirm()` nunca** — rompe la consistencia visual.
|
|
234
|
-
|
|
235
|
-
---
|
|
236
|
-
|
|
237
|
-
## 10. Checklist de replicación
|
|
238
|
-
|
|
239
|
-
En cualquier vista nueva que dispare operaciones asíncronas:
|
|
240
|
-
|
|
241
|
-
- [ ] Loading global paired `show()`/`hide()` en next y error.
|
|
242
|
-
- [ ] Toast `success` al completar guardar/crear/eliminar exitosamente.
|
|
243
|
-
- [ ] Toast `danger` para errores HTTP que bloquean el flujo.
|
|
244
|
-
- [ ] Alerta inline para errores de carga de sección que no bloquean toda la app.
|
|
245
|
-
- [ ] Validación inline en cada campo del formulario + toast `warning` al intentar guardar inválido.
|
|
246
|
-
- [ ] Empty state con mensaje específico; empty inicial con CTA a "Crear el primero".
|
|
247
|
-
- [ ] Confirmación para acciones destructivas (verbo específico, color danger, reverseButtons).
|
|
248
|
-
- [ ] Nunca silenciar errores con `catchError(() => of([]))`.
|
|
249
|
-
- [ ] Revisar `shared/` antes de crear un nuevo toast/loading/empty custom.
|
|
@@ -1,278 +0,0 @@
|
|
|
1
|
-
# Patrones de formulario CRUD — editar / nuevo
|
|
2
|
-
|
|
3
|
-
Principios de diseño para vistas de mantenimiento (editar una entidad existente o crear una nueva). **Agnóstico a framework**: los ejemplos usan HTML con utilities Bootstrap, pero el principio aplica a cualquier stack (Tailwind, Material, Bulma, etc.).
|
|
4
|
-
|
|
5
|
-
Para el código específico del stack que implementa estos patrones, ver `coding-standards/references/<stack>.md`.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## 1. Modelo mental: UX single-slot sobre modelo multi-slot
|
|
10
|
-
|
|
11
|
-
La BD puede admitir N filas por relación (p. ej. N roles por usuario), pero el **formulario expone 1**. Decisión de diseño explícita: la UI simplifica el modelo para el caso dominante; el modelo flexible queda disponible para otros flujos (p. ej. un asignador multi-rol dedicado).
|
|
12
|
-
|
|
13
|
-
**Regla:** al guardar con single-slot se "reemplaza" — se desactivan/eliminan las demás filas y queda sólo la seleccionada. La sincronización vive en **una** capa (frontend contra microservicio, o backend al persistir), no en ambas.
|
|
14
|
-
|
|
15
|
-
Cuándo exponer N (multi-slot) en la UI: sólo cuando el dominio lo exige (p. ej. asignar múltiples responsables a un ticket). Si hay duda, empezar con single-slot y evolucionar.
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
## 2. Layout: 4 cards en 2 columnas, 1 dominio por card
|
|
20
|
-
|
|
21
|
-
Agrupar los campos del formulario por **dominio lógico**, una card por dominio:
|
|
22
|
-
|
|
23
|
-
```
|
|
24
|
-
┌─────────────────────────────┐ ┌─────────────────────────────┐
|
|
25
|
-
│ 👤 Persona │ │ 💼 Asignación │
|
|
26
|
-
│ Tipo doc. / Número (RO) │ │ Negocio / Sucursal │
|
|
27
|
-
│ Nombres / Apellidos │ │ Rol + hint │
|
|
28
|
-
└─────────────────────────────┘ └─────────────────────────────┘
|
|
29
|
-
┌─────────────────────────────┐ ┌─────────────────────────────┐
|
|
30
|
-
│ ✉ Contacto │ │ 🛡 Acceso │
|
|
31
|
-
│ Correo / Celular │ │ Estado / Bloqueado │
|
|
32
|
-
└─────────────────────────────┘ │ [switch] Cambiar clave │
|
|
33
|
-
└─────────────────────────────┘
|
|
34
|
-
[Cancelar] [Acción primaria]
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
**Implementación (Bootstrap, framework-first):**
|
|
38
|
-
|
|
39
|
-
```html
|
|
40
|
-
<form class="row g-4">
|
|
41
|
-
<div class="col-12 col-xl-6">
|
|
42
|
-
<div class="border rounded-3 shadow-sm p-3">
|
|
43
|
-
<div class="d-flex align-items-center gap-2 mb-3">
|
|
44
|
-
<span class="section-icon"><i class="fa fa-user"></i></span>
|
|
45
|
-
<h4 class="fw-bold mb-0">Persona</h4>
|
|
46
|
-
</div>
|
|
47
|
-
<!-- campos del dominio -->
|
|
48
|
-
</div>
|
|
49
|
-
</div>
|
|
50
|
-
<!-- más cards... -->
|
|
51
|
-
</form>
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
Equivalente Tailwind:
|
|
55
|
-
|
|
56
|
-
```html
|
|
57
|
-
<form class="grid grid-cols-1 xl:grid-cols-2 gap-4">
|
|
58
|
-
<div class="border rounded-lg shadow-sm p-4">
|
|
59
|
-
<div class="flex items-center gap-2 mb-3">
|
|
60
|
-
<span class="section-icon"><i class="fa fa-user"></i></span>
|
|
61
|
-
<h4 class="font-bold m-0">Persona</h4>
|
|
62
|
-
</div>
|
|
63
|
-
<!-- campos -->
|
|
64
|
-
</div>
|
|
65
|
-
</form>
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
**Regla:** un dominio por card. Si aparece un 5º dominio, añadir otra card; **no** mezclar dos dominios en una misma card por ahorrar espacio.
|
|
69
|
-
|
|
70
|
-
**CSS custom justificado:** sólo `.section-icon` (cuadradito 2rem×2rem con tema del proyecto) — el framework no ofrece esta variante como utility. El wrapper de la card **no** amerita custom: `border rounded-3 shadow-sm` lo expresa.
|
|
71
|
-
|
|
72
|
-
---
|
|
73
|
-
|
|
74
|
-
## 3. Campos readonly con candado
|
|
75
|
-
|
|
76
|
-
Los campos que no se editan en esta vista se marcan visual y funcionalmente:
|
|
77
|
-
|
|
78
|
-
```html
|
|
79
|
-
<div class="input-group input-readonly">
|
|
80
|
-
<span class="input-group-text"><i class="fa fa-lock"></i></span>
|
|
81
|
-
<input type="text" class="form-control" value="12345678" readonly>
|
|
82
|
-
</div>
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
**Disciplina:** readonly se ve **diferente** a editable — fondo atenuado, candado visible. No basta con el atributo `readonly`; el usuario debe percibir "esto no se toca aquí".
|
|
86
|
-
|
|
87
|
-
**CSS custom justificado (tema del sistema):**
|
|
88
|
-
|
|
89
|
-
```css
|
|
90
|
-
.input-readonly .input-group-text { background: #f1f3f5; color: #868e96; border-right: 0; }
|
|
91
|
-
.input-readonly .form-control { background-color: #f8f9fa; border-left: 0; }
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
Este tema es específico del sistema de diseño; el framework no lo da. Custom es legítimo.
|
|
95
|
-
|
|
96
|
-
**[shared-candidato]:** si aparece en 2+ vistas, extraer a un componente `readonly-input` que reciba `icon` y `value`.
|
|
97
|
-
|
|
98
|
-
---
|
|
99
|
-
|
|
100
|
-
## 4. Combo dependiente: hints contextuales
|
|
101
|
-
|
|
102
|
-
Cuando B depende de A (p. ej. sucursal depende de negocio financiero), el UX debe informar al usuario **qué está pasando**:
|
|
103
|
-
|
|
104
|
-
- Si A no tiene valor: `"Seleccione primero <A>."`
|
|
105
|
-
- Si A tiene valor y B está cargando: `"Cargando <B>..."`
|
|
106
|
-
- Si A tiene valor y B vino vacío: `"No hay <B> disponibles."`
|
|
107
|
-
- Si la decisión de B tiene impacto no obvio (p. ej. rol → permisos): hint **siempre visible** explicando ese impacto.
|
|
108
|
-
|
|
109
|
-
Implementación (framework-first):
|
|
110
|
-
|
|
111
|
-
```html
|
|
112
|
-
<label for="sel-hijo">Sucursal</label>
|
|
113
|
-
<select id="sel-hijo" class="form-select">...</select>
|
|
114
|
-
<div class="text-muted small mt-1">{{ hintSucursal }}</div>
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
**Regla:** el hint vive debajo del combo, con tipografía atenuada del framework (`text-muted small` en Bootstrap, `text-sm text-gray-500` en Tailwind). No inventar clase custom.
|
|
118
|
-
|
|
119
|
-
---
|
|
120
|
-
|
|
121
|
-
## 5. Switch vs checkbox
|
|
122
|
-
|
|
123
|
-
Regla de decisión:
|
|
124
|
-
|
|
125
|
-
- **Switch**: cuando el toggle representa un **modo** (encender/apagar una capacidad: "cambiar contraseña", "activo", "notificaciones por correo").
|
|
126
|
-
- **Checkbox**: cuando se **selecciona un ítem** en una lista ("acepto términos", ítems de un multiselect, filtros marcables).
|
|
127
|
-
|
|
128
|
-
Si dudas: ¿activar esto cambia **cómo se comporta** el sistema? Switch. ¿Es una marca de "sí me aplica"? Checkbox.
|
|
129
|
-
|
|
130
|
-
**Alineación vertical correcta** (switch crecido a 3em×1.5em):
|
|
131
|
-
|
|
132
|
-
```html
|
|
133
|
-
<div class="form-switch d-flex align-items-center gap-2 ps-0">
|
|
134
|
-
<input type="checkbox" class="form-check-input m-0" role="switch" id="mi-switch">
|
|
135
|
-
<label class="form-check-label mb-0" for="mi-switch">Activo</label>
|
|
136
|
-
</div>
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
Claves:
|
|
140
|
-
|
|
141
|
-
- `d-flex align-items-center gap-2` — alinea verticalmente con el label.
|
|
142
|
-
- `ps-0` — anula el padding-left 1.5em default de `.form-check`.
|
|
143
|
-
- `input.m-0` y `label.mb-0` — anulan márgenes que desalinean con el switch grande.
|
|
144
|
-
|
|
145
|
-
**CSS custom mínimo (dimensiones del switch):**
|
|
146
|
-
|
|
147
|
-
```css
|
|
148
|
-
.form-switch .form-check-input { width: 3em; height: 1.5em; cursor: pointer; }
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
El resto es utilities.
|
|
152
|
-
|
|
153
|
-
**[shared-candidato]:** `switch-aligned` — encapsula el patrón completo con `[label]` y `[(checked)]`.
|
|
154
|
-
|
|
155
|
-
---
|
|
156
|
-
|
|
157
|
-
## 6. Campo opcional con switch que colapsa y limpia
|
|
158
|
-
|
|
159
|
-
Patrón para campos **opcionales en editar** que son **obligatorios en crear** (ejemplo típico: contraseña).
|
|
160
|
-
|
|
161
|
-
- Un switch "Cambiar contraseña" (desactivado por default en editar).
|
|
162
|
-
- Al activar: aparecen los campos de contraseña + confirmación.
|
|
163
|
-
- Al desactivar: los campos se **ocultan y se limpian**.
|
|
164
|
-
- La validación de igualdad entre contraseña y confirmación corre **sólo** si el switch está activo.
|
|
165
|
-
|
|
166
|
-
**Regla:** el switch no sólo oculta visualmente — **limpia** los valores del estado del formulario. De lo contrario queda basura en el payload al guardar. La implementación técnica (cómo limpiar el FormGroup, cómo condicionar la validación) vive en `coding-standards/references/angular-typescript.md`.
|
|
167
|
-
|
|
168
|
-
---
|
|
169
|
-
|
|
170
|
-
## 7. Estado y bloqueado son dimensiones separadas
|
|
171
|
-
|
|
172
|
-
Dos conceptos con nombres parecidos pero significado distinto:
|
|
173
|
-
|
|
174
|
-
- **Estado** (habilitado/deshabilitado a nivel dato): el registro existe pero no se muestra / no se usa. Típico flag `estado` (1/0) o `activo` (Y/N).
|
|
175
|
-
- **Bloqueado** (por autenticación): el usuario no puede iniciar sesión — demasiados intentos fallidos, admin lo bloqueó, suspensión temporal. Típico flag `deshabilitado` o `bloqueado`.
|
|
176
|
-
|
|
177
|
-
Son **ortogonales**: un usuario puede estar `estado=1` (activo) y `bloqueado=Y` (no puede entrar por intentos fallidos).
|
|
178
|
-
|
|
179
|
-
**Regla UX:** dos combos separados, no un solo campo mezclando semánticas. Nombrar cada uno por su concepto: "Estado" y "Bloqueado" (o "Acceso"), no "Estatus" genérico.
|
|
180
|
-
|
|
181
|
-
---
|
|
182
|
-
|
|
183
|
-
## 8. Readonly disciplinado
|
|
184
|
-
|
|
185
|
-
Los campos que no se editan en la vista actual se marcan **visual + funcionalmente**:
|
|
186
|
-
|
|
187
|
-
- Visualmente: candado + fondo atenuado (patrón §3).
|
|
188
|
-
- Funcionalmente: atributo `readonly` o `disabled` según corresponda (readonly envía el valor en el payload; disabled no).
|
|
189
|
-
|
|
190
|
-
**Regla:** si el campo es inmutable en esta vista pero editable en otra, documentarlo (hint breve: "Se edita en <otra vista>").
|
|
191
|
-
|
|
192
|
-
**Anti-patrón:** dejar el campo editable pero confiar en que el backend rechace el cambio. El usuario pierde tiempo escribiendo y recibe error.
|
|
193
|
-
|
|
194
|
-
---
|
|
195
|
-
|
|
196
|
-
## 9. Placeholder con formato esperado
|
|
197
|
-
|
|
198
|
-
Campos libres (teléfono, documento, código) deben mostrar el formato esperado en el placeholder:
|
|
199
|
-
|
|
200
|
-
- `+51 ...` para teléfono.
|
|
201
|
-
- `DNI 8 dígitos` para documento.
|
|
202
|
-
- `ABC-1234` para códigos con formato.
|
|
203
|
-
|
|
204
|
-
No usar placeholder como label (degrada accesibilidad al tipear). El `<label>` + `placeholder` + hint muted forman la tríada completa.
|
|
205
|
-
|
|
206
|
-
---
|
|
207
|
-
|
|
208
|
-
## 10. Reutilización antes que duplicación (shared/)
|
|
209
|
-
|
|
210
|
-
**Regla transversal:** antes de codear cualquier pieza visual del formulario, revisar `shared/` (o el directorio de componentes comunes del proyecto) si ya existe.
|
|
211
|
-
|
|
212
|
-
Patrones candidatos a ser compartidos:
|
|
213
|
-
|
|
214
|
-
- `readonly-input` — input con candado + fondo atenuado (§3).
|
|
215
|
-
- `section-card` — wrapper con section-title + icono + contenido (§2).
|
|
216
|
-
- `switch-aligned` — switch alineado con label (§5).
|
|
217
|
-
- `combo-hint` — select + hint muted debajo (§4).
|
|
218
|
-
- `primary-button-spinner` — botón de acción con estado de loading.
|
|
219
|
-
|
|
220
|
-
**Heurística:** si un patrón aparece en 2 mantenimientos distintos, o se proyecta a repetirse, **proponer extracción explícita como diff aislado** antes de inline-ar el código nuevo. No mezclar la extracción con el feature — dos commits separados.
|
|
221
|
-
|
|
222
|
-
**Para el asistente:** al implementar una sección de este skill en código, primero `grep`/`glob` por nombres similares en `shared/`; si existe, usar; si no, preguntar al usuario si vale extraerlo antes de codear inline.
|
|
223
|
-
|
|
224
|
-
---
|
|
225
|
-
|
|
226
|
-
## 11. Framework-first CSS (~90/10)
|
|
227
|
-
|
|
228
|
-
**Regla transversal:** ~90 % del styling se expresa con **utilities del framework** (Bootstrap, Tailwind, Angular Material, etc.). Sólo ~10 % amerita CSS custom.
|
|
229
|
-
|
|
230
|
-
### Framework gana para:
|
|
231
|
-
|
|
232
|
-
- Spacing (`p-3`, `m-4`, `gap-2`).
|
|
233
|
-
- Flex / Grid (`d-flex`, `row g-4`, `grid grid-cols-2`).
|
|
234
|
-
- Tipografía general (`fw-bold`, `text-muted`, `small`).
|
|
235
|
-
- Colores semánticos del sistema (`text-danger`, `bg-light`).
|
|
236
|
-
- Breakpoints responsivos (`col-12 col-xl-6`, `xl:grid-cols-2`).
|
|
237
|
-
- Estados hover/focus/disabled que el framework ya cubre.
|
|
238
|
-
|
|
239
|
-
### Custom justificado cuando:
|
|
240
|
-
|
|
241
|
-
- (a) Hay un **tema específico** del proyecto que el framework no expresa: colores del candado readonly, dimensiones custom de switch (3em×1.5em), tipografía del logo.
|
|
242
|
-
- (b) La **combinación de utilities se repite 5+ veces** y amerita una clase semántica para DRY: p. ej. `.card-domain { @apply border rounded-lg shadow-sm p-4; }` (cuando el framework lo permite).
|
|
243
|
-
- (c) El framework **no tiene la variante exacta** y sobrescribirlo con `!important` es peor.
|
|
244
|
-
|
|
245
|
-
### Anti-patrones:
|
|
246
|
-
|
|
247
|
-
- Reescribir `.my-card { border: 1px solid; padding: 1rem; box-shadow: ... }` cuando `border rounded-3 shadow-sm p-3` lo resuelve.
|
|
248
|
-
- Crear `.my-flex { display: flex; align-items: center; gap: 0.5rem }` en vez de usar `d-flex align-items-center gap-2`.
|
|
249
|
-
- Copiar el tema del framework en variables custom "para tenerlo local".
|
|
250
|
-
|
|
251
|
-
### Criterio práctico para el asistente
|
|
252
|
-
|
|
253
|
-
Antes de escribir una regla CSS custom, preguntarse: **"¿hay utility que lo haga?"**.
|
|
254
|
-
|
|
255
|
-
- Sí → utility.
|
|
256
|
-
- No → ¿el tema aplicará a 3+ lugares?
|
|
257
|
-
- Sí → clase semántica con comentario breve explicando la razón.
|
|
258
|
-
- No → inline con utilities y punto.
|
|
259
|
-
|
|
260
|
-
---
|
|
261
|
-
|
|
262
|
-
## 12. Checklist de replicación
|
|
263
|
-
|
|
264
|
-
Al aplicar estos patrones a un mantenimiento nuevo (p. ej. `admin/producto`, `admin/sucursal`):
|
|
265
|
-
|
|
266
|
-
- [ ] Identificar los 3-4 dominios del formulario y agrupar en cards.
|
|
267
|
-
- [ ] Layout de cards con utilities del framework (`row g-4` + `col-12 col-xl-6` o equivalente).
|
|
268
|
-
- [ ] Marcar readonly los campos que no se editan aquí (candado + `readonly`/`disabled`).
|
|
269
|
-
- [ ] Combo dependiente: mostrar hint contextual ("seleccione primero X", "cargando", "sin resultados").
|
|
270
|
-
- [ ] Si el modelo permite N pero UX requiere 1: implementar single-slot (una capa, no dos).
|
|
271
|
-
- [ ] Toggles no triviales → switch alineado con utilities.
|
|
272
|
-
- [ ] Campo opcional en edición → switch que colapsa **y** limpia.
|
|
273
|
-
- [ ] Estado y bloqueado (si aplica) en combos separados.
|
|
274
|
-
- [ ] Placeholder con formato esperado en campos libres.
|
|
275
|
-
- [ ] **Antes de codear:** `grep` en `shared/` por componentes ya existentes.
|
|
276
|
-
- [ ] **Antes de escribir CSS:** revisar utilities del framework.
|
|
277
|
-
- [ ] Si se crea CSS custom, dejar **comentario breve** con la razón (tema / DRY / framework gap).
|
|
278
|
-
- [ ] Errores del backend se propagan al usuario (toast/mensaje), nunca silenciados.
|