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
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Input Validation
|
|
3
|
+
impact: CRITICAL
|
|
4
|
+
tags: security, validation, sanitization, injection
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Input Validation
|
|
8
|
+
|
|
9
|
+
## Principle
|
|
10
|
+
Never trust user input. Validate, sanitize, and constrain all external data before processing.
|
|
11
|
+
|
|
12
|
+
## Allowlist Over Denylist
|
|
13
|
+
```typescript
|
|
14
|
+
// Bad: denylist — easy to bypass
|
|
15
|
+
const forbidden = ['<script>', 'onclick', 'onerror'];
|
|
16
|
+
if (forbidden.some(f => input.includes(f))) throw new Error('Invalid');
|
|
17
|
+
|
|
18
|
+
// Good: allowlist — only permit known-safe values
|
|
19
|
+
const ALLOWED_ROLES = ['admin', 'editor', 'viewer'] as const;
|
|
20
|
+
if (!ALLOWED_ROLES.includes(role)) throw new Error('Invalid role');
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Schema Validation
|
|
24
|
+
```typescript
|
|
25
|
+
import { z } from 'zod';
|
|
26
|
+
|
|
27
|
+
const UserInput = z.object({
|
|
28
|
+
name: z.string().min(1).max(100).trim(),
|
|
29
|
+
email: z.string().email().max(254),
|
|
30
|
+
age: z.number().int().min(0).max(150),
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
// Validate at boundary (controller/handler)
|
|
34
|
+
const data = UserInput.parse(req.body);
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Parameterized Queries
|
|
38
|
+
```typescript
|
|
39
|
+
// Bad: string interpolation — SQL injection risk
|
|
40
|
+
const q = `SELECT * FROM users WHERE id = '${id}'`;
|
|
41
|
+
|
|
42
|
+
// Good: parameterized query
|
|
43
|
+
const q = 'SELECT * FROM users WHERE id = $1';
|
|
44
|
+
await db.query(q, [id]);
|
|
45
|
+
|
|
46
|
+
// Good: ORM with type-safe parameters
|
|
47
|
+
await userRepo.findOneBy({ id: parseInt(id, 10) });
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Sanitize HTML Output
|
|
51
|
+
```typescript
|
|
52
|
+
// Bad
|
|
53
|
+
element.innerHTML = userInput;
|
|
54
|
+
|
|
55
|
+
// Good: escape or use textContent
|
|
56
|
+
element.textContent = userInput;
|
|
57
|
+
|
|
58
|
+
// Good: DOMPurify for rich content
|
|
59
|
+
import DOMPurify from 'dompurify';
|
|
60
|
+
element.innerHTML = DOMPurify.sanitize(userInput);
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Checklist
|
|
64
|
+
- Validate type, length, format, and range at the application boundary
|
|
65
|
+
- Use allowlists for enumerated values (roles, statuses, types)
|
|
66
|
+
- Use parameterized queries or ORM — never interpolate user input into SQL
|
|
67
|
+
- Sanitize output based on context (HTML, URL, SQL, shell)
|
|
68
|
+
- Reject unexpected fields; do not pass raw request bodies to business logic
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Secrets Management
|
|
3
|
+
impact: HIGH
|
|
4
|
+
tags: security, secrets, env, gitignore, rotation
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Secrets Management
|
|
8
|
+
|
|
9
|
+
## Never Hardcode Secrets
|
|
10
|
+
```typescript
|
|
11
|
+
// Bad: hardcoded secret
|
|
12
|
+
const API_KEY = 'sk-1234567890abcdef';
|
|
13
|
+
const DB_URL = 'postgres://admin:password@db:5432/prod';
|
|
14
|
+
|
|
15
|
+
// Good: environment variables
|
|
16
|
+
const API_KEY = process.env.API_KEY;
|
|
17
|
+
const DB_URL = process.env.DATABASE_URL;
|
|
18
|
+
|
|
19
|
+
// Better: secret manager for production
|
|
20
|
+
const API_KEY = await secretManager.getSecret('api-key');
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Environment Variables
|
|
24
|
+
- Use `.env` files for local development only
|
|
25
|
+
- Load with `dotenv` at application entry point, not in library code
|
|
26
|
+
- Validate required env vars at startup
|
|
27
|
+
```typescript
|
|
28
|
+
const required = ['DATABASE_URL', 'JWT_SECRET', 'API_KEY'];
|
|
29
|
+
for (const key of required) {
|
|
30
|
+
if (!process.env[key]) throw new Error(`Missing env var: ${key}`);
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## .gitignore Rules
|
|
35
|
+
```gitignore
|
|
36
|
+
# Must be in .gitignore — never commit secrets
|
|
37
|
+
.env
|
|
38
|
+
.env.local
|
|
39
|
+
.env.*.local
|
|
40
|
+
*.pem
|
|
41
|
+
*.key
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
- Use `.env.example` with placeholder values for documentation
|
|
45
|
+
- Run `git log --all -p -- .env` to verify secrets were never committed
|
|
46
|
+
- If a secret was committed, rotate it immediately — git history persists
|
|
47
|
+
|
|
48
|
+
## Secret Rotation
|
|
49
|
+
- Rotate secrets on a regular schedule (90 days recommended)
|
|
50
|
+
- Support dual-read during rotation (accept old + new key simultaneously)
|
|
51
|
+
- Automate rotation via secret manager (AWS Secrets Manager, Vault, etc.)
|
|
52
|
+
- Revoke old secrets after confirming the new ones work
|
|
53
|
+
|
|
54
|
+
## Production Practices
|
|
55
|
+
- Use a dedicated secret manager (AWS Secrets Manager, HashiCorp Vault, GCP Secret Manager)
|
|
56
|
+
- Grant least-privilege access to secrets per service
|
|
57
|
+
- Audit secret access logs regularly
|
|
58
|
+
- Never log secret values; mask them in error output
|
|
59
|
+
|
|
60
|
+
## Checklist
|
|
61
|
+
- No secrets in source code, config files, or container images
|
|
62
|
+
- `.env` and key files listed in `.gitignore`
|
|
63
|
+
- Required env vars validated at startup with clear error messages
|
|
64
|
+
- Secrets rotated on schedule; old secrets revoked
|
|
65
|
+
- Production uses a secret manager, not plain env vars
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tsq-spec
|
|
3
|
+
description: |
|
|
4
|
+
SSOT(Single Source of Truth) 문서 존재 여부를 확인하고, 미존재 시 구현 전 스펙 작성을 안내한다.
|
|
5
|
+
`/tsq-spec <기능명>`으로 호출하면 해당 기능의 SSOT 문서를 찾아 상태를 보고한다.
|
|
6
|
+
스펙 없이 구현하는 것을 방지하여 문서-코드 일관성을 유지한다.
|
|
7
|
+
version: "1.0.0"
|
|
8
|
+
tags: [tsq, spec, ssot, gate, documentation]
|
|
9
|
+
user-invocable: true
|
|
10
|
+
argument-hint: "[기능명] — SSOT 문서 존재 여부 확인"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Spec Gate
|
|
14
|
+
|
|
15
|
+
SSOT 문서 존재 여부를 확인하여 스펙 없는 구현을 방지한다.
|
|
16
|
+
|
|
17
|
+
## Contract
|
|
18
|
+
|
|
19
|
+
- **Trigger**: `/tsq-spec` 호출 또는 구현 시작 전 자동 확인
|
|
20
|
+
- **Input**: `$ARGUMENTS` (기능명) 또는 미지정 시 전체 SSOT 상태
|
|
21
|
+
- **Output**: SSOT 상태 리포트 (존재/stale/미존재) + 권장 액션
|
|
22
|
+
- **Error**: SSOT 디렉토리 자체가 없을 경우 "NOT FOUND" 안내
|
|
23
|
+
- **Dependencies**: tsq-protocol
|
|
24
|
+
|
|
25
|
+
## Protocol
|
|
26
|
+
|
|
27
|
+
1. **SSOT 검색**: `$ARGUMENTS`로 전달된 기능명으로 `.timsquad/ssot/` 디렉토리 탐색
|
|
28
|
+
2. **존재 확인**: 해당 기능의 스펙 문서(PRD, 설계문서, API 스펙) 존재 여부 판단
|
|
29
|
+
3. **상태 판정**:
|
|
30
|
+
- **존재 + 최신**: 스펙 요약 출력 + "구현 가능" 안내
|
|
31
|
+
- **존재 + stale**: "스펙 갱신 필요" + `tsq compile` 재실행 안내
|
|
32
|
+
- **미존재**: advisory 경고 + 스펙 작성 가이드 제공
|
|
33
|
+
4. **결과 리포트**: 상태 + 권장 액션을 구조화하여 출력
|
|
34
|
+
|
|
35
|
+
## Verification
|
|
36
|
+
|
|
37
|
+
| Check | Method | Pass Criteria |
|
|
38
|
+
|-------|--------|---------------|
|
|
39
|
+
| SSOT 파일 존재 | `.timsquad/ssot/` 탐색 | 관련 문서 1개 이상 |
|
|
40
|
+
| stale 여부 | compile-manifest hash 비교 | hash 일치 |
|
|
41
|
+
| 스펙 커버리지 | 기능 키워드 매칭 | 해당 기능 언급 존재 |
|
|
42
|
+
|
|
43
|
+
## Quick Rules
|
|
44
|
+
|
|
45
|
+
### Gate 동작
|
|
46
|
+
- **미존재 시**: advisory 경고 (차단 아님)
|
|
47
|
+
```
|
|
48
|
+
[SPEC GATE] 기능 "{name}"에 대한 SSOT 문서가 없습니다.
|
|
49
|
+
스펙 먼저 작성하세요: .timsquad/ssot/{name}.md
|
|
50
|
+
가이드: PRD → 설계문서 → Compiled Spec 순서
|
|
51
|
+
```
|
|
52
|
+
- **stale 시**: `tsq compile` 재실행 안내
|
|
53
|
+
```
|
|
54
|
+
[SPEC GATE] SSOT 문서가 최신이 아닙니다. `tsq compile` 재실행 필요.
|
|
55
|
+
```
|
|
56
|
+
- **Phase gate에서만 실제 차단** (일반 사용 시 advisory)
|
|
57
|
+
- `$ARGUMENTS` 미지정 시 전체 SSOT 상태 요약
|
|
58
|
+
- PRD, 설계문서, API 스펙 모두 SSOT로 인정
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: stability
|
|
2
|
+
name: tsq-stability
|
|
3
3
|
description: |
|
|
4
4
|
프로젝트 안정성 검증 스킬. 릴리스/스프린트 완료 전 6-Layer 자동+수동 검증 수행.
|
|
5
5
|
L0(정적분석) → L1(유닛테스트) → L2(보안스캔) → L3(쉘스크립트) → L4(통합) → L5(패키지).
|
|
6
6
|
각 레이어는 fail-closed(기본) 또는 fail-open 정책 적용.
|
|
7
7
|
사용 시점: 릴리스 전, 스프린트 완료 시, 보안 감사 요청 시.
|
|
8
8
|
version: "1.0.0"
|
|
9
|
-
tags: [verification, security, quality, release]
|
|
9
|
+
tags: [tsq, verification, security, quality, release]
|
|
10
10
|
user-invocable: false
|
|
11
11
|
---
|
|
12
12
|
|
|
@@ -33,7 +33,7 @@ user-invocable: false
|
|
|
33
33
|
## Quick Rules
|
|
34
34
|
|
|
35
35
|
### 검증 실행
|
|
36
|
-
- `bash .claude/skills/stability
|
|
36
|
+
- `bash .claude/skills/tsq-stability/scripts/verify.sh` 로 전체 실행
|
|
37
37
|
- `--layer L0` 으로 특정 레이어만 실행
|
|
38
38
|
- `--skip L3` 으로 특정 레이어 건너뛰기
|
|
39
39
|
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tsq-start
|
|
3
|
+
description: |
|
|
4
|
+
TimSquad 파이프라인 시작. 데몬 기동, 프로토콜 활성화, 현재 상태 복원.
|
|
5
|
+
초기화 직후 프로젝트는 자동으로 온보딩 모드 진입 (SSOT 문서 작성 가이드).
|
|
6
|
+
Use when: 사용자가 /tsq-start로 TimSquad 파이프라인을 시작할 때.
|
|
7
|
+
version: "2.0.0"
|
|
8
|
+
tags: [tsq, pipeline, start, onboarding]
|
|
9
|
+
user-invocable: true
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# /tsq-start — TimSquad Pipeline Start
|
|
13
|
+
|
|
14
|
+
## Protocol
|
|
15
|
+
|
|
16
|
+
1. **데몬 기동**: `tsq daemon start 2>/dev/null || true`
|
|
17
|
+
2. **현재 Phase 확인**: `.timsquad/state/current-phase.json` 읽기
|
|
18
|
+
3. **프로토콜 활성화**: 이후 tsq-protocol 준수, 위임은 controller 경유
|
|
19
|
+
4. **상태 복원**: 진행 중인 시퀀스/태스크 요약 출력
|
|
20
|
+
5. **온보딩 감지**: SSOT 충족도 검사 → 미충족 시 온보딩 모드
|
|
21
|
+
6. **안내 출력**
|
|
22
|
+
|
|
23
|
+
## 온보딩 감지 (Step 5)
|
|
24
|
+
|
|
25
|
+
`.timsquad/ssot/`의 `.md` 파일을 스캔하여 작성 완료도 판정:
|
|
26
|
+
- **empty**: placeholder만 존재 (`[Resource Name]`, `TBD`, `example.com` 등이 50%+)
|
|
27
|
+
- **partial**: 일부 섹션만 작성
|
|
28
|
+
- **filled**: 주요 섹션 작성 완료
|
|
29
|
+
|
|
30
|
+
**진입 조건** (하나라도 해당): prd.md가 empty / required 70%+ empty / progress=0
|
|
31
|
+
|
|
32
|
+
온보딩 시 SSOT 현황(⬜/🟨/✅)을 보여주고 3가지 선택지 제시:
|
|
33
|
+
1. 온보딩 시작 (권장) — PRD부터 순서대로
|
|
34
|
+
2. 특정 문서만 작성
|
|
35
|
+
3. 건너뛰기
|
|
36
|
+
|
|
37
|
+
## 온보딩 프로세스
|
|
38
|
+
|
|
39
|
+
**작성 우선순위**: prd → requirements → data-design → service-spec → 타입별 필수
|
|
40
|
+
|
|
41
|
+
타입별 추가 우선 문서는 `references/onboarding-questions.md` 참조.
|
|
42
|
+
|
|
43
|
+
**각 문서 작성 흐름**:
|
|
44
|
+
1. **인터뷰**: 핵심 질문 3-5개 (`references/onboarding-questions.md`의 ★ 필수 질문)
|
|
45
|
+
2. **초안 생성**: 답변으로 SSOT 템플릿 placeholder 채움
|
|
46
|
+
3. **확인**: 초안 보여주고 수정 수렴
|
|
47
|
+
4. **저장**: `.timsquad/ssot/{name}.md`
|
|
48
|
+
5. **다음 문서**: 계속 여부 확인
|
|
49
|
+
|
|
50
|
+
### PRD → Grill 자동 연결
|
|
51
|
+
|
|
52
|
+
PRD 초안 완성 후 기능 인덱스에 기능이 2개 이상이면 자동으로 `/tsq-grill` 반복 진입:
|
|
53
|
+
|
|
54
|
+
1. PRD 기능 인덱스 테이블에서 Sub-PRD 미작성 기능 목록 추출
|
|
55
|
+
2. 사용자에게 목록 보여주고 순서 확인 ("이 순서로 하나씩 상세화합니다")
|
|
56
|
+
3. 각 기능마다 `/tsq-grill` 프로세스 실행 (Why → What → How 인터뷰 → Sub-PRD 생성)
|
|
57
|
+
4. 하나 완료 후 자동으로 다음 기능 진행 (사용자가 "중단", "나중에"라고 하면 정지)
|
|
58
|
+
5. 중단 시 진행 상태를 `onboarding-progress.json`에 기록 → 다음 `/tsq-start`에서 이어서 진행
|
|
59
|
+
6. 모든 기능의 Sub-PRD 완성 시 → 나머지 SSOT 문서(requirements, data-design 등) 온보딩 계속
|
|
60
|
+
|
|
61
|
+
이렇게 하면 PRD가 기능 목록만 있는 껍데기가 아니라, 각 기능의 Why/What/How까지 잡힌 상태에서 설계 단계로 넘어간다.
|
|
62
|
+
|
|
63
|
+
**세션 관리**: `.timsquad/state/onboarding-progress.json`에 진행 상태 저장:
|
|
64
|
+
```json
|
|
65
|
+
{
|
|
66
|
+
"documents": { "prd": "filled", "requirements": "empty", ... },
|
|
67
|
+
"grill": {
|
|
68
|
+
"pending": ["feature-b", "feature-c"],
|
|
69
|
+
"completed": ["feature-a"],
|
|
70
|
+
"current": null
|
|
71
|
+
},
|
|
72
|
+
"last_updated": "ISO8601"
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
세션 끊겨도 다음 `/tsq-start`에서 `grill.pending`부터 이어서 진행. 모든 문서 filled + grill.pending 비어있으면 자동 완료.
|
|
76
|
+
|
|
77
|
+
## 온보딩 완료 후 자동 전환
|
|
78
|
+
|
|
79
|
+
모든 SSOT 문서 filled + grill.pending 비어있으면 온보딩 완료. 이후:
|
|
80
|
+
|
|
81
|
+
1. **`/tsq-decompose` 자동 안내**: "온보딩 완료. `/tsq-decompose`로 Phase-Sequence-Task 실행 계획을 생성하시겠습니까?"
|
|
82
|
+
2. 사용자 승인 시 `/tsq-decompose` 실행 (Sub-PRD → DAG → planning.md)
|
|
83
|
+
3. planning.md 확정 후 → 정상 파이프라인 진행 (Controller 경유 위임)
|
|
84
|
+
|
|
85
|
+
## 파이프라인 분기
|
|
86
|
+
|
|
87
|
+
온보딩 완료 + planning.md 확정 후 사용자가 작업을 지시하면:
|
|
88
|
+
- **파이프라인 적합** (새 기능, API, DB, 아키텍처) → controller 경유 위임
|
|
89
|
+
- **단순 작업** (오타, 스타일, 1-2줄) → 직접 수행 + 최소 로그
|
|
90
|
+
- **모호한 경우** → 사용자에게 선택지 제시
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "SSOT 온보딩 인터뷰 가이드"
|
|
3
|
+
category: guide
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# SSOT 온보딩 인터뷰 가이드
|
|
7
|
+
|
|
8
|
+
> 각 SSOT 문서를 작성하기 위한 핵심 질문 목록.
|
|
9
|
+
> /tsq-start 온보딩 모드에서 순서대로 질문하여 초안을 생성한다.
|
|
10
|
+
|
|
11
|
+
## 사용법
|
|
12
|
+
|
|
13
|
+
1. 해당 문서의 질문을 순서대로 진행
|
|
14
|
+
2. 답변을 수집하여 SSOT 템플릿의 placeholder를 채움
|
|
15
|
+
3. 사용자가 "모르겠다" / "나중에"라고 하면 해당 섹션은 TBD로 남김
|
|
16
|
+
4. 최소 필수 질문(★)만 답변해도 유효한 초안 생성 가능
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## prd.md — 제품 요구사항
|
|
21
|
+
|
|
22
|
+
| # | 질문 | 필수 | 채울 섹션 |
|
|
23
|
+
|:-:|------|:---:|----------|
|
|
24
|
+
| 1 | 이 프로젝트가 해결하는 핵심 문제는 무엇인가요? | ★ | 1.1 배경 |
|
|
25
|
+
| 2 | 주요 사용자(타겟)는 누구인가요? | ★ | 1.2 타겟 사용자 |
|
|
26
|
+
| 3 | 핵심 기능 3가지를 말해주세요. | ★ | 2. 핵심 기능 |
|
|
27
|
+
| 4 | MVP 범위는 어디까지인가요? (있다면) | | 3. 범위 |
|
|
28
|
+
| 5 | 경쟁 제품이나 참고 서비스가 있나요? | | 1.3 경쟁 분석 |
|
|
29
|
+
|
|
30
|
+
**초안 생성 규칙**: 질문 1-3 답변으로 PRD의 개요, 핵심 기능, 사용자 스토리 섹션 채움. 나머지는 TBD.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## requirements.md — 요구사항
|
|
35
|
+
|
|
36
|
+
| # | 질문 | 필수 | 채울 섹션 |
|
|
37
|
+
|:-:|------|:---:|----------|
|
|
38
|
+
| 1 | 반드시 있어야 하는 기능(Must)은? | ★ | FR - Must |
|
|
39
|
+
| 2 | 있으면 좋은 기능(Should/Could)은? | | FR - Should/Could |
|
|
40
|
+
| 3 | 성능 요구사항이 있나요? (동시 접속, 응답 시간 등) | | NFR - 성능 |
|
|
41
|
+
| 4 | 보안 요구사항이 있나요? (인증, 암호화 등) | | NFR - 보안 |
|
|
42
|
+
| 5 | 기술 제약이 있나요? (특정 언어, 프레임워크, 클라우드 등) | | NFR - 기술 제약 |
|
|
43
|
+
|
|
44
|
+
**초안 생성 규칙**: Must 기능을 기능 요구사항 테이블로 변환. 각 항목에 ID 부여 (FR-001~).
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## data-design.md — 데이터 설계
|
|
49
|
+
|
|
50
|
+
| # | 질문 | 필수 | 채울 섹션 |
|
|
51
|
+
|:-:|------|:---:|----------|
|
|
52
|
+
| 1 | 주요 데이터 엔티티(테이블)는 무엇인가요? (예: 사용자, 주문, 상품) | ★ | 1. ERD |
|
|
53
|
+
| 2 | 엔티티 간 관계를 설명해주세요. (1:N, M:N 등) | ★ | 1. ERD |
|
|
54
|
+
| 3 | 각 엔티티의 핵심 필드는? | | 2. 테이블 상세 |
|
|
55
|
+
| 4 | 암호화가 필요한 민감 데이터가 있나요? | | 3. 보안 |
|
|
56
|
+
| 5 | 검색이 빈번한 필드는? (인덱스 후보) | | 4. 인덱스 |
|
|
57
|
+
|
|
58
|
+
**초안 생성 규칙**: 엔티티 목록으로 ERD 다이어그램 + 테이블 스키마 생성. PK는 UUID, 공통 필드(created_at, updated_at) 자동 추가.
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## service-spec.md — 서비스(API) 명세
|
|
63
|
+
|
|
64
|
+
| # | 질문 | 필수 | 채울 섹션 |
|
|
65
|
+
|:-:|------|:---:|----------|
|
|
66
|
+
| 1 | 인증 방식은 무엇인가요? (JWT, Session, OAuth 등) | ★ | 1. 개요 |
|
|
67
|
+
| 2 | 주요 API 리소스(엔드포인트 그룹)는? | ★ | 2+ 리소스별 |
|
|
68
|
+
| 3 | 각 리소스의 CRUD 중 필요한 작업은? | | 2+ 리소스별 |
|
|
69
|
+
| 4 | 특수 비즈니스 엔드포인트가 있나요? (결제, 알림 등) | | 추가 섹션 |
|
|
70
|
+
| 5 | 페이지네이션 방식은? (offset, cursor) | | 1. 개요 |
|
|
71
|
+
|
|
72
|
+
**초안 생성 규칙**: 리소스별 RESTful 엔드포인트 자동 생성. 요청/응답 스키마는 data-design 참조.
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## ui-ux-spec.md — UI/UX 명세
|
|
77
|
+
|
|
78
|
+
| # | 질문 | 필수 | 채울 섹션 |
|
|
79
|
+
|:-:|------|:---:|----------|
|
|
80
|
+
| 1 | 주요 화면(페이지)은 몇 개이고 어떤 것들인가요? | ★ | 화면 목록 |
|
|
81
|
+
| 2 | 디자인 참고 사이트나 컬러 시스템이 있나요? | | 디자인 시스템 |
|
|
82
|
+
| 3 | 반응형이 필요한가요? 지원 기기는? | | 레이아웃 |
|
|
83
|
+
| 4 | 다국어 지원이 필요한가요? | | i18n |
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## navigation-map.md — 네비게이션 맵 (mobile-app)
|
|
88
|
+
|
|
89
|
+
| # | 질문 | 필수 | 채울 섹션 |
|
|
90
|
+
|:-:|------|:---:|----------|
|
|
91
|
+
| 1 | 메인 탭은 몇 개이고 각각 무엇인가요? | ★ | 1. 구조 |
|
|
92
|
+
| 2 | 로그인/회원가입 흐름이 있나요? | ★ | Auth Stack |
|
|
93
|
+
| 3 | 딥링크가 필요한 화면이 있나요? | | 4. 딥링크 |
|
|
94
|
+
| 4 | 모달/바텀시트가 필요한 화면은? | | Modal Stack |
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## compliance-matrix.md — 컴플라이언스 (fintech)
|
|
99
|
+
|
|
100
|
+
| # | 질문 | 필수 | 채울 섹션 |
|
|
101
|
+
|:-:|------|:---:|----------|
|
|
102
|
+
| 1 | 어떤 금융 서비스인가요? (결제, 거래소, 송금 등) | ★ | 1. 적용 규제 |
|
|
103
|
+
| 2 | 카드 결제를 직접 처리하나요, PG사를 사용하나요? | ★ | 3. PCI DSS |
|
|
104
|
+
| 3 | 해외 사용자 서비스 계획이 있나요? (GDPR 등) | | 1. 적용 규제 |
|
|
105
|
+
| 4 | 전자금융업 등록 상태는? | | 5. 인증 일정 |
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## sdk-spec.md — SDK 명세 (platform)
|
|
110
|
+
|
|
111
|
+
| # | 질문 | 필수 | 채울 섹션 |
|
|
112
|
+
|:-:|------|:---:|----------|
|
|
113
|
+
| 1 | SDK 사용자는 누구인가요? (외부 개발자, 내부팀) | ★ | 1. 개요 |
|
|
114
|
+
| 2 | 지원 런타임은? (Node, Browser, Python 등) | ★ | 1. 개요 |
|
|
115
|
+
| 3 | 주요 리소스/메서드는? | ★ | 2. 공개 API |
|
|
116
|
+
| 4 | 버전 정책은? (SemVer, CalVer) | | 5. 버전 정책 |
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## state-machine.md — 상태 머신
|
|
121
|
+
|
|
122
|
+
| # | 질문 | 필수 | 채울 섹션 |
|
|
123
|
+
|:-:|------|:---:|----------|
|
|
124
|
+
| 1 | 상태 관리가 필요한 엔티티는? (주문, 결제, 배송 등) | ★ | 1. 개요 |
|
|
125
|
+
| 2 | 각 엔티티의 가능한 상태 값은? | ★ | 2. 상태 정의 |
|
|
126
|
+
| 3 | 상태 전이 시 부수 효과가 있나요? (알림, 외부 API 등) | | 2.5 부수 효과 |
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## infra-topology.md — 인프라 토폴로지 (infra)
|
|
131
|
+
|
|
132
|
+
| # | 질문 | 필수 | 채울 섹션 |
|
|
133
|
+
|:-:|------|:---:|----------|
|
|
134
|
+
| 1 | 클라우드 프로바이더는? (AWS, GCP, Azure 등) | ★ | 1. 아키텍처 |
|
|
135
|
+
| 2 | 서비스는 몇 개이고 어떤 역할인가요? | ★ | 3. 서비스 구성 |
|
|
136
|
+
| 3 | DB와 캐시는 무엇을 사용하나요? | | 3. 서비스 구성 |
|
|
137
|
+
| 4 | 환경은 몇 개인가요? (dev, staging, prod) | | 5. 환경별 차이 |
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## monitoring-spec.md — 모니터링
|
|
142
|
+
|
|
143
|
+
| # | 질문 | 필수 | 채울 섹션 |
|
|
144
|
+
|:-:|------|:---:|----------|
|
|
145
|
+
| 1 | 가용성 목표는? (99.9%, 99.99% 등) | ★ | 1. SLI/SLO |
|
|
146
|
+
| 2 | 알림은 어디로 보내나요? (Slack, PagerDuty 등) | ★ | 5. 알림 |
|
|
147
|
+
| 3 | 추적할 비즈니스 메트릭이 있나요? | | 2.3 비즈니스 메트릭 |
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## performance-budget.md — 성능 예산
|
|
152
|
+
|
|
153
|
+
| # | 질문 | 필수 | 채울 섹션 |
|
|
154
|
+
|:-:|------|:---:|----------|
|
|
155
|
+
| 1 | 주요 페이지의 로딩 목표는? | ★ | 1. 성능 목표 |
|
|
156
|
+
| 2 | API 응답 시간 목표는? | ★ | 3. API 성능 예산 |
|
|
157
|
+
| 3 | JS 번들 크기 제한이 있나요? | | 1.3 리소스 예산 |
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## component-map.md — 컴포넌트 맵
|
|
162
|
+
|
|
163
|
+
| # | 질문 | 필수 | 채울 섹션 |
|
|
164
|
+
|:-:|------|:---:|----------|
|
|
165
|
+
| 1 | UI 프레임워크는? (React, Vue, Flutter 등) | ★ | 1. 계층 |
|
|
166
|
+
| 2 | 디자인 시스템이 있나요? (Material, 자체 등) | | 5. 디자인 토큰 |
|
|
167
|
+
| 3 | 공유 컴포넌트로 만들 것은? (Button, Card, Modal 등) | | 2-3. 컴포넌트 |
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## audit-trail-spec.md — 감사 추적
|
|
172
|
+
|
|
173
|
+
| # | 질문 | 필수 | 채울 섹션 |
|
|
174
|
+
|:-:|------|:---:|----------|
|
|
175
|
+
| 1 | 감사가 필요한 이벤트 유형은? (인증, 거래, 데이터 변경) | ★ | 1. 감사 대상 |
|
|
176
|
+
| 2 | 법적 보존 기간 요구사항이 있나요? | ★ | 1. 보존 기간 |
|
|
177
|
+
| 3 | 로그 변조 방지가 필요한가요? | | 3. 무결성 보장 |
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tsq-status
|
|
3
|
+
description: |
|
|
4
|
+
프로젝트 현재 상태 확인. Phase, 시퀀스, SSOT, 에이전트 상태를 요약 보고.
|
|
5
|
+
Use when: /tsq-status, "현재 상태", "프로젝트 상태", "어디까지 했나"
|
|
6
|
+
version: "1.0.0"
|
|
7
|
+
tags: [tsq, status, report]
|
|
8
|
+
user-invocable: true
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# /tsq-status — Project Status Report
|
|
12
|
+
|
|
13
|
+
## Protocol
|
|
14
|
+
|
|
15
|
+
1. **Phase 확인**: `.timsquad/state/current-phase.json` 읽기
|
|
16
|
+
2. **Phase Memory**: `.timsquad/state/phase-memory.md` 존재 시 carry-over / 주의사항 추출
|
|
17
|
+
3. **SSOT 상태**: `.timsquad/ssot/` 디렉토리의 문서 존재/작성 여부 확인
|
|
18
|
+
4. **워크플로우 상태**: `.timsquad/state/workflow.json` 읽기 (활성 시퀀스, 완료 Phase)
|
|
19
|
+
5. **최근 로그**: `.timsquad/logs/` 에서 최근 활동 요약
|
|
20
|
+
6. **세션 메트릭**: `.timsquad/.daemon/session-state.json` 읽기 → tokenInput/tokenOutput/tokenCacheRead 추출
|
|
21
|
+
7. **SSOT Drift**: `.timsquad/.daemon/drift-warnings.json` 존재 시 미갱신 문서 목록 추출
|
|
22
|
+
8. **요약 출력**:
|
|
23
|
+
```
|
|
24
|
+
## Project Status
|
|
25
|
+
- Phase: {current} ({progress}%)
|
|
26
|
+
- SSOT: {filled}/{total} documents
|
|
27
|
+
- Active sequences: {list or none}
|
|
28
|
+
- Carry-over: {items from phase-memory or "none"}
|
|
29
|
+
- Tokens (est): {input + output} (cache hit: {cacheRead / (input + cacheRead) * 100}%)
|
|
30
|
+
- SSOT Drift: {count} documents outdated ({list}) 또는 "none"
|
|
31
|
+
- Last activity: {date — summary}
|
|
32
|
+
```
|
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: tdd
|
|
3
|
-
description:
|
|
2
|
+
name: tsq-tdd
|
|
3
|
+
description: |
|
|
4
|
+
Test-Driven Development 방법론 가이드라인. Red-Green-Refactor 사이클, 테스트 우선 설계 원칙.
|
|
5
|
+
테스트 도구·패턴·커버리지 전략은 tsq-testing 스킬 참조.
|
|
6
|
+
Use when: TDD 방식으로 개발할 때, 테스트 먼저 작성 후 구현할 때, Red-Green-Refactor 사이클 적용 시.
|
|
4
7
|
version: "1.0.0"
|
|
5
|
-
tags: [tdd, methodology, testing]
|
|
8
|
+
tags: [tsq, tdd, methodology, testing]
|
|
6
9
|
user-invocable: false
|
|
10
|
+
hooks:
|
|
11
|
+
PreToolUse:
|
|
12
|
+
- matcher: "Write|Edit"
|
|
13
|
+
hooks:
|
|
14
|
+
- type: prompt
|
|
15
|
+
prompt: "TDD: 이 파일에 대한 테스트가 먼저 작성되었는지 확인하라. 테스트 없이 구현 코드를 작성하면 Red-Green-Refactor 사이클을 위반한다."
|
|
7
16
|
---
|
|
8
17
|
|
|
9
18
|
# TDD (Test-Driven Development)
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tsq-testing
|
|
3
|
+
description: |
|
|
4
|
+
테스트 전략·도구·패턴 가이드라인. 테스트 피라미드, Given-When-Then 패턴, 커버리지 기준.
|
|
5
|
+
방법론(Red-Green-Refactor 사이클)은 tsq-tdd 스킬 참조.
|
|
6
|
+
Use when: 테스트 작성, 단위 테스트, 통합 테스트, E2E, 커버리지, 테스트 구조 설계 시.
|
|
7
|
+
version: "1.0.0"
|
|
8
|
+
tags: [tsq, testing, tdd, quality]
|
|
9
|
+
user-invocable: false
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Testing
|
|
13
|
+
|
|
14
|
+
품질 보장을 위한 테스트 작성 가이드라인.
|
|
15
|
+
|
|
16
|
+
## Philosophy
|
|
17
|
+
|
|
18
|
+
- Red-Green-Refactor (TDD 사이클) 준수
|
|
19
|
+
- 테스트 피라미드: Unit(다수) > Integration(중간) > E2E(소수)
|
|
20
|
+
- 행동(behavior) 테스트 — 구현 디테일이 아닌 결과 검증
|
|
21
|
+
|
|
22
|
+
## Contract
|
|
23
|
+
|
|
24
|
+
- **Trigger**: 테스트 작성/수정 태스크, 코드 변경 후 테스트 필요 시
|
|
25
|
+
- **Input**: 테스트 대상 코드 + 요구사항
|
|
26
|
+
- **Output**: Given-When-Then 패턴 테스트 + 커버리지 기준 충족
|
|
27
|
+
- **Error**: 커버리지 미달 시 추가 테스트 작성
|
|
28
|
+
- **Dependencies**: 없음
|
|
29
|
+
|
|
30
|
+
## Protocol
|
|
31
|
+
|
|
32
|
+
1. **Red**: 실패하는 테스트 작성
|
|
33
|
+
2. **Green**: 테스트를 통과하는 최소 코드 작성
|
|
34
|
+
3. **Refactor**: 코드 정리 (테스트는 계속 통과)
|
|
35
|
+
4. **Coverage 확인**: 기준 충족 여부 점검
|
|
36
|
+
|
|
37
|
+
## Verification
|
|
38
|
+
|
|
39
|
+
| Check | Command | Pass Criteria |
|
|
40
|
+
|-------|---------|---------------|
|
|
41
|
+
| 테스트 실행 | `npm test` | exit code 0 |
|
|
42
|
+
| 라인 커버리지 | coverage report | >= 80% |
|
|
43
|
+
| 브랜치 커버리지 | coverage report | >= 70% |
|
|
44
|
+
| 3카테고리 | 수동 검증 | Happy/Edge/Error 포함 |
|
|
45
|
+
|
|
46
|
+
## Resources
|
|
47
|
+
|
|
48
|
+
| Priority | Type | Resource | Description |
|
|
49
|
+
|----------|------|----------|-------------|
|
|
50
|
+
| HIGH | ref | [testing-patterns](references/testing-patterns.md) | Given-When-Then, Mock 가이드 |
|
|
51
|
+
| HIGH | ref | [e2e-stability](references/e2e-stability.md) | E2E Viewport, Wait, Retry 가이드 |
|
|
52
|
+
|
|
53
|
+
## Quick Rules
|
|
54
|
+
|
|
55
|
+
### Test Naming
|
|
56
|
+
- 형식: `should {expected behavior} when {condition}`
|
|
57
|
+
- Bad: `test getUser`, `works correctly`
|
|
58
|
+
|
|
59
|
+
### Test Categories
|
|
60
|
+
- **Happy Path** — 정상 흐름
|
|
61
|
+
- **Edge Cases** — 경계 조건 (빈 문자열, 0, null, 최대값)
|
|
62
|
+
- **Error Cases** — 오류 상황
|
|
63
|
+
|
|
64
|
+
### Coverage Standards
|
|
65
|
+
| Metric | Min | Recommended |
|
|
66
|
+
|--------|-----|-------------|
|
|
67
|
+
| Line | 80% | 90% |
|
|
68
|
+
| Branch | 70% | 80% |
|
|
69
|
+
| Function | 80% | 90% |
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: E2E Stability Guide
|
|
3
|
+
category: reference
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# E2E Stability Guide
|
|
7
|
+
|
|
8
|
+
## Viewport & Selectors
|
|
9
|
+
- 테스트 전 `page.setViewportSize({ width: 1280, height: 720 })` 고정
|
|
10
|
+
- `data-testid` 셀렉터 사용 — CSS 클래스/태그 기반 셀렉터 금지
|
|
11
|
+
- `getByRole`, `getByText` 등 의미 기반 셀렉터 우선
|
|
12
|
+
|
|
13
|
+
## Serial Execution
|
|
14
|
+
- E2E 테스트는 `describe.serial` 또는 `--shard` 사용
|
|
15
|
+
- 상태 의존 테스트는 반드시 순서 보장 (`test.describe.configure({ mode: 'serial' })`)
|
|
16
|
+
|
|
17
|
+
## Wait Strategy
|
|
18
|
+
- `waitForSelector` 대신 `waitForLoadState('networkidle')` + assertion
|
|
19
|
+
- 하드코딩 `sleep`/`setTimeout` 절대 사용 금지
|
|
20
|
+
- 동적 콘텐츠: `expect(locator).toBeVisible({ timeout: 10000 })`
|
|
21
|
+
|
|
22
|
+
## Retry & Flakiness
|
|
23
|
+
- Playwright `retries: 2` 설정 (CI 환경)
|
|
24
|
+
- flaky 테스트 발견 시 `test.fixme()` 마킹 후 원인 분석
|
|
25
|
+
- 재시도 성공도 flaky로 기록 → `.e2e-passed` 마커에 `flaky` 카운트 포함
|
|
26
|
+
|
|
27
|
+
## Timeout Standards
|
|
28
|
+
|
|
29
|
+
| Category | Timeout | Rationale |
|
|
30
|
+
|----------|---------|-----------|
|
|
31
|
+
| Unit Test | 120s | 빠른 피드백 |
|
|
32
|
+
| E2E Test | 300s | 네트워크/렌더링 대기 |
|
|
33
|
+
| Build | 180s | 컴파일 + 번들링 |
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: typescript
|
|
3
|
-
description:
|
|
2
|
+
name: tsq-typescript
|
|
3
|
+
description: |
|
|
4
|
+
TypeScript 개발 가이드라인. strict 모드, 타입 패턴, Zod 검증, Branded Types.
|
|
5
|
+
Use when: .ts/.tsx 파일 작성·수정, tsconfig 설정, 타입 안전성 이슈, any 제거, 외부 입력 검증 시.
|
|
4
6
|
version: "1.0.0"
|
|
5
|
-
tags: [typescript, types, strict]
|
|
7
|
+
tags: [tsq, typescript, types, strict]
|
|
6
8
|
user-invocable: false
|
|
7
9
|
---
|
|
8
10
|
|
|
@@ -54,14 +56,6 @@ user-invocable: false
|
|
|
54
56
|
- `@ts-ignore`, `@ts-expect-error` 남용
|
|
55
57
|
- `!` non-null assertion 남용
|
|
56
58
|
|
|
57
|
-
## Checklist
|
|
58
|
-
- [ ] strict 모드 활성화
|
|
59
|
-
- [ ] any 타입 없음
|
|
60
|
-
- [ ] 함수 반환 타입 명시
|
|
61
|
-
- [ ] 외부 입력 Zod 검증
|
|
62
|
-
- [ ] Discriminated Union으로 상태 표현
|
|
63
|
-
- [ ] Branded Types로 ID 구분
|
|
64
|
-
|
|
65
59
|
## 참조
|
|
66
60
|
- `rules/type-patterns.md` — 각 패턴의 코드 예시
|
|
67
61
|
- `rules/utility-types.md` — DTO 조합, DeepPartial, 타입 안전 API 클라이언트
|