gsdd-cli 0.18.1 → 0.18.2
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/README.md +1 -1
- package/bin/lib/init-flow.mjs +20 -18
- package/bin/lib/init-runtime.mjs +1 -1
- package/bin/lib/rendering.mjs +47 -10
- package/bin/lib/runtime-freshness.mjs +8 -10
- package/distilled/DESIGN.md +6 -6
- package/distilled/EVIDENCE-INDEX.md +2 -2
- package/docs/USER-GUIDE.md +4 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -104,7 +104,7 @@ In a terminal, `gsdd init` now opens a guided install wizard:
|
|
|
104
104
|
|
|
105
105
|
Portable `.agents/skills/gsdd-*` skills are always generated. The wizard controls extra native adapters and optional governance, not the portable baseline.
|
|
106
106
|
When those generated surfaces exist locally, `gsdd health` checks them against current render output instead of asking you to trust manual review.
|
|
107
|
-
Workflow-embedded helper commands use `node .planning/bin/gsdd.mjs
|
|
107
|
+
`init` generates a local `.planning/bin/gsdd*` helper surface. Workflow-embedded helper commands still use `node .planning/bin/gsdd.mjs ...` as the portable contract, so execution-time lifecycle helpers do not depend on a global `gsdd` binary after init.
|
|
108
108
|
|
|
109
109
|
### Launch Proof Status
|
|
110
110
|
|
package/bin/lib/init-flow.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync, cpSync } from 'fs';
|
|
2
|
-
import { join, isAbsolute } from 'path';
|
|
3
|
-
import {
|
|
1
|
+
import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync, cpSync } from 'fs';
|
|
2
|
+
import { dirname, join, isAbsolute } from 'path';
|
|
3
|
+
import { buildPlanningCliHelperEntries, renderSkillContent } from './rendering.mjs';
|
|
4
4
|
import { buildManifest, readManifest, writeManifest } from './manifest.mjs';
|
|
5
5
|
import { parseFlagValue, parseToolsFlag, parseAutoFlag } from './cli-utils.mjs';
|
|
6
6
|
import { buildDefaultConfig, COST_PROFILES, RIGOR_PROFILES } from './models.mjs';
|
|
@@ -109,8 +109,8 @@ export function createCmdInit(ctx) {
|
|
|
109
109
|
generateOpenStandardSkills(ctx.cwd, ctx.workflows);
|
|
110
110
|
console.log(' - generated open-standard skills (.agents/skills/gsdd-*)');
|
|
111
111
|
|
|
112
|
-
|
|
113
|
-
console.log(' - generated local workflow
|
|
112
|
+
generatePlanningCliHelpers(ctx);
|
|
113
|
+
console.log(' - generated local workflow helpers (.planning/bin/gsdd*)');
|
|
114
114
|
|
|
115
115
|
for (const adapter of resolveAdapters(ctx.adapters, interactiveSession.adapterTargets)) {
|
|
116
116
|
adapter.generate();
|
|
@@ -159,10 +159,10 @@ export function createCmdUpdate(ctx) {
|
|
|
159
159
|
|
|
160
160
|
if (existsSync(ctx.planningDir)) {
|
|
161
161
|
if (isDry) {
|
|
162
|
-
console.log(' - would update local workflow
|
|
162
|
+
console.log(' - would update local workflow helpers (.planning/bin/gsdd*)');
|
|
163
163
|
} else {
|
|
164
|
-
|
|
165
|
-
console.log(' - updated local workflow
|
|
164
|
+
generatePlanningCliHelpers(ctx);
|
|
165
|
+
console.log(' - updated local workflow helpers (.planning/bin/gsdd*)');
|
|
166
166
|
}
|
|
167
167
|
updated = true;
|
|
168
168
|
}
|
|
@@ -207,16 +207,18 @@ function generateOpenStandardSkills(cwd, workflows) {
|
|
|
207
207
|
}
|
|
208
208
|
}
|
|
209
209
|
|
|
210
|
-
function
|
|
211
|
-
const
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
210
|
+
function generatePlanningCliHelpers(ctx) {
|
|
211
|
+
for (const entry of buildPlanningCliHelperEntries({
|
|
212
|
+
packageName: ctx.packageName,
|
|
213
|
+
packageVersion: ctx.packageVersion,
|
|
214
|
+
})) {
|
|
215
|
+
const absolutePath = join(ctx.planningDir, entry.relativePath);
|
|
216
|
+
mkdirSync(dirname(absolutePath), { recursive: true });
|
|
217
|
+
writeFileSync(absolutePath, entry.content);
|
|
218
|
+
if (!absolutePath.endsWith('.cmd')) {
|
|
219
|
+
chmodSync(absolutePath, 0o755);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
220
222
|
}
|
|
221
223
|
|
|
222
224
|
function buildUpdateManifest({ planningDir, frameworkVersion, updateTemplates }) {
|
package/bin/lib/init-runtime.mjs
CHANGED
|
@@ -199,7 +199,7 @@ Platforms (for --tools):
|
|
|
199
199
|
|
|
200
200
|
Notes:
|
|
201
201
|
- init always generates open-standard skills at .agents/skills/gsdd-* (portable workflow entrypoints)
|
|
202
|
-
- init also generates .planning/bin/gsdd
|
|
202
|
+
- init also generates a local .planning/bin/gsdd* helper surface so workflow-embedded helper commands do not depend on a global gsdd binary
|
|
203
203
|
- Workspine is the public product name; the retained package, command, workflow, and workspace contracts stay gsdd-cli, gsdd, gsdd-*, and .planning/
|
|
204
204
|
- running plain \`gsdd init\` in a terminal opens the guided runtime-selection wizard
|
|
205
205
|
- the wizard lets you pick runtimes first, then separately decide whether repo-wide AGENTS.md governance is worth installing
|
package/bin/lib/rendering.mjs
CHANGED
|
@@ -62,6 +62,14 @@ function forwardResult(result, fallbackMessage) {
|
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
+
function runPackagedCli() {
|
|
66
|
+
const npmCommand = process.platform === 'win32' ? 'npm.cmd' : 'npm';
|
|
67
|
+
return spawnSync(npmCommand, ['exec', '--yes', \`--package=\${packageSpec}\`, '--', 'gsdd', ...args], {
|
|
68
|
+
stdio: 'inherit',
|
|
69
|
+
env,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
65
73
|
if (env.GSDD_CLI_PATH) {
|
|
66
74
|
const localResult = spawnSync(process.execPath, [env.GSDD_CLI_PATH, ...args], {
|
|
67
75
|
stdio: 'inherit',
|
|
@@ -69,16 +77,44 @@ if (env.GSDD_CLI_PATH) {
|
|
|
69
77
|
});
|
|
70
78
|
forwardResult(localResult, 'Failed to run the local GSDD CLI path from GSDD_CLI_PATH.');
|
|
71
79
|
} else {
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
stdio: 'inherit',
|
|
75
|
-
env,
|
|
76
|
-
});
|
|
77
|
-
forwardResult(npxResult, \`Failed to run \${packageSpec} via npx.\`);
|
|
80
|
+
const packagedResult = runPackagedCli();
|
|
81
|
+
forwardResult(packagedResult, \`Failed to run \${packageSpec} via npm exec.\`);
|
|
78
82
|
}
|
|
79
83
|
`;
|
|
80
84
|
}
|
|
81
85
|
|
|
86
|
+
function renderPlanningCliShellShim() {
|
|
87
|
+
return `#!/usr/bin/env sh
|
|
88
|
+
|
|
89
|
+
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
|
|
90
|
+
exec node "$SCRIPT_DIR/gsdd.mjs" "$@"
|
|
91
|
+
`;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function renderPlanningCliCmdShim() {
|
|
95
|
+
return `@echo off
|
|
96
|
+
setlocal
|
|
97
|
+
node "%~dp0gsdd.mjs" %*
|
|
98
|
+
`;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function buildPlanningCliHelperEntries({ packageName = 'gsdd-cli', packageVersion }) {
|
|
102
|
+
return [
|
|
103
|
+
{
|
|
104
|
+
relativePath: 'bin/gsdd.mjs',
|
|
105
|
+
content: renderPlanningCliLauncher({ packageName, packageVersion }),
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
relativePath: 'bin/gsdd',
|
|
109
|
+
content: renderPlanningCliShellShim(),
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
relativePath: 'bin/gsdd.cmd',
|
|
113
|
+
content: renderPlanningCliCmdShim(),
|
|
114
|
+
},
|
|
115
|
+
];
|
|
116
|
+
}
|
|
117
|
+
|
|
82
118
|
function buildPortableSkillEntries(workflows) {
|
|
83
119
|
return workflows.map((workflow) => ({
|
|
84
120
|
relativePath: `.agents/skills/${workflow.name}/SKILL.md`,
|
|
@@ -140,10 +176,11 @@ function upsertBoundedBlock(existing, blockContent) {
|
|
|
140
176
|
return `${bounded}\n\n${existing}`.replace(/\n{3,}/g, '\n\n');
|
|
141
177
|
}
|
|
142
178
|
|
|
143
|
-
export {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
179
|
+
export {
|
|
180
|
+
buildPlanningCliHelperEntries,
|
|
181
|
+
buildPortableSkillEntries,
|
|
182
|
+
getDelegateContent,
|
|
183
|
+
getWorkflowContent,
|
|
147
184
|
renderAgentsBoundedBlock,
|
|
148
185
|
renderAgentsFileContent,
|
|
149
186
|
renderOpenCodeCommandContent,
|
|
@@ -2,9 +2,9 @@ import { existsSync, readFileSync } from 'fs';
|
|
|
2
2
|
import { dirname, join } from 'path';
|
|
3
3
|
import { fileURLToPath } from 'url';
|
|
4
4
|
import {
|
|
5
|
+
buildPlanningCliHelperEntries,
|
|
5
6
|
buildPortableSkillEntries,
|
|
6
7
|
getDelegateContent,
|
|
7
|
-
renderPlanningCliLauncher,
|
|
8
8
|
renderOpenCodeCommandContent,
|
|
9
9
|
renderSkillContent,
|
|
10
10
|
} from './rendering.mjs';
|
|
@@ -151,15 +151,13 @@ function buildCodexEntries({ cwd }) {
|
|
|
151
151
|
}
|
|
152
152
|
|
|
153
153
|
function buildWorkspaceHelperEntries() {
|
|
154
|
-
return
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
},
|
|
162
|
-
];
|
|
154
|
+
return buildPlanningCliHelperEntries({
|
|
155
|
+
packageName: PACKAGE_JSON.name,
|
|
156
|
+
packageVersion: PACKAGE_JSON.version,
|
|
157
|
+
}).map((entry) => ({
|
|
158
|
+
relativePath: `.planning/${entry.relativePath}`,
|
|
159
|
+
expectedContent: entry.content,
|
|
160
|
+
}));
|
|
163
161
|
}
|
|
164
162
|
|
|
165
163
|
export function collectExpectedRuntimeSurfaceGroups({ cwd = process.cwd(), workflows }) {
|
package/distilled/DESIGN.md
CHANGED
|
@@ -2584,18 +2584,18 @@ Sub-gap (b) was closed by D28's `<persistence>` mandate and guarded by G30. Sub-
|
|
|
2584
2584
|
|
|
2585
2585
|
## D58 - Local Workflow Helper Launcher
|
|
2586
2586
|
|
|
2587
|
-
**Decision (2026-04-22):** Workflow-embedded CLI helper commands must run through a generated local
|
|
2587
|
+
**Decision (2026-04-22):** Workflow-embedded CLI helper commands must run through a generated local helper surface under `.planning/bin/`, with `.planning/bin/gsdd.mjs` as the canonical launcher, instead of assuming a bare `gsdd` binary is available on the consumer repo's PATH.
|
|
2588
2588
|
|
|
2589
2589
|
**Context:**
|
|
2590
2590
|
- Public onboarding already leads with `npx gsdd-cli init`, which works even when the package is not globally installed.
|
|
2591
2591
|
- The authored workflow surfaces had drifted into a different assumption: embedded helper commands such as `lifecycle-preflight`, `file-op`, and `phase-status` were written as bare `gsdd ...` invocations.
|
|
2592
2592
|
- That split contract caused consumer friction in the exact place the deterministic helper seam was supposed to help: a workflow could initialize successfully, then fail later because the repo did not have a global `gsdd` on PATH.
|
|
2593
|
-
- The
|
|
2593
|
+
- The helper surface must stay out of `.agents/` ownership so it does not pollute unrelated `.agents` folders or leak into generated governance.
|
|
2594
2594
|
|
|
2595
2595
|
**Decision:**
|
|
2596
|
-
- Generate `.planning/bin/gsdd.mjs` on `gsdd init` for every initialized workspace.
|
|
2597
|
-
- Regenerate that
|
|
2598
|
-
- Keep the launcher machine-independent by resolving back to the published `gsdd-cli` package version used for generation rather than embedding framework checkout paths.
|
|
2596
|
+
- Generate `.planning/bin/gsdd.mjs` plus thin repo-local shell shims (`.planning/bin/gsdd`, `.planning/bin/gsdd.cmd`) on `gsdd init` for every initialized workspace.
|
|
2597
|
+
- Regenerate that helper surface on `gsdd update` whenever `.planning/` exists.
|
|
2598
|
+
- Keep the launcher machine-independent by resolving back to the published `gsdd-cli` package version used for generation rather than embedding framework checkout paths, and invoke the packaged `gsdd` bin explicitly through `npm exec --package=... -- gsdd ...` instead of the fragile bare `npx <package>` form.
|
|
2599
2599
|
- Route workflow-embedded helper commands through `node .planning/bin/gsdd.mjs ...` for the deterministic helper seam:
|
|
2600
2600
|
- `lifecycle-preflight`
|
|
2601
2601
|
- `file-op`
|
|
@@ -2624,7 +2624,7 @@ Sub-gap (b) was closed by D28's `<persistence>` mandate and guarded by G30. Sub-
|
|
|
2624
2624
|
**Consequences:**
|
|
2625
2625
|
- Consumer repos no longer need a global `gsdd` binary for workflow-embedded helper mechanics after init.
|
|
2626
2626
|
- Helper-command freshness is now owned under `.planning/` without widening `.agents` install detection.
|
|
2627
|
-
- Generated governance remains compact and routing-focused because
|
|
2627
|
+
- Generated governance remains compact and routing-focused because helper-surface instructions stay out of `AGENTS.md`.
|
|
2628
2628
|
|
|
2629
2629
|
## Maintenance
|
|
2630
2630
|
|
|
@@ -445,8 +445,8 @@
|
|
|
445
445
|
- `get-shit-done/workflows/new-project.md`, `get-shit-done/workflows/quick.md`
|
|
446
446
|
|
|
447
447
|
## D58 — Local Workflow Helper Launcher
|
|
448
|
-
- `bin/lib/rendering.mjs` (`renderPlanningCliLauncher` for a machine-independent local helper
|
|
449
|
-
- `bin/lib/init-flow.mjs` (`gsdd init` / `gsdd update` generation of `.planning/bin/gsdd
|
|
448
|
+
- `bin/lib/rendering.mjs` (`renderPlanningCliLauncher` and `.planning/bin/gsdd*` shim rendering for a machine-independent local helper surface)
|
|
449
|
+
- `bin/lib/init-flow.mjs` (`gsdd init` / `gsdd update` generation of `.planning/bin/gsdd*`)
|
|
450
450
|
- `bin/lib/runtime-freshness.mjs`, `bin/lib/manifest.mjs`, `bin/lib/health.mjs`, `bin/lib/health-truth.mjs`
|
|
451
451
|
- `distilled/workflows/execute.md`, `distilled/workflows/verify.md`, `distilled/workflows/resume.md`, `distilled/workflows/progress.md`
|
|
452
452
|
- `tests/gsdd.init.test.cjs`, `tests/gsdd.health.test.cjs`, `tests/gsdd.manifest.test.cjs`, `tests/gsdd.scenarios.test.cjs`
|
package/docs/USER-GUIDE.md
CHANGED
|
@@ -195,7 +195,7 @@ The 7 check dimensions: requirement coverage, task completeness, dependency corr
|
|
|
195
195
|
| `gsdd models clear --runtime <rt> --agent <id>` | Remove runtime override |
|
|
196
196
|
| `gsdd help` | Show all commands |
|
|
197
197
|
|
|
198
|
-
Workflow-embedded helper commands use `node .planning/bin/gsdd.mjs
|
|
198
|
+
`init` generates a local `.planning/bin/gsdd*` helper surface. Workflow-embedded helper commands still use `node .planning/bin/gsdd.mjs ...` as the portable contract, so lifecycle preflight, file-op, and phase-status mechanics do not depend on a global `gsdd` binary after init.
|
|
199
199
|
|
|
200
200
|
### Platform flags for `--tools`
|
|
201
201
|
|
|
@@ -405,7 +405,9 @@ Switch to budget profile: `gsdd models profile budget`. Disable research and pla
|
|
|
405
405
|
ROADMAP.md # Phased delivery plan with inline status
|
|
406
406
|
config.json # Project configuration
|
|
407
407
|
bin/
|
|
408
|
-
gsdd
|
|
408
|
+
gsdd # POSIX shim for the local helper surface
|
|
409
|
+
gsdd.cmd # Windows shim for the local helper surface
|
|
410
|
+
gsdd.mjs # Canonical local workflow-helper launcher
|
|
409
411
|
generation-manifest.json # SHA-256 hashes for template versioning
|
|
410
412
|
.continue-here.md # Session checkpoint (created by pause, consumed by resume)
|
|
411
413
|
research/ # Domain research outputs
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gsdd-cli",
|
|
3
|
-
"version": "0.18.
|
|
3
|
+
"version": "0.18.2",
|
|
4
4
|
"description": "Workspine — a repo-native delivery spine for long-horizon AI-assisted work, with directly validated support for Claude Code, Codex CLI, and OpenCode, published as gsdd-cli.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|