gsd-opencode 1.30.0 → 1.33.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 (112) hide show
  1. package/agents/gsd-debugger.md +0 -1
  2. package/agents/gsd-doc-verifier.md +207 -0
  3. package/agents/gsd-doc-writer.md +608 -0
  4. package/agents/gsd-executor.md +22 -1
  5. package/agents/gsd-phase-researcher.md +41 -0
  6. package/agents/gsd-plan-checker.md +82 -0
  7. package/agents/gsd-planner.md +123 -194
  8. package/agents/gsd-security-auditor.md +129 -0
  9. package/agents/gsd-ui-auditor.md +40 -0
  10. package/agents/gsd-user-profiler.md +2 -2
  11. package/agents/gsd-verifier.md +84 -18
  12. package/commands/gsd/gsd-add-backlog.md +1 -1
  13. package/commands/gsd/gsd-analyze-dependencies.md +34 -0
  14. package/commands/gsd/gsd-autonomous.md +6 -2
  15. package/commands/gsd/gsd-cleanup.md +5 -0
  16. package/commands/gsd/gsd-debug.md +24 -21
  17. package/commands/gsd/gsd-discuss-phase.md +7 -2
  18. package/commands/gsd/gsd-docs-update.md +48 -0
  19. package/commands/gsd/gsd-execute-phase.md +4 -0
  20. package/commands/gsd/gsd-help.md +2 -0
  21. package/commands/gsd/gsd-join-discord.md +2 -1
  22. package/commands/gsd/gsd-manager.md +1 -0
  23. package/commands/gsd/gsd-new-project.md +4 -0
  24. package/commands/gsd/gsd-plan-phase.md +5 -0
  25. package/commands/gsd/gsd-quick.md +5 -3
  26. package/commands/gsd/gsd-reapply-patches.md +171 -39
  27. package/commands/gsd/gsd-research-phase.md +2 -12
  28. package/commands/gsd/gsd-review-backlog.md +1 -0
  29. package/commands/gsd/gsd-review.md +3 -2
  30. package/commands/gsd/gsd-secure-phase.md +35 -0
  31. package/commands/gsd/gsd-thread.md +1 -1
  32. package/commands/gsd/gsd-workstreams.md +7 -2
  33. package/get-shit-done/bin/gsd-tools.cjs +42 -8
  34. package/get-shit-done/bin/lib/commands.cjs +68 -14
  35. package/get-shit-done/bin/lib/config.cjs +18 -10
  36. package/get-shit-done/bin/lib/core.cjs +383 -80
  37. package/get-shit-done/bin/lib/docs.cjs +267 -0
  38. package/get-shit-done/bin/lib/frontmatter.cjs +47 -2
  39. package/get-shit-done/bin/lib/init.cjs +85 -5
  40. package/get-shit-done/bin/lib/milestone.cjs +21 -0
  41. package/get-shit-done/bin/lib/model-profiles.cjs +2 -0
  42. package/get-shit-done/bin/lib/phase.cjs +232 -189
  43. package/get-shit-done/bin/lib/profile-output.cjs +97 -1
  44. package/get-shit-done/bin/lib/roadmap.cjs +137 -113
  45. package/get-shit-done/bin/lib/schema-detect.cjs +238 -0
  46. package/get-shit-done/bin/lib/security.cjs +5 -3
  47. package/get-shit-done/bin/lib/state.cjs +366 -44
  48. package/get-shit-done/bin/lib/verify.cjs +158 -14
  49. package/get-shit-done/bin/lib/workstream.cjs +6 -2
  50. package/get-shit-done/references/agent-contracts.md +79 -0
  51. package/get-shit-done/references/artifact-types.md +113 -0
  52. package/get-shit-done/references/context-budget.md +49 -0
  53. package/get-shit-done/references/continuation-format.md +15 -15
  54. package/get-shit-done/references/domain-probes.md +125 -0
  55. package/get-shit-done/references/gate-prompts.md +100 -0
  56. package/get-shit-done/references/model-profiles.md +2 -2
  57. package/get-shit-done/references/planner-gap-closure.md +62 -0
  58. package/get-shit-done/references/planner-reviews.md +39 -0
  59. package/get-shit-done/references/planner-revision.md +87 -0
  60. package/get-shit-done/references/planning-config.md +15 -0
  61. package/get-shit-done/references/revision-loop.md +97 -0
  62. package/get-shit-done/references/ui-brand.md +2 -2
  63. package/get-shit-done/references/universal-anti-patterns.md +58 -0
  64. package/get-shit-done/references/workstream-flag.md +56 -3
  65. package/get-shit-done/templates/SECURITY.md +61 -0
  66. package/get-shit-done/templates/VALIDATION.md +3 -3
  67. package/get-shit-done/templates/claude-md.md +27 -4
  68. package/get-shit-done/templates/config.json +4 -0
  69. package/get-shit-done/templates/debug-subagent-prompt.md +2 -6
  70. package/get-shit-done/templates/planner-subagent-prompt.md +2 -10
  71. package/get-shit-done/workflows/add-phase.md +2 -2
  72. package/get-shit-done/workflows/add-todo.md +1 -1
  73. package/get-shit-done/workflows/analyze-dependencies.md +96 -0
  74. package/get-shit-done/workflows/audit-milestone.md +8 -12
  75. package/get-shit-done/workflows/autonomous.md +158 -13
  76. package/get-shit-done/workflows/check-todos.md +2 -2
  77. package/get-shit-done/workflows/complete-milestone.md +13 -4
  78. package/get-shit-done/workflows/diagnose-issues.md +8 -6
  79. package/get-shit-done/workflows/discovery-phase.md +1 -1
  80. package/get-shit-done/workflows/discuss-phase-assumptions.md +22 -4
  81. package/get-shit-done/workflows/discuss-phase-power.md +291 -0
  82. package/get-shit-done/workflows/discuss-phase.md +149 -11
  83. package/get-shit-done/workflows/docs-update.md +1093 -0
  84. package/get-shit-done/workflows/execute-phase.md +362 -66
  85. package/get-shit-done/workflows/execute-plan.md +1 -1
  86. package/get-shit-done/workflows/help.md +9 -6
  87. package/get-shit-done/workflows/insert-phase.md +2 -2
  88. package/get-shit-done/workflows/manager.md +27 -26
  89. package/get-shit-done/workflows/map-codebase.md +10 -32
  90. package/get-shit-done/workflows/new-milestone.md +14 -8
  91. package/get-shit-done/workflows/new-project.md +48 -25
  92. package/get-shit-done/workflows/next.md +1 -1
  93. package/get-shit-done/workflows/note.md +1 -1
  94. package/get-shit-done/workflows/pause-work.md +73 -10
  95. package/get-shit-done/workflows/plan-milestone-gaps.md +2 -2
  96. package/get-shit-done/workflows/plan-phase.md +184 -32
  97. package/get-shit-done/workflows/progress.md +20 -20
  98. package/get-shit-done/workflows/quick.md +102 -84
  99. package/get-shit-done/workflows/research-phase.md +2 -6
  100. package/get-shit-done/workflows/resume-project.md +4 -4
  101. package/get-shit-done/workflows/review.md +56 -3
  102. package/get-shit-done/workflows/secure-phase.md +154 -0
  103. package/get-shit-done/workflows/settings.md +13 -2
  104. package/get-shit-done/workflows/ship.md +13 -4
  105. package/get-shit-done/workflows/transition.md +6 -6
  106. package/get-shit-done/workflows/ui-phase.md +4 -14
  107. package/get-shit-done/workflows/ui-review.md +25 -7
  108. package/get-shit-done/workflows/update.md +165 -16
  109. package/get-shit-done/workflows/validate-phase.md +1 -11
  110. package/get-shit-done/workflows/verify-phase.md +127 -6
  111. package/get-shit-done/workflows/verify-work.md +69 -21
  112. package/package.json +1 -1
