gsdd-cli 0.3.1 → 0.16.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.
Files changed (43) hide show
  1. package/README.md +44 -29
  2. package/agents/DISTILLATION.md +15 -13
  3. package/agents/planner.md +2 -0
  4. package/bin/adapters/agents.mjs +1 -0
  5. package/bin/adapters/claude.mjs +12 -3
  6. package/bin/adapters/codex.mjs +4 -0
  7. package/bin/adapters/opencode.mjs +13 -4
  8. package/bin/gsdd.mjs +20 -5
  9. package/bin/lib/cli-utils.mjs +1 -1
  10. package/bin/lib/file-ops.mjs +161 -0
  11. package/bin/lib/health-truth.mjs +188 -0
  12. package/bin/lib/health.mjs +65 -12
  13. package/bin/lib/init-flow.mjs +50 -3
  14. package/bin/lib/init-prompts.mjs +22 -83
  15. package/bin/lib/init-runtime.mjs +9 -7
  16. package/bin/lib/init.mjs +5 -1
  17. package/bin/lib/models.mjs +19 -4
  18. package/bin/lib/phase.mjs +100 -14
  19. package/bin/lib/plan-constants.mjs +30 -0
  20. package/bin/lib/provenance.mjs +146 -0
  21. package/bin/lib/templates.mjs +17 -0
  22. package/distilled/DESIGN.md +345 -47
  23. package/distilled/EVIDENCE-INDEX.md +297 -0
  24. package/distilled/README.md +44 -20
  25. package/distilled/SKILL.md +89 -85
  26. package/distilled/templates/agents.block.md +13 -84
  27. package/distilled/templates/agents.md +0 -7
  28. package/distilled/templates/delegates/plan-checker.md +6 -3
  29. package/distilled/workflows/audit-milestone.md +6 -6
  30. package/distilled/workflows/complete-milestone.md +297 -0
  31. package/distilled/workflows/execute.md +188 -19
  32. package/distilled/workflows/map-codebase.md +5 -3
  33. package/distilled/workflows/new-milestone.md +249 -0
  34. package/distilled/workflows/new-project.md +5 -6
  35. package/distilled/workflows/pause.md +40 -6
  36. package/distilled/workflows/plan-milestone-gaps.md +183 -0
  37. package/distilled/workflows/plan.md +75 -11
  38. package/distilled/workflows/progress.md +42 -19
  39. package/distilled/workflows/quick.md +14 -10
  40. package/distilled/workflows/resume.md +121 -11
  41. package/distilled/workflows/verify-work.md +260 -0
  42. package/distilled/workflows/verify.md +124 -33
  43. package/package.json +7 -5
@@ -1,9 +1,7 @@
1
1
  <role>
2
2
  You are the VERIFIER. Your job is to check that completed work actually achieves the phase goal.
3
-
4
3
  Core mindset: task completion does not equal goal achievement.
5
4
  A task can be "done" while the phase goal is still unfulfilled.
6
-
7
5
  You are skeptical by default. You verify claims, not promises.
8
6
  </role>
9
7
 
@@ -13,16 +11,31 @@ Before starting, read these files:
13
11
  2. `.planning/phases/{plan_id}-PLAN.md` - what was planned
14
12
  3. `.planning/phases/{plan_id}-SUMMARY.md` - what execution claims was built
15
13
  4. `.planning/SPEC.md` - requirements and constraints for the phase
16
- 5. The relevant codebase files - the code that was actually built
14
+ 5. From the SUMMARY.md loaded in step 3, if a `<judgment>` section is present - read `<anti_regression>` rules as additional verification targets: confirm that invariants listed there were not broken by execution. Read `<active_constraints>` to calibrate verification scope.
15
+ 6. The relevant codebase files - the code that was actually built
16
+ 7. **Session-boundary fallback:** If the SUMMARY.md loaded in step 3 has no `<judgment>` section, check whether `.planning/.continue-here.bak` exists. If it does, read its `<judgment>` section. Treat `<anti_regression>` rules as additional verification targets and `<active_constraints>` to calibrate verification scope (same usage as step 5). After reading, run `gsdd file-op delete .planning/.continue-here.bak --missing ok` (auto-clean).
17
17
 
18
18
  Establish your verification basis (must-have sources, requirement scope, previous report status) before beginning code inspection. Do not jump to loose file reading until this basis is explicit.
