timsquad 2.1.0 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +124 -724
- package/dist/commands/daemon.d.ts +7 -0
- package/dist/commands/daemon.d.ts.map +1 -0
- package/dist/commands/daemon.js +140 -0
- package/dist/commands/daemon.js.map +1 -0
- package/dist/commands/feedback.d.ts +9 -0
- package/dist/commands/feedback.d.ts.map +1 -1
- package/dist/commands/feedback.js +235 -14
- package/dist/commands/feedback.js.map +1 -1
- package/dist/commands/full.js +2 -2
- package/dist/commands/full.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +107 -20
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/knowledge.d.ts +3 -0
- package/dist/commands/knowledge.d.ts.map +1 -0
- package/dist/commands/knowledge.js +316 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/log.d.ts +27 -0
- package/dist/commands/log.d.ts.map +1 -1
- package/dist/commands/log.js +965 -0
- package/dist/commands/log.js.map +1 -1
- package/dist/commands/meta-index.d.ts +3 -0
- package/dist/commands/meta-index.d.ts.map +1 -0
- package/dist/commands/meta-index.js +401 -0
- package/dist/commands/meta-index.js.map +1 -0
- package/dist/commands/metrics.d.ts.map +1 -1
- package/dist/commands/metrics.js +239 -4
- package/dist/commands/metrics.js.map +1 -1
- package/dist/commands/retro.js +154 -6
- package/dist/commands/retro.js.map +1 -1
- package/dist/commands/upgrade.d.ts +8 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +287 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/workflow.d.ts +3 -0
- package/dist/commands/workflow.d.ts.map +1 -0
- package/dist/commands/workflow.js +607 -0
- package/dist/commands/workflow.js.map +1 -0
- package/dist/daemon/context-writer.d.ts +16 -0
- package/dist/daemon/context-writer.d.ts.map +1 -0
- package/dist/daemon/context-writer.js +35 -0
- package/dist/daemon/context-writer.js.map +1 -0
- package/dist/daemon/entry.d.ts +7 -0
- package/dist/daemon/entry.d.ts.map +1 -0
- package/dist/daemon/entry.js +17 -0
- package/dist/daemon/entry.js.map +1 -0
- package/dist/daemon/event-queue.d.ts +52 -0
- package/dist/daemon/event-queue.d.ts.map +1 -0
- package/dist/daemon/event-queue.js +255 -0
- package/dist/daemon/event-queue.js.map +1 -0
- package/dist/daemon/file-watcher.d.ts +19 -0
- package/dist/daemon/file-watcher.d.ts.map +1 -0
- package/dist/daemon/file-watcher.js +87 -0
- package/dist/daemon/file-watcher.js.map +1 -0
- package/dist/daemon/index.d.ts +28 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +204 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/jsonl-watcher.d.ts +49 -0
- package/dist/daemon/jsonl-watcher.d.ts.map +1 -0
- package/dist/daemon/jsonl-watcher.js +258 -0
- package/dist/daemon/jsonl-watcher.js.map +1 -0
- package/dist/daemon/meta-cache.d.ts +62 -0
- package/dist/daemon/meta-cache.d.ts.map +1 -0
- package/dist/daemon/meta-cache.js +240 -0
- package/dist/daemon/meta-cache.js.map +1 -0
- package/dist/daemon/shutdown.d.ts +21 -0
- package/dist/daemon/shutdown.d.ts.map +1 -0
- package/dist/daemon/shutdown.js +158 -0
- package/dist/daemon/shutdown.js.map +1 -0
- package/dist/index.js +20 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-composer.d.ts +38 -0
- package/dist/lib/agent-composer.d.ts.map +1 -0
- package/dist/lib/agent-composer.js +128 -0
- package/dist/lib/agent-composer.js.map +1 -0
- package/dist/lib/agent-generator.d.ts +22 -0
- package/dist/lib/agent-generator.d.ts.map +1 -0
- package/dist/lib/agent-generator.js +150 -0
- package/dist/lib/agent-generator.js.map +1 -0
- package/dist/lib/ast-parser.d.ts +11 -0
- package/dist/lib/ast-parser.d.ts.map +1 -0
- package/dist/lib/ast-parser.js +282 -0
- package/dist/lib/ast-parser.js.map +1 -0
- package/dist/lib/config.d.ts +6 -2
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +27 -3
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/meta-index.d.ts +19 -0
- package/dist/lib/meta-index.d.ts.map +1 -0
- package/dist/lib/meta-index.js +573 -0
- package/dist/lib/meta-index.js.map +1 -0
- package/dist/lib/project.js +1 -1
- package/dist/lib/project.js.map +1 -1
- package/dist/lib/skill-generator.d.ts +32 -0
- package/dist/lib/skill-generator.d.ts.map +1 -0
- package/dist/lib/skill-generator.js +187 -0
- package/dist/lib/skill-generator.js.map +1 -0
- package/dist/lib/template.d.ts +16 -2
- package/dist/lib/template.d.ts.map +1 -1
- package/dist/lib/template.js +109 -20
- package/dist/lib/template.js.map +1 -1
- package/dist/lib/ui-index.d.ts +12 -0
- package/dist/lib/ui-index.d.ts.map +1 -0
- package/dist/lib/ui-index.js +239 -0
- package/dist/lib/ui-index.js.map +1 -0
- package/dist/lib/ui-parser.d.ts +12 -0
- package/dist/lib/ui-parser.d.ts.map +1 -0
- package/dist/lib/ui-parser.js +472 -0
- package/dist/lib/ui-parser.js.map +1 -0
- package/dist/lib/update-check.d.ts +6 -0
- package/dist/lib/update-check.d.ts.map +1 -0
- package/dist/lib/update-check.js +121 -0
- package/dist/lib/update-check.js.map +1 -0
- package/dist/lib/upgrade-backup.d.ts +33 -0
- package/dist/lib/upgrade-backup.d.ts.map +1 -0
- package/dist/lib/upgrade-backup.js +101 -0
- package/dist/lib/upgrade-backup.js.map +1 -0
- package/dist/lib/version.d.ts +19 -0
- package/dist/lib/version.d.ts.map +1 -0
- package/dist/lib/version.js +35 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/lib/workflow-state.d.ts +48 -0
- package/dist/lib/workflow-state.d.ts.map +1 -0
- package/dist/lib/workflow-state.js +67 -0
- package/dist/lib/workflow-state.js.map +1 -0
- package/dist/types/config.d.ts +102 -2
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +173 -9
- package/dist/types/config.js.map +1 -1
- package/dist/types/feedback.d.ts +7 -0
- package/dist/types/feedback.d.ts.map +1 -1
- package/dist/types/feedback.js +1 -1
- package/dist/types/feedback.js.map +1 -1
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/meta-index.d.ts +146 -0
- package/dist/types/meta-index.d.ts.map +1 -0
- package/dist/types/meta-index.js +7 -0
- package/dist/types/meta-index.js.map +1 -0
- package/dist/types/project.d.ts +18 -2
- package/dist/types/project.d.ts.map +1 -1
- package/dist/types/project.js +21 -0
- package/dist/types/project.js.map +1 -1
- package/dist/types/task-log.d.ts +208 -0
- package/dist/types/task-log.d.ts.map +1 -0
- package/dist/types/task-log.js +6 -0
- package/dist/types/task-log.js.map +1 -0
- package/dist/types/ui-meta.d.ts +118 -0
- package/dist/types/ui-meta.d.ts.map +1 -0
- package/dist/types/ui-meta.js +7 -0
- package/dist/types/ui-meta.js.map +1 -0
- package/package.json +12 -4
- package/templates/base/agents/base/tsq-architect.md +68 -0
- package/templates/base/agents/base/tsq-dba.md +56 -0
- package/templates/base/agents/base/tsq-designer.md +72 -0
- package/templates/base/agents/base/tsq-developer.md +67 -0
- package/templates/base/agents/base/tsq-qa.md +55 -0
- package/templates/base/agents/base/tsq-security.md +65 -0
- package/templates/base/agents/overlays/domain/general-web/_common.md +11 -0
- package/templates/base/agents/overlays/platform/claude-code.md +12 -0
- package/templates/base/config.template.yaml +213 -0
- package/templates/base/knowledge/checklists/accessibility.md +37 -0
- package/templates/base/knowledge/checklists/architecture-review.md +28 -0
- package/templates/base/knowledge/checklists/database-standards.md +84 -0
- package/templates/base/knowledge/checklists/design-reference.md +97 -0
- package/templates/base/knowledge/checklists/security.md +50 -0
- package/templates/base/knowledge/checklists/ssot-validation.md +19 -0
- package/templates/base/knowledge/domains/_template.md +16 -0
- package/templates/base/knowledge/platforms/_template.md +16 -0
- package/templates/base/knowledge/templates/sequence-report.md +44 -0
- package/templates/base/knowledge/templates/task-result.md +105 -0
- package/templates/base/skills/_template/SKILL.md +59 -0
- package/templates/base/skills/_template/references/_template.md +35 -0
- package/templates/base/skills/_template/rules/_sections.md +34 -0
- package/templates/base/skills/_template/rules/_template.md +32 -0
- package/templates/base/skills/_template/scripts/_template.sh +31 -0
- package/templates/base/skills/architecture/SKILL.md +54 -0
- package/templates/base/skills/architecture/references/adr-template.md +50 -0
- package/templates/base/skills/architecture/references/api-design.md +64 -0
- package/templates/base/skills/backend/node/SKILL.md +81 -0
- package/templates/base/skills/backend/node/rules/async-patterns.md +81 -0
- package/templates/base/skills/backend/node/rules/deployment.md +33 -0
- package/templates/base/skills/backend/node/rules/env-config.md +41 -0
- package/templates/base/skills/backend/node/rules/error-handling.md +83 -0
- package/templates/base/skills/backend/node/rules/hono-app-setup.md +98 -0
- package/templates/base/skills/backend/node/rules/jwt-auth.md +76 -0
- package/templates/base/skills/backend/node/rules/middleware.md +56 -0
- package/templates/base/skills/backend/node/rules/testing.md +82 -0
- package/templates/base/skills/coding/SKILL.md +47 -0
- package/templates/base/skills/coding/rules/patterns.md +81 -0
- package/templates/base/skills/database/SKILL.md +98 -0
- package/templates/base/skills/database/prisma/SKILL.md +57 -0
- package/templates/base/skills/database/prisma/rules/queries.md +133 -0
- package/templates/base/skills/database/prisma/rules/schema-design.md +80 -0
- package/templates/base/skills/frontend/nextjs/SKILL.md +59 -0
- package/templates/base/skills/frontend/nextjs/rules/app-router.md +138 -0
- package/templates/base/skills/frontend/react/SKILL.md +86 -0
- package/templates/base/skills/frontend/react/rules/_sections.md +88 -0
- package/templates/base/skills/frontend/react/rules/anti-patterns.md +67 -0
- package/templates/base/skills/frontend/react/rules/async-api-routes.md +38 -0
- package/templates/base/skills/frontend/react/rules/async-defer-await.md +80 -0
- package/templates/base/skills/frontend/react/rules/async-dependencies.md +36 -0
- package/templates/base/skills/frontend/react/rules/async-parallel.md +28 -0
- package/templates/base/skills/frontend/react/rules/async-suspense-boundaries.md +99 -0
- package/templates/base/skills/frontend/react/rules/bundle-barrel-imports.md +59 -0
- package/templates/base/skills/frontend/react/rules/bundle-defer-third-party.md +49 -0
- package/templates/base/skills/frontend/react/rules/bundle-dynamic-imports.md +35 -0
- package/templates/base/skills/frontend/react/rules/component-conventions.md +74 -0
- package/templates/base/skills/frontend/react/rules/js-combine-iterations.md +32 -0
- package/templates/base/skills/frontend/react/rules/js-early-exit.md +50 -0
- package/templates/base/skills/frontend/react/rules/js-index-maps.md +37 -0
- package/templates/base/skills/frontend/react/rules/js-set-map-lookups.md +24 -0
- package/templates/base/skills/frontend/react/rules/rendering-conditional-render.md +40 -0
- package/templates/base/skills/frontend/react/rules/rendering-content-visibility.md +38 -0
- package/templates/base/skills/frontend/react/rules/rendering-hoist-jsx.md +46 -0
- package/templates/base/skills/frontend/react/rules/rerender-defer-reads.md +39 -0
- package/templates/base/skills/frontend/react/rules/rerender-derived-state.md +29 -0
- package/templates/base/skills/frontend/react/rules/rerender-memo.md +44 -0
- package/templates/base/skills/frontend/react/rules/rerender-transitions.md +40 -0
- package/templates/base/skills/frontend/react/rules/server-after-nonblocking.md +73 -0
- package/templates/base/skills/frontend/react/rules/server-cache-react.md +26 -0
- package/templates/base/skills/frontend/react/rules/server-parallel-fetching.md +79 -0
- package/templates/base/skills/frontend/react/rules/state-location.md +55 -0
- package/templates/base/skills/methodology/bdd/SKILL.md +69 -0
- package/templates/base/skills/methodology/bdd/rules/gherkin-patterns.md +113 -0
- package/templates/base/skills/methodology/ddd/SKILL.md +74 -0
- package/templates/base/skills/methodology/ddd/rules/strategic-patterns.md +98 -0
- package/templates/base/skills/methodology/debugging/SKILL.md +60 -0
- package/templates/base/skills/methodology/debugging/references/root-cause-tracing.md +84 -0
- package/templates/base/skills/methodology/tdd/SKILL.md +66 -0
- package/templates/base/skills/methodology/tdd/rules/real-world-example.md +88 -0
- package/templates/base/skills/methodology/tdd/rules/techniques.md +185 -0
- package/templates/base/skills/planning/SKILL.md +58 -0
- package/templates/base/skills/planning/references/prd-guide.md +47 -0
- package/templates/base/skills/planning/references/requirements-guide.md +46 -0
- package/templates/base/skills/prompt-engineering/SKILL.md +103 -0
- package/templates/base/skills/retrospective/SKILL.md +102 -0
- package/templates/base/skills/security/SKILL.md +55 -0
- package/templates/base/skills/security/rules/owasp-examples.md +119 -0
- package/templates/base/skills/security/scripts/check-secrets.sh +55 -0
- package/templates/base/skills/testing/SKILL.md +63 -0
- package/templates/base/skills/testing/references/testing-patterns.md +103 -0
- package/templates/base/skills/tsq-protocol/SKILL.md +51 -0
- package/templates/base/skills/typescript/SKILL.md +67 -0
- package/templates/base/skills/typescript/rules/type-patterns.md +135 -0
- package/templates/base/skills/typescript/rules/utility-types.md +76 -0
- package/templates/base/skills/ui-design/SKILL.md +70 -0
- package/templates/{common → base}/timsquad/feedback/routing-rules.yaml +1 -1
- package/templates/{common → base}/timsquad/retrospective/metrics/metrics-schema.json +46 -1
- package/templates/platforms/claude-code/CLAUDE.md.template +64 -0
- package/templates/platforms/claude-code/rules/adr-rules.md +32 -0
- package/templates/platforms/claude-code/rules/feedback-routing.md +18 -0
- package/templates/platforms/claude-code/rules/phase-management.md +23 -0
- package/templates/platforms/claude-code/rules/reporting-format.md +26 -0
- package/templates/platforms/claude-code/rules/sequence-management.md +72 -0
- package/templates/platforms/claude-code/rules/workspace-sync.md +33 -0
- package/templates/platforms/claude-code/settings.json +26 -0
- package/templates/project-types/api-backend/config.yaml +227 -0
- package/templates/project-types/api-backend/process/workflow.xml +214 -0
- package/templates/project-types/fintech/config.yaml +151 -0
- package/templates/project-types/fintech/process/workflow.xml +316 -0
- package/templates/project-types/infra/config.yaml +327 -0
- package/templates/project-types/infra/process/workflow.xml +296 -0
- package/templates/project-types/platform/config.yaml +254 -0
- package/templates/project-types/platform/process/workflow.xml +254 -0
- package/templates/project-types/web-app/config.yaml +198 -0
- package/templates/project-types/web-app/process/workflow.xml +210 -0
- package/templates/project-types/web-service/config.yaml +136 -0
- package/templates/project-types/web-service/process/workflow.xml +184 -0
- package/templates/common/CLAUDE.md.template +0 -254
- package/templates/common/claude/agents/tsq-dba.md +0 -311
- package/templates/common/claude/agents/tsq-designer.md +0 -323
- package/templates/common/claude/agents/tsq-developer.md +0 -177
- package/templates/common/claude/agents/tsq-planner.md +0 -190
- package/templates/common/claude/agents/tsq-prompter.md +0 -356
- package/templates/common/claude/agents/tsq-qa.md +0 -168
- package/templates/common/claude/agents/tsq-retro.md +0 -193
- package/templates/common/claude/agents/tsq-security.md +0 -221
- package/templates/common/claude/hooks/auto-metrics.sh +0 -165
- package/templates/common/claude/hooks/auto-worklog.sh +0 -245
- package/templates/common/claude/hooks/event-logger.sh +0 -208
- package/templates/common/claude/settings.json +0 -86
- package/templates/common/claude/skills/architecture/SKILL.md +0 -123
- package/templates/common/claude/skills/backend/node/SKILL.md +0 -1015
- package/templates/common/claude/skills/coding/SKILL.md +0 -171
- package/templates/common/claude/skills/database/prisma/SKILL.md +0 -357
- package/templates/common/claude/skills/frontend/nextjs/SKILL.md +0 -279
- package/templates/common/claude/skills/frontend/react/SKILL.md +0 -1729
- package/templates/common/claude/skills/methodology/bdd/SKILL.md +0 -234
- package/templates/common/claude/skills/methodology/ddd/SKILL.md +0 -311
- package/templates/common/claude/skills/methodology/tdd/SKILL.md +0 -512
- package/templates/common/claude/skills/planning/SKILL.md +0 -90
- package/templates/common/claude/skills/security/SKILL.md +0 -234
- package/templates/common/claude/skills/testing/SKILL.md +0 -146
- package/templates/common/claude/skills/typescript/SKILL.md +0 -435
- package/templates/common/config.template.yaml +0 -132
- /package/templates/{common → base}/timsquad/architectures/clean/ARCHITECTURE.md +0 -0
- /package/templates/{common → base}/timsquad/architectures/clean/backend.xml +0 -0
- /package/templates/{common → base}/timsquad/architectures/clean/frontend.xml +0 -0
- /package/templates/{common → base}/timsquad/architectures/fsd/ARCHITECTURE.md +0 -0
- /package/templates/{common → base}/timsquad/architectures/fsd/frontend.xml +0 -0
- /package/templates/{common → base}/timsquad/architectures/hexagonal/ARCHITECTURE.md +0 -0
- /package/templates/{common → base}/timsquad/architectures/hexagonal/backend.xml +0 -0
- /package/templates/{common → base}/timsquad/constraints/competency-framework.xml +0 -0
- /package/templates/{common → base}/timsquad/constraints/ssot-schema.xml +0 -0
- /package/templates/{common → base}/timsquad/feedback/feedback-router.sh +0 -0
- /package/templates/{common → base}/timsquad/generators/data-design.xml +0 -0
- /package/templates/{common → base}/timsquad/generators/prd.xml +0 -0
- /package/templates/{common → base}/timsquad/generators/requirements.xml +0 -0
- /package/templates/{common → base}/timsquad/generators/service-spec.xml +0 -0
- /package/templates/{common → base}/timsquad/logs/_example.md +0 -0
- /package/templates/{common → base}/timsquad/logs/_template.md +0 -0
- /package/templates/{common → base}/timsquad/patterns/cqrs.xml +0 -0
- /package/templates/{common → base}/timsquad/patterns/event-sourcing.xml +0 -0
- /package/templates/{common → base}/timsquad/patterns/repository.xml +0 -0
- /package/templates/{common → base}/timsquad/process/phase-checklist.yaml +0 -0
- /package/templates/{common → base}/timsquad/process/state-machine.xml +0 -0
- /package/templates/{common → base}/timsquad/process/validation-rules.xml +0 -0
- /package/templates/{common → base}/timsquad/process/workflow-base.xml +0 -0
- /package/templates/{common → base}/timsquad/retrospective/cycle-report.template.md +0 -0
- /package/templates/{common → base}/timsquad/retrospective/patterns/failure-patterns.md +0 -0
- /package/templates/{common → base}/timsquad/retrospective/patterns/success-patterns.md +0 -0
- /package/templates/{common → base}/timsquad/retrospective/retrospective-config.xml +0 -0
- /package/templates/{common → base}/timsquad/retrospective/retrospective-state.xml +0 -0
- /package/templates/{common → base}/timsquad/ssot/adr/ADR-000-template.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/adr/ADR-001-example.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/data-design.template.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/deployment-spec.template.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/env-config.template.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/error-codes.template.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/functional-spec.template.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/glossary.template.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/integration-spec.template.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/planning.template.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/prd.template.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/requirements.template.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/security-spec.template.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/service-spec.template.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/test-spec.template.md +0 -0
- /package/templates/{common → base}/timsquad/ssot/ui-ux-spec.template.md +0 -0
- /package/templates/{common → base}/timsquad/state/workspace.xml +0 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: planning
|
|
3
|
+
description: |
|
|
4
|
+
기획 및 요건 정의 가이드라인.
|
|
5
|
+
PRD, 요구사항 정의, 문서 구조화, 대용량 문서 분할 전략을 다룸.
|
|
6
|
+
Use when: "기획, PRD, 요구사항, 요건 정의, 스코프, 마일스톤"
|
|
7
|
+
version: "1.0.0"
|
|
8
|
+
tags: [planning, prd, requirements]
|
|
9
|
+
user-invocable: false
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Planning
|
|
13
|
+
|
|
14
|
+
기획 문서 작성 및 요건 정의를 위한 가이드라인.
|
|
15
|
+
|
|
16
|
+
## Philosophy
|
|
17
|
+
|
|
18
|
+
- SSOT 구조 준수: PRD (Why) → Planning (Overview) → Requirements (What)
|
|
19
|
+
- 각 문서는 다음 단계의 입력
|
|
20
|
+
- 검증 가능한 요건만 작성
|
|
21
|
+
|
|
22
|
+
## Resources
|
|
23
|
+
|
|
24
|
+
| Priority | Type | Resource | Description |
|
|
25
|
+
|----------|------|----------|-------------|
|
|
26
|
+
| HIGH | ref | [prd-guide](references/prd-guide.md) | PRD 작성 가이드 + 예시 |
|
|
27
|
+
| HIGH | ref | [requirements-guide](references/requirements-guide.md) | 요건 분류 + SMART + MoSCoW |
|
|
28
|
+
|
|
29
|
+
## Quick Rules
|
|
30
|
+
|
|
31
|
+
### SSOT Documents
|
|
32
|
+
| 문서 | 역할 |
|
|
33
|
+
|------|------|
|
|
34
|
+
| `prd.md` | 왜 만드는지, 목표, 성공 지표 |
|
|
35
|
+
| `planning.md` | 전체 계획, 마일스톤, 일정 |
|
|
36
|
+
| `requirements.md` | 기능/비기능 요건 목록 |
|
|
37
|
+
| `functional-spec.md` | 기능 시나리오, 예외처리 |
|
|
38
|
+
|
|
39
|
+
### Large Document Strategy
|
|
40
|
+
800줄 이상 예상 문서는 반드시 분할:
|
|
41
|
+
1. 목차 기반 규모 사전 추정
|
|
42
|
+
2. 도메인별 분할
|
|
43
|
+
3. 인덱스 파일에서 분할 문서 링크 유지
|
|
44
|
+
4. 순차 append 방식으로 섹션별 작성
|
|
45
|
+
|
|
46
|
+
### Context Verification
|
|
47
|
+
SSOT 템플릿 작성 시 `config.yaml` 프로젝트 설정을 먼저 확인.
|
|
48
|
+
프로젝트에서 실제 사용하는 서비스만 포함. 제너릭 외부 서비스를 무분별하게 채우지 않는다.
|
|
49
|
+
|
|
50
|
+
## Checklist
|
|
51
|
+
|
|
52
|
+
| Priority | Item |
|
|
53
|
+
|----------|------|
|
|
54
|
+
| CRITICAL | 목표가 명확히 정의되었는가 |
|
|
55
|
+
| CRITICAL | 스코프가 명확히 구분되었는가 (포함/제외) |
|
|
56
|
+
| HIGH | 모든 요건에 우선순위가 있는가 |
|
|
57
|
+
| HIGH | 요건이 검증 가능한가 (정량적 기준) |
|
|
58
|
+
| MEDIUM | 이해관계자 승인을 받았는가 |
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: PRD Writing Guide
|
|
3
|
+
category: guide
|
|
4
|
+
source: internal
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# PRD (Product Requirements Document) Guide
|
|
8
|
+
|
|
9
|
+
PRD 작성 시 필수 섹션과 예시.
|
|
10
|
+
|
|
11
|
+
## Required Sections
|
|
12
|
+
|
|
13
|
+
1. **배경 및 목적** — 왜 이 제품/기능이 필요한가
|
|
14
|
+
2. **목표 사용자** — 누가 사용하는가
|
|
15
|
+
3. **핵심 가치** — 어떤 문제를 해결하는가
|
|
16
|
+
4. **성공 지표** — 어떻게 성공을 측정할 것인가
|
|
17
|
+
5. **스코프** — 포함/제외 범위
|
|
18
|
+
|
|
19
|
+
## Example
|
|
20
|
+
|
|
21
|
+
```markdown
|
|
22
|
+
## 1. 배경 및 목적
|
|
23
|
+
현재 로그인 프로세스에서 이탈률이 30%에 달함.
|
|
24
|
+
소셜 로그인 도입으로 가입/로그인 허들을 낮추고자 함.
|
|
25
|
+
|
|
26
|
+
## 2. 목표 사용자
|
|
27
|
+
- 처음 방문하는 신규 사용자
|
|
28
|
+
- 비밀번호를 자주 잊어버리는 사용자
|
|
29
|
+
|
|
30
|
+
## 3. 핵심 가치
|
|
31
|
+
- 3초 내 로그인 완료
|
|
32
|
+
- 비밀번호 기억 부담 제거
|
|
33
|
+
|
|
34
|
+
## 4. 성공 지표
|
|
35
|
+
- 로그인 이탈률 30% → 10%
|
|
36
|
+
- 가입 전환율 20% 향상
|
|
37
|
+
|
|
38
|
+
## 5. 스코프
|
|
39
|
+
포함: Google, Apple 소셜 로그인
|
|
40
|
+
제외: Facebook, Twitter (Phase 2)
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Common Pitfalls
|
|
44
|
+
|
|
45
|
+
- 성공 지표가 정량적이지 않음 ("사용자 경험 개선" → 구체적 수치)
|
|
46
|
+
- 스코프 경계가 모호 → 나중에 스코프 크리프 발생
|
|
47
|
+
- 목표 사용자 미정의 → 모든 사람을 위해 만들다 아무도 만족 못함
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Requirements Writing Guide
|
|
3
|
+
category: guide
|
|
4
|
+
source: internal
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Requirements Writing Guide
|
|
8
|
+
|
|
9
|
+
기능/비기능 요건 정의 및 분류 가이드.
|
|
10
|
+
|
|
11
|
+
## Classification
|
|
12
|
+
|
|
13
|
+
| 유형 | 약어 | 설명 |
|
|
14
|
+
|------|------|------|
|
|
15
|
+
| 기능 요건 | FR | 시스템이 해야 하는 것 |
|
|
16
|
+
| 비기능 요건 | NFR | 성능, 보안, 확장성 등 |
|
|
17
|
+
|
|
18
|
+
## SMART Principles
|
|
19
|
+
|
|
20
|
+
- **S**pecific — 구체적
|
|
21
|
+
- **M**easurable — 측정 가능
|
|
22
|
+
- **A**chievable — 달성 가능
|
|
23
|
+
- **R**elevant — 관련성 있음
|
|
24
|
+
- **T**ime-bound — 기한 있음
|
|
25
|
+
|
|
26
|
+
## Priority System (MoSCoW)
|
|
27
|
+
|
|
28
|
+
- **Must** — 반드시 포함
|
|
29
|
+
- **Should** — 강력 권장
|
|
30
|
+
- **Could** — 있으면 좋음
|
|
31
|
+
- **Won't** — 이번에는 제외
|
|
32
|
+
|
|
33
|
+
## Requirements Table Template
|
|
34
|
+
|
|
35
|
+
```markdown
|
|
36
|
+
| ID | 분류 | 요건 | 우선순위 | 검증 방법 |
|
|
37
|
+
|----|-----|-----|---------|----------|
|
|
38
|
+
| FR-001 | 인증 | 사용자는 이메일/비밀번호로 로그인할 수 있다 | Must | 테스트 |
|
|
39
|
+
| NFR-001 | 성능 | 로그인 응답 시간 < 500ms | Must | 부하 테스트 |
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Common Pitfalls
|
|
43
|
+
|
|
44
|
+
- 검증 불가능한 요건 ("빨라야 한다" → "응답 500ms 이하")
|
|
45
|
+
- 우선순위 미지정 → 모든 것이 Must가 됨
|
|
46
|
+
- 기능/비기능 미분류 → 비기능 요건 누락
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: prompt-engineering
|
|
3
|
+
description: 프롬프트 최적화, 템플릿 관리, 회고 기반 개선 가이드라인
|
|
4
|
+
version: "1.0.0"
|
|
5
|
+
tags: [prompt, optimization, retrospective]
|
|
6
|
+
user-invocable: false
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
<skill name="prompt-engineering">
|
|
10
|
+
<purpose>에이전트/스킬 프롬프트 최적화 및 품질 개선</purpose>
|
|
11
|
+
|
|
12
|
+
<optimization-principles>
|
|
13
|
+
<principle name="구조화">
|
|
14
|
+
역할 → 페르소나 → 작업 전 필수 → 핵심 원칙 → 작업 프로세스 → 출력 형식 → 금지 사항 → 예시
|
|
15
|
+
</principle>
|
|
16
|
+
<principle name="명확성">
|
|
17
|
+
| Bad | Good |
|
|
18
|
+
|-----|------|
|
|
19
|
+
| "잘 작성해" | "3문장 이내로 요약해" |
|
|
20
|
+
| "좋은 코드" | "테스트 커버리지 80%" |
|
|
21
|
+
| 나열만 | "필수/권장/선택" 분류 |
|
|
22
|
+
</principle>
|
|
23
|
+
<principle name="컨텍스트">
|
|
24
|
+
프로젝트 정보, 참조 문서 경로, 제약 사항을 명시적으로 주입
|
|
25
|
+
</principle>
|
|
26
|
+
<principle name="예시 포함">
|
|
27
|
+
Good/Bad 예시를 함께 제공하여 기대 품질 수준 명확화
|
|
28
|
+
</principle>
|
|
29
|
+
</optimization-principles>
|
|
30
|
+
|
|
31
|
+
<template-format>
|
|
32
|
+
<![CDATA[
|
|
33
|
+
---
|
|
34
|
+
name: {template-name}
|
|
35
|
+
version: 1.0.0
|
|
36
|
+
agent: {target-agent}
|
|
37
|
+
task_type: {implementation|review|analysis}
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
# {Title}
|
|
41
|
+
|
|
42
|
+
## 컨텍스트 주입
|
|
43
|
+
{{CONTEXT}}
|
|
44
|
+
|
|
45
|
+
## 작업 정의
|
|
46
|
+
{{TASK_DESCRIPTION}}
|
|
47
|
+
|
|
48
|
+
## SSOT 참조
|
|
49
|
+
{{SSOT_REFERENCES}}
|
|
50
|
+
|
|
51
|
+
## 출력 요구사항
|
|
52
|
+
{{OUTPUT_REQUIREMENTS}}
|
|
53
|
+
|
|
54
|
+
## 검증 기준
|
|
55
|
+
{{VALIDATION_CRITERIA}}
|
|
56
|
+
]]>
|
|
57
|
+
</template-format>
|
|
58
|
+
|
|
59
|
+
<version-management>
|
|
60
|
+
| 변경 유형 | 버전 증가 | 예시 |
|
|
61
|
+
|---------|----------|------|
|
|
62
|
+
| 구조 변경 | Major (x.0.0) | 섹션 추가/삭제 |
|
|
63
|
+
| 내용 수정 | Minor (0.x.0) | 규칙 추가, 예시 수정 |
|
|
64
|
+
| 오타 수정 | Patch (0.0.x) | 단순 수정 |
|
|
65
|
+
</version-management>
|
|
66
|
+
|
|
67
|
+
<rollback-conditions>
|
|
68
|
+
| 조건 | 액션 |
|
|
69
|
+
|-----|------|
|
|
70
|
+
| 성공률 10% 하락 | 이전 버전 롤백 |
|
|
71
|
+
| Critical 피드백 발생 | 즉시 롤백 + 분석 |
|
|
72
|
+
| A/B 테스트 실패 | 기존 버전 유지 |
|
|
73
|
+
</rollback-conditions>
|
|
74
|
+
|
|
75
|
+
<improvement-mapping>
|
|
76
|
+
패턴 → 프롬프트 개선 매핑 프로세스:
|
|
77
|
+
1. 실패/성공 패턴 식별 (회고 스킬에서)
|
|
78
|
+
2. 대상 에이전트/스킬 .md 파일 특정
|
|
79
|
+
3. 변경 전/후 diff 작성
|
|
80
|
+
4. 기대 효과 및 검증 방법 명시
|
|
81
|
+
5. 사용자 승인 후 적용
|
|
82
|
+
</improvement-mapping>
|
|
83
|
+
|
|
84
|
+
<quality-checklist>
|
|
85
|
+
| 항목 | 검증 내용 |
|
|
86
|
+
|-----|----------|
|
|
87
|
+
| 명확성 | 모호한 표현이 없는가? |
|
|
88
|
+
| 완전성 | 필요한 정보가 모두 있는가? |
|
|
89
|
+
| 구조화 | 논리적 순서로 구성되었는가? |
|
|
90
|
+
| 예시 | Good/Bad 예시가 있는가? |
|
|
91
|
+
| 제약 | 금지 사항이 명시되었는가? |
|
|
92
|
+
| 출력 | 기대 출력 형식이 정의되었는가? |
|
|
93
|
+
</quality-checklist>
|
|
94
|
+
|
|
95
|
+
<effectiveness-metrics>
|
|
96
|
+
| 메트릭 | 측정 방법 | 목표 |
|
|
97
|
+
|-------|----------|:----:|
|
|
98
|
+
| 작업 성공률 | 성공 작업 / 전체 작업 | 90%+ |
|
|
99
|
+
| 수정 횟수 | 평균 수정 횟수 | 2 미만 |
|
|
100
|
+
| 피드백 레벨 | Level 2+ 피드백 비율 | 10% 미만 |
|
|
101
|
+
| SSOT 정합성 | SSOT 불일치 건수 | 0 |
|
|
102
|
+
</effectiveness-metrics>
|
|
103
|
+
</skill>
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: retrospective
|
|
3
|
+
description: 회고 분석, 패턴 식별, 개선 제안 가이드라인
|
|
4
|
+
version: "1.0.0"
|
|
5
|
+
tags: [retrospective, analysis, improvement]
|
|
6
|
+
user-invocable: false
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
<skill name="retrospective">
|
|
10
|
+
<purpose>프로젝트 회고를 위한 분석 프레임워크와 개선 프로세스</purpose>
|
|
11
|
+
|
|
12
|
+
<tsq-cli priority="critical">
|
|
13
|
+
<instruction>
|
|
14
|
+
로그 기록, 피드백, 메트릭, 회고 등 TSQ CLI가 제공하는 기능은 반드시 CLI 커맨드를 사용하세요.
|
|
15
|
+
직접 파일을 조작하지 마세요. CLI를 사용해야 구조화된 데이터가 자동 저장됩니다.
|
|
16
|
+
</instruction>
|
|
17
|
+
<commands>
|
|
18
|
+
| 시점 | 커맨드 |
|
|
19
|
+
|-----|--------|
|
|
20
|
+
| 회고 시작 | `tsq retro start` |
|
|
21
|
+
| Phase별 회고 | `tsq retro phase {phase}` |
|
|
22
|
+
| 메트릭 수집 | `tsq retro collect` 또는 `tsq metrics collect` |
|
|
23
|
+
| 로그 확인 | `tsq log list` / `tsq log today` |
|
|
24
|
+
| 리포트 생성 | `tsq retro report` (GitHub Issue 포함) |
|
|
25
|
+
| 로컬 리포트만 | `tsq retro report --local` |
|
|
26
|
+
| 사이클 완료 | `tsq retro apply` |
|
|
27
|
+
</commands>
|
|
28
|
+
</tsq-cli>
|
|
29
|
+
|
|
30
|
+
<references>
|
|
31
|
+
<reference path=".timsquad/retrospective/metrics/">메트릭 데이터</reference>
|
|
32
|
+
<reference path=".timsquad/logs/">작업 로그</reference>
|
|
33
|
+
<reference path=".timsquad/retrospective/patterns/">기존 패턴</reference>
|
|
34
|
+
<reference path=".timsquad/state/workspace.xml">작업 이력</reference>
|
|
35
|
+
</references>
|
|
36
|
+
|
|
37
|
+
<kpt-framework>
|
|
38
|
+
<description>Keep-Problem-Try 회고 프레임워크</description>
|
|
39
|
+
<category name="Keep">무엇이 잘 되었나? 계속해야 할 것은?</category>
|
|
40
|
+
<category name="Problem">무엇이 문제였나? 장애물은?</category>
|
|
41
|
+
<category name="Try">다음에 시도해볼 것은?</category>
|
|
42
|
+
</kpt-framework>
|
|
43
|
+
|
|
44
|
+
<pattern-classification>
|
|
45
|
+
<failure-pattern id="FP-XXX">
|
|
46
|
+
<criteria>3회 이상 반복, 작업 지연 유발, 품질 저하 원인</criteria>
|
|
47
|
+
</failure-pattern>
|
|
48
|
+
<success-pattern id="SP-XXX">
|
|
49
|
+
<criteria>효과 검증됨, 효율성 향상, 품질 향상</criteria>
|
|
50
|
+
</success-pattern>
|
|
51
|
+
</pattern-classification>
|
|
52
|
+
|
|
53
|
+
<metrics>
|
|
54
|
+
| 메트릭 | 계산 방법 |
|
|
55
|
+
|-------|----------|
|
|
56
|
+
| 작업 수 | 완료된 작업 개수 |
|
|
57
|
+
| 성공률 | (성공 작업 / 전체 작업) x 100 |
|
|
58
|
+
| 평균 수정 횟수 | 총 수정 횟수 / 작업 수 |
|
|
59
|
+
| 점수 | 가중 평균 (성공률 x 0.4 + (1 - 수정률) x 0.3 + 기타 x 0.3) |
|
|
60
|
+
</metrics>
|
|
61
|
+
|
|
62
|
+
<improvement-format>
|
|
63
|
+
<![CDATA[
|
|
64
|
+
## IMP-XXX: {개선 제목}
|
|
65
|
+
|
|
66
|
+
**대상**: {에이전트/스킬}.md
|
|
67
|
+
**관련 패턴**: FP-XXX / SP-XXX
|
|
68
|
+
|
|
69
|
+
### 현재 문제
|
|
70
|
+
{문제 설명}
|
|
71
|
+
|
|
72
|
+
### 제안 변경
|
|
73
|
+
```diff
|
|
74
|
+
- 현재 내용
|
|
75
|
+
+ 개선된 내용
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 기대 효과
|
|
79
|
+
{개선 효과}
|
|
80
|
+
]]>
|
|
81
|
+
</improvement-format>
|
|
82
|
+
|
|
83
|
+
<report-sections>
|
|
84
|
+
1. 메트릭 요약
|
|
85
|
+
2. 에이전트별 성과
|
|
86
|
+
3. 피드백 분석
|
|
87
|
+
4. 발견된 패턴
|
|
88
|
+
5. 개선 조치
|
|
89
|
+
6. 다음 사이클 목표
|
|
90
|
+
</report-sections>
|
|
91
|
+
|
|
92
|
+
<principles>
|
|
93
|
+
<principle>객관적 데이터 우선 - 주관적 평가보다 수치 기반</principle>
|
|
94
|
+
<principle>구체적 예시 - 추상적 서술 지양</principle>
|
|
95
|
+
<principle>실행 가능한 개선안 - "더 잘하자" 대신 구체적 액션</principle>
|
|
96
|
+
<principle>균형 잡힌 시각 - 문제점만이 아닌 성공 사례도 포함</principle>
|
|
97
|
+
</principles>
|
|
98
|
+
|
|
99
|
+
<apply-process>
|
|
100
|
+
제안된 개선 → 사용자 검토/승인 → SKILL.md 업데이트 → 템플릿 업데이트 → lessons.md 기록 → 다음 사이클에서 효과 측정
|
|
101
|
+
</apply-process>
|
|
102
|
+
</skill>
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: security
|
|
3
|
+
description: 보안 검토 및 취약점 탐지 가이드라인
|
|
4
|
+
version: "1.0.0"
|
|
5
|
+
tags: [security, owasp, vulnerability]
|
|
6
|
+
user-invocable: false
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Security Guidelines (OWASP Top 10)
|
|
10
|
+
|
|
11
|
+
## OWASP Top 10 요약
|
|
12
|
+
|
|
13
|
+
| # | 취약점 | 핵심 방어 |
|
|
14
|
+
|---|--------|----------|
|
|
15
|
+
| 1 | Injection | Parameterized Query, ORM 사용 |
|
|
16
|
+
| 2 | Broken Authentication | 강력한 패스워드 정책, bcrypt(12+) |
|
|
17
|
+
| 3 | Sensitive Data Exposure | DTO로 민감 정보 제외, 로그 마스킹 |
|
|
18
|
+
| 5 | Broken Access Control | authenticate + authorize 미들웨어 |
|
|
19
|
+
| 6 | Security Misconfiguration | helmet(), CORS 제한 |
|
|
20
|
+
| 7 | XSS | textContent 사용, innerHTML 금지 |
|
|
21
|
+
| 8 | Insecure Deserialization | Zod 스키마 검증 |
|
|
22
|
+
| 9 | Known Vulnerabilities | npm audit, 정기 업데이트 |
|
|
23
|
+
| 10 | Insufficient Logging | 로그인 실패, 브루트포스 로깅 |
|
|
24
|
+
|
|
25
|
+
## 추가 보안 체크
|
|
26
|
+
|
|
27
|
+
### 시크릿 관리
|
|
28
|
+
- **금지**: 하드코딩 (`const apiKey = 'sk-...'`)
|
|
29
|
+
- **필수**: 환경변수 (`process.env.API_KEY`)
|
|
30
|
+
- **권장**: 시크릿 매니저
|
|
31
|
+
|
|
32
|
+
### Rate Limiting
|
|
33
|
+
- API 엔드포인트에 rate limiter 적용
|
|
34
|
+
|
|
35
|
+
### CSRF 방지
|
|
36
|
+
- csrf 토큰 사용
|
|
37
|
+
|
|
38
|
+
## Checklist
|
|
39
|
+
- [ ] SQL/NoSQL Injection 방지
|
|
40
|
+
- [ ] 강력한 인증 구현
|
|
41
|
+
- [ ] 민감 정보 보호
|
|
42
|
+
- [ ] 접근 제어 구현
|
|
43
|
+
- [ ] XSS 방지
|
|
44
|
+
- [ ] 입력 검증 (Zod)
|
|
45
|
+
- [ ] 의존성 취약점 확인
|
|
46
|
+
- [ ] 보안 로깅 구현
|
|
47
|
+
- [ ] 시크릿 안전하게 관리
|
|
48
|
+
- [ ] Rate Limiting 적용
|
|
49
|
+
|
|
50
|
+
## Resources
|
|
51
|
+
|
|
52
|
+
| Priority | Type | Resource | Description |
|
|
53
|
+
|----------|------|----------|-------------|
|
|
54
|
+
| CRITICAL | rule | [owasp-examples](rules/owasp-examples.md) | 취약점별 Bad/Good 코드 예시 |
|
|
55
|
+
| HIGH | script | [check-secrets](scripts/check-secrets.sh) | 하드코딩된 시크릿 자동 스캔 |
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: OWASP Top 10 Security Patterns
|
|
3
|
+
impact: CRITICAL
|
|
4
|
+
tags: security, owasp, vulnerability
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# OWASP Top 10 — 코드 예시
|
|
8
|
+
|
|
9
|
+
## 1. Injection
|
|
10
|
+
```typescript
|
|
11
|
+
// Bad
|
|
12
|
+
const query = `SELECT * FROM users WHERE email = '${email}'`;
|
|
13
|
+
|
|
14
|
+
// Good: Parameterized Query
|
|
15
|
+
const query = 'SELECT * FROM users WHERE email = $1';
|
|
16
|
+
await db.query(query, [email]);
|
|
17
|
+
// Good: ORM 사용
|
|
18
|
+
await userRepository.findOne({ where: { email } });
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## 2. Broken Authentication
|
|
22
|
+
```typescript
|
|
23
|
+
// Bad
|
|
24
|
+
if (password.length >= 4) { ... }
|
|
25
|
+
|
|
26
|
+
// Good
|
|
27
|
+
const passwordPolicy = {
|
|
28
|
+
minLength: 12, requireUppercase: true, requireLowercase: true,
|
|
29
|
+
requireNumber: true, requireSpecialChar: true,
|
|
30
|
+
};
|
|
31
|
+
const hash = await bcrypt.hash(password, 12);
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## 3. Sensitive Data Exposure
|
|
35
|
+
```typescript
|
|
36
|
+
// Bad
|
|
37
|
+
logger.info('User login', { email, password });
|
|
38
|
+
return { ...user }; // passwordHash 포함
|
|
39
|
+
|
|
40
|
+
// Good
|
|
41
|
+
logger.info('User login', { email, password: '***' });
|
|
42
|
+
return userToDto(user); // passwordHash 제외
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## 5. Broken Access Control
|
|
46
|
+
```typescript
|
|
47
|
+
// Bad
|
|
48
|
+
app.get('/api/users/:id', async (req, res) => {
|
|
49
|
+
const user = await userService.getUser(req.params.id);
|
|
50
|
+
return res.json(user);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// Good
|
|
54
|
+
app.get('/api/users/:id', authenticate, authorize('user:read'), async (req, res) => {
|
|
55
|
+
if (req.user.id !== req.params.id && !req.user.isAdmin) throw new ForbiddenError();
|
|
56
|
+
const user = await userService.getUser(req.params.id);
|
|
57
|
+
return res.json(user);
|
|
58
|
+
});
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## 6. Security Misconfiguration
|
|
62
|
+
```typescript
|
|
63
|
+
app.use(helmet());
|
|
64
|
+
app.use(helmet.contentSecurityPolicy({
|
|
65
|
+
directives: { defaultSrc: ["'self'"], scriptSrc: ["'self'"] },
|
|
66
|
+
}));
|
|
67
|
+
app.use(cors({ origin: ['https://allowed-domain.com'], credentials: true }));
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## 7. XSS
|
|
71
|
+
```typescript
|
|
72
|
+
// Bad
|
|
73
|
+
element.innerHTML = userInput;
|
|
74
|
+
// Good
|
|
75
|
+
element.textContent = userInput;
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## 8. Insecure Deserialization
|
|
79
|
+
```typescript
|
|
80
|
+
// Bad
|
|
81
|
+
const data = JSON.parse(userInput);
|
|
82
|
+
// Good
|
|
83
|
+
const schema = z.object({ name: z.string().max(100), age: z.number().min(0) });
|
|
84
|
+
const data = schema.parse(JSON.parse(userInput));
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## 9. Known Vulnerabilities
|
|
88
|
+
```bash
|
|
89
|
+
npm audit && npm audit fix
|
|
90
|
+
npm outdated && npm update
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## 10. Insufficient Logging
|
|
94
|
+
```typescript
|
|
95
|
+
logger.warn('Login failed', { email, ip: req.ip, timestamp: new Date().toISOString() });
|
|
96
|
+
if (failedAttempts >= 5) {
|
|
97
|
+
logger.error('Possible brute force attack', { email, ip: req.ip });
|
|
98
|
+
await lockAccount(email);
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Additional Checks
|
|
103
|
+
|
|
104
|
+
### Rate Limiting
|
|
105
|
+
```typescript
|
|
106
|
+
import rateLimit from 'express-rate-limit';
|
|
107
|
+
app.use('/api/', rateLimit({ windowMs: 15 * 60 * 1000, max: 100 }));
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### CSRF 방지
|
|
111
|
+
```typescript
|
|
112
|
+
import csrf from 'csurf';
|
|
113
|
+
app.use(csrf({ cookie: true }));
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### 시크릿 관리
|
|
117
|
+
- **금지**: `const apiKey = 'sk-1234567890';`
|
|
118
|
+
- **필수**: `const apiKey = process.env.API_KEY;`
|
|
119
|
+
- **권장**: `await secretManager.getSecret('api-key');`
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# @name check-secrets
|
|
3
|
+
# @description 하드코딩된 시크릿/토큰/비밀번호를 소스코드에서 스캔
|
|
4
|
+
# @args [PROJECT_ROOT] (기본: 현재 디렉토리)
|
|
5
|
+
# @output text (발견된 파일:라인 목록 또는 "No secrets found")
|
|
6
|
+
|
|
7
|
+
set -euo pipefail
|
|
8
|
+
|
|
9
|
+
PROJECT_ROOT="${1:-.}"
|
|
10
|
+
FOUND=0
|
|
11
|
+
|
|
12
|
+
echo "Scanning for hardcoded secrets in: $PROJECT_ROOT"
|
|
13
|
+
echo "================================================"
|
|
14
|
+
|
|
15
|
+
# Pattern 1: API keys, tokens, secrets in assignments
|
|
16
|
+
echo ""
|
|
17
|
+
echo "## Hardcoded API Keys / Tokens"
|
|
18
|
+
if grep -rn --include="*.ts" --include="*.tsx" --include="*.js" --include="*.jsx" --include="*.py" --include="*.go" \
|
|
19
|
+
-E "(api_key|apiKey|API_KEY|secret|SECRET|token|TOKEN|password|PASSWORD)\s*[:=]\s*['\"][^'\"]{8,}" \
|
|
20
|
+
"$PROJECT_ROOT/src" "$PROJECT_ROOT/app" "$PROJECT_ROOT/lib" 2>/dev/null | \
|
|
21
|
+
grep -v "node_modules" | grep -v ".test." | grep -v "__mock__" | grep -v "example" | grep -v "placeholder"; then
|
|
22
|
+
FOUND=1
|
|
23
|
+
else
|
|
24
|
+
echo " (none found)"
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
# Pattern 2: .env files committed
|
|
28
|
+
echo ""
|
|
29
|
+
echo "## Committed .env Files"
|
|
30
|
+
if find "$PROJECT_ROOT" -name ".env" -o -name ".env.local" -o -name ".env.production" 2>/dev/null | \
|
|
31
|
+
grep -v "node_modules" | grep -v ".example"; then
|
|
32
|
+
FOUND=1
|
|
33
|
+
else
|
|
34
|
+
echo " (none found)"
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
# Pattern 3: Private keys
|
|
38
|
+
echo ""
|
|
39
|
+
echo "## Private Keys"
|
|
40
|
+
if grep -rn --include="*.ts" --include="*.tsx" --include="*.js" --include="*.jsx" --include="*.pem" --include="*.key" \
|
|
41
|
+
-l "PRIVATE KEY" "$PROJECT_ROOT" 2>/dev/null | grep -v "node_modules"; then
|
|
42
|
+
FOUND=1
|
|
43
|
+
else
|
|
44
|
+
echo " (none found)"
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
echo ""
|
|
48
|
+
echo "================================================"
|
|
49
|
+
if [ "$FOUND" -eq 1 ]; then
|
|
50
|
+
echo "WARNING: Potential secrets found. Review above results."
|
|
51
|
+
exit 1
|
|
52
|
+
else
|
|
53
|
+
echo "No secrets found."
|
|
54
|
+
exit 0
|
|
55
|
+
fi
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: testing
|
|
3
|
+
description: |
|
|
4
|
+
테스트 작성 규칙 및 패턴 가이드라인.
|
|
5
|
+
TDD 사이클, 테스트 피라미드, Given-When-Then 패턴, 커버리지 기준을 다룸.
|
|
6
|
+
Use when: "테스트 작성, TDD, 단위 테스트, 통합 테스트, E2E, 커버리지"
|
|
7
|
+
version: "1.0.0"
|
|
8
|
+
tags: [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
|
+
## Resources
|
|
23
|
+
|
|
24
|
+
| Priority | Type | Resource | Description |
|
|
25
|
+
|----------|------|----------|-------------|
|
|
26
|
+
| HIGH | ref | [testing-patterns](references/testing-patterns.md) | Given-When-Then, Mock 가이드, 카테고리별 예시 |
|
|
27
|
+
|
|
28
|
+
## Quick Rules
|
|
29
|
+
|
|
30
|
+
### TDD Cycle
|
|
31
|
+
1. **Red** — 실패하는 테스트 작성
|
|
32
|
+
2. **Green** — 테스트를 통과하는 최소 코드 작성
|
|
33
|
+
3. **Refactor** — 코드 정리 (테스트는 계속 통과)
|
|
34
|
+
|
|
35
|
+
### Test Naming
|
|
36
|
+
- 형식: `should {expected behavior} when {condition}`
|
|
37
|
+
- Good: `should return null when user is not found`
|
|
38
|
+
- Bad: `test getUser`, `works correctly`
|
|
39
|
+
|
|
40
|
+
### Test Categories
|
|
41
|
+
모든 테스트는 3가지 카테고리 커버:
|
|
42
|
+
- **Happy Path** — 정상 흐름
|
|
43
|
+
- **Edge Cases** — 경계 조건 (빈 문자열, 0, null, 최대값)
|
|
44
|
+
- **Error Cases** — 오류 상황
|
|
45
|
+
|
|
46
|
+
### Coverage Standards
|
|
47
|
+
|
|
48
|
+
| Metric | Minimum | Recommended |
|
|
49
|
+
|--------|---------|-------------|
|
|
50
|
+
| Line Coverage | 80% | 90% |
|
|
51
|
+
| Branch Coverage | 70% | 80% |
|
|
52
|
+
| Function Coverage | 80% | 90% |
|
|
53
|
+
|
|
54
|
+
## Checklist
|
|
55
|
+
|
|
56
|
+
| Priority | Item |
|
|
57
|
+
|----------|------|
|
|
58
|
+
| CRITICAL | Given-When-Then 패턴을 따르는가 |
|
|
59
|
+
| CRITICAL | Happy path, Edge case, Error case 커버하는가 |
|
|
60
|
+
| HIGH | 테스트 이름이 `should...when...` 형식인가 |
|
|
61
|
+
| HIGH | 커버리지 기준을 충족하는가 |
|
|
62
|
+
| MEDIUM | Mock이 적절히 사용되었는가 (외부 서비스만) |
|
|
63
|
+
| MEDIUM | 테스트가 독립적인가 (순서 무관) |
|