cc-devflow 1.0.1
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/CLAUDE.md +83 -0
- package/.claude/agents/architecture-designer.md +443 -0
- package/.claude/agents/bug-analyzer.md +382 -0
- package/.claude/agents/checklist-agent.md +175 -0
- package/.claude/agents/clarify-analyst.md +50 -0
- package/.claude/agents/code-reviewer.md +71 -0
- package/.claude/agents/codex-analyzer.md +39 -0
- package/.claude/agents/compatibility-checker.md +580 -0
- package/.claude/agents/consistency-checker.md +532 -0
- package/.claude/agents/impact-analyzer.md +441 -0
- package/.claude/agents/planner.md +230 -0
- package/.claude/agents/prd-writer.md +320 -0
- package/.claude/agents/project-guidelines-generator.md +1329 -0
- package/.claude/agents/qa-tester.md +313 -0
- package/.claude/agents/release-manager.md +295 -0
- package/.claude/agents/security-reviewer.md +314 -0
- package/.claude/agents/style-guide-generator.md +458 -0
- package/.claude/agents/tech-architect.md +516 -0
- package/.claude/agents/ui-designer.md +485 -0
- package/.claude/commands/code-review-high.md +58 -0
- package/.claude/commands/core-architecture.md +429 -0
- package/.claude/commands/core-guidelines.md +486 -0
- package/.claude/commands/core-roadmap.md +439 -0
- package/.claude/commands/core-style.md +293 -0
- package/.claude/commands/flow-archive.md +245 -0
- package/.claude/commands/flow-checklist.md +260 -0
- package/.claude/commands/flow-clarify.md +136 -0
- package/.claude/commands/flow-constitution.md +82 -0
- package/.claude/commands/flow-dev.md +134 -0
- package/.claude/commands/flow-epic.md +150 -0
- package/.claude/commands/flow-fix.md +104 -0
- package/.claude/commands/flow-ideate.md +214 -0
- package/.claude/commands/flow-init.md +313 -0
- package/.claude/commands/flow-new.md +394 -0
- package/.claude/commands/flow-prd.md +131 -0
- package/.claude/commands/flow-qa.md +93 -0
- package/.claude/commands/flow-release.md +92 -0
- package/.claude/commands/flow-restart.md +98 -0
- package/.claude/commands/flow-status.md +64 -0
- package/.claude/commands/flow-tech.md +142 -0
- package/.claude/commands/flow-ui.md +189 -0
- package/.claude/commands/flow-update.md +111 -0
- package/.claude/commands/flow-upgrade.md +115 -0
- package/.claude/commands/flow-verify.md +96 -0
- package/.claude/commands/problem-analyzer.md +60 -0
- package/.claude/config/quality-rules.yml +161 -0
- package/.claude/docs/SPEC_KIT_CONSTITUTION_ANALYSIS.md +426 -0
- package/.claude/docs/design/consistency-conflict-detection-algorithms.md +658 -0
- package/.claude/docs/design/intent-driven-input-design.md +380 -0
- package/.claude/docs/design/prd-version-management-design.md +437 -0
- package/.claude/docs/guides/INIT_TROUBLESHOOTING.md +117 -0
- package/.claude/docs/guides/NEW_TROUBLESHOOTING.md +151 -0
- package/.claude/docs/guides/ROADMAP_TROUBLESHOOTING.md +188 -0
- package/.claude/docs/guides/TASK_COMPLETION_MARKING.md +338 -0
- package/.claude/docs/templates/ARCHITECTURE_TEMPLATE.md +633 -0
- package/.claude/docs/templates/BACKLOG_TEMPLATE.md +261 -0
- package/.claude/docs/templates/CHECKLIST_TEMPLATE.md +52 -0
- package/.claude/docs/templates/CLARIFICATION_REPORT_TEMPLATE.md +206 -0
- package/.claude/docs/templates/CODE_REVIEW_TEMPLATE.md +71 -0
- package/.claude/docs/templates/EPIC_TEMPLATE.md +805 -0
- package/.claude/docs/templates/INIT_FLOW_TEMPLATE.md +213 -0
- package/.claude/docs/templates/INTENT_CLARIFICATION_TEMPLATE.md +57 -0
- package/.claude/docs/templates/NEW_ORCHESTRATION_TEMPLATE.md +148 -0
- package/.claude/docs/templates/PRD_TEMPLATE.md +562 -0
- package/.claude/docs/templates/RESEARCH_TEMPLATE.md +276 -0
- package/.claude/docs/templates/REVIEW-HIGH.md +57 -0
- package/.claude/docs/templates/ROADMAP_DIALOGUE_TEMPLATE.md +198 -0
- package/.claude/docs/templates/ROADMAP_TEMPLATE.md +310 -0
- package/.claude/docs/templates/STYLE_TEMPLATE.md +1266 -0
- package/.claude/docs/templates/TASKS_TEMPLATE.md +523 -0
- package/.claude/docs/templates/TECH_DESIGN_TEMPLATE.md +1019 -0
- package/.claude/docs/templates/UI_PROTOTYPE_TEMPLATE.md +1436 -0
- package/.claude/guides/agent-guides/agent-coordination-guide.md +459 -0
- package/.claude/guides/project-guidelines-system.md +463 -0
- package/.claude/guides/technical-guides/datetime-handling-guide.md +563 -0
- package/.claude/guides/technical-guides/git-github-guide.md +642 -0
- package/.claude/guides/technical-guides/test-execution-guide.md +618 -0
- package/.claude/guides/workflow-guides/bug-fix-orchestrator.md +217 -0
- package/.claude/guides/workflow-guides/flow-orchestrator.md +282 -0
- package/.claude/hooks/checklist-gate.js +397 -0
- package/.claude/hooks/error-handling-reminder.sh +12 -0
- package/.claude/hooks/error-handling-reminder.ts +459 -0
- package/.claude/hooks/post-tool-use-tracker.sh +280 -0
- package/.claude/hooks/pre-tool-use-guardrail.sh +36 -0
- package/.claude/hooks/pre-tool-use-guardrail.ts +342 -0
- package/.claude/hooks/skill-activation-prompt.sh +36 -0
- package/.claude/hooks/skill-activation-prompt.ts +214 -0
- package/.claude/hooks/state/skills-used-test-guard.json +3 -0
- package/.claude/rules/devflow-conventions.md +305 -0
- package/.claude/rules/project-constitution.md +748 -0
- package/.claude/schemas/constitution.schema.json +43 -0
- package/.claude/scripts/analyze-upgrade-impact.sh +200 -0
- package/.claude/scripts/archive-requirement.sh +351 -0
- package/.claude/scripts/calculate-checklist-completion.sh +243 -0
- package/.claude/scripts/calculate-quarter.sh +206 -0
- package/.claude/scripts/check-dependencies.sh +409 -0
- package/.claude/scripts/check-prerequisites.sh +232 -0
- package/.claude/scripts/check-task-status.sh +264 -0
- package/.claude/scripts/checklist-errors.sh +131 -0
- package/.claude/scripts/common.sh +570 -0
- package/.claude/scripts/consolidate-research.sh +182 -0
- package/.claude/scripts/create-requirement.sh +426 -0
- package/.claude/scripts/export-contracts.sh +117 -0
- package/.claude/scripts/extract-data-model.sh +78 -0
- package/.claude/scripts/generate-clarification-questions.sh +377 -0
- package/.claude/scripts/generate-clarification-report.sh +463 -0
- package/.claude/scripts/generate-quickstart.sh +146 -0
- package/.claude/scripts/generate-research-tasks.sh +157 -0
- package/.claude/scripts/generate-status-report.sh +523 -0
- package/.claude/scripts/generate-tech-analysis.sh +46 -0
- package/.claude/scripts/locate-requirement-in-roadmap.sh +233 -0
- package/.claude/scripts/manage-constitution.sh +602 -0
- package/.claude/scripts/mark-task-complete.sh +198 -0
- package/.claude/scripts/populate-research-tasks.sh +259 -0
- package/.claude/scripts/recover-workflow.sh +460 -0
- package/.claude/scripts/run-clarify-scan.sh +601 -0
- package/.claude/scripts/run-high-review.sh +62 -0
- package/.claude/scripts/run-problem-analysis.sh +68 -0
- package/.claude/scripts/setup-epic.sh +173 -0
- package/.claude/scripts/sync-roadmap-progress.sh +300 -0
- package/.claude/scripts/sync-task-marks.sh +199 -0
- package/.claude/scripts/test-clarify-scan.sh +515 -0
- package/.claude/scripts/update-agent-context.sh +806 -0
- package/.claude/scripts/validate-constitution.sh +567 -0
- package/.claude/scripts/validate-hooks.sh +487 -0
- package/.claude/scripts/validate-research.sh +332 -0
- package/.claude/scripts/validate-scope-boundary.sh +493 -0
- package/.claude/scripts/verify-setup.sh +37 -0
- package/.claude/settings.json +76 -0
- package/.claude/skills/_reference-implementations/README.md +96 -0
- package/.claude/skills/_reference-implementations/backend-express-prisma/SKILL.md +302 -0
- package/.claude/skills/_reference-implementations/backend-express-prisma/resources/architecture-overview.md +451 -0
- package/.claude/skills/_reference-implementations/backend-express-prisma/resources/async-and-errors.md +307 -0
- package/.claude/skills/_reference-implementations/backend-express-prisma/resources/complete-examples.md +638 -0
- package/.claude/skills/_reference-implementations/backend-express-prisma/resources/configuration.md +275 -0
- package/.claude/skills/_reference-implementations/backend-express-prisma/resources/database-patterns.md +224 -0
- package/.claude/skills/_reference-implementations/backend-express-prisma/resources/middleware-guide.md +213 -0
- package/.claude/skills/_reference-implementations/backend-express-prisma/resources/routing-and-controllers.md +756 -0
- package/.claude/skills/_reference-implementations/backend-express-prisma/resources/sentry-and-monitoring.md +336 -0
- package/.claude/skills/_reference-implementations/backend-express-prisma/resources/services-and-repositories.md +789 -0
- package/.claude/skills/_reference-implementations/backend-express-prisma/resources/testing-guide.md +235 -0
- package/.claude/skills/_reference-implementations/backend-express-prisma/resources/validation-patterns.md +754 -0
- package/.claude/skills/_reference-implementations/frontend-react-mui/SKILL.md +399 -0
- package/.claude/skills/_reference-implementations/frontend-react-mui/resources/common-patterns.md +331 -0
- package/.claude/skills/_reference-implementations/frontend-react-mui/resources/complete-examples.md +872 -0
- package/.claude/skills/_reference-implementations/frontend-react-mui/resources/component-patterns.md +502 -0
- package/.claude/skills/_reference-implementations/frontend-react-mui/resources/data-fetching.md +767 -0
- package/.claude/skills/_reference-implementations/frontend-react-mui/resources/file-organization.md +502 -0
- package/.claude/skills/_reference-implementations/frontend-react-mui/resources/loading-and-error-states.md +501 -0
- package/.claude/skills/_reference-implementations/frontend-react-mui/resources/performance.md +406 -0
- package/.claude/skills/_reference-implementations/frontend-react-mui/resources/routing-guide.md +364 -0
- package/.claude/skills/_reference-implementations/frontend-react-mui/resources/styling-guide.md +428 -0
- package/.claude/skills/_reference-implementations/frontend-react-mui/resources/typescript-standards.md +418 -0
- package/.claude/skills/cc-devflow-orchestrator/SKILL.md +229 -0
- package/.claude/skills/constitution-guardian/SKILL.md +306 -0
- package/.claude/skills/devflow-constitution-quick-ref/SKILL.md +374 -0
- package/.claude/skills/devflow-file-standards/SKILL.md +353 -0
- package/.claude/skills/devflow-tdd-enforcer/SKILL.md +192 -0
- package/.claude/skills/skill-developer/ADVANCED.md +197 -0
- package/.claude/skills/skill-developer/HOOK_MECHANISMS.md +306 -0
- package/.claude/skills/skill-developer/PATTERNS_LIBRARY.md +152 -0
- package/.claude/skills/skill-developer/SKILL.md +426 -0
- package/.claude/skills/skill-developer/SKILL_RULES_REFERENCE.md +315 -0
- package/.claude/skills/skill-developer/TRIGGER_TYPES.md +305 -0
- package/.claude/skills/skill-developer/TROUBLESHOOTING.md +514 -0
- package/.claude/skills/skill-rules.json +213 -0
- package/.claude/tests/README.md +300 -0
- package/.claude/tests/TODO.md +69 -0
- package/.claude/tests/__pycache__/test_analyze_upgrade_impact.cpython-311-pytest-7.2.2.pyc +0 -0
- package/.claude/tests/__pycache__/test_consolidate_research.cpython-311-pytest-7.2.2.pyc +0 -0
- package/.claude/tests/__pycache__/test_export_contracts.cpython-311-pytest-7.2.2.pyc +0 -0
- package/.claude/tests/__pycache__/test_extract_data_model.cpython-311-pytest-7.2.2.pyc +0 -0
- package/.claude/tests/__pycache__/test_generate_quickstart.cpython-311-pytest-7.2.2.pyc +0 -0
- package/.claude/tests/__pycache__/test_generate_research_tasks.cpython-311-pytest-7.2.2.pyc +0 -0
- package/.claude/tests/constitution/run_all_constitution_tests.sh +111 -0
- package/.claude/tests/constitution/test_agent_assignment.sh +207 -0
- package/.claude/tests/constitution/test_article_coverage.sh +201 -0
- package/.claude/tests/constitution/test_template_completeness.sh +150 -0
- package/.claude/tests/constitution/test_version_consistency.sh +120 -0
- package/.claude/tests/fixtures/spec_delta_full.md +16 -0
- package/.claude/tests/fixtures/tasks_progress_sample.md +5 -0
- package/.claude/tests/run-all-tests.sh +229 -0
- package/.claude/tests/scripts/run.sh +30 -0
- package/.claude/tests/scripts/test-framework.sh +128 -0
- package/.claude/tests/scripts/test_check_prerequisites.sh +511 -0
- package/.claude/tests/scripts/test_check_prerequisites.sh.bak +504 -0
- package/.claude/tests/scripts/test_check_prerequisites.sh.bak2 +505 -0
- package/.claude/tests/scripts/test_check_prerequisites.sh.bak3 +506 -0
- package/.claude/tests/scripts/test_check_prerequisites.sh.bak4 +507 -0
- package/.claude/tests/scripts/test_check_prerequisites.sh.bak5 +508 -0
- package/.claude/tests/scripts/test_check_task_status.sh +499 -0
- package/.claude/tests/scripts/test_common.sh +244 -0
- package/.claude/tests/scripts/test_generate_status_report.sh +71 -0
- package/.claude/tests/scripts/test_mark_task_complete.sh +441 -0
- package/.claude/tests/scripts/test_mark_task_complete.sh.backup +410 -0
- package/.claude/tests/scripts/test_recover_workflow.sh +304 -0
- package/.claude/tests/scripts/test_setup_epic.sh +437 -0
- package/.claude/tests/scripts/test_sync_task_marks.sh +196 -0
- package/.claude/tests/scripts/test_validate_constitution.sh +74 -0
- package/.claude/tests/scripts/test_validate_research.sh +462 -0
- package/.claude/tests/slugify.bats +82 -0
- package/.claude/tests/test-framework.sh +732 -0
- package/.claude/tests/test_analyze_upgrade_impact.py +34 -0
- package/.claude/tests/test_consolidate_research.py +48 -0
- package/.claude/tests/test_export_contracts.py +43 -0
- package/.claude/tests/test_extract_data_model.py +33 -0
- package/.claude/tests/test_generate_quickstart.py +50 -0
- package/.claude/tests/test_generate_research_tasks.py +52 -0
- package/.claude/tsc-cache/6e64f818-6398-49ca-8623-581a9af85c44/edited-files.log +1 -0
- package/.claude/tsc-cache/795ba6e3-b98a-423b-bab2-51aa62812569/affected-repos.txt +1 -0
- package/.claude/tsc-cache/795ba6e3-b98a-423b-bab2-51aa62812569/edited-files.log +1 -0
- package/.claude/tsc-cache/ae335694-be5a-4ba4-a1a0-b676c09a7906/affected-repos.txt +1 -0
- package/.claude/tsc-cache/ae335694-be5a-4ba4-a1a0-b676c09a7906/edited-files.log +1 -0
- package/CHANGELOG.md +507 -0
- package/LICENSE +21 -0
- package/README.md +534 -0
- package/README.zh-CN.md +530 -0
- package/bin/adapt.js +240 -0
- package/bin/cc-devflow-cli.js +185 -0
- package/bin/cc-devflow.js +78 -0
- package/config/adapters.yml +5 -0
- package/config/schema/adapters.schema.json +44 -0
- package/docs/CLAUDE.md +26 -0
- package/docs/commands/README.md +61 -0
- package/docs/commands/README.zh-CN.md +55 -0
- package/docs/commands/core-roadmap.md +106 -0
- package/docs/commands/core-roadmap.zh-CN.md +102 -0
- package/docs/commands/core-style.md +405 -0
- package/docs/commands/core-style.zh-CN.md +405 -0
- package/docs/commands/flow-init.md +134 -0
- package/docs/commands/flow-init.zh-CN.md +163 -0
- package/docs/commands/flow-new.md +274 -0
- package/docs/commands/flow-new.zh-CN.md +270 -0
- package/docs/guides/getting-started.md +204 -0
- package/docs/guides/getting-started.zh-CN.md +152 -0
- package/lib/adapters/adapter-interface.js +57 -0
- package/lib/adapters/claude-adapter.js +74 -0
- package/lib/adapters/codex-adapter.js +40 -0
- package/lib/adapters/config-validator.js +68 -0
- package/lib/adapters/logger.js +42 -0
- package/lib/adapters/registry.js +153 -0
- package/lib/compiler/CLAUDE.md +92 -0
- package/lib/compiler/__tests__/drift.test.js +215 -0
- package/lib/compiler/__tests__/errors.test.js +184 -0
- package/lib/compiler/__tests__/incremental.test.js +174 -0
- package/lib/compiler/__tests__/integration.test.js +174 -0
- package/lib/compiler/__tests__/manifest.test.js +233 -0
- package/lib/compiler/__tests__/parser.test.js +456 -0
- package/lib/compiler/__tests__/schemas.test.js +301 -0
- package/lib/compiler/__tests__/skills-registry.test.js +125 -0
- package/lib/compiler/__tests__/transformer.test.js +286 -0
- package/lib/compiler/emitters/antigravity-emitter.js +171 -0
- package/lib/compiler/emitters/base-emitter.js +73 -0
- package/lib/compiler/emitters/codex-emitter.js +52 -0
- package/lib/compiler/emitters/cursor-emitter.js +31 -0
- package/lib/compiler/emitters/index.js +50 -0
- package/lib/compiler/emitters/qwen-emitter.js +39 -0
- package/lib/compiler/errors.js +119 -0
- package/lib/compiler/index.js +256 -0
- package/lib/compiler/manifest.js +242 -0
- package/lib/compiler/parser.js +258 -0
- package/lib/compiler/platforms.js +113 -0
- package/lib/compiler/resource-copier.js +320 -0
- package/lib/compiler/rules-emitters/__tests__/antigravity-rules-emitter.test.js +191 -0
- package/lib/compiler/rules-emitters/__tests__/codex-rules-emitter.test.js +109 -0
- package/lib/compiler/rules-emitters/__tests__/cursor-rules-emitter.test.js +123 -0
- package/lib/compiler/rules-emitters/__tests__/qwen-rules-emitter.test.js +123 -0
- package/lib/compiler/rules-emitters/antigravity-rules-emitter.js +253 -0
- package/lib/compiler/rules-emitters/base-rules-emitter.js +83 -0
- package/lib/compiler/rules-emitters/codex-rules-emitter.js +116 -0
- package/lib/compiler/rules-emitters/cursor-rules-emitter.js +98 -0
- package/lib/compiler/rules-emitters/index.js +71 -0
- package/lib/compiler/rules-emitters/qwen-rules-emitter.js +70 -0
- package/lib/compiler/schemas.js +144 -0
- package/lib/compiler/skills-registry.js +225 -0
- package/lib/compiler/transformer.js +236 -0
- package/package.json +50 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
usage() {
|
|
6
|
+
cat <<'USAGE'
|
|
7
|
+
Usage: scripts/bash/run-problem-analysis.sh --input "<symptom>"
|
|
8
|
+
|
|
9
|
+
Generates a placeholder problem analysis report in analysis/problem-<timestamp>.md.
|
|
10
|
+
USAGE
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
INPUT=""
|
|
14
|
+
|
|
15
|
+
while [[ $# -gt 0 ]]; do
|
|
16
|
+
case "$1" in
|
|
17
|
+
--input)
|
|
18
|
+
shift
|
|
19
|
+
INPUT="${1:-}"
|
|
20
|
+
;;
|
|
21
|
+
-h|--help)
|
|
22
|
+
usage
|
|
23
|
+
exit 0
|
|
24
|
+
;;
|
|
25
|
+
*)
|
|
26
|
+
echo "Unknown argument: $1" >&2
|
|
27
|
+
usage
|
|
28
|
+
exit 1
|
|
29
|
+
;;
|
|
30
|
+
esac
|
|
31
|
+
shift
|
|
32
|
+
done
|
|
33
|
+
|
|
34
|
+
if [[ -z "$INPUT" ]]; then
|
|
35
|
+
echo "Error: --input payload required." >&2
|
|
36
|
+
usage
|
|
37
|
+
exit 1
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
ANALYSIS_DIR="analysis"
|
|
41
|
+
mkdir -p "$ANALYSIS_DIR"
|
|
42
|
+
timestamp="$(date -u +"%Y%m%d-%H%M%S")"
|
|
43
|
+
report="$ANALYSIS_DIR/problem-${timestamp}.md"
|
|
44
|
+
|
|
45
|
+
cat > "$report" <<EOF
|
|
46
|
+
# Problem Analysis (Placeholder)
|
|
47
|
+
|
|
48
|
+
Input:
|
|
49
|
+
\`\`\`
|
|
50
|
+
$INPUT
|
|
51
|
+
\`\`\`
|
|
52
|
+
|
|
53
|
+
- Affected files:
|
|
54
|
+
- TODO
|
|
55
|
+
- Root cause:
|
|
56
|
+
- TBD
|
|
57
|
+
- Proposed fix:
|
|
58
|
+
- Steps:
|
|
59
|
+
- Tests:
|
|
60
|
+
- Documentation gaps:
|
|
61
|
+
- TODO
|
|
62
|
+
- Open questions:
|
|
63
|
+
- TODO
|
|
64
|
+
|
|
65
|
+
Please refine this template with the actual diagnostic results.
|
|
66
|
+
EOF
|
|
67
|
+
|
|
68
|
+
echo "Problem analysis report generated at $report"
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# Setup EPIC and TASKS structure for cc-devflow
|
|
4
|
+
#
|
|
5
|
+
# This script prepares the requirement directory for Epic and Tasks generation.
|
|
6
|
+
# Based on spec-kit's setup-plan.sh design.
|
|
7
|
+
#
|
|
8
|
+
# Usage: ./setup-epic.sh [OPTIONS]
|
|
9
|
+
#
|
|
10
|
+
# OPTIONS:
|
|
11
|
+
# --json Output in JSON format
|
|
12
|
+
# --help, -h Show help message
|
|
13
|
+
#
|
|
14
|
+
# OUTPUTS:
|
|
15
|
+
# JSON mode: {"REQ_ID":"...", "PRD_FILE":"...", "EPIC_FILE":"...", "TASKS_FILE":"..."}
|
|
16
|
+
# Text mode: REQ_ID: ... \n PRD_FILE: ... \n EPIC_FILE: ... \n TASKS_FILE: ...
|
|
17
|
+
|
|
18
|
+
set -e
|
|
19
|
+
|
|
20
|
+
# Parse command line arguments
|
|
21
|
+
JSON_MODE=false
|
|
22
|
+
|
|
23
|
+
for arg in "$@"; do
|
|
24
|
+
case "$arg" in
|
|
25
|
+
--json)
|
|
26
|
+
JSON_MODE=true
|
|
27
|
+
;;
|
|
28
|
+
--help|-h)
|
|
29
|
+
cat << 'EOF'
|
|
30
|
+
Usage: setup-epic.sh [OPTIONS]
|
|
31
|
+
|
|
32
|
+
Setup EPIC and TASKS structure for cc-devflow requirement.
|
|
33
|
+
|
|
34
|
+
OPTIONS:
|
|
35
|
+
--json Output results in JSON format
|
|
36
|
+
--help, -h Show this help message
|
|
37
|
+
|
|
38
|
+
EXAMPLES:
|
|
39
|
+
# Setup Epic structure (text output)
|
|
40
|
+
./setup-epic.sh
|
|
41
|
+
|
|
42
|
+
# Setup Epic structure (JSON output)
|
|
43
|
+
./setup-epic.sh --json
|
|
44
|
+
|
|
45
|
+
PREREQUISITES:
|
|
46
|
+
- Must be on a feature branch (feature/REQ-XXX-xxx) or
|
|
47
|
+
- Must have DEVFLOW_REQ_ID environment variable set
|
|
48
|
+
- PRD.md must already exist in requirement directory
|
|
49
|
+
|
|
50
|
+
EOF
|
|
51
|
+
exit 0
|
|
52
|
+
;;
|
|
53
|
+
*)
|
|
54
|
+
echo "ERROR: Unknown option '$arg'. Use --help for usage information." >&2
|
|
55
|
+
exit 1
|
|
56
|
+
;;
|
|
57
|
+
esac
|
|
58
|
+
done
|
|
59
|
+
|
|
60
|
+
# Source common functions
|
|
61
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
62
|
+
source "$SCRIPT_DIR/common.sh"
|
|
63
|
+
|
|
64
|
+
# Get all paths and variables from common functions
|
|
65
|
+
eval $(get_requirement_paths)
|
|
66
|
+
|
|
67
|
+
# Validate requirement ID exists
|
|
68
|
+
if [[ -z "$REQ_ID" ]]; then
|
|
69
|
+
echo "ERROR: No requirement ID found" >&2
|
|
70
|
+
echo "Please ensure you are on a feature branch (feature/REQ-XXX-title)" >&2
|
|
71
|
+
echo "Or set DEVFLOW_REQ_ID environment variable" >&2
|
|
72
|
+
exit 1
|
|
73
|
+
fi
|
|
74
|
+
|
|
75
|
+
# Validate requirement ID format
|
|
76
|
+
validate_req_id "$REQ_ID" || exit 1
|
|
77
|
+
|
|
78
|
+
# Ensure the requirement directory exists
|
|
79
|
+
if [[ ! -d "$REQ_DIR" ]]; then
|
|
80
|
+
echo "ERROR: Requirement directory not found: $REQ_DIR" >&2
|
|
81
|
+
echo "Run /flow-init first to create the requirement structure." >&2
|
|
82
|
+
exit 1
|
|
83
|
+
fi
|
|
84
|
+
|
|
85
|
+
# Check if PRD exists (prerequisite)
|
|
86
|
+
if [[ ! -f "$PRD_FILE" ]]; then
|
|
87
|
+
echo "ERROR: PRD.md not found at $PRD_FILE" >&2
|
|
88
|
+
echo "Run prd-writer agent first to create the PRD." >&2
|
|
89
|
+
exit 1
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
# Copy EPIC template if it doesn't exist
|
|
93
|
+
EPIC_TEMPLATE="$REPO_ROOT/.claude/docs/templates/EPIC_TEMPLATE.md"
|
|
94
|
+
if [[ ! -f "$EPIC_FILE" ]]; then
|
|
95
|
+
if [[ -f "$EPIC_TEMPLATE" ]]; then
|
|
96
|
+
cp "$EPIC_TEMPLATE" "$EPIC_FILE"
|
|
97
|
+
if ! $JSON_MODE; then
|
|
98
|
+
echo "Copied EPIC template to $EPIC_FILE" >&2
|
|
99
|
+
fi
|
|
100
|
+
else
|
|
101
|
+
# Create basic EPIC file if template doesn't exist
|
|
102
|
+
cat > "$EPIC_FILE" <<EOF
|
|
103
|
+
# Epic: $REQ_ID
|
|
104
|
+
|
|
105
|
+
**Status**: Draft
|
|
106
|
+
**Created**: $(get_beijing_time_full)
|
|
107
|
+
|
|
108
|
+
## Overview
|
|
109
|
+
|
|
110
|
+
[Epic overview to be filled by planner]
|
|
111
|
+
|
|
112
|
+
## Success Criteria
|
|
113
|
+
|
|
114
|
+
[Success criteria to be filled by planner]
|
|
115
|
+
|
|
116
|
+
## Technical Approach
|
|
117
|
+
|
|
118
|
+
[Technical approach to be filled by planner]
|
|
119
|
+
EOF
|
|
120
|
+
if ! $JSON_MODE; then
|
|
121
|
+
echo "Created basic EPIC file at $EPIC_FILE" >&2
|
|
122
|
+
fi
|
|
123
|
+
fi
|
|
124
|
+
fi
|
|
125
|
+
|
|
126
|
+
# Copy TASKS template if it doesn't exist
|
|
127
|
+
TASKS_TEMPLATE="$REPO_ROOT/.claude/docs/templates/TASKS_TEMPLATE.md"
|
|
128
|
+
TASKS_FILE="$REQ_DIR/TASKS.md"
|
|
129
|
+
|
|
130
|
+
if [[ ! -f "$TASKS_FILE" ]]; then
|
|
131
|
+
if [[ -f "$TASKS_TEMPLATE" ]]; then
|
|
132
|
+
cp "$TASKS_TEMPLATE" "$TASKS_FILE"
|
|
133
|
+
if ! $JSON_MODE; then
|
|
134
|
+
echo "Copied TASKS template to $TASKS_FILE" >&2
|
|
135
|
+
fi
|
|
136
|
+
else
|
|
137
|
+
# Create basic TASKS file if template doesn't exist
|
|
138
|
+
cat > "$TASKS_FILE" <<EOF
|
|
139
|
+
# Tasks: $REQ_ID
|
|
140
|
+
|
|
141
|
+
**Status**: Draft
|
|
142
|
+
**Created**: $(get_beijing_time_full)
|
|
143
|
+
|
|
144
|
+
## Tasks
|
|
145
|
+
|
|
146
|
+
[Tasks to be generated by planner]
|
|
147
|
+
EOF
|
|
148
|
+
if ! $JSON_MODE; then
|
|
149
|
+
echo "Created basic TASKS file at $TASKS_FILE" >&2
|
|
150
|
+
fi
|
|
151
|
+
fi
|
|
152
|
+
fi
|
|
153
|
+
|
|
154
|
+
# Log the setup event
|
|
155
|
+
log_event "$REQ_ID" "Epic and Tasks structure initialized"
|
|
156
|
+
|
|
157
|
+
# Output results
|
|
158
|
+
if $JSON_MODE; then
|
|
159
|
+
printf '{"%s":"%s","%s":"%s","%s":"%s","%s":"%s","%s":"%s","%s":"%s"}\n' \
|
|
160
|
+
"REQ_ID" "$REQ_ID" \
|
|
161
|
+
"REQ_TYPE" "$REQ_TYPE" \
|
|
162
|
+
"REQ_DIR" "$REQ_DIR" \
|
|
163
|
+
"PRD_FILE" "$PRD_FILE" \
|
|
164
|
+
"EPIC_FILE" "$EPIC_FILE" \
|
|
165
|
+
"TASKS_FILE" "$TASKS_FILE"
|
|
166
|
+
else
|
|
167
|
+
echo "REQ_ID: $REQ_ID"
|
|
168
|
+
echo "REQ_TYPE: $REQ_TYPE"
|
|
169
|
+
echo "REQ_DIR: $REQ_DIR"
|
|
170
|
+
echo "PRD_FILE: $PRD_FILE"
|
|
171
|
+
echo "EPIC_FILE: $EPIC_FILE"
|
|
172
|
+
echo "TASKS_FILE: $TASKS_FILE"
|
|
173
|
+
fi
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Sync roadmap progress from requirements orchestration_status.json
|
|
3
|
+
# Updates devflow/ROADMAP.md Implementation Tracking table with:
|
|
4
|
+
# - Mapped REQ-IDs when requirements are created
|
|
5
|
+
# - Current status from orchestration_status
|
|
6
|
+
# - Progress percentage based on completed phases
|
|
7
|
+
# Usage: ./sync-roadmap-progress.sh
|
|
8
|
+
|
|
9
|
+
set -euo pipefail
|
|
10
|
+
|
|
11
|
+
# =============================================================================
|
|
12
|
+
# 获取当前脚本所在目录
|
|
13
|
+
# =============================================================================
|
|
14
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
15
|
+
|
|
16
|
+
# Source common functions
|
|
17
|
+
if [[ -f "$SCRIPT_DIR/common.sh" ]]; then
|
|
18
|
+
source "$SCRIPT_DIR/common.sh"
|
|
19
|
+
fi
|
|
20
|
+
|
|
21
|
+
# =============================================================================
|
|
22
|
+
# Progress Calculation Functions (进度计算函数)
|
|
23
|
+
# =============================================================================
|
|
24
|
+
|
|
25
|
+
# Calculate progress percentage based on completed phases
|
|
26
|
+
# Args: $1 = path to orchestration_status.json
|
|
27
|
+
# Returns: integer percentage (0-100)
|
|
28
|
+
calculate_progress() {
|
|
29
|
+
local status_file="$1"
|
|
30
|
+
|
|
31
|
+
if [[ ! -f "$status_file" ]]; then
|
|
32
|
+
echo "0"
|
|
33
|
+
return
|
|
34
|
+
fi
|
|
35
|
+
|
|
36
|
+
# Read JSON and extract completion flags
|
|
37
|
+
local json=$(cat "$status_file")
|
|
38
|
+
|
|
39
|
+
# Phase completion weights (total = 100%)
|
|
40
|
+
# phase0 (research): 10%
|
|
41
|
+
# prd: 10%
|
|
42
|
+
# ui: 5%
|
|
43
|
+
# tech_design: 10%
|
|
44
|
+
# epic: 10%
|
|
45
|
+
# dev: 30%
|
|
46
|
+
# qa: 15%
|
|
47
|
+
# release: 10%
|
|
48
|
+
# merged: bonus completion
|
|
49
|
+
|
|
50
|
+
local progress=0
|
|
51
|
+
|
|
52
|
+
# Check each phase completion
|
|
53
|
+
if echo "$json" | grep -q '"phase0_complete".*:.*true'; then
|
|
54
|
+
progress=$((progress + 10))
|
|
55
|
+
fi
|
|
56
|
+
|
|
57
|
+
if echo "$json" | grep -q '"prd_complete".*:.*true'; then
|
|
58
|
+
progress=$((progress + 10))
|
|
59
|
+
fi
|
|
60
|
+
|
|
61
|
+
if echo "$json" | grep -q '"ui_complete".*:.*true'; then
|
|
62
|
+
progress=$((progress + 5))
|
|
63
|
+
fi
|
|
64
|
+
|
|
65
|
+
if echo "$json" | grep -q '"tech_design_complete".*:.*true'; then
|
|
66
|
+
progress=$((progress + 10))
|
|
67
|
+
fi
|
|
68
|
+
|
|
69
|
+
if echo "$json" | grep -q '"epic_complete".*:.*true'; then
|
|
70
|
+
progress=$((progress + 10))
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
if echo "$json" | grep -q '"dev_complete".*:.*true'; then
|
|
74
|
+
progress=$((progress + 30))
|
|
75
|
+
fi
|
|
76
|
+
|
|
77
|
+
if echo "$json" | grep -q '"qa_complete".*:.*true'; then
|
|
78
|
+
progress=$((progress + 15))
|
|
79
|
+
fi
|
|
80
|
+
|
|
81
|
+
if echo "$json" | grep -q '"release_complete".*:.*true'; then
|
|
82
|
+
progress=$((progress + 10))
|
|
83
|
+
fi
|
|
84
|
+
|
|
85
|
+
# If merged, consider 100%
|
|
86
|
+
if echo "$json" | grep -q '"status".*:.*"merged"'; then
|
|
87
|
+
progress=100
|
|
88
|
+
fi
|
|
89
|
+
|
|
90
|
+
echo "$progress"
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
# Get status from orchestration_status.json
|
|
94
|
+
# Args: $1 = path to orchestration_status.json
|
|
95
|
+
# Returns: status string
|
|
96
|
+
get_status() {
|
|
97
|
+
local status_file="$1"
|
|
98
|
+
|
|
99
|
+
if [[ ! -f "$status_file" ]]; then
|
|
100
|
+
echo "Planned"
|
|
101
|
+
return
|
|
102
|
+
fi
|
|
103
|
+
|
|
104
|
+
local json=$(cat "$status_file")
|
|
105
|
+
local status=$(echo "$json" | grep -o '"status"[[:space:]]*:[[:space:]]*"[^"]*"' | cut -d'"' -f4)
|
|
106
|
+
|
|
107
|
+
# Map orchestration status to roadmap status
|
|
108
|
+
case "$status" in
|
|
109
|
+
"initialized"|"planning")
|
|
110
|
+
echo "Planned"
|
|
111
|
+
;;
|
|
112
|
+
"in_progress"|"development")
|
|
113
|
+
echo "In Progress"
|
|
114
|
+
;;
|
|
115
|
+
"merged"|"complete")
|
|
116
|
+
echo "Completed"
|
|
117
|
+
;;
|
|
118
|
+
"blocked")
|
|
119
|
+
echo "Blocked"
|
|
120
|
+
;;
|
|
121
|
+
"cancelled")
|
|
122
|
+
echo "Cancelled"
|
|
123
|
+
;;
|
|
124
|
+
*)
|
|
125
|
+
echo "Planned"
|
|
126
|
+
;;
|
|
127
|
+
esac
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
# Get requirement title from orchestration_status.json
|
|
131
|
+
# Args: $1 = path to orchestration_status.json
|
|
132
|
+
# Returns: title string
|
|
133
|
+
get_title() {
|
|
134
|
+
local status_file="$1"
|
|
135
|
+
|
|
136
|
+
if [[ ! -f "$status_file" ]]; then
|
|
137
|
+
echo "-"
|
|
138
|
+
return
|
|
139
|
+
fi
|
|
140
|
+
|
|
141
|
+
local json=$(cat "$status_file")
|
|
142
|
+
local title=$(echo "$json" | grep -o '"title"[[:space:]]*:[[:space:]]*"[^"]*"' | cut -d'"' -f4)
|
|
143
|
+
|
|
144
|
+
if [[ -z "$title" ]]; then
|
|
145
|
+
echo "-"
|
|
146
|
+
else
|
|
147
|
+
echo "$title"
|
|
148
|
+
fi
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
# =============================================================================
|
|
152
|
+
# Roadmap Update Functions (路线图更新函数)
|
|
153
|
+
# =============================================================================
|
|
154
|
+
|
|
155
|
+
# Scan all requirements and build progress map
|
|
156
|
+
# Returns: associative array of REQ-ID -> progress data
|
|
157
|
+
scan_requirements() {
|
|
158
|
+
local repo_root=$(get_repo_root)
|
|
159
|
+
local requirements_dir="$repo_root/devflow/requirements"
|
|
160
|
+
|
|
161
|
+
if [[ ! -d "$requirements_dir" ]]; then
|
|
162
|
+
echo "ERROR: Requirements directory not found: $requirements_dir" >&2
|
|
163
|
+
return 1
|
|
164
|
+
fi
|
|
165
|
+
|
|
166
|
+
# Output format: REQ-ID|Title|Status|Progress
|
|
167
|
+
for req_dir in "$requirements_dir"/REQ-*; do
|
|
168
|
+
if [[ -d "$req_dir" ]]; then
|
|
169
|
+
local req_id=$(basename "$req_dir")
|
|
170
|
+
local status_file="$req_dir/orchestration_status.json"
|
|
171
|
+
|
|
172
|
+
local title=$(get_title "$status_file")
|
|
173
|
+
local status=$(get_status "$status_file")
|
|
174
|
+
local progress=$(calculate_progress "$status_file")
|
|
175
|
+
|
|
176
|
+
echo "$req_id|$title|$status|$progress"
|
|
177
|
+
fi
|
|
178
|
+
done
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
# Update ROADMAP.md Implementation Tracking table
|
|
182
|
+
# Args: $1 = path to ROADMAP.md
|
|
183
|
+
update_roadmap() {
|
|
184
|
+
local roadmap_file="$1"
|
|
185
|
+
|
|
186
|
+
if [[ ! -f "$roadmap_file" ]]; then
|
|
187
|
+
echo "ERROR: ROADMAP.md not found: $roadmap_file" >&2
|
|
188
|
+
return 1
|
|
189
|
+
fi
|
|
190
|
+
|
|
191
|
+
# Create temporary file for updated roadmap
|
|
192
|
+
local temp_file="${roadmap_file}.tmp"
|
|
193
|
+
cp "$roadmap_file" "$temp_file"
|
|
194
|
+
|
|
195
|
+
# Get all requirement progress data
|
|
196
|
+
local req_data=$(scan_requirements)
|
|
197
|
+
|
|
198
|
+
# For each requirement, try to find corresponding RM-ID in roadmap
|
|
199
|
+
# and update the table row
|
|
200
|
+
|
|
201
|
+
while IFS='|' read -r req_id title status progress; do
|
|
202
|
+
# Look for this REQ-ID in the Implementation Tracking table
|
|
203
|
+
# Format: | RM-XXX | Feature | Derived From | Status | Mapped REQ | Progress |
|
|
204
|
+
|
|
205
|
+
# Find if this REQ-ID is already mapped to an RM-ID
|
|
206
|
+
local rm_id=$(grep -E "\\| RM-[0-9]+ \\|.*\\| $req_id \\|" "$temp_file" | grep -o "RM-[0-9]*" | head -1)
|
|
207
|
+
|
|
208
|
+
if [[ -n "$rm_id" ]]; then
|
|
209
|
+
# Update existing mapping
|
|
210
|
+
# Find the line and update Status and Progress columns
|
|
211
|
+
|
|
212
|
+
# Use sed to update the line
|
|
213
|
+
# Match pattern: | RM-XXX | ... | ... | OLD_STATUS | REQ-XXX | OLD_PROGRESS |
|
|
214
|
+
# Replace with: | RM-XXX | ... | ... | NEW_STATUS | REQ-XXX | NEW_PROGRESS% |
|
|
215
|
+
|
|
216
|
+
sed -i.bak -E "/\\| $rm_id \\|/s/\\| [^|]+ \\| $req_id \\| [^|]+ \\|/| $status | $req_id | ${progress}% |/g" "$temp_file"
|
|
217
|
+
else
|
|
218
|
+
# Check if there's an RM-ID row with "-" as Mapped REQ that matches derived_from
|
|
219
|
+
# This is a new requirement that should be linked
|
|
220
|
+
|
|
221
|
+
# Try to find RM-ID row with "Derived From" matching this REQ-ID and Mapped REQ = "-"
|
|
222
|
+
local potential_rm=$(grep -E "\\| RM-[0-9]+ \\|.*\\| $req_id \\|.*\\| - \\|" "$temp_file" | grep -o "RM-[0-9]*" | head -1)
|
|
223
|
+
|
|
224
|
+
if [[ -n "$potential_rm" ]]; then
|
|
225
|
+
# Update this RM-ID row to link to this REQ-ID
|
|
226
|
+
sed -i.bak -E "/\\| $potential_rm \\|/s/\\| [^|]+ \\| - \\| [^|]+ \\|/| $status | $req_id | ${progress}% |/g" "$temp_file"
|
|
227
|
+
fi
|
|
228
|
+
fi
|
|
229
|
+
done <<< "$req_data"
|
|
230
|
+
|
|
231
|
+
# Replace original file with updated version
|
|
232
|
+
mv "$temp_file" "$roadmap_file"
|
|
233
|
+
|
|
234
|
+
# Clean up backup file
|
|
235
|
+
# 修复: sed -i.bak 对 temp_file 操作会创建 temp_file.bak,而不是 roadmap_file.bak
|
|
236
|
+
rm -f "${temp_file}.bak"
|
|
237
|
+
|
|
238
|
+
echo "✅ Updated ROADMAP.md Implementation Tracking table"
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
# =============================================================================
|
|
242
|
+
# Main Function (主函数)
|
|
243
|
+
# =============================================================================
|
|
244
|
+
|
|
245
|
+
main() {
|
|
246
|
+
local repo_root=$(get_repo_root)
|
|
247
|
+
local roadmap_file="$repo_root/devflow/ROADMAP.md"
|
|
248
|
+
|
|
249
|
+
echo "==================================================================="
|
|
250
|
+
echo "Syncing Roadmap Progress"
|
|
251
|
+
echo "==================================================================="
|
|
252
|
+
echo ""
|
|
253
|
+
|
|
254
|
+
# Check if ROADMAP.md exists
|
|
255
|
+
if [[ ! -f "$roadmap_file" ]]; then
|
|
256
|
+
echo "⚠️ ROADMAP.md not found at: $roadmap_file"
|
|
257
|
+
echo ""
|
|
258
|
+
echo "Please run /core-roadmap to create a roadmap first."
|
|
259
|
+
exit 0
|
|
260
|
+
fi
|
|
261
|
+
|
|
262
|
+
echo "📊 Scanning requirements for progress data..."
|
|
263
|
+
echo ""
|
|
264
|
+
|
|
265
|
+
# Display current requirements
|
|
266
|
+
local req_data=$(scan_requirements)
|
|
267
|
+
|
|
268
|
+
if [[ -z "$req_data" ]]; then
|
|
269
|
+
echo "⚠️ No requirements found in devflow/requirements/"
|
|
270
|
+
exit 0
|
|
271
|
+
fi
|
|
272
|
+
|
|
273
|
+
echo "Found requirements:"
|
|
274
|
+
echo ""
|
|
275
|
+
printf "%-12s %-50s %-15s %-10s\n" "REQ-ID" "Title" "Status" "Progress"
|
|
276
|
+
echo "------------------------------------------------------------------------------------"
|
|
277
|
+
|
|
278
|
+
while IFS='|' read -r req_id title status progress; do
|
|
279
|
+
printf "%-12s %-50s %-15s %-10s\n" "$req_id" "$title" "$status" "${progress}%"
|
|
280
|
+
done <<< "$req_data"
|
|
281
|
+
|
|
282
|
+
echo ""
|
|
283
|
+
echo "📝 Updating ROADMAP.md..."
|
|
284
|
+
echo ""
|
|
285
|
+
|
|
286
|
+
# Update roadmap
|
|
287
|
+
update_roadmap "$roadmap_file"
|
|
288
|
+
|
|
289
|
+
echo ""
|
|
290
|
+
echo "✅ Roadmap sync completed!"
|
|
291
|
+
echo ""
|
|
292
|
+
echo "Updated: $roadmap_file"
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
# =============================================================================
|
|
296
|
+
# Script Entry Point (脚本入口)
|
|
297
|
+
# =============================================================================
|
|
298
|
+
|
|
299
|
+
# Run main function
|
|
300
|
+
main "$@"
|