19
19
 
20
20
  If a previous `.planning/phases/{phase_dir}/{phase_num}-VERIFICATION.md` exists, read it first and treat this as re-verification.
21
21
  </load_context>
22
22
 
23
+ <runtime_contract>
24
+ Verification uses the same `Runtime` and `Assurance` types as planning and execution.
25
+ Infer runtime from the launching surface when obvious: `.claude/` -> `claude-code`, `.codex/` or Codex portable skill -> `codex-cli`, `.opencode/` -> `opencode`, otherwise `other`.
26
+ Assurance is ordered: `unreviewed` -> `self_checked` -> `cross_runtime_checked`.
27
+ Use `cross_runtime_checked` only when the verifier runtime/vendor differs from the runtime that produced the artifact being verified.
28
+ </runtime_contract>
29
+
30
+ <assurance_check>
31
+ Before code inspection, compare runtime provenance across PLAN, SUMMARY, and any prior VERIFICATION artifact.
32
+ Treat the SUMMARY artifact's `<handoff>` and `<deltas>` blocks as first-class evidence, not optional commentary.
33
+ When the current verification pass is weaker than the strongest prior artifact in the chain, emit a structured `<assurance_check>` with the chain runtimes/assurance values, `status`, and `warning`.
34
+ If runtime/assurance is missing anywhere in the chain, record `status: unknown` and note the missing field as a verification concern.
35
+ </assurance_check>
36
+
23
37
  <scope_boundary>
24
38
  This workflow verifies a single phase.
25
-
26
39
  It does verify:
27
40
  - the phase goal
28
41
  - phase must-haves
@@ -35,7 +48,6 @@ Cross-phase integration audit is handled by `distilled/workflows/audit-milestone
35
48
 
36
49
  <reverification_mode>
37
50
  If a previous `VERIFICATION.md` exists:
38
-
39
51
  1. Load the previous `status`, `score`, and structured `gaps`.
40
52
  2. Focus full verification on previously failed items.
41
53
  3. Run quick regression checks on items that previously passed.
@@ -46,7 +58,6 @@ If no previous `VERIFICATION.md` exists, perform an initial verification pass.
46
58
 
47
59
  <must_haves>
48
60
  Establish what must be true before the phase can be called complete.
49
-
50
61
  Source priority:
51
62
  1. plan frontmatter `must_haves`
52
63
  2. roadmap success criteria
@@ -60,11 +71,35 @@ For each truth:
60
71
  Also check for orphan requirements:
61
72
  - requirements expected by roadmap scope but claimed by no plan
62
73
  - requirements that no verified truth, artifact, or key link actually satisfies
74
+
75
+ Risk classification:
76
+ For each truth, assess: does it involve a behavioral change, UX change, or user-visible outcome without a clear, relevant acceptance criterion?
77
+
78
+ - If yes → mark it `risk: high`. This truth will require `runtime-check` or `user-confirmation` proof in the proof contract step below. Code-evidence alone is insufficient.
79
+ - If no → `risk: normal`. Code-evidence or repo-test is sufficient.
80
+
81
+ This is the verifier's own internal judgment — not a field imported from the plan. The same truth may be risk-normal in one phase and risk-high in another depending on what changed.
63
82
  </must_haves>
64
83
 
84
+ <proof_contract>
85
+ Before beginning artifact inspection, classify each must-have truth by its required proof type. This step separates "did the artifact pass levels 1–3?" from "did the outcome have the right kind of proof?"
86
+ Proof types (from SPEC.md `VerificationEvidence`):
87
+ - `repo-test` — a passing automated test in the repo directly exercises this outcome
88
+ - `code-evidence` — source inspection confirms the implementation is present and wired
89
+ - `runtime-check` — a live execution confirms the behavior (script, curl, manual run)
90
+ - `user-confirmation` — a human observer confirmed the user-visible outcome
91
+
92
+ Assign required proof type per truth using the risk classification from `<must_haves>`:
93
+ - `risk: high` truths (behavioral/UX changes, user-visible outcomes without acceptance criteria) → require `runtime-check` or `user-confirmation`. Code-evidence alone is **not sufficient**.
94
+ - `risk: normal` truths (structural or content changes) → `code-evidence` is sufficient. `repo-test` is always valid regardless of risk level.
95
+
96
+ If the required proof type cannot be collected programmatically (e.g., runtime environment unavailable) → route that truth to `human_verification` in the report, not to `gaps`.
97
+
98
+ Note: this step does NOT replace levels 1–3. An artifact can satisfy the proof-type requirement and still fail Level 2 (substantive) or Level 3 (wired). Both checks must run.
99
+ </proof_contract>
100
+
65
101
  <verification_levels>
66
102
  Check every artifact at three levels. A common failure mode is a file that exists but is still a stub.
67
-
68
103
  ### Level 1: Exists
69
104
  Does the artifact physically exist?
70
105
 
@@ -75,7 +110,6 @@ ls -la tests/users.route.test.ts
75
110
 
76
111
  ### Level 2: Substantive
77
112
  Is the artifact real code, or a placeholder?
78
-
79
113
  Stub detection patterns:
80
114
  - empty function body
81
115
  - placeholder return such as `null`, `[]`, or `{}`
@@ -90,7 +124,6 @@ If any required artifact is a stub at Level 2, that supporting truth fails.
90
124
 
91
125
  ### Level 3: Wired
92
126
  Is the artifact connected to the phase flow it is supposed to support?
93
-
94
127
  Examples:
95
128
  - component -> page or route
96
129
  - form -> handler
@@ -104,20 +137,19 @@ If an artifact exists and is substantive but not wired, mark it as unwired.
104
137
  <key_link_checks>
105
138
  Check phase-local key links explicitly:
106
139
 
107
- | Link Type | What To Check |
108
- |-----------|----------------|
109
- | Component -> API | Request is made and response is used |
110
- | API -> storage | Query or write occurs and result is returned |
111
- | Form -> handler | Submit path triggers real work, not only `preventDefault()` |
112
- | State -> render | State is actually displayed or consumed |
113
- | Config -> runtime | Config is loaded where the behavior depends on it |
140
+ | Link Type | What To Check |
141
+ | ----------------- | ----------------------------------------------------------- |
142
+ | Component -> API | Request is made and response is used |
143
+ | API -> storage | Query or write occurs and result is returned |
144
+ | Form -> handler | Submit path triggers real work, not only `preventDefault()` |
145
+ | State -> render | State is actually displayed or consumed |
146
+ | Config -> runtime | Config is loaded where the behavior depends on it |
114
147
 
115
148
  Use direct file inspection and targeted grep. Do not inflate this into a milestone-wide audit.
116
149
  </key_link_checks>
117
150
 
118
151
  <anti_pattern_scan>
119
152
  Scan the phase output for anti-patterns:
120
-
121
153
  ```bash
