timsquad 3.5.0 → 3.7.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.ko.md +103 -107
- package/README.md +100 -104
- package/dist/commands/daemon.d.ts.map +1 -1
- package/dist/commands/daemon.js +48 -2
- package/dist/commands/daemon.js.map +1 -1
- package/dist/commands/init.js +46 -14
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/{upgrade.d.ts → update.d.ts} +3 -3
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/{upgrade.js → update.js} +12 -17
- package/dist/commands/update.js.map +1 -0
- package/dist/daemon/context-writer.d.ts +14 -0
- package/dist/daemon/context-writer.d.ts.map +1 -1
- package/dist/daemon/context-writer.js +29 -0
- package/dist/daemon/context-writer.js.map +1 -1
- package/dist/daemon/event-queue.d.ts +7 -11
- package/dist/daemon/event-queue.d.ts.map +1 -1
- package/dist/daemon/event-queue.js +78 -118
- package/dist/daemon/event-queue.js.map +1 -1
- package/dist/daemon/file-watcher.d.ts +14 -8
- package/dist/daemon/file-watcher.d.ts.map +1 -1
- package/dist/daemon/file-watcher.js +78 -41
- package/dist/daemon/file-watcher.js.map +1 -1
- package/dist/daemon/index.d.ts +1 -1
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +54 -47
- package/dist/daemon/index.js.map +1 -1
- package/dist/index.js +3 -41
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-generator.d.ts.map +1 -1
- package/dist/lib/agent-generator.js +21 -10
- package/dist/lib/agent-generator.js.map +1 -1
- package/dist/lib/compile-rules.d.ts +2 -0
- package/dist/lib/compile-rules.d.ts.map +1 -1
- package/dist/lib/compile-rules.js +39 -4
- package/dist/lib/compile-rules.js.map +1 -1
- package/dist/lib/compiler.d.ts +22 -1
- package/dist/lib/compiler.d.ts.map +1 -1
- package/dist/lib/compiler.js +178 -12
- package/dist/lib/compiler.js.map +1 -1
- package/dist/lib/config.d.ts +3 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +17 -2
- package/dist/lib/config.js.map +1 -1
- package/dist/{commands/log.d.ts → lib/log-utils.d.ts} +7 -15
- package/dist/lib/log-utils.d.ts.map +1 -0
- package/dist/lib/log-utils.js +347 -0
- package/dist/lib/log-utils.js.map +1 -0
- package/dist/lib/skill-generator.d.ts +1 -1
- package/dist/lib/skill-generator.d.ts.map +1 -1
- package/dist/lib/skill-generator.js +19 -44
- package/dist/lib/skill-generator.js.map +1 -1
- package/dist/lib/ssot-map.d.ts +31 -0
- package/dist/lib/ssot-map.d.ts.map +1 -0
- package/dist/lib/ssot-map.js +79 -0
- package/dist/lib/ssot-map.js.map +1 -0
- package/dist/lib/template.d.ts +10 -3
- package/dist/lib/template.d.ts.map +1 -1
- package/dist/lib/template.js +137 -22
- package/dist/lib/template.js.map +1 -1
- package/dist/lib/upgrade-backup.js +1 -1
- package/dist/lib/upgrade-backup.js.map +1 -1
- package/dist/lib/workflow-state.d.ts +1 -1
- package/dist/lib/workflow-state.d.ts.map +1 -1
- package/dist/lib/workflow-state.js +1 -1
- package/dist/lib/workflow-state.js.map +1 -1
- package/dist/types/config.d.ts +10 -1
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +46 -41
- package/dist/types/config.js.map +1 -1
- package/dist/types/feedback.d.ts +1 -54
- package/dist/types/feedback.d.ts.map +1 -1
- package/dist/types/feedback.js +1 -22
- package/dist/types/feedback.js.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/meta-index.d.ts +8 -0
- package/dist/types/meta-index.d.ts.map +1 -1
- package/dist/types/project.d.ts +6 -1
- package/dist/types/project.d.ts.map +1 -1
- package/dist/types/project.js +15 -0
- package/dist/types/project.js.map +1 -1
- package/dist/types/ssot-map.d.ts +30 -0
- package/dist/types/ssot-map.d.ts.map +1 -0
- package/dist/types/ssot-map.js +6 -0
- package/dist/types/ssot-map.js.map +1 -0
- package/package.json +1 -1
- package/templates/base/agents/base/tsq-architect.md +1 -1
- package/templates/base/agents/base/tsq-dba.md +3 -1
- package/templates/base/agents/base/tsq-designer.md +3 -1
- package/templates/base/agents/base/tsq-developer.md +3 -1
- package/templates/base/agents/base/tsq-librarian.md +45 -0
- package/templates/base/agents/base/tsq-qa.md +3 -1
- package/templates/base/agents/base/tsq-security.md +3 -1
- package/templates/base/agents/overlays/platform/claude-code.md +2 -2
- package/templates/base/config.template.yaml +17 -28
- package/templates/base/knowledge/templates/task-result.md +5 -10
- package/templates/base/skills/_shared/naming-conventions.md +49 -0
- package/templates/base/skills/_template/SKILL.md +31 -17
- package/templates/base/skills/{architecture → tsq-architecture}/SKILL.md +2 -2
- package/templates/base/skills/tsq-audit/SKILL.md +74 -0
- package/templates/base/skills/{methodology/bdd → tsq-bdd}/SKILL.md +14 -9
- package/templates/base/skills/tsq-coding/SKILL.md +65 -0
- package/templates/base/skills/tsq-coding/rules/async-patterns.md +81 -0
- package/templates/base/skills/tsq-coding/rules/code-organization.md +80 -0
- package/templates/base/skills/tsq-coding/rules/error-handling.md +76 -0
- package/templates/base/skills/tsq-coding/rules/type-safety.md +85 -0
- package/templates/base/skills/tsq-controller/SKILL.md +81 -0
- package/templates/base/skills/tsq-controller/memory/.gitkeep +0 -0
- package/templates/base/skills/{mobile/dart → tsq-dart}/SKILL.md +5 -3
- package/templates/base/skills/{database → tsq-database}/SKILL.md +13 -27
- package/templates/base/skills/tsq-database/rules/query-optimization.md +32 -0
- package/templates/base/skills/tsq-database/rules/supabase-patterns.md +94 -0
- package/templates/base/skills/{methodology/ddd → tsq-ddd}/SKILL.md +15 -10
- package/templates/base/skills/{methodology/debugging → tsq-debugging}/SKILL.md +2 -2
- package/templates/base/skills/tsq-decompose/SKILL.md +117 -0
- package/templates/base/skills/tsq-delete/SKILL.md +72 -0
- package/templates/base/skills/{mobile/flutter → tsq-flutter}/SKILL.md +6 -3
- package/templates/base/skills/tsq-grill/SKILL.md +86 -0
- package/templates/base/skills/{backend/node → tsq-hono}/SKILL.md +6 -4
- package/templates/base/skills/tsq-librarian/SKILL.md +78 -0
- package/templates/base/skills/tsq-log/SKILL.md +30 -0
- package/templates/base/skills/{frontend/nextjs → tsq-nextjs}/SKILL.md +14 -9
- package/templates/base/skills/{planning → tsq-planning}/SKILL.md +2 -2
- package/templates/base/skills/{database/prisma → tsq-prisma}/SKILL.md +15 -9
- package/templates/base/skills/tsq-product-audit/SKILL.md +113 -0
- package/templates/base/skills/tsq-product-audit/checklists/01-security.md +86 -0
- package/templates/base/skills/tsq-product-audit/checklists/02-performance.md +67 -0
- package/templates/base/skills/tsq-product-audit/checklists/03-seo.md +46 -0
- package/templates/base/skills/tsq-product-audit/checklists/04-accessibility.md +66 -0
- package/templates/base/skills/tsq-product-audit/checklists/05-ui-ux.md +50 -0
- package/templates/base/skills/tsq-product-audit/checklists/06-architecture.md +53 -0
- package/templates/base/skills/tsq-product-audit/checklists/07-functional-requirements.md +55 -0
- package/templates/base/skills/tsq-product-audit/rules/audit-protocol.md +136 -0
- package/templates/base/skills/tsq-product-audit/rules/false-positive-guard.md +81 -0
- package/templates/base/skills/tsq-product-audit/rules/scoring-criteria.md +113 -0
- package/templates/base/skills/tsq-product-audit/templates/improvement-plan-template.md +60 -0
- package/templates/base/skills/tsq-product-audit/templates/report-template.md +88 -0
- package/templates/base/skills/tsq-prompt/SKILL.md +86 -0
- package/templates/base/skills/tsq-protocol/SKILL.md +101 -33
- package/templates/base/skills/{frontend/react → tsq-react}/SKILL.md +6 -3
- package/templates/base/skills/tsq-retro/SKILL.md +86 -0
- package/templates/base/skills/tsq-retro/references/feedback-guide.md +58 -0
- package/templates/base/skills/tsq-retro/references/improve-protocol.md +87 -0
- package/templates/base/skills/tsq-retro/references/improvement-template.md +26 -0
- package/templates/base/skills/tsq-security/SKILL.md +66 -0
- package/templates/base/skills/tsq-security/rules/auth-patterns.md +62 -0
- package/templates/base/skills/tsq-security/rules/dependency-security.md +69 -0
- package/templates/base/skills/tsq-security/rules/input-validation.md +68 -0
- package/templates/base/skills/tsq-security/rules/secrets-management.md +65 -0
- package/templates/base/skills/tsq-spec/SKILL.md +58 -0
- package/templates/base/skills/{stability-verification → tsq-stability}/SKILL.md +3 -3
- package/templates/base/skills/tsq-start/SKILL.md +90 -0
- package/templates/base/skills/tsq-start/references/onboarding-questions.md +177 -0
- package/templates/base/skills/tsq-status/SKILL.md +32 -0
- package/templates/base/skills/{methodology/tdd → tsq-tdd}/SKILL.md +12 -3
- package/templates/base/skills/tsq-testing/SKILL.md +69 -0
- package/templates/base/skills/tsq-testing/references/e2e-stability.md +33 -0
- package/templates/base/skills/{typescript → tsq-typescript}/SKILL.md +5 -11
- package/templates/base/skills/{ui-design → tsq-ui}/SKILL.md +2 -2
- package/templates/base/skills/tsq-update/SKILL.md +48 -0
- package/templates/base/timsquad/constraints/competency-framework.xml +2 -2
- package/templates/base/timsquad/constraints/ssot-schema.xml +2 -2
- package/templates/base/timsquad/process/phase-checklist.yaml +1 -1
- package/templates/base/timsquad/process/state-machine.xml +2 -2
- package/templates/base/timsquad/process/validation-rules.xml +8 -8
- package/templates/base/timsquad/process/workflow-base.xml +8 -8
- package/templates/base/timsquad/retrospective/cycle-report.template.md +2 -2
- package/templates/base/timsquad/retrospective/patterns/failure-patterns.md +1 -1
- package/templates/base/timsquad/retrospective/patterns/success-patterns.md +2 -2
- package/templates/base/timsquad/retrospective/retrospective-state.xml +2 -2
- package/templates/base/timsquad/ssot/audit-trail-spec.template.md +155 -0
- package/templates/base/timsquad/ssot/compliance-matrix.template.md +105 -0
- package/templates/base/timsquad/ssot/component-map.template.md +181 -0
- package/templates/base/timsquad/ssot/data-design.template.md +4 -4
- package/templates/base/timsquad/ssot/deployment-spec.template.md +29 -22
- package/templates/base/timsquad/ssot/env-config.template.md +4 -2
- package/templates/base/timsquad/ssot/error-codes.template.md +3 -3
- package/templates/base/timsquad/ssot/functional-spec.template.md +40 -3
- package/templates/base/timsquad/ssot/glossary.template.md +2 -2
- package/templates/base/timsquad/ssot/infra-topology.template.md +191 -0
- package/templates/base/timsquad/ssot/integration-spec.template.md +2 -2
- package/templates/base/timsquad/ssot/monitoring-spec.template.md +185 -0
- package/templates/base/timsquad/ssot/navigation-map.template.md +154 -0
- package/templates/base/timsquad/ssot/performance-budget.template.md +132 -0
- package/templates/base/timsquad/ssot/planning.template.md +3 -3
- package/templates/base/timsquad/ssot/prd/_template.md +73 -0
- package/templates/base/timsquad/ssot/prd.template.md +10 -21
- package/templates/base/timsquad/ssot/requirements.template.md +3 -3
- package/templates/base/timsquad/ssot/sdk-spec.template.md +223 -0
- package/templates/base/timsquad/ssot/service-spec.template.md +3 -3
- package/templates/base/timsquad/ssot/state-machine.template.md +127 -0
- package/templates/base/timsquad/ssot/test-spec.template.md +11 -1
- package/templates/base/timsquad/ssot/ui-ux-spec.template.md +43 -3
- package/templates/base/timsquad/ssot-map.template.yaml +69 -0
- package/templates/base/timsquad/state/workspace.xml +11 -11
- package/templates/platforms/claude-code/rules/adr-rules.md +1 -1
- package/templates/platforms/claude-code/rules/api-conventions.md +12 -0
- package/templates/platforms/claude-code/rules/build-gate.md +1 -1
- package/templates/platforms/claude-code/rules/completion-verification.md +0 -2
- package/templates/platforms/claude-code/rules/context-monitor.md +1 -1
- package/templates/platforms/claude-code/rules/feedback-routing.md +2 -2
- package/templates/platforms/claude-code/rules/librarian-constraints.md +11 -0
- package/templates/platforms/claude-code/rules/phase-management.md +2 -2
- package/templates/platforms/claude-code/rules/plan-review.md +2 -2
- package/templates/platforms/claude-code/rules/quality-guards.md +0 -2
- package/templates/platforms/claude-code/rules/sequence-management.md +15 -15
- package/templates/platforms/claude-code/rules/session-notes.md +1 -1
- package/templates/platforms/claude-code/rules/test-conventions.md +13 -0
- package/templates/platforms/claude-code/rules/workspace-sync.md +1 -1
- package/templates/platforms/claude-code/scripts/build-gate.sh +6 -1
- package/templates/platforms/claude-code/scripts/change-scope-guard.sh +110 -0
- package/templates/platforms/claude-code/scripts/check-capability.sh +68 -0
- package/templates/platforms/claude-code/scripts/completion-guard.sh +134 -14
- package/templates/platforms/claude-code/scripts/context-restore.sh +95 -0
- package/templates/platforms/claude-code/scripts/e2e-commit-gate.sh +70 -0
- package/templates/platforms/claude-code/scripts/e2e-marker.sh +51 -0
- package/templates/platforms/claude-code/scripts/phase-guard.sh +3 -6
- package/templates/platforms/claude-code/scripts/pre-compact.sh +70 -0
- package/templates/platforms/claude-code/scripts/safe-guard.sh +2 -5
- package/templates/platforms/claude-code/scripts/subagent-start.sh +11 -0
- package/templates/platforms/claude-code/scripts/subagent-stop.sh +11 -0
- package/templates/platforms/claude-code/settings.json +28 -56
- package/templates/project-types/api-backend/config.yaml +9 -5
- package/templates/project-types/api-backend/process/workflow.xml +2 -2
- package/templates/project-types/fintech/config.yaml +13 -19
- package/templates/project-types/fintech/ssot/audit-trail-spec.template.md +207 -0
- package/templates/project-types/fintech/ssot/compliance-matrix.template.md +187 -0
- package/templates/project-types/infra/config.yaml +7 -4
- package/templates/project-types/infra/process/workflow.xml +3 -3
- package/templates/project-types/mobile-app/config.yaml +8 -14
- package/templates/project-types/mobile-app/process/workflow.xml +4 -4
- package/templates/project-types/platform/config.yaml +8 -5
- package/templates/project-types/platform/process/workflow.xml +3 -3
- package/templates/project-types/web-app/config.yaml +9 -15
- package/templates/project-types/web-app/process/workflow.xml +6 -6
- package/templates/project-types/web-service/config.yaml +10 -19
- package/templates/project-types/web-service/process/workflow.xml +6 -6
- package/dist/commands/compile.d.ts +0 -3
- package/dist/commands/compile.d.ts.map +0 -1
- package/dist/commands/compile.js +0 -170
- package/dist/commands/compile.js.map +0 -1
- package/dist/commands/feedback.d.ts +0 -12
- package/dist/commands/feedback.d.ts.map +0 -1
- package/dist/commands/feedback.js +0 -382
- package/dist/commands/feedback.js.map +0 -1
- package/dist/commands/full.d.ts +0 -3
- package/dist/commands/full.d.ts.map +0 -1
- package/dist/commands/full.js +0 -88
- package/dist/commands/full.js.map +0 -1
- package/dist/commands/git/commit.d.ts +0 -3
- package/dist/commands/git/commit.d.ts.map +0 -1
- package/dist/commands/git/commit.js +0 -85
- package/dist/commands/git/commit.js.map +0 -1
- package/dist/commands/git/index.d.ts +0 -5
- package/dist/commands/git/index.d.ts.map +0 -1
- package/dist/commands/git/index.js +0 -5
- package/dist/commands/git/index.js.map +0 -1
- package/dist/commands/git/pr.d.ts +0 -3
- package/dist/commands/git/pr.d.ts.map +0 -1
- package/dist/commands/git/pr.js +0 -139
- package/dist/commands/git/pr.js.map +0 -1
- package/dist/commands/git/release.d.ts +0 -3
- package/dist/commands/git/release.d.ts.map +0 -1
- package/dist/commands/git/release.js +0 -153
- package/dist/commands/git/release.js.map +0 -1
- package/dist/commands/git/sync.d.ts +0 -3
- package/dist/commands/git/sync.d.ts.map +0 -1
- package/dist/commands/git/sync.js +0 -132
- package/dist/commands/git/sync.js.map +0 -1
- package/dist/commands/improve.d.ts +0 -3
- package/dist/commands/improve.d.ts.map +0 -1
- package/dist/commands/improve.js +0 -286
- package/dist/commands/improve.js.map +0 -1
- package/dist/commands/knowledge.d.ts +0 -3
- package/dist/commands/knowledge.d.ts.map +0 -1
- package/dist/commands/knowledge.js +0 -316
- package/dist/commands/knowledge.js.map +0 -1
- package/dist/commands/log.d.ts.map +0 -1
- package/dist/commands/log.js +0 -1436
- package/dist/commands/log.js.map +0 -1
- package/dist/commands/meta-index.d.ts +0 -3
- package/dist/commands/meta-index.d.ts.map +0 -1
- package/dist/commands/meta-index.js +0 -401
- package/dist/commands/meta-index.js.map +0 -1
- package/dist/commands/metrics.d.ts +0 -3
- package/dist/commands/metrics.d.ts.map +0 -1
- package/dist/commands/metrics.js +0 -843
- package/dist/commands/metrics.js.map +0 -1
- package/dist/commands/quick.d.ts +0 -3
- package/dist/commands/quick.d.ts.map +0 -1
- package/dist/commands/quick.js +0 -136
- package/dist/commands/quick.js.map +0 -1
- package/dist/commands/retro.d.ts +0 -3
- package/dist/commands/retro.d.ts.map +0 -1
- package/dist/commands/retro.js +0 -828
- package/dist/commands/retro.js.map +0 -1
- package/dist/commands/session.d.ts +0 -3
- package/dist/commands/session.d.ts.map +0 -1
- package/dist/commands/session.js +0 -346
- package/dist/commands/session.js.map +0 -1
- package/dist/commands/skills.d.ts +0 -12
- package/dist/commands/skills.d.ts.map +0 -1
- package/dist/commands/skills.js +0 -228
- package/dist/commands/skills.js.map +0 -1
- package/dist/commands/status.d.ts +0 -3
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js +0 -127
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/upgrade.d.ts.map +0 -1
- package/dist/commands/upgrade.js.map +0 -1
- package/dist/commands/watch.d.ts +0 -3
- package/dist/commands/watch.d.ts.map +0 -1
- package/dist/commands/watch.js +0 -213
- package/dist/commands/watch.js.map +0 -1
- package/dist/commands/workflow.d.ts +0 -3
- package/dist/commands/workflow.d.ts.map +0 -1
- package/dist/commands/workflow.js +0 -607
- package/dist/commands/workflow.js.map +0 -1
- package/templates/base/skills/coding/SKILL.md +0 -47
- package/templates/base/skills/controller/SKILL.md +0 -111
- package/templates/base/skills/prompt-engineering/SKILL.md +0 -103
- package/templates/base/skills/retrospective/SKILL.md +0 -102
- package/templates/base/skills/security/SKILL.md +0 -55
- package/templates/base/skills/testing/SKILL.md +0 -63
- package/templates/base/timsquad/feedback/feedback-router.sh +0 -341
- package/templates/base/timsquad/feedback/routing-rules.yaml +0 -352
- package/templates/platforms/claude-code/CLAUDE.md.template +0 -89
- package/templates/platforms/claude-code/rules/skill-suggest.md +0 -27
- package/templates/platforms/claude-code/scripts/skill-rules.json +0 -85
- package/templates/platforms/claude-code/scripts/skill-suggest.sh +0 -105
- /package/templates/base/skills/{architecture → tsq-architecture}/references/adr-template.md +0 -0
- /package/templates/base/skills/{architecture → tsq-architecture}/references/api-design.md +0 -0
- /package/templates/base/skills/{methodology/bdd → tsq-bdd}/rules/gherkin-patterns.md +0 -0
- /package/templates/base/skills/{coding → tsq-coding}/rules/patterns.md +0 -0
- /package/templates/base/skills/{controller → tsq-controller}/references/README.md +0 -0
- /package/templates/base/skills/{controller → tsq-controller}/rules/README.md +0 -0
- /package/templates/base/skills/{mobile/dart → tsq-dart}/rules/async-patterns.md +0 -0
- /package/templates/base/skills/{mobile/dart → tsq-dart}/rules/code-style.md +0 -0
- /package/templates/base/skills/{mobile/dart → tsq-dart}/rules/null-safety.md +0 -0
- /package/templates/base/skills/{mobile/dart → tsq-dart}/rules/type-system.md +0 -0
- /package/templates/base/skills/{methodology/ddd → tsq-ddd}/rules/strategic-patterns.md +0 -0
- /package/templates/base/skills/{methodology/debugging → tsq-debugging}/references/root-cause-tracing.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/ci-cd/SKILL.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/ci-cd/references/ci-cd-pipeline.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/ci-cd/rules/code-signing.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/ci-cd/rules/codemagic-setup.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/ci-cd/rules/fastlane-setup.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/ci-cd/rules/github-actions.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/ci-cd/rules/store-deployment.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/ci-cd/rules/versioning.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/i18n/SKILL.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/i18n/references/i18n-architecture.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/i18n/rules/arb-files.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/i18n/rules/locale-switching.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/i18n/rules/localization-setup.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/i18n/rules/plural-gender.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/i18n/rules/text-direction.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/monitoring/SKILL.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/monitoring/references/monitoring-architecture.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/monitoring/rules/analytics.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/monitoring/rules/crashlytics-setup.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/monitoring/rules/logging.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/monitoring/rules/performance-monitoring.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/monitoring/rules/sentry-integration.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/networking/SKILL.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/networking/references/api-client-architecture.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/networking/rules/caching.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/networking/rules/connectivity.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/networking/rules/dio-setup.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/networking/rules/error-handling.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/networking/rules/interceptors.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/networking/rules/retrofit-patterns.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/SKILL.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/references/notification-architecture.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/references/platform-setup.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/rules/background-processing.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/rules/deep-linking.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/rules/fcm-setup.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/rules/local-notifications.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/rules/notification-handling.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/rules/notification-permissions.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/rules/rich-notifications.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/references/freezed-patterns.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/references/project-structure.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/rules/animations.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/rules/architecture.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/rules/navigation-routing.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/rules/performance.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/rules/platform-adaptive.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/rules/state-management.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/rules/testing.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/rules/widget-conventions.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/security/SKILL.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/security/references/mobile-security-checklist.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/security/rules/api-key-protection.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/security/rules/authentication.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/security/rules/data-protection.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/security/rules/obfuscation.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/security/rules/secure-storage.md +0 -0
- /package/templates/base/skills/{mobile/flutter → tsq-flutter}/security/rules/ssl-pinning.md +0 -0
- /package/templates/base/skills/{backend/node → tsq-hono}/rules/async-patterns.md +0 -0
- /package/templates/base/skills/{backend/node → tsq-hono}/rules/deployment.md +0 -0
- /package/templates/base/skills/{backend/node → tsq-hono}/rules/env-config.md +0 -0
- /package/templates/base/skills/{backend/node → tsq-hono}/rules/error-handling.md +0 -0
- /package/templates/base/skills/{backend/node → tsq-hono}/rules/hono-app-setup.md +0 -0
- /package/templates/base/skills/{backend/node → tsq-hono}/rules/jwt-auth.md +0 -0
- /package/templates/base/skills/{backend/node → tsq-hono}/rules/middleware.md +0 -0
- /package/templates/base/skills/{backend/node → tsq-hono}/rules/testing.md +0 -0
- /package/templates/base/skills/{frontend/nextjs → tsq-nextjs}/rules/app-router.md +0 -0
- /package/templates/base/skills/{planning → tsq-planning}/references/prd-guide.md +0 -0
- /package/templates/base/skills/{planning → tsq-planning}/references/requirements-guide.md +0 -0
- /package/templates/base/skills/{database/prisma → tsq-prisma}/rules/queries.md +0 -0
- /package/templates/base/skills/{database/prisma → tsq-prisma}/rules/schema-design.md +0 -0
- /package/templates/base/skills/{frontend/react → tsq-react}/rules/_sections.md +0 -0
- /package/templates/base/skills/{frontend/react → tsq-react}/rules/anti-patterns.md +0 -0
- /package/templates/base/skills/{frontend/react → tsq-react}/rules/async-api-routes.md +0 -0
- /package/templates/base/skills/{frontend/react → tsq-react}/rules/async-defer-await.md +0 -0
- /package/templates/base/skills/{frontend/react → tsq-react}/rules/async-dependencies.md +0 -0
- /package/templates/base/skills/{frontend/react → tsq-react}/rules/async-parallel.md +0 -0
- /package/templates/base/skills/{frontend/react → tsq-react}/rules/async-suspense-boundaries.md +0 -0
- /package/templates/base/skills/{frontend/react → tsq-react}/rules/bundle-barrel-imports.md +0 -0
- /package/templates/base/skills/{frontend/react → tsq-react}/rules/bundle-defer-third-party.md +0 -0
- /package/templates/base/skills/{frontend/react → tsq-react}/rules/bundle-dynamic-imports.md +0 -0
- /package/templates/base/skills/{frontend/react → tsq-react}/rules/component-conventions.md +0 -0
- /package/templates/base/skills/{frontend/react → tsq-react}/rules/js-combine-iterations.md +0 -0
- /package/templates/base/skills/{frontend/react → tsq-react}/rules/js-early-exit.md +0 -0
- /package/templates/base/skills/{frontend/react → tsq-react}/rules/js-index-maps.md +0 -0
- /package/templates/base/skills/{frontend/react → tsq-react}/rules/js-set-map-lookups.md +0 -0
- /package/templates/base/skills/{frontend/react → tsq-react}/rules/rendering-conditional-render.md +0 -0
- /package/templates/base/skills/{frontend/react → tsq-react}/rules/rendering-content-visibility.md +0 -0
- /package/templates/base/skills/{frontend/react → tsq-react}/rules/rendering-hoist-jsx.md +0 -0
- /package/templates/base/skills/{frontend/react → tsq-react}/rules/rerender-defer-reads.md +0 -0
- /package/templates/base/skills/{frontend/react → tsq-react}/rules/rerender-derived-state.md +0 -0
- /package/templates/base/skills/{frontend/react → tsq-react}/rules/rerender-memo.md +0 -0
- /package/templates/base/skills/{frontend/react → tsq-react}/rules/rerender-transitions.md +0 -0
- /package/templates/base/skills/{frontend/react → tsq-react}/rules/server-after-nonblocking.md +0 -0
- /package/templates/base/skills/{frontend/react → tsq-react}/rules/server-cache-react.md +0 -0
- /package/templates/base/skills/{frontend/react → tsq-react}/rules/server-parallel-fetching.md +0 -0
- /package/templates/base/skills/{frontend/react → tsq-react}/rules/state-location.md +0 -0
- /package/templates/base/skills/{security → tsq-security}/rules/owasp-examples.md +0 -0
- /package/templates/base/skills/{security → tsq-security}/scripts/check-secrets.sh +0 -0
- /package/templates/base/skills/{stability-verification → tsq-stability}/references/release-checklist.md +0 -0
- /package/templates/base/skills/{stability-verification → tsq-stability}/references/security-fix-patterns.md +0 -0
- /package/templates/base/skills/{stability-verification → tsq-stability}/rules/verification-layers.md +0 -0
- /package/templates/base/skills/{stability-verification → tsq-stability}/rules/verification-workflow.md +0 -0
- /package/templates/base/skills/{stability-verification → tsq-stability}/scripts/verify.sh +0 -0
- /package/templates/base/skills/{methodology/tdd → tsq-tdd}/rules/real-world-example.md +0 -0
- /package/templates/base/skills/{methodology/tdd → tsq-tdd}/rules/techniques.md +0 -0
- /package/templates/base/skills/{testing → tsq-testing}/references/testing-patterns.md +0 -0
- /package/templates/base/skills/{typescript → tsq-typescript}/rules/type-patterns.md +0 -0
- /package/templates/base/skills/{typescript → tsq-typescript}/rules/utility-types.md +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAClG,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAShD,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,QAAQ,GAAG,OAAO;SACrB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,mBAAmB,CAAC,CAAC;IAEpC,kBAAkB;IAClB,QAAQ;SACL,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,UAAU,EAAE,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,iBAAiB;IACjB,QAAQ;SACL,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,eAAe,CAAC;SAC5B,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,SAAS,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,mBAAmB;IACnB,QAAQ;SACL,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,mBAAmB,CAAC;SAChC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,WAAmB;IAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC;IAEnF,IAAI,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,YAAY,EAAE,EAAE;YAChB,WAAW,EAAE,CAAC;SACf,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,OAAO,EAAE,KAAK;YACd,YAAY,EAAE,EAAE;YAChB,WAAW,EAAE,CAAC;SACf,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,WAAmB,EAAE,KAAiB;IAClE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC;IACnF,MAAM,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,KAAK,UAAU,UAAU;IACvB,MAAM,WAAW,GAAG,MAAM,eAAe,EAAE,CAAC;IAC5C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;IAE/C,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,WAAW,CAAC,mBAAmB,CAAC,CAAC;IAEjC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC;KAChC,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,qBAAqB;IACrB,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE;QACzC,UAAU,EAAE,IAAI;QAChB,aAAa,EAAE,IAAI;QACnB,gBAAgB,EAAE;YAChB,kBAAkB,EAAE,GAAG;YACvB,YAAY,EAAE,GAAG;SAClB;KACF,CAAC,CAAC;IAEH,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,OAAO;SACJ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE;QACzB,WAAW,EAAE,CAAC;QACd,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,SAAS,eAAe,YAAY,EAAE,CAAC;QAE5D,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC9C,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEzB,cAAc;QACd,SAAS,CAAC,WAAW,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;IACnD,CAAC,CAAC;SACD,EAAE,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE;QACtB,WAAW,EAAE,CAAC;QACd,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,SAAS,YAAY,YAAY,EAAE,CAAC;QAEzD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC7C,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEzB,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IAChD,CAAC,CAAC;SACD,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE;QACzB,WAAW,EAAE,CAAC;QACd,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,SAAS,cAAc,YAAY,EAAE,CAAC;QAE3D,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC3C,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEzB,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IAClD,CAAC,CAAC;SACD,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QACrB,UAAU,CAAC,kBAAkB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEL,eAAe;IACf,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;IACrB,KAAK,CAAC,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,KAAK,CAAC,YAAY,GAAG,UAAU,CAAC;IAChC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC;IACtB,MAAM,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAEzC,YAAY,CAAC,iBAAiB,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAElD,6BAA6B;IAC7B,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;QACzB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACnD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QAEtB,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;QACtB,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;QAChC,MAAM,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAEzC,YAAY,CAAC,oBAAoB,WAAW,oBAAoB,CAAC,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AACjC,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,MAAM,WAAW,GAAG,MAAM,eAAe,EAAE,CAAC;IAC5C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;IAE/C,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,yDAAyD;IACzD,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;IACtB,MAAM,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAEzC,YAAY,CAAC,2BAA2B,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,KAAK,UAAU,eAAe;IAC5B,MAAM,WAAW,GAAG,MAAM,eAAe,EAAE,CAAC;IAC5C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;IAE/C,WAAW,CAAC,cAAc,CAAC,CAAC;IAC5B,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAE/D,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,aAAa,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;IAED,aAAa,CAAC,kBAAkB,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IAE7D,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAClD,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YAC7B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,WAAmB,EACnB,MAAc,EACd,QAAgB;IAEhB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAEtD,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAG,GAAG,SAAS,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,QAAQ,IAAI,CAAC;IAEpF,IAAI,CAAC;QACH,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,IAAI,QAAQ,CAAC;QACpB,MAAM,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,wBAAwB;IAC1B,CAAC;AACH,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/commands/workflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiH9D"}
|
|
@@ -1,607 +0,0 @@
|
|
|
1
|
-
import path from 'path';
|
|
2
|
-
import fs from 'fs-extra';
|
|
3
|
-
import { colors, printHeader, printError, printSuccess, printKeyValue } from '../utils/colors.js';
|
|
4
|
-
import { findProjectRoot } from '../lib/project.js';
|
|
5
|
-
import { getTimestamp } from '../utils/date.js';
|
|
6
|
-
import { loadWorkflowState, saveWorkflowState, isSequenceComplete, findSequenceForAgent, } from '../lib/workflow-state.js';
|
|
7
|
-
import { getSequencesDir, getPhasesDir, buildSequenceLogData, buildPhaseGateData, loadSequenceTaskLogs, hasSemantic, } from './log.js';
|
|
8
|
-
import { queryDaemon } from '../daemon/meta-cache.js';
|
|
9
|
-
import { writeContext } from '../daemon/context-writer.js';
|
|
10
|
-
const LOG_SCHEMA_VERSION = '1.0.0';
|
|
11
|
-
export function registerWorkflowCommand(program) {
|
|
12
|
-
const wfCmd = program
|
|
13
|
-
.command('workflow')
|
|
14
|
-
.alias('wf')
|
|
15
|
-
.description('Manage automated workflow (sequences, phases, automation toggles)');
|
|
16
|
-
// tsq workflow set-phase <phase-id>
|
|
17
|
-
wfCmd
|
|
18
|
-
.command('set-phase <phase-id>')
|
|
19
|
-
.description('Set the current active phase')
|
|
20
|
-
.action(async (phaseId) => {
|
|
21
|
-
try {
|
|
22
|
-
await setPhase(phaseId);
|
|
23
|
-
}
|
|
24
|
-
catch (error) {
|
|
25
|
-
printError(error.message);
|
|
26
|
-
process.exit(1);
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
// tsq workflow add-sequence <seq-id>
|
|
30
|
-
wfCmd
|
|
31
|
-
.command('add-sequence <seq-id>')
|
|
32
|
-
.description('Register a sequence for workflow tracking')
|
|
33
|
-
.requiredOption('--agents <list>', 'Comma-separated expected agent types (e.g. developer,dba)')
|
|
34
|
-
.option('--phase <id>', 'Phase ID (defaults to current phase)')
|
|
35
|
-
.action(async (seqId, options) => {
|
|
36
|
-
try {
|
|
37
|
-
await addSequence(seqId, options);
|
|
38
|
-
}
|
|
39
|
-
catch (error) {
|
|
40
|
-
printError(error.message);
|
|
41
|
-
process.exit(1);
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
// tsq workflow remove-sequence <seq-id>
|
|
45
|
-
wfCmd
|
|
46
|
-
.command('remove-sequence <seq-id>')
|
|
47
|
-
.description('Remove a sequence from tracking')
|
|
48
|
-
.action(async (seqId) => {
|
|
49
|
-
try {
|
|
50
|
-
await removeSequence(seqId);
|
|
51
|
-
}
|
|
52
|
-
catch (error) {
|
|
53
|
-
printError(error.message);
|
|
54
|
-
process.exit(1);
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
// tsq workflow status
|
|
58
|
-
wfCmd
|
|
59
|
-
.command('status')
|
|
60
|
-
.description('Show workflow state and automation status')
|
|
61
|
-
.action(async () => {
|
|
62
|
-
try {
|
|
63
|
-
await showStatus();
|
|
64
|
-
}
|
|
65
|
-
catch (error) {
|
|
66
|
-
printError(error.message);
|
|
67
|
-
process.exit(1);
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
// tsq workflow config <key> <value>
|
|
71
|
-
wfCmd
|
|
72
|
-
.command('config <key> <value>')
|
|
73
|
-
.description('Toggle automation settings (e.g. sequence_log on/off)')
|
|
74
|
-
.action(async (key, value) => {
|
|
75
|
-
try {
|
|
76
|
-
await setConfig(key, value);
|
|
77
|
-
}
|
|
78
|
-
catch (error) {
|
|
79
|
-
printError(error.message);
|
|
80
|
-
process.exit(1);
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
// tsq task start --agent <agent> --scope <paths>
|
|
84
|
-
wfCmd
|
|
85
|
-
.command('task-start')
|
|
86
|
-
.description('Prepare task context for a sub-agent (creates task-context.json)')
|
|
87
|
-
.requiredOption('--agent <type>', 'Agent type (developer, qa, dba, etc.)')
|
|
88
|
-
.option('--scope <paths>', 'Comma-separated scope paths (e.g. "src/auth,src/models")')
|
|
89
|
-
.action(async (options) => {
|
|
90
|
-
try {
|
|
91
|
-
await taskStart(options);
|
|
92
|
-
}
|
|
93
|
-
catch (error) {
|
|
94
|
-
printError(error.message);
|
|
95
|
-
process.exit(1);
|
|
96
|
-
}
|
|
97
|
-
});
|
|
98
|
-
// tsq workflow track-task <agent> <task-log-path> (internal — called by hook)
|
|
99
|
-
wfCmd
|
|
100
|
-
.command('track-task <agent> <task-log-path>')
|
|
101
|
-
.description('(internal) Track a completed task in workflow state')
|
|
102
|
-
.action(async (agent, taskLogPath) => {
|
|
103
|
-
try {
|
|
104
|
-
await trackTask(agent, taskLogPath);
|
|
105
|
-
}
|
|
106
|
-
catch {
|
|
107
|
-
// Silent fail for hook usage — don't break the hook chain
|
|
108
|
-
process.exit(0);
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
// tsq workflow check (internal — called by hook on SessionEnd)
|
|
112
|
-
wfCmd
|
|
113
|
-
.command('check')
|
|
114
|
-
.description('(internal) Check workflow state and auto-create L2/L3/gate/retro')
|
|
115
|
-
.action(async () => {
|
|
116
|
-
try {
|
|
117
|
-
await checkAndAutomate();
|
|
118
|
-
}
|
|
119
|
-
catch {
|
|
120
|
-
// Silent fail for hook usage
|
|
121
|
-
process.exit(0);
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
// ============================================================
|
|
126
|
-
// Commands
|
|
127
|
-
// ============================================================
|
|
128
|
-
async function setPhase(phaseId) {
|
|
129
|
-
const projectRoot = await findProjectRoot();
|
|
130
|
-
if (!projectRoot)
|
|
131
|
-
throw new Error('Not a TimSquad project');
|
|
132
|
-
const state = await loadWorkflowState(projectRoot);
|
|
133
|
-
// Archive current phase if exists
|
|
134
|
-
if (state.current_phase && state.current_phase.id !== phaseId) {
|
|
135
|
-
state.completed_phases.push(state.current_phase.id);
|
|
136
|
-
}
|
|
137
|
-
state.current_phase = {
|
|
138
|
-
id: phaseId,
|
|
139
|
-
started_at: getTimestamp(),
|
|
140
|
-
sequences: [],
|
|
141
|
-
};
|
|
142
|
-
await saveWorkflowState(projectRoot, state);
|
|
143
|
-
printSuccess(`Phase set: ${phaseId}`);
|
|
144
|
-
printKeyValue('Automation', formatAutomation(state.automation));
|
|
145
|
-
}
|
|
146
|
-
async function addSequence(seqId, options) {
|
|
147
|
-
const projectRoot = await findProjectRoot();
|
|
148
|
-
if (!projectRoot)
|
|
149
|
-
throw new Error('Not a TimSquad project');
|
|
150
|
-
const state = await loadWorkflowState(projectRoot);
|
|
151
|
-
const phaseId = options.phase || state.current_phase?.id;
|
|
152
|
-
if (!phaseId) {
|
|
153
|
-
throw new Error('No active phase. Run `tsq workflow set-phase <phase-id>` first.');
|
|
154
|
-
}
|
|
155
|
-
if (state.sequences[seqId]) {
|
|
156
|
-
throw new Error(`Sequence ${seqId} already exists. Remove it first to re-add.`);
|
|
157
|
-
}
|
|
158
|
-
const agents = options.agents.split(',').map(a => a.trim());
|
|
159
|
-
state.sequences[seqId] = {
|
|
160
|
-
status: 'pending',
|
|
161
|
-
phase: phaseId,
|
|
162
|
-
expected_agents: agents,
|
|
163
|
-
completed_tasks: [],
|
|
164
|
-
report_path: null,
|
|
165
|
-
l2_created: false,
|
|
166
|
-
};
|
|
167
|
-
// Add to current phase's sequence list
|
|
168
|
-
if (state.current_phase && !state.current_phase.sequences.includes(seqId)) {
|
|
169
|
-
state.current_phase.sequences.push(seqId);
|
|
170
|
-
}
|
|
171
|
-
await saveWorkflowState(projectRoot, state);
|
|
172
|
-
printSuccess(`Sequence added: ${seqId}`);
|
|
173
|
-
printKeyValue('Phase', phaseId);
|
|
174
|
-
printKeyValue('Expected agents', agents.join(', '));
|
|
175
|
-
}
|
|
176
|
-
async function removeSequence(seqId) {
|
|
177
|
-
const projectRoot = await findProjectRoot();
|
|
178
|
-
if (!projectRoot)
|
|
179
|
-
throw new Error('Not a TimSquad project');
|
|
180
|
-
const state = await loadWorkflowState(projectRoot);
|
|
181
|
-
if (!state.sequences[seqId]) {
|
|
182
|
-
throw new Error(`Sequence ${seqId} not found`);
|
|
183
|
-
}
|
|
184
|
-
delete state.sequences[seqId];
|
|
185
|
-
if (state.current_phase) {
|
|
186
|
-
state.current_phase.sequences = state.current_phase.sequences.filter(s => s !== seqId);
|
|
187
|
-
}
|
|
188
|
-
await saveWorkflowState(projectRoot, state);
|
|
189
|
-
printSuccess(`Sequence removed: ${seqId}`);
|
|
190
|
-
}
|
|
191
|
-
async function showStatus() {
|
|
192
|
-
const projectRoot = await findProjectRoot();
|
|
193
|
-
if (!projectRoot)
|
|
194
|
-
throw new Error('Not a TimSquad project');
|
|
195
|
-
const state = await loadWorkflowState(projectRoot);
|
|
196
|
-
printHeader('Workflow Status');
|
|
197
|
-
// Automation toggles
|
|
198
|
-
console.log(colors.subheader(' Automation'));
|
|
199
|
-
for (const [key, val] of Object.entries(state.automation)) {
|
|
200
|
-
const icon = val ? colors.success('ON') : colors.dim('OFF');
|
|
201
|
-
console.log(` ${key.padEnd(16)} ${icon}`);
|
|
202
|
-
}
|
|
203
|
-
// Current phase
|
|
204
|
-
console.log(colors.subheader('\n Phase'));
|
|
205
|
-
if (state.current_phase) {
|
|
206
|
-
printKeyValue(' Current', state.current_phase.id);
|
|
207
|
-
printKeyValue(' Started', state.current_phase.started_at);
|
|
208
|
-
printKeyValue(' Sequences', state.current_phase.sequences.join(', ') || '(none)');
|
|
209
|
-
}
|
|
210
|
-
else {
|
|
211
|
-
console.log(colors.dim(' No active phase. Run `tsq wf set-phase <id>`'));
|
|
212
|
-
}
|
|
213
|
-
// Sequences
|
|
214
|
-
const seqEntries = Object.entries(state.sequences);
|
|
215
|
-
if (seqEntries.length > 0) {
|
|
216
|
-
console.log(colors.subheader('\n Sequences'));
|
|
217
|
-
for (const [seqId, seq] of seqEntries) {
|
|
218
|
-
const statusIcon = seq.status === 'completed'
|
|
219
|
-
? colors.success('✓')
|
|
220
|
-
: seq.status === 'in_progress'
|
|
221
|
-
? colors.warning('▸')
|
|
222
|
-
: colors.dim('○');
|
|
223
|
-
const l2Icon = seq.l2_created ? colors.success('[L2]') : colors.dim('[--]');
|
|
224
|
-
const completedAgents = seq.completed_tasks.map(t => t.agent);
|
|
225
|
-
const remaining = seq.expected_agents.filter(a => !completedAgents.includes(a));
|
|
226
|
-
console.log(` ${statusIcon} ${colors.agent(seqId)} ${l2Icon} ${colors.dim(`[${seq.phase}]`)}`);
|
|
227
|
-
console.log(` agents: ${seq.expected_agents.map(a => completedAgents.includes(a) ? colors.success(a) : colors.dim(a)).join(', ')}`);
|
|
228
|
-
if (remaining.length > 0 && seq.status !== 'completed') {
|
|
229
|
-
console.log(` ${colors.dim(`waiting: ${remaining.join(', ')}`)}`);
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
// Completed phases
|
|
234
|
-
if (state.completed_phases.length > 0) {
|
|
235
|
-
console.log(colors.subheader('\n Completed Phases'));
|
|
236
|
-
console.log(` ${state.completed_phases.join(', ')}`);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
async function setConfig(key, value) {
|
|
240
|
-
const projectRoot = await findProjectRoot();
|
|
241
|
-
if (!projectRoot)
|
|
242
|
-
throw new Error('Not a TimSquad project');
|
|
243
|
-
const state = await loadWorkflowState(projectRoot);
|
|
244
|
-
const validKeys = Object.keys(state.automation);
|
|
245
|
-
if (!validKeys.includes(key)) {
|
|
246
|
-
throw new Error(`Invalid key: ${key}. Valid: ${validKeys.join(', ')}`);
|
|
247
|
-
}
|
|
248
|
-
const boolVal = value === 'on' || value === 'true' || value === '1';
|
|
249
|
-
state.automation[key] = boolVal;
|
|
250
|
-
await saveWorkflowState(projectRoot, state);
|
|
251
|
-
printSuccess(`${key} = ${boolVal ? 'ON' : 'OFF'}`);
|
|
252
|
-
}
|
|
253
|
-
// ============================================================
|
|
254
|
-
// Internal: Called by hooks
|
|
255
|
-
// ============================================================
|
|
256
|
-
/**
|
|
257
|
-
* Prepare task context for a sub-agent.
|
|
258
|
-
* Queries daemon IPC (or disk fallback) for scope data and writes task-context.json.
|
|
259
|
-
*/
|
|
260
|
-
async function taskStart(options) {
|
|
261
|
-
const projectRoot = await findProjectRoot();
|
|
262
|
-
if (!projectRoot)
|
|
263
|
-
throw new Error('Not a TimSquad project');
|
|
264
|
-
const scopePaths = options.scope?.split(',').map(s => s.trim()) || [];
|
|
265
|
-
if (scopePaths.length === 0) {
|
|
266
|
-
printSuccess(`Task started for ${options.agent} (no scope filter)`);
|
|
267
|
-
return;
|
|
268
|
-
}
|
|
269
|
-
// 데몬 IPC로 scope 쿼리
|
|
270
|
-
let scopedData = null;
|
|
271
|
-
try {
|
|
272
|
-
const response = await queryDaemon(projectRoot, 'scope', { paths: scopePaths });
|
|
273
|
-
scopedData = response.context;
|
|
274
|
-
}
|
|
275
|
-
catch {
|
|
276
|
-
// 데몬 미실행 — fallback으로 MetaCache 사용
|
|
277
|
-
const { MetaCache } = await import('../daemon/meta-cache.js');
|
|
278
|
-
const cache = new MetaCache(projectRoot);
|
|
279
|
-
await cache.load();
|
|
280
|
-
scopedData = cache.filterByScope(scopePaths);
|
|
281
|
-
}
|
|
282
|
-
if (scopedData && Object.keys(scopedData.files).length > 0) {
|
|
283
|
-
const ctxPath = await writeContext(projectRoot, options.agent, scopedData);
|
|
284
|
-
printSuccess(`Task context created for ${options.agent}`);
|
|
285
|
-
printKeyValue(' Context', ctxPath);
|
|
286
|
-
printKeyValue(' Files', String(Object.keys(scopedData.files).length));
|
|
287
|
-
}
|
|
288
|
-
else {
|
|
289
|
-
console.log(colors.dim(` No files matched scope: ${scopePaths.join(', ')}`));
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
/**
|
|
293
|
-
* Track a completed task in workflow state.
|
|
294
|
-
* Called by SubagentStop hook: tsq workflow track-task <agent> <task-log-path>
|
|
295
|
-
*/
|
|
296
|
-
async function trackTask(agent, taskLogPath) {
|
|
297
|
-
const projectRoot = await findProjectRoot();
|
|
298
|
-
if (!projectRoot)
|
|
299
|
-
return;
|
|
300
|
-
const state = await loadWorkflowState(projectRoot);
|
|
301
|
-
// Find matching sequence
|
|
302
|
-
const seqId = findSequenceForAgent(state, agent);
|
|
303
|
-
if (!seqId)
|
|
304
|
-
return; // No match or ambiguous — skip silently
|
|
305
|
-
const seq = state.sequences[seqId];
|
|
306
|
-
seq.completed_tasks.push({
|
|
307
|
-
agent,
|
|
308
|
-
task_log: taskLogPath,
|
|
309
|
-
completed_at: getTimestamp(),
|
|
310
|
-
});
|
|
311
|
-
// Update status
|
|
312
|
-
if (seq.status === 'pending') {
|
|
313
|
-
seq.status = 'in_progress';
|
|
314
|
-
}
|
|
315
|
-
if (isSequenceComplete(seq)) {
|
|
316
|
-
seq.status = 'completed';
|
|
317
|
-
}
|
|
318
|
-
await saveWorkflowState(projectRoot, state);
|
|
319
|
-
}
|
|
320
|
-
/**
|
|
321
|
-
* Check workflow state and auto-create L2/L3/gate/retro.
|
|
322
|
-
* Called by SessionEnd hook: tsq workflow check
|
|
323
|
-
*/
|
|
324
|
-
async function checkAndAutomate() {
|
|
325
|
-
const projectRoot = await findProjectRoot();
|
|
326
|
-
if (!projectRoot)
|
|
327
|
-
return;
|
|
328
|
-
const state = await loadWorkflowState(projectRoot);
|
|
329
|
-
let stateChanged = false;
|
|
330
|
-
// 1. Auto-create L2 for completed sequences
|
|
331
|
-
if (state.automation.sequence_log) {
|
|
332
|
-
for (const [seqId, seq] of Object.entries(state.sequences)) {
|
|
333
|
-
if (seq.status === 'completed' && !seq.l2_created) {
|
|
334
|
-
try {
|
|
335
|
-
const entry = await buildSequenceLogData(projectRoot, seqId, {
|
|
336
|
-
phase: seq.phase,
|
|
337
|
-
report: seq.report_path || `(auto) no report`,
|
|
338
|
-
verdict: 'proceed',
|
|
339
|
-
});
|
|
340
|
-
const seqDir = getSequencesDir(projectRoot);
|
|
341
|
-
await fs.ensureDir(seqDir);
|
|
342
|
-
await fs.writeJson(path.join(seqDir, `${seqId}.json`), entry, { spaces: 2 });
|
|
343
|
-
seq.l2_created = true;
|
|
344
|
-
stateChanged = true;
|
|
345
|
-
// Log the automation
|
|
346
|
-
await appendWorkflowLog(projectRoot, `[AUTO] L2 sequence log created: ${seqId}`);
|
|
347
|
-
}
|
|
348
|
-
catch { /* skip on error */ }
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
// 2. Check if all sequences in current phase are completed
|
|
353
|
-
if (state.current_phase && (state.automation.phase_log || state.automation.phase_gate)) {
|
|
354
|
-
const phaseSeqs = state.current_phase.sequences;
|
|
355
|
-
const allCompleted = phaseSeqs.length > 0 && phaseSeqs.every(id => {
|
|
356
|
-
const seq = state.sequences[id];
|
|
357
|
-
return seq && seq.status === 'completed' && seq.l2_created;
|
|
358
|
-
});
|
|
359
|
-
if (allCompleted) {
|
|
360
|
-
const phaseId = state.current_phase.id;
|
|
361
|
-
// 2a. Auto phase gate
|
|
362
|
-
if (state.automation.phase_gate) {
|
|
363
|
-
try {
|
|
364
|
-
const gateResult = await buildPhaseGateData(projectRoot, phaseId);
|
|
365
|
-
await appendWorkflowLog(projectRoot, `[AUTO] Phase gate ${phaseId}: ${gateResult.can_transition ? 'PASSED' : 'BLOCKED'}`);
|
|
366
|
-
}
|
|
367
|
-
catch { /* skip */ }
|
|
368
|
-
}
|
|
369
|
-
// 2b. Auto create L3 phase log
|
|
370
|
-
if (state.automation.phase_log) {
|
|
371
|
-
const phaseDir = getPhasesDir(projectRoot);
|
|
372
|
-
const phaseLogPath = path.join(phaseDir, `${phaseId}.json`);
|
|
373
|
-
if (!await fs.pathExists(phaseLogPath)) {
|
|
374
|
-
try {
|
|
375
|
-
const phaseLog = await buildPhaseLogData(projectRoot, phaseId, phaseSeqs);
|
|
376
|
-
await fs.ensureDir(phaseDir);
|
|
377
|
-
await fs.writeJson(phaseLogPath, phaseLog, { spaces: 2 });
|
|
378
|
-
await appendWorkflowLog(projectRoot, `[AUTO] L3 phase log created: ${phaseId}`);
|
|
379
|
-
stateChanged = true;
|
|
380
|
-
}
|
|
381
|
-
catch { /* skip */ }
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
// 2c. Auto retro (basic KPT collection)
|
|
385
|
-
if (state.automation.retro) {
|
|
386
|
-
try {
|
|
387
|
-
await autoRetro(projectRoot, phaseId, phaseSeqs, state);
|
|
388
|
-
await appendWorkflowLog(projectRoot, `[AUTO] Retro generated: ${phaseId}`);
|
|
389
|
-
}
|
|
390
|
-
catch { /* skip */ }
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
// 3. Auto metrics (already handled by auto-metrics.sh, but log)
|
|
395
|
-
if (state.automation.metrics) {
|
|
396
|
-
// auto-metrics.sh handles this — no-op here
|
|
397
|
-
}
|
|
398
|
-
// 4. Pending feedback cleanup
|
|
399
|
-
if (state.automation.feedback) {
|
|
400
|
-
const feedbackDir = path.join(projectRoot, '.timsquad', 'feedback');
|
|
401
|
-
const cleanedPending = [];
|
|
402
|
-
for (const fbId of state.pending_feedback || []) {
|
|
403
|
-
const fbPath = path.join(feedbackDir, `${fbId}.json`);
|
|
404
|
-
if (await fs.pathExists(fbPath)) {
|
|
405
|
-
try {
|
|
406
|
-
const fb = await fs.readJson(fbPath);
|
|
407
|
-
if (fb.status === 'open' || fb.status === 'in_review') {
|
|
408
|
-
cleanedPending.push(fbId);
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
catch { /* skip */ }
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
if (cleanedPending.length !== (state.pending_feedback || []).length) {
|
|
415
|
-
state.pending_feedback = cleanedPending;
|
|
416
|
-
stateChanged = true;
|
|
417
|
-
}
|
|
418
|
-
if (cleanedPending.length > 0) {
|
|
419
|
-
await appendWorkflowLog(projectRoot, `[AUTO] ${cleanedPending.length} pending feedback(s) blocking phase gate`);
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
if (stateChanged) {
|
|
423
|
-
await saveWorkflowState(projectRoot, state);
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
// ============================================================
|
|
427
|
-
// Internal helpers
|
|
428
|
-
// ============================================================
|
|
429
|
-
async function buildPhaseLogData(projectRoot, phaseId, seqIds) {
|
|
430
|
-
const seqDir = getSequencesDir(projectRoot);
|
|
431
|
-
const now = getTimestamp();
|
|
432
|
-
const seqLogs = [];
|
|
433
|
-
let completed = 0, blocked = 0;
|
|
434
|
-
for (const id of seqIds) {
|
|
435
|
-
const seqPath = path.join(seqDir, `${id}.json`);
|
|
436
|
-
if (await fs.pathExists(seqPath)) {
|
|
437
|
-
const data = await fs.readJson(seqPath);
|
|
438
|
-
seqLogs.push(data);
|
|
439
|
-
if (data.execution.status === 'completed')
|
|
440
|
-
completed++;
|
|
441
|
-
else
|
|
442
|
-
blocked++;
|
|
443
|
-
}
|
|
444
|
-
else {
|
|
445
|
-
blocked++;
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
let totalTasks = 0, totalSuccess = 0, totalRework = 0, totalFiles = 0;
|
|
449
|
-
let totalIssues1 = 0, totalIssues2 = 0, totalIssues3 = 0;
|
|
450
|
-
const durations = [];
|
|
451
|
-
for (const seq of seqLogs) {
|
|
452
|
-
totalTasks += seq.tasks.total;
|
|
453
|
-
totalSuccess += seq.tasks.success;
|
|
454
|
-
totalRework += seq.tasks.rework;
|
|
455
|
-
durations.push(seq.execution.duration_ms);
|
|
456
|
-
for (const axis of Object.values(seq.analysis)) {
|
|
457
|
-
const r = axis;
|
|
458
|
-
for (const issue of r.issues || []) {
|
|
459
|
-
if (issue.level === 1)
|
|
460
|
-
totalIssues1++;
|
|
461
|
-
else if (issue.level === 2)
|
|
462
|
-
totalIssues2++;
|
|
463
|
-
else
|
|
464
|
-
totalIssues3++;
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
for (const seqId of seqIds) {
|
|
469
|
-
const taskLogs = await loadSequenceTaskLogs(projectRoot, seqId);
|
|
470
|
-
for (const { data } of taskLogs) {
|
|
471
|
-
totalFiles += data.mechanical?.files?.length || 0;
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
const timestamps = seqLogs
|
|
475
|
-
.map(s => [new Date(s.execution.started_at).getTime(), new Date(s.execution.completed_at).getTime()])
|
|
476
|
-
.flat()
|
|
477
|
-
.filter(t => t > 0);
|
|
478
|
-
const leadTime = timestamps.length >= 2 ? Math.max(...timestamps) - Math.min(...timestamps) : 0;
|
|
479
|
-
return {
|
|
480
|
-
schema_version: LOG_SCHEMA_VERSION,
|
|
481
|
-
trace: { phase_id: phaseId },
|
|
482
|
-
execution: {
|
|
483
|
-
status: blocked > 0 ? 'aborted' : 'completed',
|
|
484
|
-
started_at: seqLogs[0]?.execution.started_at || now,
|
|
485
|
-
completed_at: now,
|
|
486
|
-
duration_ms: leadTime,
|
|
487
|
-
sessions_count: seqLogs.length,
|
|
488
|
-
},
|
|
489
|
-
sequences: { total: seqIds.length, completed, blocked, ids: seqIds },
|
|
490
|
-
aggregate_metrics: {
|
|
491
|
-
total_tasks: totalTasks,
|
|
492
|
-
task_success_rate: totalTasks > 0 ? totalSuccess / totalTasks : 0,
|
|
493
|
-
task_rework_rate: totalTasks > 0 ? totalRework / totalTasks : 0,
|
|
494
|
-
total_files_changed: totalFiles,
|
|
495
|
-
total_issues: { level_1: totalIssues1, level_2: totalIssues2, level_3: totalIssues3 },
|
|
496
|
-
ssot_conformance_rate: 0,
|
|
497
|
-
mean_sequence_duration_ms: durations.length > 0 ? durations.reduce((a, b) => a + b, 0) / durations.length : 0,
|
|
498
|
-
},
|
|
499
|
-
dora_derived: {
|
|
500
|
-
lead_time_ms: leadTime,
|
|
501
|
-
change_failure_rate: totalTasks > 0 ? (totalTasks - totalSuccess) / totalTasks : 0,
|
|
502
|
-
mean_recovery_time_ms: null,
|
|
503
|
-
},
|
|
504
|
-
planning: {
|
|
505
|
-
original_sequences: seqIds,
|
|
506
|
-
added_sequences: [],
|
|
507
|
-
removed_sequences: [],
|
|
508
|
-
scope_changes: [],
|
|
509
|
-
plan_adherence_rate: 1,
|
|
510
|
-
},
|
|
511
|
-
retrospective: { keep: [], problem: [], try: [] },
|
|
512
|
-
knowledge_extracted: [],
|
|
513
|
-
};
|
|
514
|
-
}
|
|
515
|
-
/**
|
|
516
|
-
* Auto-generate a basic retrospective from task/sequence data
|
|
517
|
-
*/
|
|
518
|
-
async function autoRetro(projectRoot, phaseId, seqIds, state) {
|
|
519
|
-
const retroDir = path.join(projectRoot, '.timsquad', 'retrospective', 'cycles');
|
|
520
|
-
await fs.ensureDir(retroDir);
|
|
521
|
-
const retroPath = path.join(retroDir, `${phaseId}-auto.md`);
|
|
522
|
-
if (await fs.pathExists(retroPath))
|
|
523
|
-
return; // Already exists
|
|
524
|
-
const keep = [];
|
|
525
|
-
const problem = [];
|
|
526
|
-
const tryItems = [];
|
|
527
|
-
// Analyze task logs for patterns
|
|
528
|
-
let totalTasks = 0, tasksWithSemantic = 0, totalRework = 0;
|
|
529
|
-
for (const seqId of seqIds) {
|
|
530
|
-
const taskLogs = await loadSequenceTaskLogs(projectRoot, seqId);
|
|
531
|
-
for (const { data } of taskLogs) {
|
|
532
|
-
totalTasks++;
|
|
533
|
-
if (hasSemantic(data.semantic))
|
|
534
|
-
tasksWithSemantic++;
|
|
535
|
-
if (data.semantic?.issues?.length) {
|
|
536
|
-
for (const issue of data.semantic.issues) {
|
|
537
|
-
if (issue.level >= 2) {
|
|
538
|
-
problem.push(`[${seqId}] ${issue.description}`);
|
|
539
|
-
}
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
}
|
|
543
|
-
const seq = state.sequences[seqId];
|
|
544
|
-
if (seq) {
|
|
545
|
-
const reworkCount = seq.completed_tasks.length - seq.expected_agents.length;
|
|
546
|
-
if (reworkCount > 0)
|
|
547
|
-
totalRework += reworkCount;
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
// Generate observations
|
|
551
|
-
const semanticCoverage = totalTasks > 0 ? Math.round((tasksWithSemantic / totalTasks) * 100) : 0;
|
|
552
|
-
if (semanticCoverage >= 80) {
|
|
553
|
-
keep.push(`Semantic coverage ${semanticCoverage}% — good documentation discipline`);
|
|
554
|
-
}
|
|
555
|
-
else if (semanticCoverage < 50) {
|
|
556
|
-
problem.push(`Semantic coverage ${semanticCoverage}% — agents not consistently enriching logs`);
|
|
557
|
-
tryItems.push('Enforce tsq log enrich in agent protocols');
|
|
558
|
-
}
|
|
559
|
-
if (totalRework === 0) {
|
|
560
|
-
keep.push('No rework detected — first-pass quality was high');
|
|
561
|
-
}
|
|
562
|
-
else {
|
|
563
|
-
problem.push(`${totalRework} rework tasks detected`);
|
|
564
|
-
tryItems.push('Review SSOT alignment before implementation starts');
|
|
565
|
-
}
|
|
566
|
-
if (seqIds.length > 0) {
|
|
567
|
-
keep.push(`${seqIds.length} sequences completed in phase ${phaseId}`);
|
|
568
|
-
}
|
|
569
|
-
// Write retro markdown
|
|
570
|
-
const content = `# Retrospective: ${phaseId} (Auto-generated)
|
|
571
|
-
|
|
572
|
-
> Generated at ${getTimestamp()} by tsq workflow check
|
|
573
|
-
|
|
574
|
-
## Keep
|
|
575
|
-
${keep.map(k => `- ${k}`).join('\n') || '- (none detected)'}
|
|
576
|
-
|
|
577
|
-
## Problem
|
|
578
|
-
${problem.map(p => `- ${p}`).join('\n') || '- (none detected)'}
|
|
579
|
-
|
|
580
|
-
## Try
|
|
581
|
-
${tryItems.map(t => `- ${t}`).join('\n') || '- (no suggestions)'}
|
|
582
|
-
|
|
583
|
-
---
|
|
584
|
-
|
|
585
|
-
## Metrics
|
|
586
|
-
- Total tasks: ${totalTasks}
|
|
587
|
-
- Semantic coverage: ${semanticCoverage}%
|
|
588
|
-
- Rework tasks: ${totalRework}
|
|
589
|
-
- Sequences: ${seqIds.join(', ')}
|
|
590
|
-
`;
|
|
591
|
-
await fs.writeFile(retroPath, content, 'utf-8');
|
|
592
|
-
}
|
|
593
|
-
/**
|
|
594
|
-
* Append to workflow automation log (for debugging/auditing)
|
|
595
|
-
*/
|
|
596
|
-
async function appendWorkflowLog(projectRoot, message) {
|
|
597
|
-
const logDir = path.join(projectRoot, '.timsquad', 'logs');
|
|
598
|
-
const logFile = path.join(logDir, 'workflow-automation.log');
|
|
599
|
-
await fs.ensureDir(logDir);
|
|
600
|
-
const line = `${getTimestamp()} ${message}\n`;
|
|
601
|
-
await fs.appendFile(logFile, line, 'utf-8');
|
|
602
|
-
}
|
|
603
|
-
function formatAutomation(auto) {
|
|
604
|
-
const enabled = Object.entries(auto).filter(([, v]) => v).map(([k]) => k);
|
|
605
|
-
return enabled.length > 0 ? enabled.join(', ') : 'all OFF';
|
|
606
|
-
}
|
|
607
|
-
//# sourceMappingURL=workflow.js.map
|