@educa-corp/sdd-framework 0.4.2 → 0.6.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.
Files changed (149) hide show
  1. package/bin/build.js +113 -19
  2. package/bin/gate-trace.js +464 -0
  3. package/bin/index.js +418 -146
  4. package/bin/lint-trace.js +602 -0
  5. package/bin/self-check.js +499 -6
  6. package/bin/trace-schema.json +1449 -692
  7. package/commands/debug.md +123 -510
  8. package/commands/debug.tmpl +3 -0
  9. package/commands/define-product.md +86 -509
  10. package/commands/dev-gen-test.md +120 -516
  11. package/commands/dev-run-test.md +120 -516
  12. package/commands/dev-smoke-test.md +86 -509
  13. package/commands/extend-prd.md +486 -0
  14. package/commands/extend-prd.tmpl +273 -0
  15. package/commands/fix-bug.md +152 -515
  16. package/commands/generate-architecture.md +94 -514
  17. package/commands/generate-architecture.tmpl +3 -0
  18. package/commands/generate-bdd.md +138 -519
  19. package/commands/generate-bdd.tmpl +18 -3
  20. package/commands/generate-code.md +156 -523
  21. package/commands/generate-code.tmpl +36 -7
  22. package/commands/generate-design-spec.md +86 -509
  23. package/commands/generate-prd.md +114 -509
  24. package/commands/generate-prd.tmpl +28 -0
  25. package/commands/generate-spec-manifest.md +86 -509
  26. package/commands/generate-tech-docs.md +86 -509
  27. package/commands/learn.md +172 -495
  28. package/commands/learn.tmpl +70 -3
  29. package/commands/map-testids.md +86 -509
  30. package/commands/propose-scenario.md +136 -508
  31. package/commands/propose-scenario.tmpl +52 -1
  32. package/commands/qc-analyze.md +86 -509
  33. package/commands/qc-design-test.md +87 -509
  34. package/commands/qc-design-test.tmpl +1 -0
  35. package/commands/qc-plan.md +86 -509
  36. package/commands/qc-report.md +86 -509
  37. package/commands/qc-review.md +86 -509
  38. package/commands/qc-run-test.md +133 -517
  39. package/commands/qc-run-test.tmpl +13 -1
  40. package/commands/refine-prd.md +99 -519
  41. package/commands/refine-prd.tmpl +3 -0
  42. package/commands/report-bug.md +86 -509
  43. package/commands/review-code.md +127 -513
  44. package/commands/review-code.tmpl +7 -3
  45. package/commands/review-context.md +96 -515
  46. package/commands/review-context.tmpl +6 -2
  47. package/commands/review-tech-docs.md +90 -510
  48. package/commands/review-tech-docs.tmpl +3 -0
  49. package/commands/setup-ai-first.md +166 -137
  50. package/commands/setup-ai-first.tmpl +72 -0
  51. package/commands/sync.md +86 -118
  52. package/commands/sync.tmpl +84 -16
  53. package/commands/update-framework.md +16 -102
  54. package/commands/update-framework.tmpl +14 -0
  55. package/commands/validate-traces.md +458 -531
  56. package/commands/validate-traces.tmpl +381 -31
  57. package/core/FRAMEWORK_VERSION +1 -1
  58. package/core/README.md +20 -0
  59. package/core/commands/debug.md +123 -510
  60. package/core/commands/define-product.md +86 -509
  61. package/core/commands/dev-gen-test.md +120 -516
  62. package/core/commands/dev-run-test.md +120 -516
  63. package/core/commands/dev-smoke-test.md +86 -509
  64. package/core/commands/extend-prd.md +486 -0
  65. package/core/commands/fix-bug.md +152 -515
  66. package/core/commands/generate-architecture.md +94 -514
  67. package/core/commands/generate-bdd.md +138 -519
  68. package/core/commands/generate-code.md +156 -523
  69. package/core/commands/generate-design-spec.md +86 -509
  70. package/core/commands/generate-prd.md +114 -509
  71. package/core/commands/generate-spec-manifest.md +86 -509
  72. package/core/commands/generate-tech-docs.md +86 -509
  73. package/core/commands/learn.md +172 -495
  74. package/core/commands/map-testids.md +86 -509
  75. package/core/commands/propose-scenario.md +136 -508
  76. package/core/commands/qc-analyze.md +86 -509
  77. package/core/commands/qc-design-test.md +87 -509
  78. package/core/commands/qc-plan.md +86 -509
  79. package/core/commands/qc-report.md +86 -509
  80. package/core/commands/qc-review.md +86 -509
  81. package/core/commands/qc-run-test.md +133 -517
  82. package/core/commands/refine-prd.md +99 -519
  83. package/core/commands/report-bug.md +86 -509
  84. package/core/commands/review-code.md +127 -513
  85. package/core/commands/review-context.md +96 -515
  86. package/core/commands/review-tech-docs.md +90 -510
  87. package/core/commands/setup-ai-first.md +166 -137
  88. package/core/commands/sync.md +86 -118
  89. package/core/commands/update-framework.md +16 -102
  90. package/core/commands/validate-traces.md +458 -531
  91. package/core/hooks/data-guard.js +174 -83
  92. package/core/hooks/settings.json +2 -1
  93. package/core/rules/workflow.md +48 -4
  94. package/core/steps/capture-lesson.md +34 -1
  95. package/core/steps/context-loader.md +24 -3
  96. package/core/steps/gate.md +92 -35
  97. package/core/steps/report-footer.md +26 -2
  98. package/core/steps/trace-mirror.md +34 -7
  99. package/core/templates/README.md +24 -1
  100. package/core/templates/ci/trace-gate.yml +146 -0
  101. package/core/templates/feature.template +1 -1
  102. package/core/templates/hooks/pre-push +61 -0
  103. package/docs/01-getting-started/installation.md +18 -1
  104. package/docs/01-getting-started/what-is-sdd.md +4 -2
  105. package/docs/02-concepts/architecture.md +48 -5
  106. package/docs/02-concepts/pipeline-steps/02-specification.md +39 -3
  107. package/docs/02-concepts/pipeline-steps/04-bdd.md +24 -2
  108. package/docs/02-concepts/pipeline-steps/05-tech-docs.md +18 -1
  109. package/docs/02-concepts/pipeline-steps/06-code.md +35 -4
  110. package/docs/02-concepts/pipeline-steps/09-validate-traces.md +137 -12
  111. package/docs/02-concepts/pipeline-steps/10-feedback-loop.md +59 -3
  112. package/docs/02-concepts/roles-and-hitl.md +1 -1
  113. package/docs/02-concepts/traceability.md +183 -117
  114. package/docs/03-guides/architect.md +63 -0
  115. package/docs/03-guides/developer.md +20 -4
  116. package/docs/03-guides/product-owner.md +72 -68
  117. package/docs/03-guides/tester-qa.md +81 -70
  118. package/docs/04-reference/commands.md +134 -105
  119. package/docs/04-reference/configuration.md +146 -94
  120. package/docs/04-reference/model-selection.md +32 -19
  121. package/docs/04-reference/trace-schema.md +26 -9
  122. package/docs/explain/02-generate-prd.md +80 -78
  123. package/docs/explain/02b-extend-prd.md +125 -0
  124. package/docs/explain/03-refine-prd.md +86 -86
  125. package/docs/explain/04-review-context.md +18 -1
  126. package/docs/explain/06-generate-bdd.md +23 -0
  127. package/docs/explain/08-review-tech-docs.md +20 -5
  128. package/docs/explain/10-review-code.md +36 -2
  129. package/docs/explain/19-qc-run-test.md +87 -67
  130. package/docs/explain/21-validate-traces.md +75 -68
  131. package/docs/explain/23-fix-bug.md +19 -3
  132. package/docs/explain/26-propose-scenario.md +70 -63
  133. package/docs/explain/27-learn.md +5 -3
  134. package/docs/explain/README.md +135 -134
  135. package/hooks/data-guard.js +174 -83
  136. package/hooks/settings.json +2 -1
  137. package/package.json +53 -50
  138. package/rules/workflow.md +48 -4
  139. package/steps/capture-lesson.md +34 -1
  140. package/steps/context-loader.md +24 -3
  141. package/steps/gate.md +92 -35
  142. package/steps/report-footer.md +26 -2
  143. package/steps/trace-mirror.md +34 -7
  144. package/templates/README.md +24 -1
  145. package/templates/ci/trace-gate.yml +146 -0
  146. package/templates/feature.template +1 -1
  147. package/templates/hooks/pre-push +61 -0
  148. package/scripts/init.sh +0 -49
  149. package/scripts/upgrade.sh +0 -94