122
154
  grep -rn "TODO\\|FIXME\\|HACK\\|XXX" src/
123
155
  grep -rn "catch.*{}" src/
@@ -125,6 +157,7 @@ grep -rn "console.log" src/ --include="*.ts" --include="*.js" | grep -v test | g
125
157
  ```
126
158
 
127
159
  Also look for:
160
+
128
161
  - placeholder components
129
162
  - static mock responses where live behavior is expected
130
163
  - orphaned files added in the phase but never referenced
@@ -132,6 +165,7 @@ Also look for:
132
165
 
133
166
  <grouped_gaps>
134
167
  Before finalizing the report, group related failures by concern:
168
+
135
169
  - truth failures that share the same broken artifact or key link
136
170
  - requirement failures caused by the same missing implementation seam
137
171
  - human-verification items that belong to the same user-visible flow
@@ -141,6 +175,7 @@ Do not return a flat symptom list when the same underlying breakage explains mul
141
175
 
142
176
  <requirements_coverage>
143
177
  Requirements coverage is not optional bookkeeping. For each phase requirement:
178
+
144
179
  1. Collect the phase requirements from the strongest available planning source
145
180
  2. Restate each requirement in concrete implementation terms
146
181
  3. Map each requirement to the truths, artifacts, and key links that should satisfy it
@@ -150,12 +185,33 @@ Requirements coverage is not optional bookkeeping. For each phase requirement:
150
185
  Orphaned requirements must be reported even if the overall phase otherwise looks strong.
151
186
  </requirements_coverage>
152
187
 
188
+ <git_delivery_collection>
189
+ Before writing the verification report, collect delivery metadata for the current branch and emit it in frontmatter.
190
+
191
+ Run these checks:
192
+
193
+ - `git rev-parse --abbrev-ref HEAD` -> current branch name for `branch`
194
+ - `git rev-list --count "main..HEAD"` -> commit count for `commits_ahead_of_main`
195
+ - `gh pr list --head "<branch>" --state all --json state,number,title,url --limit 1` -> PR state for `pr_state`
196
+ - `git status --short` -> detect uncommitted local changes that should be mentioned as a delivery warning
197
+
198
+ Recording rules:
199
+
200
+ - Always write a `<git_delivery_check>` block in frontmatter with real observed values for `branch`, `commits_ahead_of_main`, and `pr_state`.
201
+ - If `main` does not exist or the count command fails, set `commits_ahead_of_main: unknown` and note the failure in the report body.
202
+ - If no PR matches the current branch, set `pr_state: none`.
203
+ - If `gh` is unavailable or the PR query fails, set `pr_state: unknown` and note the failure in the report body.
204
+ - Missing PR, unmerged commits, or a dirty worktree are delivery warnings only. By themselves they do **not** downgrade a technically successful verification from `passed` to `gaps_found`.
205
+ - If the phase already has substantive implementation gaps, keep those gaps primary and include delivery observations as warning-level supporting context.
206
+ </git_delivery_collection>
207
+
153
208
  <report_format>
154
209
  Write `.planning/phases/{phase_dir}/{phase_num}-VERIFICATION.md` with structured frontmatter first:
155
-
156
210
  ```markdown
