@arimakouyou/spec-workflow-mcp 2.2.7
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/.claude-plugin/.mcp.json +8 -0
- package/.claude-plugin/agents/code-simplifier.md +80 -0
- package/.claude-plugin/agents/integ-test-auditor.md +91 -0
- package/.claude-plugin/agents/integ-test-worker.md +73 -0
- package/.claude-plugin/agents/parallel-worker.md +136 -0
- package/.claude-plugin/agents/review-worker.md +279 -0
- package/.claude-plugin/agents/unit-test-engineer.md +148 -0
- package/.claude-plugin/agents/wave-harness-worker.md +158 -0
- package/.claude-plugin/hooks/hooks.json +16 -0
- package/.claude-plugin/hooks/tasks-read-guard.sh +17 -0
- package/.claude-plugin/marketplace.json +33 -0
- package/.claude-plugin/plugin.json +11 -0
- package/.claude-plugin/rules/axum.md +154 -0
- package/.claude-plugin/rules/cargo-toml.md +63 -0
- package/.claude-plugin/rules/context7.md +17 -0
- package/.claude-plugin/rules/design-conformance.md +82 -0
- package/.claude-plugin/rules/design-principles.md +53 -0
- package/.claude-plugin/rules/diesel.md +176 -0
- package/.claude-plugin/rules/feedback-loop.md +33 -0
- package/.claude-plugin/rules/leptos.md +319 -0
- package/.claude-plugin/rules/project-architecture.md +134 -0
- package/.claude-plugin/rules/quality-checks.md +265 -0
- package/.claude-plugin/rules/rust-style.md +242 -0
- package/.claude-plugin/rules/security.md +67 -0
- package/.claude-plugin/rules/spec-workflow-enforcement.md +47 -0
- package/.claude-plugin/rules/valkey.md +167 -0
- package/.claude-plugin/skills/integration-test/SKILL.md +230 -0
- package/.claude-plugin/skills/integration-test/references/auditor-prompt.md +78 -0
- package/.claude-plugin/skills/integration-test/references/external-api-mock.md +98 -0
- package/.claude-plugin/skills/integration-test/references/fixture-catalog.md +155 -0
- package/.claude-plugin/skills/integration-test/references/parallel-execution.md +124 -0
- package/.claude-plugin/skills/integration-test/references/quality-gate.md +80 -0
- package/.claude-plugin/skills/integration-test/references/test-case-design.md +88 -0
- package/.claude-plugin/skills/integration-test/references/test-patterns.md +215 -0
- package/.claude-plugin/skills/integration-test/references/whiteboard-template.md +81 -0
- package/.claude-plugin/skills/integration-test/references/worker-prompt.md +70 -0
- package/.claude-plugin/skills/knowhow-capture/SKILL.md +143 -0
- package/.claude-plugin/skills/phase-review-team/SKILL.md +380 -0
- package/.claude-plugin/skills/spec-design/SKILL.md +282 -0
- package/.claude-plugin/skills/spec-e2e-implement/SKILL.md +259 -0
- package/.claude-plugin/skills/spec-impl-code/SKILL.md +101 -0
- package/.claude-plugin/skills/spec-impl-review/SKILL.md +115 -0
- package/.claude-plugin/skills/spec-impl-test-run/SKILL.md +98 -0
- package/.claude-plugin/skills/spec-impl-test-write/SKILL.md +121 -0
- package/.claude-plugin/skills/spec-implement/SKILL.md +822 -0
- package/.claude-plugin/skills/spec-requirements/SKILL.md +130 -0
- package/.claude-plugin/skills/spec-review/SKILL.md +274 -0
- package/.claude-plugin/skills/spec-tasks/SKILL.md +372 -0
- package/.claude-plugin/skills/spec-test-design/SKILL.md +233 -0
- package/.claude-plugin/skills/tdd-skills/SKILL.md +95 -0
- package/.claude-plugin/skills/tdd-skills/references/advanced-techniques.md +49 -0
- package/.claude-plugin/skills/tdd-skills/references/green-strategies.md +70 -0
- package/.claude-plugin/skills/tdd-skills/references/tdd-and-design.md +48 -0
- package/.claude-plugin/skills/tdd-skills/references/test-design.md +43 -0
- package/.claude-plugin/skills/tdd-skills/references/test-doubles.md +53 -0
- package/.claude-plugin/skills/tdd-skills/references/test-patterns.md +40 -0
- package/.claude-plugin/skills/tdd-skills-rust/SKILL.md +128 -0
- package/.claude-plugin/skills/tdd-skills-rust/references/advanced-techniques.md +205 -0
- package/.claude-plugin/skills/tdd-skills-rust/references/green-strategies.md +166 -0
- package/.claude-plugin/skills/tdd-skills-rust/references/tdd-and-design.md +215 -0
- package/.claude-plugin/skills/tdd-skills-rust/references/test-design.md +128 -0
- package/.claude-plugin/skills/tdd-skills-rust/references/test-doubles.md +208 -0
- package/.claude-plugin/skills/tdd-skills-rust/references/test-patterns.md +223 -0
- package/.claude-plugin/with-dashboard/.mcp.json +8 -0
- package/.claude-plugin/with-dashboard/plugin.json +10 -0
- package/CHANGELOG.md +1007 -0
- package/LICENSE +674 -0
- package/README.ja.md +380 -0
- package/README.md +437 -0
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +264 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/index-args.test.d.ts +2 -0
- package/dist/__tests__/index-args.test.d.ts.map +1 -0
- package/dist/__tests__/index-args.test.js +43 -0
- package/dist/__tests__/index-args.test.js.map +1 -0
- package/dist/__tests__/index-entrypoint.test.d.ts +2 -0
- package/dist/__tests__/index-entrypoint.test.d.ts.map +1 -0
- package/dist/__tests__/index-entrypoint.test.js +23 -0
- package/dist/__tests__/index-entrypoint.test.js.map +1 -0
- package/dist/config.d.ts +26 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +188 -0
- package/dist/config.js.map +1 -0
- package/dist/core/__tests__/git-utils.test.d.ts +2 -0
- package/dist/core/__tests__/git-utils.test.d.ts.map +1 -0
- package/dist/core/__tests__/git-utils.test.js +179 -0
- package/dist/core/__tests__/git-utils.test.js.map +1 -0
- package/dist/core/__tests__/mdx-validator.test.d.ts +2 -0
- package/dist/core/__tests__/mdx-validator.test.d.ts.map +1 -0
- package/dist/core/__tests__/mdx-validator.test.js +42 -0
- package/dist/core/__tests__/mdx-validator.test.js.map +1 -0
- package/dist/core/__tests__/path-utils.test.d.ts +2 -0
- package/dist/core/__tests__/path-utils.test.d.ts.map +1 -0
- package/dist/core/__tests__/path-utils.test.js +342 -0
- package/dist/core/__tests__/path-utils.test.js.map +1 -0
- package/dist/core/__tests__/project-registry.test.d.ts +2 -0
- package/dist/core/__tests__/project-registry.test.d.ts.map +1 -0
- package/dist/core/__tests__/project-registry.test.js +62 -0
- package/dist/core/__tests__/project-registry.test.js.map +1 -0
- package/dist/core/__tests__/security-utils.test.d.ts +2 -0
- package/dist/core/__tests__/security-utils.test.d.ts.map +1 -0
- package/dist/core/__tests__/security-utils.test.js +657 -0
- package/dist/core/__tests__/security-utils.test.js.map +1 -0
- package/dist/core/__tests__/task-parser.test.d.ts +2 -0
- package/dist/core/__tests__/task-parser.test.d.ts.map +1 -0
- package/dist/core/__tests__/task-parser.test.js +222 -0
- package/dist/core/__tests__/task-parser.test.js.map +1 -0
- package/dist/core/__tests__/task-validator.test.d.ts +2 -0
- package/dist/core/__tests__/task-validator.test.d.ts.map +1 -0
- package/dist/core/__tests__/task-validator.test.js +308 -0
- package/dist/core/__tests__/task-validator.test.js.map +1 -0
- package/dist/core/archive-service.d.ts +10 -0
- package/dist/core/archive-service.d.ts.map +1 -0
- package/dist/core/archive-service.js +99 -0
- package/dist/core/archive-service.js.map +1 -0
- package/dist/core/dashboard-session.d.ts +49 -0
- package/dist/core/dashboard-session.d.ts.map +1 -0
- package/dist/core/dashboard-session.js +132 -0
- package/dist/core/dashboard-session.js.map +1 -0
- package/dist/core/git-utils.d.ts +25 -0
- package/dist/core/git-utils.d.ts.map +1 -0
- package/dist/core/git-utils.js +87 -0
- package/dist/core/git-utils.js.map +1 -0
- package/dist/core/global-dir.d.ts +44 -0
- package/dist/core/global-dir.d.ts.map +1 -0
- package/dist/core/global-dir.js +74 -0
- package/dist/core/global-dir.js.map +1 -0
- package/dist/core/implementation-log-migrator.d.ts +41 -0
- package/dist/core/implementation-log-migrator.d.ts.map +1 -0
- package/dist/core/implementation-log-migrator.js +258 -0
- package/dist/core/implementation-log-migrator.js.map +1 -0
- package/dist/core/mdx-validator.d.ts +14 -0
- package/dist/core/mdx-validator.d.ts.map +1 -0
- package/dist/core/mdx-validator.js +34 -0
- package/dist/core/mdx-validator.js.map +1 -0
- package/dist/core/parser.d.ts +11 -0
- package/dist/core/parser.d.ts.map +1 -0
- package/dist/core/parser.js +128 -0
- package/dist/core/parser.js.map +1 -0
- package/dist/core/path-utils.d.ts +68 -0
- package/dist/core/path-utils.d.ts.map +1 -0
- package/dist/core/path-utils.js +302 -0
- package/dist/core/path-utils.js.map +1 -0
- package/dist/core/project-registry.d.ts +94 -0
- package/dist/core/project-registry.d.ts.map +1 -0
- package/dist/core/project-registry.js +297 -0
- package/dist/core/project-registry.js.map +1 -0
- package/dist/core/security-utils.d.ts +99 -0
- package/dist/core/security-utils.d.ts.map +1 -0
- package/dist/core/security-utils.js +275 -0
- package/dist/core/security-utils.js.map +1 -0
- package/dist/core/task-parser.d.ts +90 -0
- package/dist/core/task-parser.d.ts.map +1 -0
- package/dist/core/task-parser.js +477 -0
- package/dist/core/task-parser.js.map +1 -0
- package/dist/core/task-validator.d.ts +37 -0
- package/dist/core/task-validator.d.ts.map +1 -0
- package/dist/core/task-validator.js +499 -0
- package/dist/core/task-validator.js.map +1 -0
- package/dist/core/workspace-initializer.d.ts +16 -0
- package/dist/core/workspace-initializer.d.ts.map +1 -0
- package/dist/core/workspace-initializer.js +168 -0
- package/dist/core/workspace-initializer.js.map +1 -0
- package/dist/dashboard/__tests__/approval-storage-path-resolution.test.d.ts +2 -0
- package/dist/dashboard/__tests__/approval-storage-path-resolution.test.d.ts.map +1 -0
- package/dist/dashboard/__tests__/approval-storage-path-resolution.test.js +78 -0
- package/dist/dashboard/__tests__/approval-storage-path-resolution.test.js.map +1 -0
- package/dist/dashboard/__tests__/multi-server-approvals-content.test.d.ts +2 -0
- package/dist/dashboard/__tests__/multi-server-approvals-content.test.d.ts.map +1 -0
- package/dist/dashboard/__tests__/multi-server-approvals-content.test.js +115 -0
- package/dist/dashboard/__tests__/multi-server-approvals-content.test.js.map +1 -0
- package/dist/dashboard/__tests__/watcher-error-handling.test.d.ts +2 -0
- package/dist/dashboard/__tests__/watcher-error-handling.test.d.ts.map +1 -0
- package/dist/dashboard/__tests__/watcher-error-handling.test.js +118 -0
- package/dist/dashboard/__tests__/watcher-error-handling.test.js.map +1 -0
- package/dist/dashboard/approval-storage.d.ts +139 -0
- package/dist/dashboard/approval-storage.d.ts.map +1 -0
- package/dist/dashboard/approval-storage.js +608 -0
- package/dist/dashboard/approval-storage.js.map +1 -0
- package/dist/dashboard/execution-history-manager.d.ts +52 -0
- package/dist/dashboard/execution-history-manager.d.ts.map +1 -0
- package/dist/dashboard/execution-history-manager.js +161 -0
- package/dist/dashboard/execution-history-manager.js.map +1 -0
- package/dist/dashboard/implementation-log-manager.d.ts +97 -0
- package/dist/dashboard/implementation-log-manager.d.ts.map +1 -0
- package/dist/dashboard/implementation-log-manager.js +617 -0
- package/dist/dashboard/implementation-log-manager.js.map +1 -0
- package/dist/dashboard/job-scheduler.d.ts +91 -0
- package/dist/dashboard/job-scheduler.d.ts.map +1 -0
- package/dist/dashboard/job-scheduler.js +321 -0
- package/dist/dashboard/job-scheduler.js.map +1 -0
- package/dist/dashboard/multi-server.d.ts +42 -0
- package/dist/dashboard/multi-server.d.ts.map +1 -0
- package/dist/dashboard/multi-server.js +1460 -0
- package/dist/dashboard/multi-server.js.map +1 -0
- package/dist/dashboard/parser.d.ts +18 -0
- package/dist/dashboard/parser.d.ts.map +1 -0
- package/dist/dashboard/parser.js +269 -0
- package/dist/dashboard/parser.js.map +1 -0
- package/dist/dashboard/project-manager.d.ts +82 -0
- package/dist/dashboard/project-manager.d.ts.map +1 -0
- package/dist/dashboard/project-manager.js +257 -0
- package/dist/dashboard/project-manager.js.map +1 -0
- package/dist/dashboard/public/assets/Inter-Bold-CD3Pr7BX.woff2 +0 -0
- package/dist/dashboard/public/assets/Inter-Medium-B_8v_WHh.woff2 +0 -0
- package/dist/dashboard/public/assets/Inter-Regular-DRVdRqcI.woff2 +0 -0
- package/dist/dashboard/public/assets/Inter-SemiBold-CtskMddL.woff2 +0 -0
- package/dist/dashboard/public/assets/JetBrainsMono-Bold-D4WEaHbo.woff2 +0 -0
- package/dist/dashboard/public/assets/JetBrainsMono-Medium-3S3k2nMz.woff2 +0 -0
- package/dist/dashboard/public/assets/JetBrainsMono-Regular-BQaDgvhP.woff2 +0 -0
- package/dist/dashboard/public/assets/Tableau10-B-NsZVaP.js +1 -0
- package/dist/dashboard/public/assets/apl-B4CMkyY2.js +1 -0
- package/dist/dashboard/public/assets/arc-a5wW942W.js +1 -0
- package/dist/dashboard/public/assets/array-BKyUJesY.js +1 -0
- package/dist/dashboard/public/assets/asciiarmor-Df11BRmG.js +1 -0
- package/dist/dashboard/public/assets/asn1-EdZsLKOL.js +1 -0
- package/dist/dashboard/public/assets/asterisk-B-8jnY81.js +1 -0
- package/dist/dashboard/public/assets/blockDiagram-c4efeb88-CvjTuK-w.js +118 -0
- package/dist/dashboard/public/assets/brainfuck-C4LP7Hcl.js +1 -0
- package/dist/dashboard/public/assets/c4Diagram-c83219d4-NwVQo5kf.js +10 -0
- package/dist/dashboard/public/assets/channel-Bi16YZhk.js +1 -0
- package/dist/dashboard/public/assets/classDiagram-beda092f-BmSeXDdU.js +2 -0
- package/dist/dashboard/public/assets/classDiagram-v2-2358418a-D7GvvuPr.js +2 -0
- package/dist/dashboard/public/assets/clike-B9uivgTg.js +1 -0
- package/dist/dashboard/public/assets/clojure-BMjYHr_A.js +1 -0
- package/dist/dashboard/public/assets/clone-BpKTiq7P.js +1 -0
- package/dist/dashboard/public/assets/cmake-BQqOBYOt.js +1 -0
- package/dist/dashboard/public/assets/cobol-CWcv1MsR.js +1 -0
- package/dist/dashboard/public/assets/coffeescript-S37ZYGWr.js +1 -0
- package/dist/dashboard/public/assets/commonlisp-DBKNyK5s.js +1 -0
- package/dist/dashboard/public/assets/createText-1719965b-qASbqHUP.js +7 -0
- package/dist/dashboard/public/assets/crystal-SjHAIU92.js +1 -0
- package/dist/dashboard/public/assets/css-BnMrqG3P.js +1 -0
- package/dist/dashboard/public/assets/cypher-C_CwsFkJ.js +1 -0
- package/dist/dashboard/public/assets/d-pRatUO7H.js +1 -0
- package/dist/dashboard/public/assets/diff-DbItnlRl.js +1 -0
- package/dist/dashboard/public/assets/dockerfile-BKs6k2Af.js +1 -0
- package/dist/dashboard/public/assets/dtd-DF_7sFjM.js +1 -0
- package/dist/dashboard/public/assets/dylan-DwRh75JA.js +1 -0
- package/dist/dashboard/public/assets/ebnf-CDyGwa7X.js +1 -0
- package/dist/dashboard/public/assets/ecl-Cabwm37j.js +1 -0
- package/dist/dashboard/public/assets/edges-96097737-BItTSnH7.js +4 -0
- package/dist/dashboard/public/assets/eiffel-CnydiIhH.js +1 -0
- package/dist/dashboard/public/assets/elm-vLlmbW-K.js +1 -0
- package/dist/dashboard/public/assets/erDiagram-0228fc6a-DT224olg.js +51 -0
- package/dist/dashboard/public/assets/erlang-BNw1qcRV.js +1 -0
- package/dist/dashboard/public/assets/factor-kuTfRLto.js +1 -0
- package/dist/dashboard/public/assets/fcl-Kvtd6kyn.js +1 -0
- package/dist/dashboard/public/assets/flowDb-c6c81e3f-D9_ukKtv.js +10 -0
- package/dist/dashboard/public/assets/flowDiagram-50d868cf-CylE8siG.js +4 -0
- package/dist/dashboard/public/assets/flowDiagram-v2-4f6560a1-B2O3JN7Y.js +1 -0
- package/dist/dashboard/public/assets/flowchart-elk-definition-6af322e1-BCaqFKf3.js +139 -0
- package/dist/dashboard/public/assets/forth-Ffai-XNe.js +1 -0
- package/dist/dashboard/public/assets/fortran-DYz_wnZ1.js +1 -0
- package/dist/dashboard/public/assets/ganttDiagram-a2739b55-WQUL1QW_.js +257 -0
- package/dist/dashboard/public/assets/gas-Bneqetm1.js +1 -0
- package/dist/dashboard/public/assets/gherkin-heZmZLOM.js +1 -0
- package/dist/dashboard/public/assets/gitGraphDiagram-82fe8481-CttZrdmr.js +70 -0
- package/dist/dashboard/public/assets/graph-Ch-rVueN.js +1 -0
- package/dist/dashboard/public/assets/groovy-D9Dt4D0W.js +1 -0
- package/dist/dashboard/public/assets/haskell-Cw1EW3IL.js +1 -0
- package/dist/dashboard/public/assets/haxe-H-WmDvRZ.js +1 -0
- package/dist/dashboard/public/assets/http-DBlCnlav.js +1 -0
- package/dist/dashboard/public/assets/idl-BEugSyMb.js +1 -0
- package/dist/dashboard/public/assets/index--kbPpDKv.js +1 -0
- package/dist/dashboard/public/assets/index-3scDwWm6.js +1 -0
- package/dist/dashboard/public/assets/index-5325376f-BL2zVOJU.js +1 -0
- package/dist/dashboard/public/assets/index-BZdjbO25.js +1 -0
- package/dist/dashboard/public/assets/index-BmA_batZ.js +1 -0
- package/dist/dashboard/public/assets/index-Bu0u99kF.js +2 -0
- package/dist/dashboard/public/assets/index-Ch-lr7F4.js +1 -0
- package/dist/dashboard/public/assets/index-ClgWbdoq.js +1 -0
- package/dist/dashboard/public/assets/index-CzLwOMQ_.js +3 -0
- package/dist/dashboard/public/assets/index-DAOEjGO7.js +1 -0
- package/dist/dashboard/public/assets/index-DXqf0B9c.js +1 -0
- package/dist/dashboard/public/assets/index-DegWdR16.js +1 -0
- package/dist/dashboard/public/assets/index-DiHyYGim.js +1 -0
- package/dist/dashboard/public/assets/index-DlZtG7I5.js +1 -0
- package/dist/dashboard/public/assets/index-DmhGE2M8.js +1 -0
- package/dist/dashboard/public/assets/index-QEGvld4x.js +1 -0
- package/dist/dashboard/public/assets/index-RfZPGAJu.js +1 -0
- package/dist/dashboard/public/assets/index-UybBj_7u.js +319 -0
- package/dist/dashboard/public/assets/index-bVekzPnl.js +7 -0
- package/dist/dashboard/public/assets/index-f5bysQzW.css +1 -0
- package/dist/dashboard/public/assets/infoDiagram-8eee0895-DjzkkE3o.js +7 -0
- package/dist/dashboard/public/assets/init-Gi6I4Gst.js +1 -0
- package/dist/dashboard/public/assets/javascript-iXu5QeM3.js +1 -0
- package/dist/dashboard/public/assets/journeyDiagram-c64418c1-CxPZkNdB.js +139 -0
- package/dist/dashboard/public/assets/julia-DuME0IfC.js +1 -0
- package/dist/dashboard/public/assets/katex-XbL3y5x-.js +261 -0
- package/dist/dashboard/public/assets/layout-DX7DNTRm.js +1 -0
- package/dist/dashboard/public/assets/line-DfvpmKOn.js +1 -0
- package/dist/dashboard/public/assets/linear-gQbBPHO5.js +1 -0
- package/dist/dashboard/public/assets/livescript-BwQOo05w.js +1 -0
- package/dist/dashboard/public/assets/lua-BgMRiT3U.js +1 -0
- package/dist/dashboard/public/assets/mathematica-DTrFuWx2.js +1 -0
- package/dist/dashboard/public/assets/mbox-CNhZ1qSd.js +1 -0
- package/dist/dashboard/public/assets/mindmap-definition-8da855dc-CNxmpyG6.js +415 -0
- package/dist/dashboard/public/assets/mirc-CjQqDB4T.js +1 -0
- package/dist/dashboard/public/assets/mllike-CXdrOF99.js +1 -0
- package/dist/dashboard/public/assets/modelica-Dc1JOy9r.js +1 -0
- package/dist/dashboard/public/assets/mscgen-BA5vi2Kp.js +1 -0
- package/dist/dashboard/public/assets/mumps-BT43cFF4.js +1 -0
- package/dist/dashboard/public/assets/nginx-DdIZxoE0.js +1 -0
- package/dist/dashboard/public/assets/nsis-LdVXkNf5.js +1 -0
- package/dist/dashboard/public/assets/ntriples-BfvgReVJ.js +1 -0
- package/dist/dashboard/public/assets/octave-Ck1zUtKM.js +1 -0
- package/dist/dashboard/public/assets/ordinal-Cboi1Yqb.js +1 -0
- package/dist/dashboard/public/assets/oz-BzwKVEFT.js +1 -0
- package/dist/dashboard/public/assets/pascal--L3eBynH.js +1 -0
- package/dist/dashboard/public/assets/path-CbwjOpE9.js +1 -0
- package/dist/dashboard/public/assets/perl-CdXCOZ3F.js +1 -0
- package/dist/dashboard/public/assets/pieDiagram-a8764435-D-xy_NSA.js +35 -0
- package/dist/dashboard/public/assets/pig-CevX1Tat.js +1 -0
- package/dist/dashboard/public/assets/powershell-CFHJl5sT.js +1 -0
- package/dist/dashboard/public/assets/properties-C78fOPTZ.js +1 -0
- package/dist/dashboard/public/assets/protobuf-ChK-085T.js +1 -0
- package/dist/dashboard/public/assets/pug-DeIclll2.js +1 -0
- package/dist/dashboard/public/assets/puppet-DMA9R1ak.js +1 -0
- package/dist/dashboard/public/assets/python-BuPzkPfP.js +1 -0
- package/dist/dashboard/public/assets/q-pXgVlZs6.js +1 -0
- package/dist/dashboard/public/assets/quadrantDiagram-1e28029f-BoL2wzz0.js +7 -0
- package/dist/dashboard/public/assets/r-B6wPVr8A.js +1 -0
- package/dist/dashboard/public/assets/requirementDiagram-08caed73-BujFz0q1.js +52 -0
- package/dist/dashboard/public/assets/rpm-CTu-6PCP.js +1 -0
- package/dist/dashboard/public/assets/ruby-B2Rjki9n.js +1 -0
- package/dist/dashboard/public/assets/sankeyDiagram-a04cb91d-D03_NARm.js +8 -0
- package/dist/dashboard/public/assets/sas-B4kiWyti.js +1 -0
- package/dist/dashboard/public/assets/scheme-C41bIUwD.js +1 -0
- package/dist/dashboard/public/assets/sequenceDiagram-c5b8d532-B65eFcaT.js +122 -0
- package/dist/dashboard/public/assets/shell-CjFT_Tl9.js +1 -0
- package/dist/dashboard/public/assets/sieve-C3Gn_uJK.js +1 -0
- package/dist/dashboard/public/assets/simple-mode-GW_nhZxv.js +1 -0
- package/dist/dashboard/public/assets/smalltalk-CnHTOXQT.js +1 -0
- package/dist/dashboard/public/assets/solr-DehyRSwq.js +1 -0
- package/dist/dashboard/public/assets/sparql-DkYu6x3z.js +1 -0
- package/dist/dashboard/public/assets/spreadsheet-BCZA_wO0.js +1 -0
- package/dist/dashboard/public/assets/sql-D0XecflT.js +1 -0
- package/dist/dashboard/public/assets/stateDiagram-1ecb1508-BDbqu0Vl.js +1 -0
- package/dist/dashboard/public/assets/stateDiagram-v2-c2b004d7-CBHvk4b8.js +1 -0
- package/dist/dashboard/public/assets/stex-C3f8Ysf7.js +1 -0
- package/dist/dashboard/public/assets/styles-b4e223ce-CELsPqaO.js +160 -0
- package/dist/dashboard/public/assets/styles-ca3715f6-BRqMqT6F.js +207 -0
- package/dist/dashboard/public/assets/styles-d45a18b0-e8N-oLPy.js +116 -0
- package/dist/dashboard/public/assets/stylus-B533Al4x.js +1 -0
- package/dist/dashboard/public/assets/svgDrawCommon-b86b1483-vNDtmQc-.js +1 -0
- package/dist/dashboard/public/assets/swift-BzpIVaGY.js +1 -0
- package/dist/dashboard/public/assets/tcl-DVfN8rqt.js +1 -0
- package/dist/dashboard/public/assets/textile-CnDTJFAw.js +1 -0
- package/dist/dashboard/public/assets/tiddlywiki-DO-Gjzrf.js +1 -0
- package/dist/dashboard/public/assets/tiki-DGYXhP31.js +1 -0
- package/dist/dashboard/public/assets/timeline-definition-faaaa080-Dh2_A5VU.js +61 -0
- package/dist/dashboard/public/assets/toml-Bm5Em-hy.js +1 -0
- package/dist/dashboard/public/assets/troff-wAsdV37c.js +1 -0
- package/dist/dashboard/public/assets/ttcn-CfJYG6tj.js +1 -0
- package/dist/dashboard/public/assets/ttcn-cfg-B9xdYoR4.js +1 -0
- package/dist/dashboard/public/assets/turtle-B1tBg_DP.js +1 -0
- package/dist/dashboard/public/assets/vb-CmGdzxic.js +1 -0
- package/dist/dashboard/public/assets/vbscript-BuJXcnF6.js +1 -0
- package/dist/dashboard/public/assets/velocity-D8B20fx6.js +1 -0
- package/dist/dashboard/public/assets/verilog-C6RDOZhf.js +1 -0
- package/dist/dashboard/public/assets/vhdl-lSbBsy5d.js +1 -0
- package/dist/dashboard/public/assets/webidl-ZXfAyPTL.js +1 -0
- package/dist/dashboard/public/assets/xquery-DzFWVndE.js +1 -0
- package/dist/dashboard/public/assets/xychartDiagram-f5964ef8-B76v1AVF.js +7 -0
- package/dist/dashboard/public/assets/yacas-BJ4BC0dw.js +1 -0
- package/dist/dashboard/public/assets/z80-Hz9HOZM7.js +1 -0
- package/dist/dashboard/public/claude-icon-dark.svg +1 -0
- package/dist/dashboard/public/claude-icon.svg +1 -0
- package/dist/dashboard/public/index.html +16 -0
- package/dist/dashboard/settings-manager.d.ts +47 -0
- package/dist/dashboard/settings-manager.d.ts.map +1 -0
- package/dist/dashboard/settings-manager.js +180 -0
- package/dist/dashboard/settings-manager.js.map +1 -0
- package/dist/dashboard/utils.d.ts +31 -0
- package/dist/dashboard/utils.d.ts.map +1 -0
- package/dist/dashboard/utils.js +102 -0
- package/dist/dashboard/utils.js.map +1 -0
- package/dist/dashboard/watcher.d.ts +32 -0
- package/dist/dashboard/watcher.d.ts.map +1 -0
- package/dist/dashboard/watcher.js +173 -0
- package/dist/dashboard/watcher.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +380 -0
- package/dist/index.js.map +1 -0
- package/dist/markdown/templates/design-template.md +126 -0
- package/dist/markdown/templates/product-template.md +51 -0
- package/dist/markdown/templates/requirements-template.md +50 -0
- package/dist/markdown/templates/structure-template.md +145 -0
- package/dist/markdown/templates/tasks-template.md +100 -0
- package/dist/markdown/templates/tech-template.md +99 -0
- package/dist/markdown/templates/test-design-template.md +221 -0
- package/dist/prompts/create-spec.d.ts +3 -0
- package/dist/prompts/create-spec.d.ts.map +1 -0
- package/dist/prompts/create-spec.js +97 -0
- package/dist/prompts/create-spec.js.map +1 -0
- package/dist/prompts/create-steering-doc.d.ts +3 -0
- package/dist/prompts/create-steering-doc.d.ts.map +1 -0
- package/dist/prompts/create-steering-doc.js +75 -0
- package/dist/prompts/create-steering-doc.js.map +1 -0
- package/dist/prompts/implement-task.d.ts +3 -0
- package/dist/prompts/implement-task.d.ts.map +1 -0
- package/dist/prompts/implement-task.js +174 -0
- package/dist/prompts/implement-task.js.map +1 -0
- package/dist/prompts/index.d.ts +20 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +103 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/inject-spec-workflow-guide.d.ts +3 -0
- package/dist/prompts/inject-spec-workflow-guide.d.ts.map +1 -0
- package/dist/prompts/inject-spec-workflow-guide.js +60 -0
- package/dist/prompts/inject-spec-workflow-guide.js.map +1 -0
- package/dist/prompts/inject-steering-guide.d.ts +3 -0
- package/dist/prompts/inject-steering-guide.d.ts.map +1 -0
- package/dist/prompts/inject-steering-guide.js +64 -0
- package/dist/prompts/inject-steering-guide.js.map +1 -0
- package/dist/prompts/refresh-tasks.d.ts +3 -0
- package/dist/prompts/refresh-tasks.d.ts.map +1 -0
- package/dist/prompts/refresh-tasks.js +237 -0
- package/dist/prompts/refresh-tasks.js.map +1 -0
- package/dist/prompts/spec-status.d.ts +3 -0
- package/dist/prompts/spec-status.d.ts.map +1 -0
- package/dist/prompts/spec-status.js +77 -0
- package/dist/prompts/spec-status.js.map +1 -0
- package/dist/prompts/types.d.ts +13 -0
- package/dist/prompts/types.d.ts.map +1 -0
- package/dist/prompts/types.js +2 -0
- package/dist/prompts/types.js.map +1 -0
- package/dist/server.d.ts +17 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +175 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/__tests__/log-implementation-review-process.test.d.ts +2 -0
- package/dist/tools/__tests__/log-implementation-review-process.test.d.ts.map +1 -0
- package/dist/tools/__tests__/log-implementation-review-process.test.js +190 -0
- package/dist/tools/__tests__/log-implementation-review-process.test.js.map +1 -0
- package/dist/tools/__tests__/projectPath.test.d.ts +2 -0
- package/dist/tools/__tests__/projectPath.test.d.ts.map +1 -0
- package/dist/tools/__tests__/projectPath.test.js +187 -0
- package/dist/tools/__tests__/projectPath.test.js.map +1 -0
- package/dist/tools/approvals.d.ts +14 -0
- package/dist/tools/approvals.d.ts.map +1 -0
- package/dist/tools/approvals.js +505 -0
- package/dist/tools/approvals.js.map +1 -0
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +52 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/log-implementation.d.ts +5 -0
- package/dist/tools/log-implementation.d.ts.map +1 -0
- package/dist/tools/log-implementation.js +498 -0
- package/dist/tools/log-implementation.js.map +1 -0
- package/dist/tools/spec-status.d.ts +5 -0
- package/dist/tools/spec-status.d.ts.map +1 -0
- package/dist/tools/spec-status.js +192 -0
- package/dist/tools/spec-status.js.map +1 -0
- package/dist/tools/spec-workflow-guide.d.ts +5 -0
- package/dist/tools/spec-workflow-guide.d.ts.map +1 -0
- package/dist/tools/spec-workflow-guide.js +116 -0
- package/dist/tools/spec-workflow-guide.js.map +1 -0
- package/dist/tools/steering-guide.d.ts +5 -0
- package/dist/tools/steering-guide.d.ts.map +1 -0
- package/dist/tools/steering-guide.js +192 -0
- package/dist/tools/steering-guide.js.map +1 -0
- package/dist/types.d.ts +183 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +13 -0
- package/dist/types.js.map +1 -0
- package/package.json +106 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# 共通ヘルパー・Fixture カタログ
|
|
2
|
+
|
|
3
|
+
`tests/integration/helpers/` で定義するテスト用ヘルパーの一覧。
|
|
4
|
+
|
|
5
|
+
## TestContext(中核ヘルパー)
|
|
6
|
+
|
|
7
|
+
各テストで独立した DB コンテナと Axum アプリケーションを提供する。
|
|
8
|
+
|
|
9
|
+
```rust
|
|
10
|
+
pub struct TestContext {
|
|
11
|
+
pub app: Router,
|
|
12
|
+
pub db_pool: DbPool,
|
|
13
|
+
pub valkey: ConnectionManager,
|
|
14
|
+
_pg_container: ContainerAsync<Postgres>,
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
impl TestContext {
|
|
18
|
+
/// 新しいテストコンテキストを作成(実 PostgreSQL コンテナ起動)
|
|
19
|
+
pub async fn new() -> Self { /* ... */ }
|
|
20
|
+
|
|
21
|
+
/// 外部 API がエラーを返す設定で作成
|
|
22
|
+
pub async fn with_failing_external_api() -> Self { /* ... */ }
|
|
23
|
+
|
|
24
|
+
/// GET リクエスト(認証ヘッダー付き)
|
|
25
|
+
pub async fn get(&self, path: &str) -> TestResponse { /* ... */ }
|
|
26
|
+
|
|
27
|
+
/// GET リクエスト(認証なし)
|
|
28
|
+
pub async fn get_without_auth(&self, path: &str) -> TestResponse { /* ... */ }
|
|
29
|
+
|
|
30
|
+
/// POST リクエスト(認証ヘッダー付き)
|
|
31
|
+
pub async fn post(&self, path: &str) -> RequestBuilder { /* ... */ }
|
|
32
|
+
|
|
33
|
+
/// PUT リクエスト(認証ヘッダー付き)
|
|
34
|
+
pub async fn put(&self, path: &str) -> RequestBuilder { /* ... */ }
|
|
35
|
+
|
|
36
|
+
/// DELETE リクエスト(認証ヘッダー付き)
|
|
37
|
+
pub async fn delete(&self, path: &str) -> TestResponse { /* ... */ }
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## DB 関連ヘルパー
|
|
42
|
+
|
|
43
|
+
### PostgreSQL コンテナ
|
|
44
|
+
|
|
45
|
+
```rust
|
|
46
|
+
use testcontainers::runners::AsyncRunner;
|
|
47
|
+
use testcontainers_modules::postgres::Postgres;
|
|
48
|
+
|
|
49
|
+
async fn create_pg_container() -> (ContainerAsync<Postgres>, String) {
|
|
50
|
+
let container = Postgres::default().start().await.unwrap();
|
|
51
|
+
let port = container.get_host_port_ipv4(5432).await.unwrap();
|
|
52
|
+
let url = format!("postgres://postgres:postgres@localhost:{port}/postgres");
|
|
53
|
+
(container, url)
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### マイグレーション実行
|
|
58
|
+
|
|
59
|
+
```rust
|
|
60
|
+
use diesel_async::AsyncPgConnection;
|
|
61
|
+
use diesel_migrations::{embed_migrations, EmbeddedMigrations, MigrationHarness};
|
|
62
|
+
|
|
63
|
+
const MIGRATIONS: EmbeddedMigrations = embed_migrations!();
|
|
64
|
+
|
|
65
|
+
async fn run_migrations(database_url: &str) {
|
|
66
|
+
// diesel の同期マイグレーションを blocking task で実行
|
|
67
|
+
let url = database_url.to_string();
|
|
68
|
+
tokio::task::spawn_blocking(move || {
|
|
69
|
+
use diesel::prelude::*;
|
|
70
|
+
let mut conn = PgConnection::establish(&url).unwrap();
|
|
71
|
+
conn.run_pending_migrations(MIGRATIONS).unwrap();
|
|
72
|
+
})
|
|
73
|
+
.await
|
|
74
|
+
.unwrap();
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### テストデータ投入 (Seed)
|
|
79
|
+
|
|
80
|
+
```rust
|
|
81
|
+
impl TestContext {
|
|
82
|
+
pub async fn seed_user(&self, new_user: &NewUser) -> User {
|
|
83
|
+
let mut conn = self.db_pool.get().await.unwrap();
|
|
84
|
+
diesel::insert_into(users::table)
|
|
85
|
+
.values(new_user)
|
|
86
|
+
.get_result(&mut conn)
|
|
87
|
+
.await
|
|
88
|
+
.unwrap()
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
pub async fn seed_users(&self, users: &[NewUser]) -> Vec<User> {
|
|
92
|
+
let mut conn = self.db_pool.get().await.unwrap();
|
|
93
|
+
diesel::insert_into(users::table)
|
|
94
|
+
.values(users)
|
|
95
|
+
.get_results(&mut conn)
|
|
96
|
+
.await
|
|
97
|
+
.unwrap()
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
pub async fn find_user_by_id(&self, id: i64) -> Option<User> {
|
|
101
|
+
let mut conn = self.db_pool.get().await.unwrap();
|
|
102
|
+
users::table.find(id)
|
|
103
|
+
.select(User::as_select())
|
|
104
|
+
.first(&mut conn)
|
|
105
|
+
.await
|
|
106
|
+
.optional()
|
|
107
|
+
.unwrap()
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## 認証ヘッダー
|
|
113
|
+
|
|
114
|
+
```rust
|
|
115
|
+
fn test_auth_header() -> HeaderMap {
|
|
116
|
+
let mut headers = HeaderMap::new();
|
|
117
|
+
headers.insert(
|
|
118
|
+
"Authorization",
|
|
119
|
+
HeaderValue::from_static("Bearer test-token-xxx"),
|
|
120
|
+
);
|
|
121
|
+
headers
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Axum アプリ構築
|
|
126
|
+
|
|
127
|
+
```rust
|
|
128
|
+
async fn build_test_app(db_pool: DbPool, valkey: ConnectionManager) -> Router {
|
|
129
|
+
let state = AppState {
|
|
130
|
+
db_pool,
|
|
131
|
+
valkey,
|
|
132
|
+
config: Arc::new(test_config()),
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
// 本番と同じルーター構成を使用
|
|
136
|
+
crate::routes::routes()
|
|
137
|
+
.with_state(state)
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Fixture 選択フロー
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
テストで何が必要?
|
|
145
|
+
├─ DB アクセスが必要
|
|
146
|
+
│ └─ TestContext::new() を使用
|
|
147
|
+
│ ├─ テストデータ投入 → seed_user(), seed_users()
|
|
148
|
+
│ └─ DB 検証 → find_user_by_id(), find_user_by_email()
|
|
149
|
+
│
|
|
150
|
+
├─ 外部 API のモック
|
|
151
|
+
│ └─ TestContext::with_failing_external_api() or カスタム trait 実装
|
|
152
|
+
│
|
|
153
|
+
└─ HTTP リクエスト送信
|
|
154
|
+
└─ ctx.get(), ctx.post(), ctx.put(), ctx.delete()
|
|
155
|
+
```
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# 並列実行フロー詳細
|
|
2
|
+
|
|
3
|
+
Agent Teams を使った並列テスト作成の全フェーズ詳細。
|
|
4
|
+
|
|
5
|
+
## チーム構成
|
|
6
|
+
|
|
7
|
+
| 役割 | 数 | 責務 |
|
|
8
|
+
|------|:--:|------|
|
|
9
|
+
| Command(司令塔) | 1 | 分析・分担・監視・最終検証 |
|
|
10
|
+
| Workers(テスト実装) | 1-2 | テストファイル作成 |
|
|
11
|
+
| Pentagon(品質レビュー) | 1 | 品質ゲート判定 |
|
|
12
|
+
|
|
13
|
+
## フェーズ詳細
|
|
14
|
+
|
|
15
|
+
### P0: Parse & Analyze
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
入力: /integration-test users,posts
|
|
19
|
+
↓
|
|
20
|
+
カンマで分割 → ["users", "posts"]
|
|
21
|
+
↓
|
|
22
|
+
各対象を分析:
|
|
23
|
+
users → src/handlers/users.rs → src/db/repository/users.rs → src/models/user.rs
|
|
24
|
+
posts → src/handlers/posts.rs → src/db/repository/posts.rs → src/models/post.rs
|
|
25
|
+
↓
|
|
26
|
+
Worker 分担:
|
|
27
|
+
alpha → users (test_users.rs)
|
|
28
|
+
bravo → posts (test_posts.rs)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### P1: Setup Team
|
|
32
|
+
|
|
33
|
+
1. 共通ヘルパーの確認
|
|
34
|
+
- `tests/integration/helpers/` が存在するか
|
|
35
|
+
- TestContext が対象ドメインで動作するか
|
|
36
|
+
- 新規 fixture が必要なら Command が追加
|
|
37
|
+
|
|
38
|
+
2. ホワイトボード作成
|
|
39
|
+
- `whiteboard-template.md` に従い作成
|
|
40
|
+
- Key Questions を 1-3 個設定
|
|
41
|
+
|
|
42
|
+
### P2: Launch Agents
|
|
43
|
+
|
|
44
|
+
Workers と Pentagon を `.claude/agents/` のエージェント定義を使ってサブエージェントとして起動。
|
|
45
|
+
|
|
46
|
+
**起動順序:**
|
|
47
|
+
1. Pentagon(`subagent_type: "integ-test-auditor"`)— 起動後はレビュー依頼待ち
|
|
48
|
+
2. Workers(`subagent_type: "integ-test-worker"`)— alpha, bravo を並列起動
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
# Pentagon 起動
|
|
52
|
+
Agent(subagent_type: "integ-test-auditor", prompt: "ホワイトボード: {whiteboard_path}\nレビュー依頼を待機")
|
|
53
|
+
|
|
54
|
+
# Worker 起動(並列)
|
|
55
|
+
Agent(subagent_type: "integ-test-worker", prompt: "Worker名: alpha\nドメイン: {domain_a}\n...")
|
|
56
|
+
Agent(subagent_type: "integ-test-worker", prompt: "Worker名: bravo\nドメイン: {domain_b}\n...")
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### P3: Monitor & Facilitate
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
while 未完了タスクが存在:
|
|
63
|
+
├─ Worker 完了を検出
|
|
64
|
+
│ ├─ ホワイトボードに Findings 転記
|
|
65
|
+
│ ├─ Pentagon にレビュー依頼
|
|
66
|
+
│ └─ Pentagon 結果を待つ
|
|
67
|
+
│ ├─ PASS → Quality Gate 更新、次タスクがあれば割当
|
|
68
|
+
│ └─ FAIL → レビュー回数確認
|
|
69
|
+
│ ├─ < 3 回 → Worker に差し戻し
|
|
70
|
+
│ └─ = 3 回 → 残存指摘付きで完了
|
|
71
|
+
└─ 全タスク完了 → P4 へ
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**差し戻し時の Worker 再実行:**
|
|
75
|
+
- 元の prompt に Pentagon の指摘事項を追加
|
|
76
|
+
- 「修正箇所」と「修正理由」を明示
|
|
77
|
+
|
|
78
|
+
### P4: Final Verification
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# 全テスト実行
|
|
82
|
+
cargo test --test integration_users --test integration_posts -- --nocapture
|
|
83
|
+
|
|
84
|
+
# コード品質チェック
|
|
85
|
+
rustfmt tests/integration/test_users.rs tests/integration/test_posts.rs
|
|
86
|
+
cargo clippy --tests --quiet
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
失敗した場合:
|
|
90
|
+
- コンパイルエラー → Command が直接修正
|
|
91
|
+
- テスト失敗 → 原因を特定し Command が修正 or Worker に再依頼
|
|
92
|
+
- clippy 警告 → Command が修正
|
|
93
|
+
|
|
94
|
+
### P5: Cleanup & Report
|
|
95
|
+
|
|
96
|
+
1. ホワイトボードを `.claude/_docs/deleted/` に移動
|
|
97
|
+
2. 最終レポート出力
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
integration-test 並列実装完了
|
|
101
|
+
|
|
102
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
103
|
+
対象: users, posts
|
|
104
|
+
|
|
105
|
+
生成ファイル:
|
|
106
|
+
tests/integration/test_users.rs (12 tests)
|
|
107
|
+
tests/integration/test_posts.rs (10 tests)
|
|
108
|
+
|
|
109
|
+
テスト結果:
|
|
110
|
+
22 tests passed, 0 failed
|
|
111
|
+
|
|
112
|
+
品質ゲート:
|
|
113
|
+
test_users.rs: PASS (cycle 1)
|
|
114
|
+
test_posts.rs: PASS (cycle 2)
|
|
115
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## タイムアウトと中断
|
|
119
|
+
|
|
120
|
+
| 状況 | 対処 |
|
|
121
|
+
|------|------|
|
|
122
|
+
| Worker が 10 分以上応答なし | Command が状態確認、必要なら再起動 |
|
|
123
|
+
| Pentagon が 5 分以上応答なし | Command が状態確認、必要なら再起動 |
|
|
124
|
+
| 3 回差し戻し後も品質不足 | 残存指摘付きで完了、レポートに注記 |
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# 品質ゲート
|
|
2
|
+
|
|
3
|
+
Pentagon(Reviewer)がテストファイルをレビューする際の判定基準。
|
|
4
|
+
全項目 PASS で合格、1 項目でも FAIL で差し戻し。
|
|
5
|
+
|
|
6
|
+
## 判定項目
|
|
7
|
+
|
|
8
|
+
### A. 5 分類カバレッジ
|
|
9
|
+
|
|
10
|
+
- [ ] 正常系テストが存在する
|
|
11
|
+
- [ ] 異常系テスト(バリデーションエラー、404 等)が存在する
|
|
12
|
+
- [ ] 境界値テスト(空リスト、最大長等)が存在する
|
|
13
|
+
- [ ] エッジケース(重複、同時更新等)が考慮されている
|
|
14
|
+
- [ ] 外部依存エラー時の挙動がテストされている(該当する場合)
|
|
15
|
+
|
|
16
|
+
### B. 振る舞い契約の検証
|
|
17
|
+
|
|
18
|
+
- [ ] HTTP ステータスコードが正しい
|
|
19
|
+
- [ ] レスポンスボディの構造が正しい(フィールド名、型)
|
|
20
|
+
- [ ] DB の状態変更が検証されている(POST/PUT/DELETE)
|
|
21
|
+
- [ ] エラーレスポンスのフォーマットが統一されている
|
|
22
|
+
|
|
23
|
+
### C. コード品質
|
|
24
|
+
|
|
25
|
+
- [ ] Given-When-Then 構造が明確
|
|
26
|
+
- [ ] テスト関数名が振る舞いを説明している
|
|
27
|
+
- [ ] テスト間に依存がない(独立して実行可能)
|
|
28
|
+
- [ ] 不要な assert がない(1 テスト 1 概念)
|
|
29
|
+
- [ ] ハードコードされたマジックナンバーがない
|
|
30
|
+
|
|
31
|
+
### D. Hermetic & Deterministic
|
|
32
|
+
|
|
33
|
+
- [ ] 各テストが独立した DB 状態を持つ(testcontainers or トランザクション)
|
|
34
|
+
- [ ] 外部 API は trait DI でテストダブルに差し替えている
|
|
35
|
+
- [ ] 時刻依存のテストは Clock trait で制御している
|
|
36
|
+
- [ ] テスト実行順序に依存しない
|
|
37
|
+
- [ ] `sleep` や固定タイムアウトに依存しない
|
|
38
|
+
|
|
39
|
+
### E. Rust 固有
|
|
40
|
+
|
|
41
|
+
- [ ] `#[tokio::test]` が正しく使われている
|
|
42
|
+
- [ ] `unwrap()` はテストコード内でのみ使用(本番コードに混入していない)
|
|
43
|
+
- [ ] `clippy` 警告がない
|
|
44
|
+
- [ ] `rustfmt` でフォーマット済み
|
|
45
|
+
|
|
46
|
+
## 判定フロー
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
全項目チェック
|
|
50
|
+
├─ 全 PASS → PASS(テスト承認)
|
|
51
|
+
├─ FAIL あり(修正可能)→ FAIL + 具体的な修正指示
|
|
52
|
+
└─ FAIL あり(設計レベル)→ FAIL + 設計変更の提案
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## レポートフォーマット
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
[Pentagon Review] {test_file}
|
|
59
|
+
|
|
60
|
+
判定: PASS / FAIL
|
|
61
|
+
|
|
62
|
+
A. 5分類カバレッジ: PASS / FAIL
|
|
63
|
+
{不足があれば具体的に}
|
|
64
|
+
|
|
65
|
+
B. 振る舞い契約: PASS / FAIL
|
|
66
|
+
{問題があれば具体的に}
|
|
67
|
+
|
|
68
|
+
C. コード品質: PASS / FAIL
|
|
69
|
+
{問題があれば具体的に}
|
|
70
|
+
|
|
71
|
+
D. Hermetic: PASS / FAIL
|
|
72
|
+
{問題があれば具体的に}
|
|
73
|
+
|
|
74
|
+
E. Rust 固有: PASS / FAIL
|
|
75
|
+
{問題があれば具体的に}
|
|
76
|
+
|
|
77
|
+
修正指示:
|
|
78
|
+
1. {具体的な修正内容}
|
|
79
|
+
2. {具体的な修正内容}
|
|
80
|
+
```
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# テストケース設計ガイド
|
|
2
|
+
|
|
3
|
+
## 5 分類体系
|
|
4
|
+
|
|
5
|
+
インテグレーションテストのケースは以下の 5 分類で網羅する。
|
|
6
|
+
|
|
7
|
+
| 分類 | 説明 | 例 |
|
|
8
|
+
|------|------|-----|
|
|
9
|
+
| **正常系** | 正しい入力で期待通りの結果 | ユーザー作成成功、一覧取得 |
|
|
10
|
+
| **異常系** | 不正な入力やエラー条件 | バリデーションエラー、認証エラー |
|
|
11
|
+
| **境界値** | 境界条件の動作確認 | 空リスト、最大長、ページ境界 |
|
|
12
|
+
| **エッジケース** | 特殊な状況 | 重複データ、同時更新、空文字 |
|
|
13
|
+
| **外部依存エラー** | 外部システムの障害 | DB 接続エラー、外部 API タイムアウト |
|
|
14
|
+
|
|
15
|
+
## HTTP メソッド別必須テストケース
|
|
16
|
+
|
|
17
|
+
### GET 一覧
|
|
18
|
+
|
|
19
|
+
| 分類 | テストケース |
|
|
20
|
+
|------|------------|
|
|
21
|
+
| 正常系 | データが存在する場合に全件返す |
|
|
22
|
+
| 境界値 | データが0件の場合に空配列を返す |
|
|
23
|
+
| 正常系 | ページネーションが正しく動作する |
|
|
24
|
+
| 境界値 | 最終ページの件数が正しい |
|
|
25
|
+
| 異常系 | 認証なしで 401 |
|
|
26
|
+
|
|
27
|
+
### GET 詳細
|
|
28
|
+
|
|
29
|
+
| 分類 | テストケース |
|
|
30
|
+
|------|------------|
|
|
31
|
+
| 正常系 | 存在する ID で正しいデータを返す |
|
|
32
|
+
| 異常系 | 存在しない ID で 404 |
|
|
33
|
+
| 異常系 | 不正な ID 形式で 400 |
|
|
34
|
+
| 異常系 | 認証なしで 401 |
|
|
35
|
+
|
|
36
|
+
### POST 作成
|
|
37
|
+
|
|
38
|
+
| 分類 | テストケース |
|
|
39
|
+
|------|------------|
|
|
40
|
+
| 正常系 | 有効な入力で 201 + DB に保存 |
|
|
41
|
+
| 異常系 | 必須フィールド欠落で 400 |
|
|
42
|
+
| 異常系 | バリデーション違反で 400 |
|
|
43
|
+
| エッジケース | 重複データで 409 (Conflict) |
|
|
44
|
+
| 外部依存 | 外部 API エラー時にロールバック |
|
|
45
|
+
| 異常系 | 認証なしで 401 |
|
|
46
|
+
|
|
47
|
+
### PUT/PATCH 更新
|
|
48
|
+
|
|
49
|
+
| 分類 | テストケース |
|
|
50
|
+
|------|------------|
|
|
51
|
+
| 正常系 | 有効な入力で更新成功 + DB に反映 |
|
|
52
|
+
| 異常系 | 存在しない ID で 404 |
|
|
53
|
+
| 異常系 | バリデーション違反で 400 |
|
|
54
|
+
| 境界値 | 変更なし (同じ値) で正常応答 |
|
|
55
|
+
| 異常系 | 認証なしで 401 |
|
|
56
|
+
|
|
57
|
+
### DELETE 削除
|
|
58
|
+
|
|
59
|
+
| 分類 | テストケース |
|
|
60
|
+
|------|------------|
|
|
61
|
+
| 正常系 | 存在する ID で 204 + DB から削除 |
|
|
62
|
+
| 異常系 | 存在しない ID で 404 |
|
|
63
|
+
| エッジケース | 関連データがある場合の挙動 |
|
|
64
|
+
| 異常系 | 認証なしで 401 |
|
|
65
|
+
|
|
66
|
+
## テストケース導出手順
|
|
67
|
+
|
|
68
|
+
1. **handler を読む**: ルート定義からエンドポイント一覧を把握
|
|
69
|
+
2. **リクエスト/レスポンス型を読む**: DTO の構造からバリデーション条件を特定
|
|
70
|
+
3. **repository を読む**: クエリロジックからエッジケースを特定
|
|
71
|
+
4. **5 分類マトリクスに当てはめる**: 上記のテーブルを参考にケースを列挙
|
|
72
|
+
|
|
73
|
+
## ケース数の目安
|
|
74
|
+
|
|
75
|
+
| エンドポイント種別 | 最小ケース数 |
|
|
76
|
+
|------------------|:----------:|
|
|
77
|
+
| GET 一覧 | 4-5 |
|
|
78
|
+
| GET 詳細 | 3-4 |
|
|
79
|
+
| POST 作成 | 5-6 |
|
|
80
|
+
| PUT/PATCH 更新 | 4-5 |
|
|
81
|
+
| DELETE 削除 | 3-4 |
|
|
82
|
+
|
|
83
|
+
## UT との棲み分け
|
|
84
|
+
|
|
85
|
+
| テスト種別 | 対象 | DB | 外部 API |
|
|
86
|
+
|-----------|------|:--:|:-------:|
|
|
87
|
+
| UT | ビジネスロジック単体 | mock/fake | mock |
|
|
88
|
+
| IT | HTTP → handler → repository → DB 全層 | 実 DB (testcontainers) | trait DI |
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
# テスト実装パターン
|
|
2
|
+
|
|
3
|
+
インテグレーションテストで使う典型的なパターン集。
|
|
4
|
+
|
|
5
|
+
## ファイル構成テンプレート
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
tests/
|
|
9
|
+
├── integration.rs # テストバイナリエントリポイント(mod で下記を参照)
|
|
10
|
+
├── integration/
|
|
11
|
+
│ ├── helpers/
|
|
12
|
+
│ │ ├── mod.rs # 共通ヘルパー
|
|
13
|
+
│ │ ├── app.rs # テスト用 Axum app 構築
|
|
14
|
+
│ │ ├── db.rs # testcontainers DB セットアップ
|
|
15
|
+
│ │ └── auth.rs # テスト用認証ヘッダー
|
|
16
|
+
│ ├── test_users.rs # ドメインごとのテストファイル
|
|
17
|
+
│ └── test_posts.rs
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## パターン1: リスト取得 (GET /)
|
|
21
|
+
|
|
22
|
+
```rust
|
|
23
|
+
#[tokio::test]
|
|
24
|
+
async fn list_users_returns_all_users() {
|
|
25
|
+
let ctx = TestContext::new().await;
|
|
26
|
+
// Given: DB にテストデータを投入
|
|
27
|
+
ctx.seed_users(&[
|
|
28
|
+
NewUser { name: "Alice", email: "alice@example.com" },
|
|
29
|
+
NewUser { name: "Bob", email: "bob@example.com" },
|
|
30
|
+
]).await;
|
|
31
|
+
|
|
32
|
+
// When: GET /api/users
|
|
33
|
+
let response = ctx.get("/api/users").await;
|
|
34
|
+
|
|
35
|
+
// Then
|
|
36
|
+
assert_eq!(response.status(), StatusCode::OK);
|
|
37
|
+
let body: Vec<UserResponse> = response.json().await;
|
|
38
|
+
assert_eq!(body.len(), 2);
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## パターン2: 作成 (POST /)
|
|
43
|
+
|
|
44
|
+
```rust
|
|
45
|
+
#[tokio::test]
|
|
46
|
+
async fn create_user_returns_created() {
|
|
47
|
+
let ctx = TestContext::new().await;
|
|
48
|
+
|
|
49
|
+
// When
|
|
50
|
+
let response = ctx.post("/api/users")
|
|
51
|
+
.json(&json!({ "name": "Alice", "email": "alice@example.com" }))
|
|
52
|
+
.await;
|
|
53
|
+
|
|
54
|
+
// Then: レスポンス検証
|
|
55
|
+
assert_eq!(response.status(), StatusCode::CREATED);
|
|
56
|
+
let body: UserResponse = response.json().await;
|
|
57
|
+
assert_eq!(body.name, "Alice");
|
|
58
|
+
|
|
59
|
+
// Then: DB にも保存されたことを検証
|
|
60
|
+
let user = ctx.find_user_by_email("alice@example.com").await;
|
|
61
|
+
assert!(user.is_some());
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## パターン3: 詳細取得 (GET /:id)
|
|
66
|
+
|
|
67
|
+
```rust
|
|
68
|
+
#[tokio::test]
|
|
69
|
+
async fn get_user_returns_user_when_exists() {
|
|
70
|
+
let ctx = TestContext::new().await;
|
|
71
|
+
let user = ctx.seed_user(&NewUser { name: "Alice", email: "alice@example.com" }).await;
|
|
72
|
+
|
|
73
|
+
let response = ctx.get(&format!("/api/users/{}", user.id)).await;
|
|
74
|
+
|
|
75
|
+
assert_eq!(response.status(), StatusCode::OK);
|
|
76
|
+
let body: UserResponse = response.json().await;
|
|
77
|
+
assert_eq!(body.id, user.id);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
#[tokio::test]
|
|
81
|
+
async fn get_user_returns_not_found_when_missing() {
|
|
82
|
+
let ctx = TestContext::new().await;
|
|
83
|
+
|
|
84
|
+
let response = ctx.get("/api/users/99999").await;
|
|
85
|
+
|
|
86
|
+
assert_eq!(response.status(), StatusCode::NOT_FOUND);
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## パターン4: 更新 (PUT /:id)
|
|
91
|
+
|
|
92
|
+
```rust
|
|
93
|
+
#[tokio::test]
|
|
94
|
+
async fn update_user_modifies_existing_record() {
|
|
95
|
+
let ctx = TestContext::new().await;
|
|
96
|
+
let user = ctx.seed_user(&NewUser { name: "Alice", email: "alice@example.com" }).await;
|
|
97
|
+
|
|
98
|
+
let response = ctx.put(&format!("/api/users/{}", user.id))
|
|
99
|
+
.json(&json!({ "name": "Alice Updated" }))
|
|
100
|
+
.await;
|
|
101
|
+
|
|
102
|
+
assert_eq!(response.status(), StatusCode::OK);
|
|
103
|
+
|
|
104
|
+
// DB も更新されたことを検証
|
|
105
|
+
let updated = ctx.find_user_by_id(user.id).await.unwrap();
|
|
106
|
+
assert_eq!(updated.name, "Alice Updated");
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## パターン5: 削除 (DELETE /:id)
|
|
111
|
+
|
|
112
|
+
```rust
|
|
113
|
+
#[tokio::test]
|
|
114
|
+
async fn delete_user_removes_record() {
|
|
115
|
+
let ctx = TestContext::new().await;
|
|
116
|
+
let user = ctx.seed_user(&NewUser { name: "Alice", email: "alice@example.com" }).await;
|
|
117
|
+
|
|
118
|
+
let response = ctx.delete(&format!("/api/users/{}", user.id)).await;
|
|
119
|
+
|
|
120
|
+
assert_eq!(response.status(), StatusCode::NO_CONTENT);
|
|
121
|
+
|
|
122
|
+
// DB から削除されたことを検証
|
|
123
|
+
let deleted = ctx.find_user_by_id(user.id).await;
|
|
124
|
+
assert!(deleted.is_none());
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## パターン6: parametrize (rstest)
|
|
129
|
+
|
|
130
|
+
```rust
|
|
131
|
+
use rstest::rstest;
|
|
132
|
+
|
|
133
|
+
const LONG_NAME: &str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; // 256文字
|
|
134
|
+
|
|
135
|
+
#[rstest]
|
|
136
|
+
#[case("", StatusCode::BAD_REQUEST)]
|
|
137
|
+
#[case(LONG_NAME, StatusCode::BAD_REQUEST)]
|
|
138
|
+
#[case("valid_name", StatusCode::CREATED)]
|
|
139
|
+
#[tokio::test]
|
|
140
|
+
async fn create_user_validates_name(
|
|
141
|
+
#[case] name: &str,
|
|
142
|
+
#[case] expected_status: StatusCode,
|
|
143
|
+
) {
|
|
144
|
+
let ctx = TestContext::new().await;
|
|
145
|
+
|
|
146
|
+
let response = ctx.post("/api/users")
|
|
147
|
+
.json(&json!({ "name": name, "email": "test@example.com" }))
|
|
148
|
+
.await;
|
|
149
|
+
|
|
150
|
+
assert_eq!(response.status(), expected_status);
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## パターン7: ページネーション
|
|
155
|
+
|
|
156
|
+
```rust
|
|
157
|
+
#[tokio::test]
|
|
158
|
+
async fn list_users_supports_pagination() {
|
|
159
|
+
let ctx = TestContext::new().await;
|
|
160
|
+
ctx.seed_users_count(25).await;
|
|
161
|
+
|
|
162
|
+
// 1ページ目
|
|
163
|
+
let response = ctx.get("/api/users?page=1&per_page=10").await;
|
|
164
|
+
assert_eq!(response.status(), StatusCode::OK);
|
|
165
|
+
let body: PaginatedResponse<UserResponse> = response.json().await;
|
|
166
|
+
assert_eq!(body.items.len(), 10);
|
|
167
|
+
assert_eq!(body.total, 25);
|
|
168
|
+
|
|
169
|
+
// 3ページ目(残り5件)
|
|
170
|
+
let response = ctx.get("/api/users?page=3&per_page=10").await;
|
|
171
|
+
let body: PaginatedResponse<UserResponse> = response.json().await;
|
|
172
|
+
assert_eq!(body.items.len(), 5);
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
## パターン8: 外部 API エラー時の挙動
|
|
177
|
+
|
|
178
|
+
```rust
|
|
179
|
+
#[tokio::test]
|
|
180
|
+
async fn create_user_returns_error_when_external_api_fails() {
|
|
181
|
+
let ctx = TestContext::with_failing_external_api().await;
|
|
182
|
+
|
|
183
|
+
let response = ctx.post("/api/users")
|
|
184
|
+
.json(&json!({ "name": "Alice", "email": "alice@example.com" }))
|
|
185
|
+
.await;
|
|
186
|
+
|
|
187
|
+
assert_eq!(response.status(), StatusCode::BAD_GATEWAY);
|
|
188
|
+
|
|
189
|
+
// DB にはロールバックされていることを検証
|
|
190
|
+
let user = ctx.find_user_by_email("alice@example.com").await;
|
|
191
|
+
assert!(user.is_none());
|
|
192
|
+
}
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
## パターン9: 認証エラー
|
|
196
|
+
|
|
197
|
+
```rust
|
|
198
|
+
#[tokio::test]
|
|
199
|
+
async fn unauthenticated_request_returns_401() {
|
|
200
|
+
let ctx = TestContext::new().await;
|
|
201
|
+
|
|
202
|
+
let response = ctx.get_without_auth("/api/users").await;
|
|
203
|
+
|
|
204
|
+
assert_eq!(response.status(), StatusCode::UNAUTHORIZED);
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## よくあるエラーと対処法
|
|
209
|
+
|
|
210
|
+
| エラー | 原因 | 対処 |
|
|
211
|
+
|--------|------|------|
|
|
212
|
+
| `connection refused` | testcontainers コンテナ未起動 | Docker デーモンが起動しているか確認 |
|
|
213
|
+
| `table not found` | マイグレーション未実行 | TestContext でマイグレーション実行を確認 |
|
|
214
|
+
| テスト間でデータが干渉 | トランザクション未ロールバック | 各テストで独立した DB / トランザクションを使用 |
|
|
215
|
+
| `tokio runtime` エラー | `#[test]` を使っている | `#[tokio::test]` に変更 |
|