@hegemonart/get-design-done 1.31.0 → 1.31.5
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-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +44 -0
- package/NOTICE +224 -0
- package/README.md +1 -1
- package/agents/design-authority-watcher.md +1 -1
- package/agents/perf-analyzer.md +2 -2
- package/bin/gdd-mcp +78 -0
- package/bin/gdd-sdk +34 -24
- package/bin/gdd-state-mcp +78 -0
- package/{README.de.md → docs/i18n/README.de.md} +1 -1
- package/{README.fr.md → docs/i18n/README.fr.md} +1 -1
- package/{README.it.md → docs/i18n/README.it.md} +1 -1
- package/{README.ja.md → docs/i18n/README.ja.md} +1 -1
- package/{README.ko.md → docs/i18n/README.ko.md} +1 -1
- package/{README.zh-CN.md → docs/i18n/README.zh-CN.md} +1 -1
- package/hooks/_hook-emit.js +1 -1
- package/hooks/budget-enforcer.ts +5 -5
- package/hooks/context-exhaustion.ts +2 -2
- package/hooks/gdd-precompact-snapshot.js +3 -3
- package/hooks/gdd-read-injection-scanner.ts +2 -2
- package/hooks/gdd-sessionstart-recap.js +1 -1
- package/hooks/gdd-turn-closeout.js +1 -1
- package/package.json +20 -9
- package/recipes/.gitkeep +0 -0
- package/reference/schemas/recipe.schema.json +33 -0
- package/scripts/cli/gdd-events.mjs +5 -5
- package/scripts/lib/cache/gdd-cache-manager.cjs +1 -1
- package/scripts/lib/cli/index.ts +22 -160
- package/scripts/lib/connection-probe/index.cjs +1 -1
- package/scripts/lib/discuss-parallel-runner/aggregator.ts +1 -1
- package/scripts/lib/discuss-parallel-runner/index.ts +1 -1
- package/scripts/lib/error-classifier.cjs +24 -227
- package/scripts/lib/event-stream/index.ts +25 -193
- package/scripts/lib/gdd-errors/index.ts +24 -213
- package/scripts/lib/gdd-state/index.ts +23 -161
- package/scripts/lib/iteration-budget.cjs +23 -199
- package/scripts/lib/jittered-backoff.cjs +24 -107
- package/scripts/lib/lockfile.cjs +23 -195
- package/scripts/lib/logger/index.ts +1 -1
- package/scripts/lib/parallelism-engine/concurrency-tuner.cjs +1 -1
- package/scripts/lib/perf-analyzer/index.cjs +1 -1
- package/scripts/lib/pipeline-runner/index.ts +4 -4
- package/scripts/lib/pipeline-runner/state-machine.ts +1 -1
- package/scripts/lib/prompt-dedup/index.cjs +1 -1
- package/scripts/lib/rate-guard.cjs +2 -2
- package/scripts/lib/recipe-loader.cjs +142 -0
- package/scripts/lib/session-runner/errors.ts +3 -3
- package/scripts/lib/session-runner/index.ts +3 -3
- package/scripts/lib/session-runner/transcript.ts +1 -1
- package/scripts/lib/tool-scoping/index.ts +1 -1
- package/scripts/mcp-servers/gdd-mcp/server.ts +29 -311
- package/scripts/mcp-servers/gdd-state/server.ts +28 -282
- package/sdk/README.md +45 -0
- package/{scripts/lib → sdk}/cli/commands/audit.ts +3 -3
- package/{scripts/lib → sdk}/cli/commands/init.ts +3 -3
- package/{scripts/lib → sdk}/cli/commands/query.ts +4 -4
- package/{scripts/lib → sdk}/cli/commands/run.ts +5 -5
- package/{scripts/lib → sdk}/cli/commands/stage.ts +5 -5
- package/sdk/cli/index.js +8091 -0
- package/sdk/cli/index.ts +172 -0
- package/{scripts/lib → sdk}/cli/parse-args.ts +2 -2
- package/{scripts/lib/gdd-errors → sdk/errors}/classification.ts +1 -1
- package/sdk/errors/index.ts +218 -0
- package/{scripts/lib → sdk}/event-stream/emitter.ts +1 -1
- package/sdk/event-stream/index.ts +197 -0
- package/{scripts/lib → sdk}/event-stream/reader.ts +1 -1
- package/{scripts/lib → sdk}/event-stream/types.ts +2 -2
- package/{scripts/lib → sdk}/event-stream/writer.ts +1 -1
- package/sdk/index.ts +19 -0
- package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/README.md +3 -3
- package/sdk/mcp/gdd-mcp/server.js +1924 -0
- package/sdk/mcp/gdd-mcp/server.ts +325 -0
- package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_cycle_recap.ts +3 -3
- package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_decisions_list.ts +2 -2
- package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_events_tail.ts +3 -3
- package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_health.ts +2 -2
- package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_intel_get.ts +2 -2
- package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_learnings_digest.ts +2 -2
- package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_phase_current.ts +2 -2
- package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_phases_list.ts +2 -2
- package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_plans_list.ts +2 -2
- package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_reflections_latest.ts +2 -2
- package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_status.ts +3 -3
- package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_telemetry_query.ts +3 -3
- package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/index.ts +2 -2
- package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/shared.ts +3 -3
- package/sdk/mcp/gdd-state/server.js +2790 -0
- package/sdk/mcp/gdd-state/server.ts +294 -0
- package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/add_blocker.ts +3 -3
- package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/add_decision.ts +3 -3
- package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/add_must_have.ts +3 -3
- package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/checkpoint.ts +2 -2
- package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/frontmatter_update.ts +2 -2
- package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/get.ts +3 -3
- package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/index.ts +1 -1
- package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/probe_connections.ts +3 -3
- package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/resolve_blocker.ts +3 -3
- package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/set_status.ts +2 -2
- package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/shared.ts +8 -8
- package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/transition_stage.ts +4 -4
- package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/update_progress.ts +2 -2
- package/sdk/primitives/error-classifier.cjs +232 -0
- package/sdk/primitives/iteration-budget.cjs +205 -0
- package/sdk/primitives/jittered-backoff.cjs +112 -0
- package/sdk/primitives/lockfile.cjs +201 -0
- package/{scripts/lib/gdd-state → sdk/state}/gates.ts +1 -1
- package/sdk/state/index.ts +167 -0
- package/{scripts/lib/gdd-state → sdk/state}/lockfile.ts +1 -1
- package/{scripts/lib/gdd-state → sdk/state}/mutator.ts +1 -1
- package/{scripts/lib/gdd-state → sdk/state}/parser.ts +1 -1
- package/{scripts/lib/gdd-state → sdk/state}/types.ts +4 -4
- package/skills/quality-gate/SKILL.md +2 -2
- package/scripts/aggregate-agent-metrics.ts +0 -282
- package/scripts/bootstrap-manifest.txt +0 -3
- package/scripts/bootstrap.sh +0 -80
- package/scripts/build-distribution-bundles.cjs +0 -549
- package/scripts/build-intel.cjs +0 -486
- package/scripts/codegen-schema-types.ts +0 -149
- package/scripts/detect-stale-refs.cjs +0 -107
- package/scripts/e2e/run-headless.ts +0 -514
- package/scripts/extract-changelog-section.cjs +0 -58
- package/scripts/gsd-cleanup-incubator.cjs +0 -367
- package/scripts/injection-patterns.cjs +0 -58
- package/scripts/lint-agentskills-spec.cjs +0 -457
- package/scripts/release-smoke-test.cjs +0 -200
- package/scripts/rollback-release.sh +0 -42
- package/scripts/run-injection-scanner-ci.cjs +0 -83
- package/scripts/tests/test-authority-rejected-kinds.sh +0 -58
- package/scripts/tests/test-authority-watcher-diff.sh +0 -113
- package/scripts/tests/test-motion-provenance.sh +0 -64
- package/scripts/validate-frontmatter.ts +0 -409
- package/scripts/validate-incubator-scope.cjs +0 -133
- package/scripts/validate-schemas.ts +0 -401
- package/scripts/validate-skill-length.cjs +0 -283
- package/scripts/verify-version-sync.cjs +0 -30
- /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_cycle_recap.schema.json +0 -0
- /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_decisions_list.schema.json +0 -0
- /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_events_tail.schema.json +0 -0
- /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_health.schema.json +0 -0
- /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_intel_get.schema.json +0 -0
- /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_learnings_digest.schema.json +0 -0
- /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_phase_current.schema.json +0 -0
- /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_phases_list.schema.json +0 -0
- /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_plans_list.schema.json +0 -0
- /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_reflections_latest.schema.json +0 -0
- /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_status.schema.json +0 -0
- /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_telemetry_query.schema.json +0 -0
- /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/add_blocker.schema.json +0 -0
- /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/add_decision.schema.json +0 -0
- /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/add_must_have.schema.json +0 -0
- /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/checkpoint.schema.json +0 -0
- /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/frontmatter_update.schema.json +0 -0
- /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/get.schema.json +0 -0
- /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/probe_connections.schema.json +0 -0
- /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/resolve_blocker.schema.json +0 -0
- /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/set_status.schema.json +0 -0
- /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/transition_stage.schema.json +0 -0
- /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/update_progress.schema.json +0 -0
- /package/{scripts/lib → sdk/primitives}/error-classifier.d.cts +0 -0
- /package/{scripts/lib → sdk/primitives}/iteration-budget.d.cts +0 -0
- /package/{scripts/lib → sdk/primitives}/jittered-backoff.d.cts +0 -0
- /package/{scripts/lib → sdk/primitives}/lockfile.d.cts +0 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# GET DESIGN DONE
|
|
4
4
|
|
|
5
|
-
[English](README.md) · **简体中文** · [日本語](README.ja.md) · [한국어](README.ko.md) · [Français](README.fr.md) · [Italiano](README.it.md) · [Deutsch](README.de.md)
|
|
5
|
+
[English](../../README.md) · **简体中文** · [日本語](README.ja.md) · [한국어](README.ko.md) · [Français](README.fr.md) · [Italiano](README.it.md) · [Deutsch](README.de.md)
|
|
6
6
|
|
|
7
7
|
**面向 AI 编码智能体的设计质量流水线:简报 → 探索 → 规划 → 实现 → 验证。**
|
|
8
8
|
|
package/hooks/_hook-emit.js
CHANGED
|
@@ -45,7 +45,7 @@ function getAppendEvent() {
|
|
|
45
45
|
// require()'ing — if Node refuses to parse `.ts`, we silently fall
|
|
46
46
|
// back to no-op.
|
|
47
47
|
// eslint-disable-next-line node/no-missing-require, global-require
|
|
48
|
-
cachedAppendEvent = require('../
|
|
48
|
+
cachedAppendEvent = require('../sdk/event-stream/index.ts').appendEvent;
|
|
49
49
|
return cachedAppendEvent;
|
|
50
50
|
} catch {
|
|
51
51
|
cachedAppendEvent = null;
|
package/hooks/budget-enforcer.ts
CHANGED
|
@@ -44,8 +44,8 @@ import { spawn } from 'node:child_process';
|
|
|
44
44
|
import { createInterface } from 'node:readline';
|
|
45
45
|
import { createRequire } from 'node:module';
|
|
46
46
|
|
|
47
|
-
import { appendEvent } from '../
|
|
48
|
-
import type { HookFiredEvent } from '../
|
|
47
|
+
import { appendEvent } from '../sdk/event-stream/index.ts';
|
|
48
|
+
import type { HookFiredEvent } from '../sdk/event-stream/index.ts';
|
|
49
49
|
// Consume the generated BudgetSchema so this hook participates in the
|
|
50
50
|
// Plan 20-00 codegen graph. We treat parsed JSON as BudgetSchema after
|
|
51
51
|
// the structural merge with defaults — the schema permits every field
|
|
@@ -71,7 +71,7 @@ function resolveHookPath(): string {
|
|
|
71
71
|
}
|
|
72
72
|
const nodeRequire = createRequire(resolveHookPath());
|
|
73
73
|
const rateGuard = nodeRequire('../scripts/lib/rate-guard.cjs') as typeof import('../scripts/lib/rate-guard.cjs');
|
|
74
|
-
const iterationBudget = nodeRequire('../
|
|
74
|
+
const iterationBudget = nodeRequire('../sdk/primitives/iteration-budget.cjs') as typeof import('../sdk/primitives/iteration-budget.cjs');
|
|
75
75
|
// Plan 26-05: shared cost-computation backend for the resolved_models
|
|
76
76
|
// consumer path. Pure module — takes (model_id, runtime, token_counts) →
|
|
77
77
|
// cost_usd by reading per-runtime price tables under reference/prices/.
|
|
@@ -612,9 +612,9 @@ export function writeTelemetry(partial: TelemetryRowPartial): void {
|
|
|
612
612
|
|
|
613
613
|
/**
|
|
614
614
|
* Emit one hook.fired event per hook decision. Uses the pre-registered
|
|
615
|
-
* HookFiredEvent subtype from
|
|
615
|
+
* HookFiredEvent subtype from sdk/event-stream/types.ts and
|
|
616
616
|
* stamps sessionId from the process PID + boot time — same scheme as
|
|
617
|
-
*
|
|
617
|
+
* sdk/mcp/gdd-state/tools/shared.ts but inlined here so the
|
|
618
618
|
* hook stays dependency-light.
|
|
619
619
|
*/
|
|
620
620
|
let CACHED_SESSION_ID: string | null = null;
|
|
@@ -28,8 +28,8 @@ import {
|
|
|
28
28
|
import { dirname, join } from 'node:path';
|
|
29
29
|
import { createInterface } from 'node:readline';
|
|
30
30
|
|
|
31
|
-
import { appendEvent } from '../
|
|
32
|
-
import type { HookFiredEvent } from '../
|
|
31
|
+
import { appendEvent } from '../sdk/event-stream/index.ts';
|
|
32
|
+
import type { HookFiredEvent } from '../sdk/event-stream/index.ts';
|
|
33
33
|
|
|
34
34
|
// ── Types ───────────────────────────────────────────────────────────────────
|
|
35
35
|
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* writes an atomic snapshot of STATE.md sections + last-N event-chain
|
|
7
7
|
* entries + last-N decisions to `.design/snapshots/<ts>.json`.
|
|
8
8
|
*
|
|
9
|
-
* Phase 27.6 D-08: atomic .tmp + rename via
|
|
9
|
+
* Phase 27.6 D-08: atomic .tmp + rename via sdk/primitives/lockfile.cjs.
|
|
10
10
|
* - Lockfile serializes concurrent PreCompact writers.
|
|
11
11
|
* - .tmp + rename guarantees no partial file ever appears at target path
|
|
12
12
|
* (a SIGKILL between writeFileSync and renameSync leaves an orphan
|
|
@@ -52,7 +52,7 @@ function detectHarness() {
|
|
|
52
52
|
|
|
53
53
|
function getAppendEvent() {
|
|
54
54
|
try {
|
|
55
|
-
const m = require('../
|
|
55
|
+
const m = require('../sdk/event-stream');
|
|
56
56
|
if (m && typeof m.appendEvent === 'function') return m.appendEvent;
|
|
57
57
|
} catch {
|
|
58
58
|
/* swallow — event-stream is optional infrastructure */
|
|
@@ -224,7 +224,7 @@ async function main() {
|
|
|
224
224
|
// PreCompact writers; the second writer either waits or fails-silent.
|
|
225
225
|
let release = null;
|
|
226
226
|
try {
|
|
227
|
-
const lockfile = require('../
|
|
227
|
+
const lockfile = require('../sdk/primitives/lockfile.cjs');
|
|
228
228
|
release = await lockfile.acquire(snapshotPath, {
|
|
229
229
|
staleMs: 60_000,
|
|
230
230
|
maxWaitMs: 10_000,
|
|
@@ -29,8 +29,8 @@ import { createRequire } from 'node:module';
|
|
|
29
29
|
import { createInterface } from 'node:readline';
|
|
30
30
|
import { dirname, isAbsolute, join, resolve } from 'node:path';
|
|
31
31
|
|
|
32
|
-
import { appendEvent } from '../
|
|
33
|
-
import type { HookFiredEvent } from '../
|
|
32
|
+
import { appendEvent } from '../sdk/event-stream/index.ts';
|
|
33
|
+
import type { HookFiredEvent } from '../sdk/event-stream/index.ts';
|
|
34
34
|
|
|
35
35
|
// ── require-bridge to the shared .cjs pattern file ──────────────────────────
|
|
36
36
|
|
|
@@ -45,7 +45,7 @@ function detectHarness() {
|
|
|
45
45
|
|
|
46
46
|
function getAppendEvent() {
|
|
47
47
|
try {
|
|
48
|
-
const m = require('../
|
|
48
|
+
const m = require('../sdk/event-stream');
|
|
49
49
|
if (m && typeof m.appendEvent === 'function') return m.appendEvent;
|
|
50
50
|
} catch {
|
|
51
51
|
/* swallow — event-stream is optional infrastructure */
|
|
@@ -49,7 +49,7 @@ const TAIL_BYTES = 8_192; // last 8 KiB is plenty for one event line (<<64KiB ca
|
|
|
49
49
|
* Lightweight parse of the `<position>` block in STATE.md. Returns the fields
|
|
50
50
|
* we care about, or null if the block isn't present / well-formed.
|
|
51
51
|
*
|
|
52
|
-
* We intentionally avoid the full parser at
|
|
52
|
+
* We intentionally avoid the full parser at sdk/state/parser.ts
|
|
53
53
|
* because (a) it requires TS execution and (b) its overhead would blow the
|
|
54
54
|
* 10ms budget. The position block is k=v lines so a regex pass is fine.
|
|
55
55
|
*/
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hegemonart/get-design-done",
|
|
3
|
-
"version": "1.31.
|
|
3
|
+
"version": "1.31.5",
|
|
4
4
|
"description": "A design-quality pipeline for AI coding agents: brief, plan, implement, and verify UI work against your design system.",
|
|
5
5
|
"author": "Hegemon",
|
|
6
6
|
"homepage": "https://github.com/hegemonart/get-design-done",
|
|
@@ -17,21 +17,28 @@
|
|
|
17
17
|
"agents/",
|
|
18
18
|
"skills/",
|
|
19
19
|
"hooks/",
|
|
20
|
-
"scripts/",
|
|
21
20
|
"connections/",
|
|
22
21
|
"reference/",
|
|
23
22
|
"bin/",
|
|
23
|
+
"sdk/",
|
|
24
|
+
"recipes/",
|
|
25
|
+
"docs/i18n/",
|
|
26
|
+
"scripts/lib/",
|
|
27
|
+
"scripts/mcp-servers/",
|
|
28
|
+
"scripts/cli/",
|
|
29
|
+
"scripts/install.cjs",
|
|
24
30
|
"SKILL.md",
|
|
25
31
|
"README.md",
|
|
26
32
|
"CHANGELOG.md",
|
|
27
|
-
"LICENSE"
|
|
33
|
+
"LICENSE",
|
|
34
|
+
"NOTICE"
|
|
28
35
|
],
|
|
29
36
|
"bin": {
|
|
30
37
|
"gdd-events": "./scripts/cli/gdd-events.mjs",
|
|
31
38
|
"gdd-graph": "./bin/gdd-graph",
|
|
32
|
-
"gdd-mcp": "./
|
|
39
|
+
"gdd-mcp": "./bin/gdd-mcp",
|
|
33
40
|
"gdd-sdk": "./bin/gdd-sdk",
|
|
34
|
-
"gdd-state-mcp": "./
|
|
41
|
+
"gdd-state-mcp": "./bin/gdd-state-mcp",
|
|
35
42
|
"get-design-done": "./scripts/install.cjs"
|
|
36
43
|
},
|
|
37
44
|
"publishConfig": {
|
|
@@ -40,26 +47,30 @@
|
|
|
40
47
|
},
|
|
41
48
|
"scripts": {
|
|
42
49
|
"build:bundles": "node scripts/build-distribution-bundles.cjs",
|
|
43
|
-
"
|
|
50
|
+
"build:sdk": "node scripts/build-sdk-bins.cjs",
|
|
51
|
+
"prepack": "npm run build:sdk",
|
|
52
|
+
"postpack": "node scripts/build-sdk-bins.cjs --clean",
|
|
53
|
+
"test": "node --test --experimental-strip-types \"test/suite/**/*.test.cjs\" \"test/suite/**/*.test.ts\"",
|
|
44
54
|
"typecheck": "tsc --noEmit",
|
|
45
55
|
"codegen:schemas": "node --experimental-strip-types scripts/codegen-schema-types.ts",
|
|
46
|
-
"lint:md": "npx --yes markdownlint-cli2 \"**/*.md\" \"#node_modules\" \"#.planning\" \"#.claude\" \"#test
|
|
56
|
+
"lint:md": "npx --yes markdownlint-cli2 \"**/*.md\" \"#node_modules\" \"#.planning\" \"#.claude\" \"#test/fixtures/baselines\"",
|
|
47
57
|
"lint:links": "npx --yes lychee --no-progress --accept 200,206,403,429 \"**/*.md\" || true",
|
|
48
58
|
"lint:agentskills": "node scripts/lint-agentskills-spec.cjs",
|
|
49
59
|
"validate:schemas": "node --experimental-strip-types scripts/validate-schemas.ts",
|
|
50
60
|
"validate:frontmatter": "node --experimental-strip-types scripts/validate-frontmatter.ts agents/",
|
|
51
61
|
"detect:stale-refs": "node scripts/detect-stale-refs.cjs",
|
|
52
62
|
"scan:injection": "node scripts/run-injection-scanner-ci.cjs",
|
|
53
|
-
"test:size-budget": "node --test
|
|
63
|
+
"test:size-budget": "node --test test/suite/agent-size-budget.test.cjs",
|
|
54
64
|
"release:extract-changelog": "node scripts/extract-changelog-section.cjs",
|
|
55
65
|
"verify:version-sync": "node scripts/verify-version-sync.cjs",
|
|
56
66
|
"typecheck:session-runner": "tsc --noEmit",
|
|
57
|
-
"gdd-sdk": "node --experimental-strip-types
|
|
67
|
+
"gdd-sdk": "node --experimental-strip-types sdk/cli/index.ts"
|
|
58
68
|
},
|
|
59
69
|
"devDependencies": {
|
|
60
70
|
"@types/node": "^25.6.0",
|
|
61
71
|
"ajv-cli": "^5.0.0",
|
|
62
72
|
"ajv-formats": "^3.0.1",
|
|
73
|
+
"esbuild": "^0.25.12",
|
|
63
74
|
"json-schema-to-typescript": "^15.0.0",
|
|
64
75
|
"typescript": "^6.0.3"
|
|
65
76
|
},
|
package/recipes/.gitkeep
ADDED
|
File without changes
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://raw.githubusercontent.com/hegemonart/get-design-done/main/reference/schemas/recipe.schema.json",
|
|
4
|
+
"title": "Recipe",
|
|
5
|
+
"description": "Shape of a declarative recipe loaded from recipes/<name>.json by scripts/lib/recipe-loader.cjs (Plan 31-5-03, RECIPE-01 / SC#14). The recipes/ directory ships EMPTY of recipes and is populated downstream by Phase 32 (skill-trigger recipes), Phase 33.6 (per-provider), Phase 26 (per-runtime/per-model), and Phase 23.5 (bandit-arm shape). This is a minimal, forward-compatible envelope: a recipe MUST carry name/version/steps; additionalProperties:true lets the populating phases extend the envelope without breaking the loader contract. Modelled on Storybloq's src/autonomous/recipes/ loader.ts pattern.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": true,
|
|
8
|
+
"required": ["name", "version", "steps"],
|
|
9
|
+
"properties": {
|
|
10
|
+
"name": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"minLength": 1,
|
|
13
|
+
"description": "The recipe identifier. Matches the filename stem (recipes/<name>.json)."
|
|
14
|
+
},
|
|
15
|
+
"version": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"minLength": 1,
|
|
18
|
+
"description": "Recipe/schema version string for forward-compatibility. Lets the loader and downstream phases reason about envelope evolution."
|
|
19
|
+
},
|
|
20
|
+
"steps": {
|
|
21
|
+
"type": "array",
|
|
22
|
+
"description": "The ordered recipe body. Item shape is kept permissive for now — each step is an object carrying at least a `kind` OR an `id` string. Downstream phases (32/33.6/26/23.5) tighten the step contract per their domain.",
|
|
23
|
+
"items": {
|
|
24
|
+
"type": "object",
|
|
25
|
+
"additionalProperties": true,
|
|
26
|
+
"anyOf": [
|
|
27
|
+
{ "required": ["kind"], "properties": { "kind": { "type": "string", "minLength": 1 } } },
|
|
28
|
+
{ "required": ["id"], "properties": { "id": { "type": "string", "minLength": 1 } } }
|
|
29
|
+
]
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -138,7 +138,7 @@ export function compileFilter(terms) {
|
|
|
138
138
|
|
|
139
139
|
async function cmdTail(parsed) {
|
|
140
140
|
const path = resolvePath(parsed.flags.path);
|
|
141
|
-
const { readEvents } = await import('
|
|
141
|
+
const { readEvents } = await import('../../sdk/event-stream/reader.ts');
|
|
142
142
|
if (!parsed.flags.follow) {
|
|
143
143
|
for await (const ev of readEvents({ path })) {
|
|
144
144
|
stdout.write(JSON.stringify(ev) + '\n');
|
|
@@ -188,7 +188,7 @@ async function cmdGrep(parsed) {
|
|
|
188
188
|
return 2;
|
|
189
189
|
}
|
|
190
190
|
const predicate = compileFilter(terms);
|
|
191
|
-
const { readEvents } = await import('
|
|
191
|
+
const { readEvents } = await import('../../sdk/event-stream/reader.ts');
|
|
192
192
|
for await (const ev of readEvents({ path, predicate })) {
|
|
193
193
|
stdout.write(JSON.stringify(ev) + '\n');
|
|
194
194
|
}
|
|
@@ -197,7 +197,7 @@ async function cmdGrep(parsed) {
|
|
|
197
197
|
|
|
198
198
|
async function cmdCat(parsed) {
|
|
199
199
|
const path = resolvePath(parsed.flags.path);
|
|
200
|
-
const { readEvents } = await import('
|
|
200
|
+
const { readEvents } = await import('../../sdk/event-stream/reader.ts');
|
|
201
201
|
for await (const ev of readEvents({ path })) {
|
|
202
202
|
const ts = ev.timestamp ?? '?';
|
|
203
203
|
const tp = ev.type ?? '?';
|
|
@@ -207,7 +207,7 @@ async function cmdCat(parsed) {
|
|
|
207
207
|
}
|
|
208
208
|
|
|
209
209
|
async function cmdListTypes() {
|
|
210
|
-
const { KNOWN_EVENT_TYPES } = await import('
|
|
210
|
+
const { KNOWN_EVENT_TYPES } = await import('../../sdk/event-stream/types.ts');
|
|
211
211
|
for (const t of KNOWN_EVENT_TYPES) stdout.write(t + '\n');
|
|
212
212
|
return 0;
|
|
213
213
|
}
|
|
@@ -236,7 +236,7 @@ async function cmdServe(parsed) {
|
|
|
236
236
|
// Bridge live bus → ws transport. The transport is CommonJS and cannot
|
|
237
237
|
// require .ts directly, so we import the bus here and pass subscribeAll
|
|
238
238
|
// as a callback factory.
|
|
239
|
-
const { subscribeAll } = await import('
|
|
239
|
+
const { subscribeAll } = await import('../../sdk/event-stream/index.ts');
|
|
240
240
|
const subscribe = (handler) => subscribeAll(handler);
|
|
241
241
|
const handle = await mod.startServer({ port, token, tailFrom, subscribe });
|
|
242
242
|
stderr.write(`gdd-events: WebSocket listening on :${port} (auth required)\n`);
|
|
@@ -83,7 +83,7 @@ function clamp01(n) {
|
|
|
83
83
|
function getAppendEvent() {
|
|
84
84
|
try {
|
|
85
85
|
// Resolved relative to this file: `scripts/lib/cache/` → `../event-stream`.
|
|
86
|
-
const m = require('
|
|
86
|
+
const m = require('../../../sdk/event-stream');
|
|
87
87
|
if (m && typeof m.appendEvent === 'function') return m.appendEvent;
|
|
88
88
|
} catch {
|
|
89
89
|
// Swallow — fall through to the no-op below. The event is
|
package/scripts/lib/cli/index.ts
CHANGED
|
@@ -1,167 +1,29 @@
|
|
|
1
|
-
// scripts/lib/cli/index.ts — Plan
|
|
1
|
+
// scripts/lib/cli/index.ts — GDD-DEPRECATION-SHIM (Plan 31-5-06, SDK-05, D-02).
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
3
|
+
// Thin deprecation shim. The real implementation moved to sdk/cli/index.ts
|
|
4
|
+
// in Plan 31-5-04 (SDK consolidation). This file is re-created at the OLD
|
|
5
|
+
// path so undocumented EXTERNAL importers (anyone who reached into
|
|
6
|
+
// node_modules/@hegemonart/get-design-done/scripts/lib/cli/index.ts directly)
|
|
7
|
+
// keep working for one minor grace window.
|
|
6
8
|
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
// exit 3 and print USAGE to stderr.
|
|
9
|
+
// REMOVED IN v1.33.0 (D-02). Grace window: 1.31.5 ships with shims →
|
|
10
|
+
// 1.32.0 still has them → 1.33.0 removes them. Internal callers already use
|
|
11
|
+
// the sdk/ path (Plan 31-5-04/05) — this shim is external-only; 31-5-10's
|
|
12
|
+
// no-stale-internal-refs guard excludes files carrying the
|
|
13
|
+
// GDD-DEPRECATION-SHIM marker above.
|
|
13
14
|
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
// not to throw) and translates to exit code 3.
|
|
15
|
+
// Runs under --experimental-strip-types (the runtime `bin/gdd-sdk` and the
|
|
16
|
+
// test suite both use it), so `export *` re-export is strip-types-clean.
|
|
17
17
|
|
|
18
|
-
import {
|
|
19
|
-
import { runCommand } from './commands/run.ts';
|
|
20
|
-
import { stageCommand } from './commands/stage.ts';
|
|
21
|
-
import { queryCommand } from './commands/query.ts';
|
|
22
|
-
import { auditCommand } from './commands/audit.ts';
|
|
23
|
-
import { initCommand } from './commands/init.ts';
|
|
18
|
+
import { emitWarning } from 'node:process';
|
|
24
19
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
Commands:
|
|
32
|
-
run Run the full design pipeline headlessly.
|
|
33
|
-
stage <name> Run a single stage (brief|explore|plan|design|verify|discuss).
|
|
34
|
-
query <op> Typed STATE.md read operations.
|
|
35
|
-
audit Probe connections + dry-run verify.
|
|
36
|
-
init Bootstrap a new project.
|
|
37
|
-
|
|
38
|
-
Use 'gdd-sdk <command> -h' for command-specific flags.
|
|
39
|
-
|
|
40
|
-
Exit codes (general):
|
|
41
|
-
0 success
|
|
42
|
-
1 halted / regression / already-initialized
|
|
43
|
-
2 awaiting-gate / partial (init)
|
|
44
|
-
3 argument / config error
|
|
45
|
-
`;
|
|
46
|
-
|
|
47
|
-
// ---------------------------------------------------------------------------
|
|
48
|
-
// Deps.
|
|
49
|
-
// ---------------------------------------------------------------------------
|
|
50
|
-
|
|
51
|
-
export interface DispatcherDeps {
|
|
52
|
-
readonly stdout?: NodeJS.WritableStream;
|
|
53
|
-
readonly stderr?: NodeJS.WritableStream;
|
|
54
|
-
readonly commands?: {
|
|
55
|
-
readonly run?: typeof runCommand;
|
|
56
|
-
readonly stage?: typeof stageCommand;
|
|
57
|
-
readonly query?: typeof queryCommand;
|
|
58
|
-
readonly audit?: typeof auditCommand;
|
|
59
|
-
readonly init?: typeof initCommand;
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// ---------------------------------------------------------------------------
|
|
64
|
-
// Dispatcher.
|
|
65
|
-
// ---------------------------------------------------------------------------
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Dispatch a parsed ParsedArgs to the appropriate subcommand. Exported
|
|
69
|
-
* for tests (they can construct a ParsedArgs manually and assert the
|
|
70
|
-
* exit code + captured stdout/stderr).
|
|
71
|
-
*/
|
|
72
|
-
export async function dispatch(
|
|
73
|
-
parsed: ParsedArgs,
|
|
74
|
-
deps: DispatcherDeps = {},
|
|
75
|
-
): Promise<number> {
|
|
76
|
-
const stdout = deps.stdout ?? process.stdout;
|
|
77
|
-
const stderr = deps.stderr ?? process.stderr;
|
|
78
|
-
const commands = {
|
|
79
|
-
run: deps.commands?.run ?? runCommand,
|
|
80
|
-
stage: deps.commands?.stage ?? stageCommand,
|
|
81
|
-
query: deps.commands?.query ?? queryCommand,
|
|
82
|
-
audit: deps.commands?.audit ?? auditCommand,
|
|
83
|
-
init: deps.commands?.init ?? initCommand,
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
// Bare invocation or top-level help → USAGE.
|
|
87
|
-
if (parsed.subcommand === null) {
|
|
88
|
-
stdout.write(USAGE);
|
|
89
|
-
return 0;
|
|
90
|
-
}
|
|
91
|
-
if (
|
|
92
|
-
(parsed.flags['help'] === true || parsed.flags['h'] === true) &&
|
|
93
|
-
// Top-level --help (no subcommand recognized yet; --help before the
|
|
94
|
-
// first positional lands here). Subcommands also honor --help
|
|
95
|
-
// themselves, so this branch only fires for `gdd-sdk --help`.
|
|
96
|
-
parsed.positionals.length === 0 &&
|
|
97
|
-
!KNOWN_SUBCOMMANDS.has(parsed.subcommand)
|
|
98
|
-
) {
|
|
99
|
-
stdout.write(USAGE);
|
|
100
|
-
return 0;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
switch (parsed.subcommand) {
|
|
104
|
-
case 'run':
|
|
105
|
-
return await commands.run(parsed, { stdout, stderr });
|
|
106
|
-
case 'stage':
|
|
107
|
-
return await commands.stage(parsed, { stdout, stderr });
|
|
108
|
-
case 'query':
|
|
109
|
-
return await commands.query(parsed, { stdout, stderr });
|
|
110
|
-
case 'audit':
|
|
111
|
-
return await commands.audit(parsed, { stdout, stderr });
|
|
112
|
-
case 'init':
|
|
113
|
-
return await commands.init(parsed, { stdout, stderr });
|
|
114
|
-
default:
|
|
115
|
-
stderr.write(
|
|
116
|
-
`gdd-sdk: unknown subcommand "${parsed.subcommand}"\n${USAGE}`,
|
|
117
|
-
);
|
|
118
|
-
return 3;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
const KNOWN_SUBCOMMANDS: ReadonlySet<string> = new Set([
|
|
123
|
-
'run',
|
|
124
|
-
'stage',
|
|
125
|
-
'query',
|
|
126
|
-
'audit',
|
|
127
|
-
'init',
|
|
128
|
-
]);
|
|
129
|
-
|
|
130
|
-
// ---------------------------------------------------------------------------
|
|
131
|
-
// Bootstrap entry point — called by bin/gdd-sdk trampoline.
|
|
132
|
-
// ---------------------------------------------------------------------------
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Top-level main. Parses process.argv.slice(2), dispatches, prints
|
|
136
|
-
* USAGE + exit 3 on any uncaught error. Exported so tests can invoke
|
|
137
|
-
* it directly (bypassing the trampoline).
|
|
138
|
-
*/
|
|
139
|
-
export async function main(
|
|
140
|
-
argv: readonly string[] = process.argv.slice(2),
|
|
141
|
-
deps: DispatcherDeps = {},
|
|
142
|
-
): Promise<number> {
|
|
143
|
-
const parsed = parseArgs(argv);
|
|
144
|
-
return await dispatch(parsed, deps);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// ---------------------------------------------------------------------------
|
|
148
|
-
// When executed directly by the trampoline, invoke main() + exit.
|
|
149
|
-
// ---------------------------------------------------------------------------
|
|
150
|
-
|
|
151
|
-
// Only self-invoke when this module IS the entry point. We detect that
|
|
152
|
-
// by checking process.argv[1] (trampoline passes this file's path).
|
|
153
|
-
//
|
|
154
|
-
// `import.meta.url` is the POSIX idiom but this TS runs under --experimental-strip-types
|
|
155
|
-
// as Node16 modules — we use process.argv to stay ESM/CJS-agnostic.
|
|
156
|
-
|
|
157
|
-
const entryPath: string = (process.argv[1] ?? '').replace(/\\/g, '/');
|
|
158
|
-
if (entryPath.endsWith('/scripts/lib/cli/index.ts')) {
|
|
159
|
-
main().then(
|
|
160
|
-
(code) => process.exit(code),
|
|
161
|
-
(err) => {
|
|
162
|
-
// eslint-disable-next-line no-console
|
|
163
|
-
console.error('gdd-sdk: unexpected error:', err);
|
|
164
|
-
process.exit(3);
|
|
165
|
-
},
|
|
20
|
+
let warned = false;
|
|
21
|
+
if (!warned) {
|
|
22
|
+
warned = true;
|
|
23
|
+
emitWarning(
|
|
24
|
+
'scripts/lib/cli/index.ts is deprecated; import sdk/cli instead. Removed in v1.33.0.',
|
|
25
|
+
'DeprecationWarning',
|
|
166
26
|
);
|
|
167
27
|
}
|
|
28
|
+
|
|
29
|
+
export * from '../../../sdk/cli/index.ts';
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
const { writeFileSync, readFileSync, existsSync, mkdirSync, renameSync } = require('node:fs');
|
|
43
43
|
const { dirname, isAbsolute, resolve, join } = require('node:path');
|
|
44
44
|
|
|
45
|
-
const { delayMs } = require('
|
|
45
|
+
const { delayMs } = require('../../../sdk/primitives/jittered-backoff.cjs');
|
|
46
46
|
|
|
47
47
|
const DEFAULT_STATE_PATH = '.design/telemetry/connection-state.json';
|
|
48
48
|
|
|
@@ -27,7 +27,7 @@ import type {
|
|
|
27
27
|
SessionResult,
|
|
28
28
|
SessionRunnerOptions,
|
|
29
29
|
} from '../session-runner/types.ts';
|
|
30
|
-
import { ValidationError } from '
|
|
30
|
+
import { ValidationError } from '../../../sdk/errors/index.ts';
|
|
31
31
|
import { getLogger } from '../logger/index.ts';
|
|
32
32
|
|
|
33
33
|
import type {
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
// Consumers: `discuss` skill (Plan 21-08 / future) + `gdd-sdk discuss`
|
|
28
28
|
// CLI subcommand (Plan 21-09).
|
|
29
29
|
|
|
30
|
-
import { OperationFailedError } from '
|
|
30
|
+
import { OperationFailedError } from '../../../sdk/errors/index.ts';
|
|
31
31
|
import { getLogger } from '../logger/index.ts';
|
|
32
32
|
import { resolveConcurrency } from '../parallelism-engine/concurrency-tuner.cjs';
|
|
33
33
|
|