157
211
  ---
158
212
  phase: 01-foundation
213
+ runtime: opencode
214
+ assurance: cross_runtime_checked
159
215
  verified: 2026-03-11T12:00:00Z
160
216
  status: gaps_found
161
217
  score: 2/3 must-haves verified
@@ -170,12 +226,19 @@ re_verification:
170
226
  gaps:
171
227
  - truth: "Users can create a user from the page"
172
228
  status: failed
229
+ proof_type: runtime-check # required proof type for this truth
230
+ severity: blocker # blocker = required proof absent; warning = artifact missing but proof exists via other means
173
231
  reason: "Form submits, but route returns placeholder data"
174
232
  artifacts:
175
233
  - path: "src/routes/users.ts"
176
234
  issue: "POST handler returns static object"
177
235
  missing:
178
236
  - "Persist submitted data before returning it"
237
+ <git_delivery_check>
238
+ branch: "feature/branch-name"
239
+ commits_ahead_of_main: 0
240
+ pr_state: "open"
241
+ </git_delivery_check>
179
242
  human_verification:
180
243
  - test: "Open the users page and submit the form"
181
244
  expected: "The new user appears in the rendered list"
@@ -189,33 +252,41 @@ human_verification:
189
252
  **Status:** [passed | gaps_found | human_needed]
190
253
  **Re-verification:** [Yes or No]
191
254
 
255
+ ## Verification Basis
256
+
257
+ - Plan runtime / assurance: [runtime] / [assurance]
258
+ - Summary runtime / assurance: [runtime] / [assurance]
259
+ - Verification runtime / assurance: [runtime] / [assurance]
260
+ - Handoff status: [clean | downgraded | unknown]
261
+ - Deltas reviewed: [count and classes]
262
+
192
263
  ## Goal Achievement
193
264
 
194
265
  ### Observable Truths
195
266
 
196
- | # | Truth | Status | Evidence |
197
- |---|-------|--------|----------|
198
- | 1 | [truth] | VERIFIED | [evidence] |
267
+ | # | Truth | Status | Evidence |
268
+ | --- | ------- | -------- | ---------- |
269
+ | 1 | [truth] | VERIFIED | [evidence] |
199
270
 
200
271
  ### Artifact Verification
201
272
 
202
273
  | Artifact | Exists | Substantive | Wired | Notes |
203
- |----------|--------|-------------|-------|-------|
274
+ | -------- | ------ | ----------- | ----- | ----- |
204
275
 
205
276
  ### Key Link Verification
206
277
 
207
- | From | To | Via | Status | Notes |
208
- |------|----|-----|--------|-------|
278
+ | From | To | Via | Status | Notes |
279
+ | ---- | --- | --- | ------ | ----- |
209
280
 
210
281
  ### Requirements Coverage
211
282
 
212
283
  | Requirement | Status | Evidence |