@@ -13,6 +13,7 @@ Goal-backward verification:
13
13
  1. What must be TRUE for the goal to be achieved?
14
14
  2. What must EXIST for those truths to hold?
15
15
  3. What must be WIRED for those artifacts to function?
16
+ 4. What must TESTS PROVE for those truths to be evidenced?
16
17
 
17
18
  Then verify each level against the actual codebase.
18
19
  </core_principle>
@@ -41,7 +42,12 @@ grep -E "^| ${phase_number}" .planning/REQUIREMENTS.md 2>/dev/null || true
41
42
  ls "$phase_dir"/*-SUMMARY.md "$phase_dir"/*-PLAN.md 2>/dev/null || true
42
43
  ```
43
44
 
44
- Extract **phase goal** from ROADMAP.md (the outcome to verify, not tasks) and **requirements** from REQUIREMENTS.md if it exists.
45
+ Load full milestone phases for deferred-item filtering (Step 9b):
46
+ ```bash
47
+ node "$HOME/.config/opencode/get-shit-done/bin/gsd-tools.cjs" roadmap analyze
48
+ ```
49
+
50
+ Extract **phase goal** from ROADMAP.md (the outcome to verify, not tasks), **requirements** from REQUIREMENTS.md if it exists, and **all milestone phases** from roadmap analyze (for cross-referencing gaps against later phases).
45
51
  </step>
46
52
 
47
53
  <step name="establish_must_haves">
@@ -190,6 +196,93 @@ Extract files modified in this phase from SUMMARY.md, scan each:
190
196
  Categorize: 🛑 Blocker (prevents goal) | ⚠️ Warning (incomplete) | ℹ️ Info (notable).
191
197
  </step>
192
198
 
199
+ <step name="audit_test_quality">
200
+ **Verify that tests PROVE what they claim to prove.**
201
+
202
+ This step catches test-level deceptions that pass all prior checks: files exist, are substantive, are wired, and tests pass — but the tests don't actually validate the requirement.
203
+
204
+ **1. Identify requirement-linked test files**
205
+
206
+ From PLAN and SUMMARY files, map each requirement to the test files that are supposed to prove it.
207
+
208
+ **2. Disabled test scan**
209
+
210
+ For ALL test files linked to requirements, search for disabled/skipped patterns:
211
+
212
+ ```bash
213
+ grep -rn -E "it\.skip|describe\.skip|test\.skip|xit\(|xdescribe\(|xtest\(|@pytest\.mark\.skip|@unittest\.skip|#\[ignore\]|\.pending|it\.todo|test\.todo" "$TEST_FILE"
214
+ ```
215
+
216
+ **Rule:** A disabled test linked to a requirement = requirement NOT tested.
217
+ - 🛑 BLOCKER if the disabled test is the only test proving that requirement
218
+ - ⚠️ WARNING if other active tests also cover the requirement
219
+
220
+ **3. Circular test detection**
221
+
222
+ Search for scripts/utilities that generate expected values by running the system under test:
223
+
224
+ ```bash
225
+ grep -rn -E "writeFileSync|writeFile|fs\.write|open\(.*w\)" "$TEST_DIRS"
226
+ ```
227
+
228
+ For each match, check if it also imports the system/service/module being tested. If a script both imports the system-under-test AND writes expected output values → CIRCULAR.
229
+
230
+ **Circular test indicators:**
231
+ - Script imports a service AND writes to fixture files
232
+ - Expected values have comments like "computed from engine", "captured from baseline"
233
+ - Script filename contains "capture", "baseline", "generate", "snapshot" in test context
234
+ - Expected values were added in the same commit as the test assertions
235
+
236
+ **Rule:** A test comparing system output against values generated by the same system is circular. It proves consistency, not correctness.
237
+
238
+ **4. Expected value provenance** (for comparison/parity/migration requirements)
239
+
240
+ When a requirement demands comparison with an external source ("identical to X", "matches Y", "same output as Z"):
241
+
242
+ - Is the external source actually invoked or referenced in the test pipeline?
243
+ - Do fixture files contain data sourced from the external system?
244
+ - Or do all expected values come from the new system itself or from mathematical formulas?
245
+
246
+ **Provenance classification:**
247
+ - VALID: Expected value from external/legacy system output, manual capture, or independent oracle
248
+ - PARTIAL: Expected value from mathematical derivation (proves formula, not system match)
249
+ - CIRCULAR: Expected value from the system being tested
250
+ - UNKNOWN: No provenance information — treat as SUSPECT
251
+
252
+ **5. Assertion strength**
253
+
254
+ For each test linked to a requirement, classify the strongest assertion:
255
+
256
+ | Level | Examples | Proves |
257
+ |-------|---------|--------|
258
+ | Existence | `toBeDefined()`, `!= null` | Something returned |
259
+ | Type | `typeof x === 'number'` | Correct shape |
260
+ | Status | `code === 200` | No error |
261
+ | Value | `toEqual(expected)`, `toBeCloseTo(x)` | Specific value |
262
+ | Behavioral | Multi-step workflow assertions | End-to-end correctness |
263
+
264
+ If a requirement demands value-level or behavioral-level proof and the test only has existence/type/status assertions → INSUFFICIENT.
265
+
266
+ **6. Coverage quantity**
267
+
268
+ If a requirement specifies a quantity of test cases (e.g., "30 calculations"), check if the actual number of active (non-skipped) test cases meets the requirement.
269
+
270
+ **Reporting — add to VERIFICATION.md:**
271
+
272
+ ```markdown
273
+ ### Test Quality Audit
274
+
275
+ | Test File | Linked Req | Active | Skipped | Circular | Assertion Level | Verdict |
276
+ |-----------|-----------|--------|---------|----------|----------------|---------|
277
+
278
+ **Disabled tests on requirements:** {N} → {BLOCKER if any req has ONLY disabled tests}
279
+ **Circular patterns detected:** {N} → {BLOCKER if any}
280
+ **Insufficient assertions:** {N} → {WARNING}
281
+ ```
282
+
283
+ **Impact on status:** Any BLOCKER from test quality audit ��� overall status = `gaps_found`, regardless of other checks passing.
284
+ </step>
285
+
193
286
  <step name="identify_human_verification">
194
287
  **Always needs human:** Visual appearance, user flow completion, real-time behavior (WebSocket/SSE), external service integration, performance feel, error message clarity.
195
288
 
@@ -199,15 +292,41 @@ Format each as: Test Name → What to do → Expected result → Why can't verif
199
292
  </step>
200
293
 
201
294
  <step name="determine_status">
202
- **passed:** All truths VERIFIED, all artifacts pass levels 1-3, all key links WIRED, no blocker anti-patterns.
295
+ Classify status using this decision tree IN ORDER (most restrictive first):
203
296
 
204
- **gaps_found:** Any truth FAILED, artifact MISSING/STUB, key link NOT_WIRED, or blocker found.
297
+ 1. IF any truth FAILED, artifact MISSING/STUB, key link NOT_WIRED, blocker found, **or test quality audit found blockers (disabled requirement tests, circular tests)**:
298
+ → **gaps_found**
205
299
 
206
- **human_needed:** All automated checks pass but human verification items remain.
300
+ 2. IF the previous step produced ANY human verification items:
301
+ → **human_needed** (even if all truths VERIFIED and score is N/N)
302
+
303
+ 3. IF all checks pass AND no human verification items:
304
+ → **passed**
305
+
306
+ **passed is ONLY valid when no human verification items exist.**
207
307
 
208
308
  **Score:** `verified_truths / total_truths`
209
309
  </step>
210
310
 
311
+ <step name="filter_deferred_items">
312
+ Before reporting gaps, cross-reference each gap against later phases in the milestone using the full roadmap data loaded in load_context (from `roadmap analyze`).
313
+
314
+ For each potential gap identified in determine_status:
315
+ 1. Check if the gap's failed truth or missing item is covered by a later phase's goal or success criteria
316
+ 2. **Match criteria:** The gap's concern appears in a later phase's goal text, success criteria text, or the later phase's name clearly suggests it covers this area
317
+ 3. If a clear match is found → move the gap to a `deferred` list with the matching phase reference and evidence text
318
+ 4. If no match in any later phase → keep as a real `gap`
319
+
320
+ **Important:** Be conservative. Only defer a gap when there is clear, specific evidence in a later phase. Vague or tangential matches should NOT cause deferral — when in doubt, keep it as a real gap.
321
+
322
+ **Deferred items do NOT affect the status determination.** Recalculate after filtering:
323
+ - If gaps list is now empty and no human items exist → `passed`
324
+ - If gaps list is now empty but human items exist → `human_needed`
325
+ - If gaps list still has items → `gaps_found`
326
+
327
+ Include deferred items in VERIFICATION.md frontmatter (`deferred:` section) and body (Deferred Items table) for transparency. If no deferred items exist, omit these sections.
328
+ </step>
329
+
211
330
  <step name="generate_fix_plans">
212
331
  If gaps_found:
213
332
 
@@ -215,7 +334,7 @@ If gaps_found:
215
334
 
216
335
  2. **Generate plan per cluster:** Objective, 2-3 tasks (files/action/verify each), re-verify step. Keep focused: single concern per plan.
217
336
 
218
- 3. **Order by dependency:** Fix missing → fix stubs → fix wiring → verify.
337
+ 3. **Order by dependency:** Fix missing → fix stubs → fix wiring → **fix test evidence** → verify.
219
338
  </step>
220
339
 
221
340
  <step name="create_report">
@@ -246,9 +365,11 @@ Orchestrator routes: `passed` → update_roadmap | `gaps_found` → create/execu
246
365
  - [ ] All key links verified
247
366
  - [ ] Requirements coverage assessed (if applicable)
248
367
  - [ ] Anti-patterns scanned and categorized
368
+ - [ ] Test quality audited (disabled tests, circular patterns, assertion strength, provenance)
249
369
  - [ ] Human verification items identified
250
370
  - [ ] Overall status determined
251
- - [ ] Fix plans generated (if gaps_found)
371
+ - [ ] Deferred items filtered against later milestone phases (if gaps found)
372
+ - [ ] Fix plans generated (if gaps_found after filtering)
252
373
  - [ ] VERIFICATION.md created with complete report
253
374
  - [ ] Results returned to orchestrator
254
375
  </success_criteria>
@@ -86,6 +86,42 @@ Provide a phase number to start testing (e.g., /gsd-verify-work 4)
86
86
  Continue to `create_uat_file`.
87
87
  </step>
88
88
 
89
+ <step name="automated_ui_verification">
90
+ **Automated UI Verification (when Playwright-MCP is available)**
91
+
92
+ Before running manual UAT, check whether this phase has a UI component and whether
93
+ `mcp__playwright__*` or `mcp__puppeteer__*` tools are available in the current session.
94
+
95
+ ```
96
+ UI_PHASE_FLAG=$(node "$HOME/.config/opencode/get-shit-done/bin/gsd-tools.cjs" config-get workflow.ui_phase --raw 2>/dev/null || echo "true")
97
+ UI_SPEC_FILE=$(ls "${PHASE_DIR}"/*-UI-SPEC.md 2>/dev/null | head -1)
98
+ ```
99
+
100
+ **If Playwright-MCP tools are available in this session (`mcp__playwright__*` tools
101
+ respond to tool calls) AND (`UI_PHASE_FLAG` is `true` OR `UI_SPEC_FILE` is non-empty):**
102
+
103
+ For each UI checkpoint listed in the phase's UI-SPEC.md (or inferred from SUMMARY.md):
104
+
105
+ 1. Use `mcp__playwright__navigate` (or equivalent) to open the component's URL.
106
+ 2. Use `mcp__playwright__screenshot` to capture a screenshot.
107
+ 3. Compare the screenshot visually against the spec's stated requirements
108
+ (dimensions, color, layout, spacing).
109
+ 4. Automatically mark checkpoints as **passed** or **needs review** based on the
110
+ visual comparison — no manual question required for items that clearly match.
111
+ 5. Flag items that require human judgment (subjective aesthetics, content accuracy)
112
+ and present only those as manual UAT questions.
113
+
114
+ If automated verification is not available, fall back to the standard manual
115
+ checkpoint questions defined in this workflow unchanged. This step is entirely
116
+ conditional: if Playwright-MCP is not configured, behavior is unchanged from today.
117
+
118
+ **Display summary line before proceeding:**
119
+ ```
120
+ UI checkpoints: {N} auto-verified, {M} queued for manual review
121
+ ```
122
+
123
+ </step>
124
+
89
125
  <step name="find_summaries">
90
126
  **Find what to test:**
91
127
 
@@ -375,11 +411,38 @@ Present summary:
375
411
  **If issues > 0:** Proceed to `diagnose_issues`
376
412
 
377
413
  **If issues == 0:**
414
+
415
+ ```bash
416
+ SECURITY_CFG=$(node "$HOME/.config/opencode/get-shit-done/bin/gsd-tools.cjs" config-get workflow.security_enforcement --raw 2>/dev/null || echo "true")
417
+ SECURITY_FILE=$(ls "${PHASE_DIR}"/*-SECURITY.md 2>/dev/null | head -1)
418
+ ```
419
+
420
+ If `SECURITY_CFG` is `true` AND `SECURITY_FILE` is empty:
421
+ ```
422
+ ⚠ Security enforcement enabled — /gsd-secure-phase {phase} has not run.
423
+ Run before advancing to the next phase.
424
+
425
+ All tests passed. Ready to continue.
426
+
427
+ - `/gsd-secure-phase {phase}` — security review (required before advancing)
428
+ - `/gsd-plan-phase {next}` — Plan next phase
429
+ - `/gsd-execute-phase {next}` — Execute next phase
430
+ - `/gsd-ui-review {phase}` — visual quality audit (if frontend files were modified)
431
+ ```
432
+
433
+ If `SECURITY_CFG` is `true` AND `SECURITY_FILE` exists: check frontmatter `threats_open`. If > 0:
434
+ ```
435
+ ⚠ Security gate: {threats_open} threats open
436
+ /gsd-secure-phase {phase} — resolve before advancing
437
+ ```
438
+
439
+ If `SECURITY_CFG` is `false` OR (`SECURITY_FILE` exists AND `threats_open` is `0`):
378
440
  ```
379
441
  All tests passed. Ready to continue.
380
442
 
381
443
  - `/gsd-plan-phase {next}` — Plan next phase
382
444
  - `/gsd-execute-phase {next}` — Execute next phase
445
+ - `/gsd-secure-phase {phase}` — security review
383
446
  - `/gsd-ui-review {phase}` — visual quality audit (if frontend files were modified)
384
447
  ```
385
448
  </step>
@@ -420,8 +483,7 @@ Display:
420
483
  Spawn gsd-planner in --gaps mode:
421
484
 
422
485
  ```
423
- task(
424
- prompt="""
486
+ @gsd-planner """
425
487
  <planning_context>
426
488
 
427
489
  **Phase:** {phase_number}
@@ -441,11 +503,7 @@ ${AGENT_SKILLS_PLANNER}
441
503
  Output consumed by /gsd-execute-phase
442
504
  Plans must be executable prompts.
443
505
  </downstream_consumer>
444
- """,
445
- subagent_type="gsd-planner",
446
- model="{planner_model}",
447
- description="Plan gap fixes for Phase {phase}"
448
- )
506
+ """
449
507
  ```
450
508
 
451
509
  On return:
@@ -470,8 +528,7 @@ Initialize: `iteration_count = 1`
470
528
  Spawn gsd-plan-checker:
471
529
 
472
530
  ```
473
- task(
474
- prompt="""
531
+ @gsd-plan-checker """
475
532
  <verification_context>
476
533
 
477
534
  **Phase:** {phase_number}
@@ -490,11 +547,7 @@ Return one of:
490
547
  - ## VERIFICATION PASSED — all checks pass
491
548
  - ## ISSUES FOUND — structured issue list
492
549
  </expected_output>
493
- """,
494
- subagent_type="gsd-plan-checker",
495
- model="{checker_model}",
496
- description="Verify Phase {phase} fix plans"
497
- )
550
+ """
498
551
  ```
499
552
 
500
553
  On return:
@@ -512,8 +565,7 @@ Display: `Sending back to planner for revision... (iteration {N}/3)`
512
565
  Spawn gsd-planner with revision context:
513
566
 
514
567
  ```
515
- task(
516
- prompt="""
568
+ @gsd-planner """
517
569
  <revision_context>
518
570
 
519
571
  **Phase:** {phase_number}
@@ -534,11 +586,7 @@ ${AGENT_SKILLS_PLANNER}
534
586
  read existing PLAN.md files. Make targeted updates to address checker issues.
535
587
  Do NOT replan from scratch unless issues are fundamental.
536
588
  </instructions>
537
- """,
538
- subagent_type="gsd-planner",
539
- model="{planner_model}",
540
- description="Revise Phase {phase} plans"
541
- )
589
+ """
542
590
  ```
543
591
 
544
592
  After planner returns → spawn checker again (verify_gap_plans logic)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gsd-opencode",
3
- "version": "1.30.0",
3
+ "version": "1.33.0",
4
4
  "description": "GSD-OpenCode distribution manager - install, verify, and maintain your GSD-OpenCode installation",
5
5
  "type": "module",
6
6
  "main": "bin/gsd.js",