@@ -0,0 +1,146 @@
1
+ # ─────────────────────────────────────────────────────────────────────────────
2
+ # SDD Framework — Trace Gate (GitHub Actions)
3
+ #
4
+ # COPY file này vào .github/workflows/ của project. Nó KHÔNG tự chạy từ
5
+ # .agent/templates/ — mọi thứ trong .agent/ là bản sinh ra, bị ghi đè mỗi lần
6
+ # /update-framework.
7
+ #
8
+ # VÌ SAO CẦN (GAPS-v3 G39): framework phát hiện được một lớp lỗi mà build xanh +
9
+ # test từng-UC xanh KHÔNG thấy — luồng ghép chạy vào hàm rỗng (SEAM_UNWIRED,
10
+ # STUB_UNRESOLVED), hoặc code trỏ vào scenario đã bị xoá (ORPHANED, TRACE_ORPHAN).
11
+ # Nhưng trước G39 việc phát hiện đó phụ thuộc vào có người TỰ NGUYỆN chạy
12
+ # /validate-traces trong Claude Code rồi đọc report bằng mắt. Cái gì không chặn
13
+ # thì sau sprint thứ ba không ai làm. Đây là chỗ nó chặn.
14
+ #
15
+ # GIỚI HẠN — đọc trước khi tin:
16
+ # Job này chứng minh "report khớp SỔ, và sổ không có cờ 🔴".
17
+ # Nó KHÔNG chứng minh "sổ khớp CODE" — việc đó cần quét tag trong source, đọc
18
+ # .feature, so version, tức cần /validate-traces (một lệnh LLM, không chạy được
19
+ # trong CI thường). Nên nó bắt ca phổ biến "quên chạy lại /validate-traces",
20
+ # nhưng KHÔNG bắt ca "sửa code mà không đụng sổ".
21
+ # Muốn bịt nốt: xem job `require-fresh-audit` ở cuối file.
22
+ # ─────────────────────────────────────────────────────────────────────────────
23
+
24
+ name: Trace Gate
25
+
26
+ on:
27
+ pull_request:
28
+ push:
29
+ branches: [main, master, develop]
30
+
31
+ jobs:
32
+ trace-gate:
33
+ runs-on: ubuntu-latest
34
+ steps:
35
+ - uses: actions/checkout@v4
36
+ with:
37
+ # Cần lịch sử để job require-fresh-audit so được diff. Bỏ nếu không dùng job đó.
38
+ fetch-depth: 0
39
+ # Spec/trace nằm trong submodule (umbrella + spec_source)? Bỏ comment:
40
+ # submodules: recursive
41
+
42
+ - uses: actions/setup-node@v4
43
+ with:
44
+ node-version: '20'
45
+
46
+ # ── 1. Cấu trúc sổ ───────────────────────────────────────────────────────
47
+ # Sổ trace 24 cột do LLM ghi bằng tay. Một dấu tab thiếu dồn mọi ô sang trái
48
+ # và ô `status` nhận một ngày tháng — trước G38 không gì báo. Bước này chặn.
49
+ # Cũng bắt marker conflict git lọt vào sổ (T7) và sổ thiếu luật merge (T10).
50
+ - name: Lint sổ trace
51
+ run: npx -y @educa-corp/sdd-framework@latest --lint-trace
52
+
53
+ # ── 2. Cổng chặn PR ──────────────────────────────────────────────────────
54
+ # --gate-trace tự chạy lại lint ở tầng G1, nên bước 1 ở trên là để có log
55
+ # riêng dễ đọc khi đỏ. Muốn gọn thì bỏ bước 1 và chỉ giữ bước này.
56
+ - name: Trace gate (cờ 🔴 chặn PR)
57
+ run: npx -y @educa-corp/sdd-framework@latest --gate-trace
58
+
59
+ # ── 3. (tuỳ chọn) Đưa kết quả vào PR summary ─────────────────────────────
60
+ - name: Ghi kết quả vào job summary
61
+ if: always()
62
+ run: |
63
+ npx -y @educa-corp/sdd-framework@latest --gate-trace --json --warn-only \
64
+ > gate.json || true
65
+ {
66
+ echo '## Trace Gate'
67
+ echo '```json'
68
+ cat gate.json
69
+ echo '```'
70
+ } >> "$GITHUB_STEP_SUMMARY"
71
+
72
+ # ───────────────────────────────────────────────────────────────────────────
73
+ # Ép audit phải TƯƠI khi thứ report đang KHẲNG ĐỊNH bị đổi.
74
+ #
75
+ # Bịt cái lỗ mà trace-gate không bịt được: gate chứng minh "report khớp SỔ",
76
+ # không chứng minh "sổ khớp CODE" — việc đó cần /validate-traces, một lệnh LLM
77
+ # không chạy được ở đây. Nên job này dùng một PROXY: không verify được thì ĐÒI
78
+ # BẰNG CHỨNG có người vừa verify.
79
+ #
80
+ # ĐO BẰNG TAG, KHÔNG BẰNG `src/**`:
81
+ # Framework có luật boundary-only tagging — chỉ Controller/Handler/Middleware/
82
+ # Steps mang tag @trace; Entity/Repository/DTO/Interface/Base KHÔNG. Nên câu
83
+ # hỏi "PR có sửa src/ không?" chặn cả PR chỉ thêm một field vào DTO — một file
84
+ # không mang lời khẳng định trace nào. Cái gì báo oan thì bị tắt, rồi mất luôn
85
+ # phần thật sự cần chặn.
86
+ # Câu hỏi đúng: "PR có chạm dòng nào mang tag mà report đang khẳng định không?"
87
+ #
88
+ # sửa log trong Controller → cho qua (bản `src/**` cũ: chặn oan)
89
+ # thêm field vào DTO → cho qua (bản cũ: chặn oan)
90
+ # thêm method + @implements → CHẶN
91
+ # lấp một @trace.stub → CHẶN
92
+ #
93
+ # KHÔNG cần sửa gì theo layout project — tag là tag, ở đâu cũng vậy.
94
+ #
95
+ # BẢY TAG dưới đây là NGUỒN của đúng 4 cờ chặn PR. Chúng được khai trong
96
+ # bin/trace-schema.json → gate.audit_invalidating_tags, và self-check R10 fail
97
+ # build nếu file này không nhắc đủ — tag đổi tên mà đây không biết thì grep
98
+ # không khớp gì, job LUÔN XANH, và cổng mù trong im lặng.
99
+ #
100
+ # GIỚI HẠN ĐÃ BIẾT: đổi tên class (AuthService → AuthenticationService) không
101
+ # chạm dòng tag ⇒ job này bỏ lọt, dù cột implemented_by giờ trỏ vào tên không
102
+ # còn. Chấp nhận có chủ ý: ca đó ít gặp và KHÔNG im lặng (/validate-traces lần
103
+ # sau báo ngay), còn báo oan thì xảy ra mỗi ngày.
104
+ # Muốn chặt hơn (bắt cả rename, giá là chặn cả việc sửa log trong Controller):
105
+ # đổi bước dưới thành — lấy danh sách file đã đổi, rồi `grep -l` bảy tag đó
106
+ # TRÊN NỘI DUNG FILE thay vì trên diff.
107
+ # ───────────────────────────────────────────────────────────────────────────
108
+ require-fresh-audit:
109
+ if: github.event_name == 'pull_request'
110
+ runs-on: ubuntu-latest
111
+ steps:
112
+ - uses: actions/checkout@v4
113
+ with: { fetch-depth: 0 }
114
+
115
+ - name: Đổi thứ report khẳng định thì audit phải đổi theo
116
+ shell: bash
117
+ run: |
118
+ BASE="origin/${{ github.base_ref }}"
119
+
120
+ # 7 tag sinh ra 4 cờ chặn PR — khai ở bin/trace-schema.json,
121
+ # gate.audit_invalidating_tags (self-check R10 canh danh sách này khớp).
122
+ TAGS='@trace\.(implements|verifies|seam_port|seam_pending|stub|stub_owner|stub_for)'
123
+
124
+ # Chạm dòng mang tag = report có thể đã hết đúng. -U0 để chỉ lấy dòng thật đổi.
125
+ touched=$(git diff -U0 "$BASE"...HEAD | grep -E "^[+-].*${TAGS}" | head -5 || true)
126
+ audit=$(git diff --name-only "$BASE"...HEAD | grep -E 'trace-report\.json$' | head -1 || true)
127
+
128
+ if [ -n "$touched" ] && [ -z "$audit" ]; then
129
+ echo "::error::PR đổi tag trace nhưng không kèm trace-report.json được sinh lại."
130
+ echo ""
131
+ echo "Những dòng này đã đổi:"
132
+ echo "$touched" | sed 's/^/ /'
133
+ echo ""
134
+ echo "Trace gate chỉ chứng minh 'report khớp SỔ'. Tag vừa đổi mà chưa audit lại"
135
+ echo "thì mọi cờ 🔴 trong report nói về trạng thái TRƯỚC khi bạn sửa."
136
+ echo ""
137
+ echo "Chạy trong Claude Code: /validate-traces"
138
+ echo "Rồi commit: {trace_dir}/trace-report.json + *.tsv"
139
+ exit 1
140
+ fi
141
+
142
+ if [ -n "$touched" ]; then
143
+ echo "✅ Tag trace có đổi, và audit đã được sinh lại cùng PR."
144
+ else
145
+ echo "✅ PR không chạm tag nào mà report đang khẳng định — audit vẫn còn đúng."
146
+ fi
@@ -4,7 +4,7 @@
4
4
  # @trace.revision: 1 ← field tĩnh; version theo dõi bằng @trace.bdd_version