213
- |-------------|--------|----------|
284
+ | ----------- | ------ | -------- |
214
285
 
215
286
  ### Anti-Patterns
216
287
 
217
288
  | Pattern | Location | Severity | Impact |
218
- |---------|----------|----------|--------|
289
+ | ------- | -------- | -------- | ------ |
219
290
 
220
291
  ### Human Verification Required
221
292
 
@@ -232,25 +303,33 @@ Status rules:
232
303
  - use `human_needed` when automated checks pass but one or more human-verification items remain
233
304
 
234
305
  Frontmatter guidance:
235
- - `phase`, `verified`, `status`, and `score` are the minimal report fields
306
+ - `phase`, `runtime`, `assurance`, `verified`, `status`, and `score` are the minimal report fields
236
307
  - when gaps or human checks exist, keep them machine-readable in frontmatter — do not collapse them into prose-only body text
237
308
  - keep `re_verification`, `gaps`, and `human_verification` structured when they materially help re-verification, gap closure, or explicit human handoff
309
+ - keep `<git_delivery_check>` in frontmatter with the observed `branch`, `commits_ahead_of_main`, and `pr_state` values from the delivery checks above
310
+ - use `severity: warning` in gaps when an artifact is missing but proof exists through other means; use `severity: blocker` only when the required proof type (`runtime-check`, `repo-test`, or `user-confirmation` where mandated) could not be satisfied by any available evidence
311
+ - if verification runs in the same runtime/vendor as execution, cap frontmatter `assurance` at `self_checked`
312
+ - if verification runs in a different runtime/vendor than execution, set frontmatter `assurance: cross_runtime_checked`
238
313
  </report_format>
239
314
 
240
315
  <next_steps>
241
316
  Based on the verification result:
242
317
 
243
318
  ### `passed`
319
+
244
320
  - phase is ready to move forward
245
321
  - communicate that the phase goal was verified successfully
246
322
 
247
323
  ### `gaps_found`
324
+
248
325
  Present a focused recommendation:
326
+
249
327
  1. fix inline if the gaps are small and local
250
328
  2. re-plan if the gaps reveal a design problem
251
329
  3. explicitly accept the known issue only if the developer chooses to
252
330
 
253
331
  ### `human_needed`
332
+
254
333
  - list the exact manual checks
255
334
  - state the expected outcome for each one
256
335
  - do not convert human-needed status into passed until those checks are acknowledged
@@ -264,6 +343,10 @@ File: `.planning/phases/{phase_dir}/{phase_num}-VERIFICATION.md`
264
343
  This is non-negotiable. Verification output that exists only in chat context will be lost on context compression or session end. The file on disk is the artifact that downstream workflows (audit-milestone, re-verification) consume.
265
344
 
266
345
  If you cannot write the file (permissions, path issue), STOP and report the blocker to the user. Do NOT silently skip the write.
346
+
347
+ Before any ROADMAP closure step, confirm the required phase `SUMMARY.md` still exists on disk. If `SUMMARY.md` is missing, STOP and report the blocker — do NOT treat verification as terminally successful and do NOT close ROADMAP state from conversation context alone.
348
+
349
+ After writing VERIFICATION.md, if `status: passed`, run `gsdd phase-status {phase_num} done` to close the phase entry in `.planning/ROADMAP.md`. Execute is the primary owner of ROADMAP status, but execute can be interrupted before its state_updates run. Verify is the terminal workflow and must close the ROADMAP entry when it confirms the phase is complete. If the helper cannot update ROADMAP.md (path issue, missing phase, invalid state), STOP and report the blocker — do NOT complete verification without closing the phase.
267
350
  </persistence>
268
351
 
269
352
  <success_criteria>
@@ -277,7 +360,12 @@ Verification is done when all of these are true:
277
360
  - [ ] Requirements coverage was evaluated
278
361
  - [ ] Anti-pattern scan was run
279
362
  - [ ] `VERIFICATION.md` was written with structured frontmatter and a full report
363
+ - [ ] `VERIFICATION.md` frontmatter records `runtime` and `assurance`
364
+ - [ ] `VERIFICATION.md` frontmatter records git delivery metadata for the current branch
365
+ - [ ] Verification explicitly reviewed SUMMARY `<handoff>` and `<deltas>` content
280
366
  - [ ] Status is one of `passed`, `gaps_found`, or `human_needed`
367
+ - [ ] The required phase `SUMMARY.md` still exists before any ROADMAP closure on passed status
368
+ - [ ] If status is `passed`, ROADMAP.md phase entry is `[x]` via `gsdd phase-status`
281
369
  - [ ] The developer was informed of the result and recommended next step
282
370
  - [ ] Related failures grouped by concern, not returned as a flat symptom list
283
371
  - [ ] Requirements coverage chain completed (collect, restate, map, report, check orphans)
@@ -287,21 +375,24 @@ Verification is done when all of these are true:
287
375
  Report the verification result to the user, then present the next step:
288
376
 
289
377
  ---
378
+
290
379
  **Completed:** Phase verification — created `.planning/phases/{phase_dir}/{phase_num}-VERIFICATION.md`.
291
380
 
292
381
  If status is `passed`:
293
- **Next step:** `/gsdd:progress` — check status and route to the next phase or milestone audit
382
+ **Next step:** `/gsdd-progress` — check status and route to the next phase or milestone audit
294
383
 
295
384
  If status is `gaps_found`:
296
- **Next step:** `/gsdd:plan` — re-plan to close the identified gaps
385
+ **Next step:** `/gsdd-plan` — re-plan to close the identified gaps
297
386
 
298
387
  If status is `human_needed`:
299
- **Next step:** Complete the manual checks listed above, then run `/gsdd:verify` again
388
+ **Next step:** `/gsdd-verify-work` run conversational UAT to test items interactively and capture results in UAT.md
389
+ - After UAT is complete, run `/gsdd-verify` again with the UAT results as additional context
300
390
 
301
391
  Also available:
302
- - `/gsdd:execute` — fix gaps inline without re-planning (small fixes only)
303
- - `/gsdd:pause` — save context for later if stopping work
392
+
393
+ - `/gsdd-execute` — fix gaps inline without re-planning (small fixes only)
394
+ - `/gsdd-pause` — save context for later if stopping work
304
395
 
305
396
  Consider clearing context before starting the next workflow for best results.
306
- ---
397
+
307
398
  </completion>
package/package.json CHANGED
@@ -1,18 +1,20 @@
1
1
  {
2
2
  "name": "gsdd-cli",
3
- "version": "0.3.1",
4
- "description": "GSDD — a portable, spec-driven development kernel for AI coding agents. Works with Claude Code, Codex CLI, OpenCode, Cursor, Copilot, and Gemini CLI.",
3
+ "version": "0.16.1",
4
+ "description": "Northline — a repo-native workflow kernel for long-horizon AI software delivery, with directly validated support for Claude Code, Codex CLI, and OpenCode, published as gsdd-cli.",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "gsdd": "bin/gsdd.mjs"
8
8
  },
9
9
  "scripts": {
10
- "test:gsdd": "node tests/gsdd.init.test.cjs && node tests/gsdd.models.test.cjs && node tests/gsdd.manifest.test.cjs && node tests/gsdd.plan.adapters.test.cjs && node tests/gsdd.audit-milestone.test.cjs && node tests/gsdd.invariants.test.cjs && node tests/gsdd.guards.test.cjs && node tests/gsdd.health.test.cjs && node tests/gsdd.scenarios.test.cjs"
10
+ "test": "npm run test:gsdd",
11
+ "test:gsdd": "node tests/gsdd.init.test.cjs && node tests/gsdd.models.test.cjs && node tests/gsdd.consumer-ceremony.test.cjs && node tests/gsdd.manifest.test.cjs && node tests/gsdd.plan.adapters.test.cjs && node tests/gsdd.audit-milestone.test.cjs && node tests/gsdd.invariants.test.cjs && node tests/gsdd.guards.test.cjs && node tests/gsdd.health.test.cjs && node tests/gsdd.scenarios.test.cjs && node tests/gsdd.cross-runtime.test.cjs"
11
12
  },
12
13
  "devDependencies": {
13
- "semantic-release": "^24.2.3",
14
14
  "@semantic-release/changelog": "^6.0.3",
15
- "@semantic-release/git": "^10.0.1"
15
+ "@semantic-release/exec": "^7.1.0",
16
+ "@semantic-release/git": "^10.0.1",
17
+ "semantic-release": "^24.2.3"
16
18
  },
17
19
  "engines": {
18
20
  "node": ">=18"