5
5
  # @trace.domain: <domain>
6
6
  # @trace.platform: {active_platform — web | app | system} ← BẮT BUỘC mọi mode; phải khớp segment bdd/{platform}/ của path
7
- # @trace.service: {active_service — bỏ trong spec repo mode}
7
+ # @trace.service: {active_service — BẮT BUỘC mọi mode. "—" ở single-service/spec repo mode; "multi" nếu chưa chốt; "unresolved" nếu routing sai. Nguồn của cột TSV `service` — trace gộp không tách theo service nên đây là chỗ DUY NHẤT mang thông tin sở hữu}
8
8
  # @trace.module: {active_module trong umbrella mode; "unknown" trong spec repo mode}
9
9
  # @trace.status: draft
10
10
  # @trace.author: AI-generated
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env sh
2
+ # ─────────────────────────────────────────────────────────────────────────────
3
+ # SDD Framework — git pre-push hook
4
+ #
5
+ # CÀI (từ gốc project):
6
+ # cp .agent/templates/hooks/pre-push .git/hooks/pre-push
7
+ # chmod +x .git/hooks/pre-push
8
+ #
9
+ # Trên Windows: Git for Windows chạy hook bằng sh nên file này dùng được như vậy.
10
+ #
11
+ # VÌ SAO CÓ HOOK NÀY khi đã có CI (GAPS-v3 G39/G40): nó chặn ở chỗ RẺ NHẤT.
12
+ # Cụ thể là T7 — marker conflict git (`<<<<<<< HEAD`) lọt vào sổ trace. Một khi
13
+ # thứ đó vào nhánh chung thì mọi người kéo về đều có sổ hỏng, và sổ trace là dữ
14
+ # liệu KHÔNG dựng lại được. Bắt trước lúc push tốn 2 giây; bắt ở CI thì đã muộn
15
+ # một vòng, bắt bằng mắt thì thường là ba tuần sau.
16
+ #
17
+ # CỐ Ý CHỈ LINT, KHÔNG GATE:
18
+ # --lint-trace = cấu trúc sổ. Nhanh, offline được sau lần đầu, và một lỗi ở đây
19
+ # LUÔN là lỗi thật (tab lệch, marker conflict, enum sai).
20
+ # --gate-trace = cờ 🔴. Cần trace-report.json còn tươi, mà giữa lúc làm việc thì
21
+ # nó thường chưa tươi — đỏ liên tục ⇒ người ta gõ --no-verify ⇒
22
+ # mất luôn cả phần lint. Cờ 🔴 để CI chặn.
23
+ #
24
+ # Bỏ qua một lần (dùng có ý thức, đừng thành phản xạ): git push --no-verify
25
+ # ─────────────────────────────────────────────────────────────────────────────
26
+
27
+ # Không có node thì im lặng cho qua — hook không được làm người ta không push được
28
+ # vì lý do không liên quan tới việc họ đang làm.
29
+ command -v node >/dev/null 2>&1 || exit 0
30
+
31
+ # Không có sổ trace thì không có gì để kiểm (project chưa chạy /generate-bdd lần nào).
32
+ # Sửa đường dẫn nếu trace_dir của project khác (vd ../.trace, hay {spec_source}/.trace).
33
+ TRACE_DIR=".trace"
34
+ [ -d "$TRACE_DIR" ] || exit 0
35
+
36
+ echo "→ Lint sổ trace trước khi push ..."
37
+
38
+ if npx -y @educa-corp/sdd-framework@latest --lint-trace --trace "$TRACE_DIR"; then
39
+ exit 0
40
+ fi
41
+
42
+ cat <<'MSG'
43
+
44
+ ──────────────────────────────────────────────────────────────────────
45
+ 🔴 PUSH BỊ CHẶN — sổ trace hỏng cấu trúc.
46
+
47
+ Sổ trace là dữ liệu KHÔNG regenerate được. Đẩy một sổ hỏng lên nhánh
48
+ chung thì mọi người kéo về đều nhận bản hỏng.
49
+
50
+ Thường gặp nhất — marker conflict git chưa giải (T7):
51
+ 1. Mở file lint vừa nêu, xoá 3 dòng <<<<<<< ======= >>>>>>>
52
+ 2. GIỮ CẢ HAI BÊN, đừng chọn một bên (mất row là mất vĩnh viễn)
53
+ 3. npx @educa-corp/sdd-framework --lint-trace # xác nhận sạch
54
+ 4. /validate-traces trong Claude Code # reconcile row trùng
55
+
56
+ Playbook đầy đủ: docs/02-concepts/traceability.md
57
+ Bỏ qua một lần: git push --no-verify
58
+ ──────────────────────────────────────────────────────────────────────
59
+
60
+ MSG
61
+ exit 1
package/scripts/init.sh DELETED
@@ -1,49 +0,0 @@
1
- #!/usr/bin/env bash
2
- # init.sh — First-time setup of SDD Framework framework in a consumer project.
3
- #
4
- # Usage:
5
- # bash scripts/init.sh
6
- # bash scripts/init.sh --module java-spring
7
- # bash scripts/init.sh --module java-spring --hooks
8
- #
9
- # What it does:
10
- # 1. Copies framework files to .agent/ (commands, steps, hooks, rules, templates, modules)
11
- # 2. Creates lightweight shortcut files in .claude/commands/ that delegate to .agent/
12
- # 3. Writes .agent/FRAMEWORK_VERSION for upgrade.sh to track installed version
13
- #
14
- # After init:
15
- # - Commit .agent/ to git so the entire team shares the framework
16
- # - Run /setup-ai-first in Claude Code to complete project setup
17
- # - To upgrade later: bash scripts/upgrade.sh
18
-
19
- set -euo pipefail
20
-
21
- echo ""
22
- echo "╔══════════════════════════════════════════╗"
23
- echo "║ SDD Framework — Project Init ║"
24
- echo "╚══════════════════════════════════════════╝"
25
- echo ""
26
-
27
- # ── Prerequisite check ────────────────────────────────────────────────────────
28
-
29
- if ! command -v node &> /dev/null; then
30
- echo "❌ Node.js is required. Install from https://nodejs.org"
31
- exit 1
32
- fi
33
-
34
- # ── Run installer via npx ─────────────────────────────────────────────────────
35
-
36
- echo "Running: npx @educa-corp/sdd-framework --init $*"
37
- echo ""
38
-
39
- npx -y @educa-corp/sdd-framework --init "$@"
40
-
41
- echo ""
42
- echo "✅ Init complete!"
43
- echo ""
44
- echo "Recommended next steps:"
45
- echo " git add .agent/ .claude/commands/"
46
- echo " git commit -m 'chore: init spec-driven-docs framework'"
47
- echo ""
48
- echo "Then open Claude Code and run: /setup-ai-first"
49
- echo ""
@@ -1,94 +0,0 @@
1
- #!/usr/bin/env bash
2
- # upgrade.sh — Upgrade SDD Framework framework in an existing project.
3
- #
4
- # Usage:
5
- # bash scripts/upgrade.sh
6
- # bash scripts/upgrade.sh --module java-spring # also upgrade a stack module
7
- #
8
- # What it does:
9
- # 1. Reads current installed version from .agent/FRAMEWORK_VERSION
10
- # 2. Checks npm registry for the latest published version
11
- # 3. If newer: runs npx @educa-corp/sdd-framework@latest --init to update .agent/
12
- # 4. Reports what changed so you can review before committing
13
- #
14
- # Requirements:
15
- # - Project was set up with init.sh (or npx ... --init)
16
- # - .agent/FRAMEWORK_VERSION exists
17
-
18
- set -euo pipefail
19
-
20
- AGENT_DIR=".agent"
21
- VERSION_FILE="${AGENT_DIR}/FRAMEWORK_VERSION"
22
-
23
- echo ""
24
- echo "╔══════════════════════════════════════════╗"
25
- echo "║ SDD Framework — Upgrade ║"
26
- echo "╚══════════════════════════════════════════╝"
27
- echo ""
28
-
29
- # ── Prerequisite checks ───────────────────────────────────────────────────────
30
-
31
- if ! command -v node &> /dev/null; then
32
- echo "❌ Node.js is required. Install from https://nodejs.org"
33
- exit 1
34
- fi
35
-
36
- if ! command -v npm &> /dev/null; then
37
- echo "❌ npm is required. Install Node.js from https://nodejs.org"
38
- exit 1
39
- fi
40
-
41
- if [ ! -f "$VERSION_FILE" ]; then
42
- echo "❌ .agent/FRAMEWORK_VERSION not found."
43
- echo ""
44
- echo " This project was not set up with --init."
45
- echo " To set up the new structure:"
46
- echo ""
47
- echo " bash scripts/init.sh"
48
- echo " or:"
49
- echo " npx @educa-corp/sdd-framework --init"
50
- echo ""
51
- exit 1
52
- fi
53
-
54
- # ── Version comparison ────────────────────────────────────────────────────────
55
-
56
- CURRENT=$(cat "$VERSION_FILE" | tr -d '[:space:]')
57
- echo "Checking npm registry ..."
58
-
59
- LATEST=$(npm view @educa-corp/sdd-framework version 2>/dev/null || echo "unknown")
60
-
61
- echo ""
62
- echo " Installed : v${CURRENT}"
63
- echo " Latest : v${LATEST}"
64
- echo ""
65
-
66
- if [ "$LATEST" = "unknown" ]; then
67
- echo "⚠️ Could not reach npm registry. Check your internet connection."
68
- exit 1
69
- fi
70
-
71
- if [ "$CURRENT" = "$LATEST" ]; then
72
- echo "✅ Already up to date (v${CURRENT}). Nothing to do."
73
- echo ""
74
- exit 0
75
- fi
76
-
77
- # ── Upgrade ───────────────────────────────────────────────────────────────────
78
-
79
- echo "Upgrading v${CURRENT} → v${LATEST} ..."
80
- echo ""
81
-
82
- npx -y @educa-corp/sdd-framework@latest --init "$@"
83
-
84
- # ── Post-upgrade guidance ─────────────────────────────────────────────────────
85
-
86
- echo ""
87
- echo "✅ Upgraded to v${LATEST}!"
88
- echo ""
89
- echo "Review what changed in .agent/ before committing:"
90
- echo ""
91
- echo " git diff .agent/"
92
- echo " git add .agent/"
93
- echo " git commit -m 'chore: upgrade spec-driven-docs v${CURRENT} → v${LATEST}'"
94
- echo ""