@hegemonart/get-design-done 1.31.0 → 1.32.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 (180) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +75 -0
  4. package/NOTICE +262 -0
  5. package/README.md +13 -1
  6. package/SKILL.md +4 -0
  7. package/agents/design-authority-watcher.md +1 -1
  8. package/agents/perf-analyzer.md +2 -2
  9. package/bin/gdd-mcp +78 -0
  10. package/bin/gdd-sdk +34 -24
  11. package/bin/gdd-state-mcp +78 -0
  12. package/{README.de.md → docs/i18n/README.de.md} +1 -1
  13. package/{README.fr.md → docs/i18n/README.fr.md} +1 -1
  14. package/{README.it.md → docs/i18n/README.it.md} +1 -1
  15. package/{README.ja.md → docs/i18n/README.ja.md} +1 -1
  16. package/{README.ko.md → docs/i18n/README.ko.md} +1 -1
  17. package/{README.zh-CN.md → docs/i18n/README.zh-CN.md} +1 -1
  18. package/hooks/_hook-emit.js +1 -1
  19. package/hooks/budget-enforcer.ts +5 -5
  20. package/hooks/context-exhaustion.ts +2 -2
  21. package/hooks/gdd-precompact-snapshot.js +3 -3
  22. package/hooks/gdd-read-injection-scanner.ts +2 -2
  23. package/hooks/gdd-sessionstart-recap.js +1 -1
  24. package/hooks/gdd-turn-closeout.js +1 -1
  25. package/hooks/hooks.json +9 -0
  26. package/hooks/inject-using-gdd.sh +72 -0
  27. package/hooks/run-hook.cmd +35 -0
  28. package/package.json +20 -9
  29. package/recipes/.gitkeep +0 -0
  30. package/reference/schemas/events.schema.json +63 -1
  31. package/reference/schemas/recipe.schema.json +33 -0
  32. package/scripts/cli/gdd-events.mjs +5 -5
  33. package/scripts/lib/cache/gdd-cache-manager.cjs +1 -1
  34. package/scripts/lib/cli/index.ts +22 -160
  35. package/scripts/lib/connection-probe/index.cjs +1 -1
  36. package/scripts/lib/discuss-parallel-runner/aggregator.ts +1 -1
  37. package/scripts/lib/discuss-parallel-runner/index.ts +1 -1
  38. package/scripts/lib/error-classifier.cjs +24 -227
  39. package/scripts/lib/event-stream/index.ts +25 -193
  40. package/scripts/lib/gdd-errors/index.ts +24 -213
  41. package/scripts/lib/gdd-state/index.ts +23 -161
  42. package/scripts/lib/health-mirror/index.cjs +79 -1
  43. package/scripts/lib/iteration-budget.cjs +23 -199
  44. package/scripts/lib/jittered-backoff.cjs +24 -107
  45. package/scripts/lib/lockfile.cjs +23 -195
  46. package/scripts/lib/logger/index.ts +1 -1
  47. package/scripts/lib/parallelism-engine/concurrency-tuner.cjs +1 -1
  48. package/scripts/lib/perf-analyzer/index.cjs +1 -1
  49. package/scripts/lib/pipeline-runner/index.ts +4 -4
  50. package/scripts/lib/pipeline-runner/state-machine.ts +1 -1
  51. package/scripts/lib/prompt-dedup/index.cjs +1 -1
  52. package/scripts/lib/rate-guard.cjs +2 -2
  53. package/scripts/lib/recipe-loader.cjs +142 -0
  54. package/scripts/lib/session-runner/errors.ts +3 -3
  55. package/scripts/lib/session-runner/index.ts +3 -3
  56. package/scripts/lib/session-runner/transcript.ts +1 -1
  57. package/scripts/lib/tool-scoping/index.ts +1 -1
  58. package/scripts/mcp-servers/gdd-mcp/server.ts +29 -311
  59. package/scripts/mcp-servers/gdd-state/server.ts +28 -282
  60. package/sdk/README.md +45 -0
  61. package/{scripts/lib → sdk}/cli/commands/audit.ts +3 -3
  62. package/{scripts/lib → sdk}/cli/commands/init.ts +3 -3
  63. package/{scripts/lib → sdk}/cli/commands/query.ts +4 -4
  64. package/{scripts/lib → sdk}/cli/commands/run.ts +5 -5
  65. package/{scripts/lib → sdk}/cli/commands/stage.ts +5 -5
  66. package/sdk/cli/index.js +8091 -0
  67. package/sdk/cli/index.ts +172 -0
  68. package/{scripts/lib → sdk}/cli/parse-args.ts +2 -2
  69. package/{scripts/lib/gdd-errors → sdk/errors}/classification.ts +1 -1
  70. package/sdk/errors/index.ts +218 -0
  71. package/{scripts/lib → sdk}/event-stream/emitter.ts +1 -1
  72. package/sdk/event-stream/index.ts +197 -0
  73. package/{scripts/lib → sdk}/event-stream/reader.ts +1 -1
  74. package/{scripts/lib → sdk}/event-stream/types.ts +2 -2
  75. package/{scripts/lib → sdk}/event-stream/writer.ts +1 -1
  76. package/sdk/index.ts +19 -0
  77. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/README.md +3 -3
  78. package/sdk/mcp/gdd-mcp/server.js +1966 -0
  79. package/sdk/mcp/gdd-mcp/server.ts +325 -0
  80. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_cycle_recap.ts +3 -3
  81. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_decisions_list.ts +2 -2
  82. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_events_tail.ts +3 -3
  83. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_health.ts +2 -2
  84. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_intel_get.ts +2 -2
  85. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_learnings_digest.ts +2 -2
  86. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_phase_current.ts +2 -2
  87. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_phases_list.ts +2 -2
  88. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_plans_list.ts +2 -2
  89. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_reflections_latest.ts +2 -2
  90. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_status.ts +3 -3
  91. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_telemetry_query.ts +3 -3
  92. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/index.ts +2 -2
  93. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/shared.ts +3 -3
  94. package/sdk/mcp/gdd-state/server.js +2790 -0
  95. package/sdk/mcp/gdd-state/server.ts +294 -0
  96. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/add_blocker.ts +3 -3
  97. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/add_decision.ts +3 -3
  98. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/add_must_have.ts +3 -3
  99. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/checkpoint.ts +2 -2
  100. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/frontmatter_update.ts +2 -2
  101. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/get.ts +3 -3
  102. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/index.ts +1 -1
  103. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/probe_connections.ts +3 -3
  104. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/resolve_blocker.ts +3 -3
  105. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/set_status.ts +2 -2
  106. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/shared.ts +8 -8
  107. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/transition_stage.ts +4 -4
  108. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/update_progress.ts +2 -2
  109. package/sdk/primitives/error-classifier.cjs +232 -0
  110. package/sdk/primitives/iteration-budget.cjs +205 -0
  111. package/sdk/primitives/jittered-backoff.cjs +112 -0
  112. package/sdk/primitives/lockfile.cjs +201 -0
  113. package/{scripts/lib/gdd-state → sdk/state}/gates.ts +1 -1
  114. package/sdk/state/index.ts +167 -0
  115. package/{scripts/lib/gdd-state → sdk/state}/lockfile.ts +1 -1
  116. package/{scripts/lib/gdd-state → sdk/state}/mutator.ts +1 -1
  117. package/{scripts/lib/gdd-state → sdk/state}/parser.ts +1 -1
  118. package/{scripts/lib/gdd-state → sdk/state}/types.ts +4 -4
  119. package/skills/audit/SKILL.md +13 -0
  120. package/skills/brief/SKILL.md +25 -0
  121. package/skills/design/SKILL.md +17 -0
  122. package/skills/discuss/SKILL.md +13 -0
  123. package/skills/explore/SKILL.md +17 -0
  124. package/skills/health/SKILL.md +6 -0
  125. package/skills/plan/SKILL.md +25 -0
  126. package/skills/quality-gate/SKILL.md +2 -2
  127. package/skills/router/SKILL.md +4 -0
  128. package/skills/router/router-pick-emitter.md +78 -0
  129. package/skills/using-gdd/SKILL.md +78 -0
  130. package/skills/verify/SKILL.md +17 -0
  131. package/scripts/aggregate-agent-metrics.ts +0 -282
  132. package/scripts/bootstrap-manifest.txt +0 -3
  133. package/scripts/bootstrap.sh +0 -80
  134. package/scripts/build-distribution-bundles.cjs +0 -549
  135. package/scripts/build-intel.cjs +0 -486
  136. package/scripts/codegen-schema-types.ts +0 -149
  137. package/scripts/detect-stale-refs.cjs +0 -107
  138. package/scripts/e2e/run-headless.ts +0 -514
  139. package/scripts/extract-changelog-section.cjs +0 -58
  140. package/scripts/gsd-cleanup-incubator.cjs +0 -367
  141. package/scripts/injection-patterns.cjs +0 -58
  142. package/scripts/lint-agentskills-spec.cjs +0 -457
  143. package/scripts/release-smoke-test.cjs +0 -200
  144. package/scripts/rollback-release.sh +0 -42
  145. package/scripts/run-injection-scanner-ci.cjs +0 -83
  146. package/scripts/tests/test-authority-rejected-kinds.sh +0 -58
  147. package/scripts/tests/test-authority-watcher-diff.sh +0 -113
  148. package/scripts/tests/test-motion-provenance.sh +0 -64
  149. package/scripts/validate-frontmatter.ts +0 -409
  150. package/scripts/validate-incubator-scope.cjs +0 -133
  151. package/scripts/validate-schemas.ts +0 -401
  152. package/scripts/validate-skill-length.cjs +0 -283
  153. package/scripts/verify-version-sync.cjs +0 -30
  154. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_cycle_recap.schema.json +0 -0
  155. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_decisions_list.schema.json +0 -0
  156. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_events_tail.schema.json +0 -0
  157. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_health.schema.json +0 -0
  158. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_intel_get.schema.json +0 -0
  159. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_learnings_digest.schema.json +0 -0
  160. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_phase_current.schema.json +0 -0
  161. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_phases_list.schema.json +0 -0
  162. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_plans_list.schema.json +0 -0
  163. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_reflections_latest.schema.json +0 -0
  164. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_status.schema.json +0 -0
  165. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_telemetry_query.schema.json +0 -0
  166. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/add_blocker.schema.json +0 -0
  167. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/add_decision.schema.json +0 -0
  168. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/add_must_have.schema.json +0 -0
  169. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/checkpoint.schema.json +0 -0
  170. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/frontmatter_update.schema.json +0 -0
  171. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/get.schema.json +0 -0
  172. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/probe_connections.schema.json +0 -0
  173. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/resolve_blocker.schema.json +0 -0
  174. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/set_status.schema.json +0 -0
  175. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/transition_stage.schema.json +0 -0
  176. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/update_progress.schema.json +0 -0
  177. /package/{scripts/lib → sdk/primitives}/error-classifier.d.cts +0 -0
  178. /package/{scripts/lib → sdk/primitives}/iteration-budget.d.cts +0 -0
  179. /package/{scripts/lib → sdk/primitives}/jittered-backoff.d.cts +0 -0
  180. /package/{scripts/lib → sdk/primitives}/lockfile.d.cts +0 -0
@@ -1,167 +1,29 @@
1
- // scripts/lib/cli/index.ts — Plan 21-09 Task 7 (SDK-21).
1
+ // scripts/lib/cli/index.ts — GDD-DEPRECATION-SHIM (Plan 31-5-06, SDK-05, D-02).
2
2
  //
3
- // Main dispatcher for the `gdd-sdk` CLI. Invoked by `bin/gdd-sdk` (the
4
- // CJS trampoline) with `--experimental-strip-types` so TS runs without
5
- // a build step.
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
- // Responsibilities:
8
- // * Parse argv via parseArgs().
9
- // * Route by first positional to the matching subcommand module.
10
- // * Print top-level USAGE on bare `gdd-sdk` / `-h` / `--help`.
11
- // * Exit with the subcommand's return code. Unknown subcommands
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
- // The bottom of this file has the `main()` bootstrap that the trampoline
15
- // invokes. It catches any accidental throw (subcommands are contracted
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 { parseArgs, type ParsedArgs } from './parse-args.ts';
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
- // Top-level USAGE.
27
- // ---------------------------------------------------------------------------
28
-
29
- export const USAGE = `gdd-sdk <command> [flags]
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('../jittered-backoff.cjs');
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 '../gdd-errors/index.ts';
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 '../gdd-errors/index.ts';
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
 
@@ -1,232 +1,29 @@
1
- // scripts/lib/error-classifier.cjs
2
- //
3
- // Plan 20-14 — classify raw errors into a recovery-action vocabulary.
4
- //
5
- // Plan 20-04 shipped the GDDError taxonomy (ValidationError /
6
- // StateConflictError / OperationFailedError). This module is one layer
7
- // lower: it maps LOW-LEVEL errors (fetch rejections, Anthropic API
8
- // responses, Node errno rejections) onto a small enum that recovery
9
- // code can switch on without needing to know which SDK produced the
10
- // error.
11
- //
12
- // Consumers (e.g. budget-enforcer retry, figma probe retry, MCP
13
- // transport) check `classify(err).reason` and decide whether to retry,
14
- // compress, surface, or fail.
1
+ 'use strict';
2
+ // scripts/lib/error-classifier.cjs — GDD-DEPRECATION-SHIM (Plan 31-5-06, SDK-05, D-02).
15
3
  //
16
- // Classification rules evaluated in order; first match wins:
17
- // 1. HTTP 429 OR message ~ /rate.?limit/ → RATE_LIMITED (retryable)
18
- // 2. HTTP 413 OR /context.?(length|window|overflow)/
19
- // OR /context_length_exceeded/ → CONTEXT_OVERFLOW (retryable with compression)
20
- // 3. HTTP 401/403 → AUTH_ERROR (NOT retryable)
21
- // 4. /tool not found|unknown tool/ → TOOL_NOT_FOUND (NOT retryable)
22
- // 5. HTTP 5xx OR errno ECONNRESET/ETIMEDOUT/EAI_AGAIN/ECONNREFUSED
23
- // OR /network|timeout|socket/ → NETWORK_TRANSIENT (retryable)
24
- // 6. HTTP 4xx (non-auth, non-rate, non-overflow) → VALIDATION (NOT retryable)
25
- // 7. HTTP >= 400 with no other match → NETWORK_PERMANENT (NOT retryable)
26
- // 8. Anything else (null, undefined, plain Error) → UNKNOWN (NOT retryable)
4
+ // Thin deprecation shim. The real implementation moved to
5
+ // sdk/primitives/error-classifier.cjs in Plan 31-5-04 (SDK consolidation).
6
+ // This file is re-created at the OLD path so undocumented EXTERNAL importers
7
+ // (anyone who reached into node_modules/@hegemonart/get-design-done/scripts/
8
+ // lib/error-classifier.cjs directly) keep working for one minor grace window.
27
9
  //
28
- // Rule order matters: the tool-not-found string can land inside
29
- // otherwise-validation-shaped errors, so it's checked early. Anthropic
30
- // "context_length_exceeded" returns HTTP 400 in some surfaces and HTTP
31
- // 413 in others rule 2 catches it either way.
10
+ // REMOVED IN v1.33.0 (D-02). Grace window: 1.31.5 ships with shims
11
+ // 1.32.0 still has them 1.33.0 removes them. Internal callers already use
12
+ // the sdk/ path (Plan 31-5-04/05) this shim is external-only and 31-5-10's
13
+ // no-stale-internal-refs guard excludes files carrying the GDD-DEPRECATION-SHIM
14
+ // marker above.
32
15
  //
33
- // Reference: `reference/error-recovery.md` describes the protocol layer
34
- // that sits on top of this module.
35
-
36
- 'use strict';
37
-
38
- /**
39
- * @readonly
40
- * @enum {string}
41
- */
42
- const FailoverReason = Object.freeze({
43
- RATE_LIMITED: 'rate_limited',
44
- CONTEXT_OVERFLOW: 'context_overflow',
45
- AUTH_ERROR: 'auth_error',
46
- NETWORK_TRANSIENT: 'network_transient',
47
- NETWORK_PERMANENT: 'network_permanent',
48
- TOOL_NOT_FOUND: 'tool_not_found',
49
- VALIDATION: 'validation',
50
- UNKNOWN: 'unknown',
51
- });
52
-
53
- /** Suggested actions per reason — keyed by FailoverReason. */
54
- const SUGGESTED_ACTIONS = Object.freeze({
55
- [FailoverReason.RATE_LIMITED]:
56
- 'consult scripts/lib/rate-guard.cjs → blockUntilReady(provider); then retry with scripts/lib/jittered-backoff.cjs',
57
- [FailoverReason.CONTEXT_OVERFLOW]:
58
- 'compress context (drop oldest non-system turns; target 50% reduction) and retry once',
59
- [FailoverReason.AUTH_ERROR]:
60
- 'surface to user — do not retry; credentials or OAuth session need refresh',
61
- [FailoverReason.NETWORK_TRANSIENT]:
62
- 'retry with scripts/lib/jittered-backoff.cjs; max 3 attempts',
63
- [FailoverReason.NETWORK_PERMANENT]:
64
- 'surface to user; do not retry — endpoint is wrong or resource is gone',
65
- [FailoverReason.TOOL_NOT_FOUND]:
66
- 'do not retry; verify tool name and MCP registration',
67
- [FailoverReason.VALIDATION]:
68
- 'do not retry same input; surface validation detail to caller',
69
- [FailoverReason.UNKNOWN]:
70
- 'surface to user — cannot determine safe recovery action',
71
- });
72
-
73
- /** Which reasons are safe to retry by policy. */
74
- const RETRYABLE = Object.freeze({
75
- [FailoverReason.RATE_LIMITED]: true,
76
- [FailoverReason.CONTEXT_OVERFLOW]: true,
77
- [FailoverReason.NETWORK_TRANSIENT]: true,
78
- [FailoverReason.AUTH_ERROR]: false,
79
- [FailoverReason.NETWORK_PERMANENT]: false,
80
- [FailoverReason.TOOL_NOT_FOUND]: false,
81
- [FailoverReason.VALIDATION]: false,
82
- [FailoverReason.UNKNOWN]: false,
83
- });
84
-
85
- /** Extract a numeric HTTP status from an error shape. Returns null on miss. */
86
- function statusOf(err) {
87
- if (err === null || err === undefined) return null;
88
- if (typeof err !== 'object') return null;
89
- // Direct status / statusCode field.
90
- if (Number.isFinite(err.status)) return Number(err.status);
91
- if (Number.isFinite(err.statusCode)) return Number(err.statusCode);
92
- // Fetch / node-fetch responses wrap status under .response.
93
- if (err.response && typeof err.response === 'object') {
94
- if (Number.isFinite(err.response.status)) return Number(err.response.status);
95
- if (Number.isFinite(err.response.statusCode)) return Number(err.response.statusCode);
96
- }
97
- return null;
98
- }
99
-
100
- /** Extract a string message; tolerant of anything. */
101
- function messageOf(err) {
102
- if (err === null || err === undefined) return '';
103
- if (typeof err === 'string') return err;
104
- if (typeof err === 'object') {
105
- // Gather every string-ish field in priority order; join with ' | ' so
106
- // classification regexes can match against any of them without the
107
- // caller needing to know which SDK shaped the error. OpenAI-style
108
- // wraps the interesting discriminator in `error.code` while keeping
109
- // a generic top-level message; the join lets both contribute.
110
- const parts = [];
111
- if (typeof err.message === 'string' && err.message.length > 0) parts.push(err.message);
112
- if (err.error && typeof err.error === 'object') {
113
- if (typeof err.error.code === 'string') parts.push(err.error.code);
114
- if (typeof err.error.type === 'string') parts.push(err.error.type);
115
- if (typeof err.error.message === 'string') parts.push(err.error.message);
116
- }
117
- // Only use top-level `code` when it is NOT an errno (errnoOf handles
118
- // those). Errnos always match /^E[A-Z0-9_]+$/, so filter them out.
119
- if (typeof err.code === 'string' && !/^E[A-Z0-9_]+$/.test(err.code)) {
120
- parts.push(err.code);
121
- }
122
- if (parts.length > 0) return parts.join(' | ');
123
- }
124
- return '';
125
- }
126
-
127
- /** Extract a low-level errno code (ECONNRESET, ETIMEDOUT, ...). */
128
- function errnoOf(err) {
129
- if (err === null || err === undefined || typeof err !== 'object') return '';
130
- if (typeof err.code === 'string' && /^E[A-Z0-9_]+$/.test(err.code)) return err.code;
131
- // fetch native in newer Node wraps the cause
132
- if (err.cause && typeof err.cause === 'object') {
133
- const code = err.cause.code;
134
- if (typeof code === 'string' && /^E[A-Z0-9_]+$/.test(code)) return code;
135
- }
136
- return '';
137
- }
138
-
139
- /**
140
- * Classify a raw error into a {@link FailoverReason}.
141
- *
142
- * @param {unknown} err
143
- * @returns {{reason: string, retryable: boolean, suggestedAction: string, raw: unknown}}
144
- */
145
- function classify(err) {
146
- const status = statusOf(err);
147
- const message = messageOf(err).toLowerCase();
148
- const errno = errnoOf(err);
149
-
150
- // 1. Rate limit.
151
- if (status === 429 || /rate.?limit/.test(message) || /too many requests/.test(message)) {
152
- return build(FailoverReason.RATE_LIMITED, err);
153
- }
154
-
155
- // 2. Context overflow. Anthropic returns 400 with type=invalid_request and
156
- // message containing "prompt is too long"; OpenAI returns 400 with
157
- // code=context_length_exceeded; some edge surfaces use 413.
158
- if (
159
- status === 413 ||
160
- /context_length_exceeded/.test(message) ||
161
- /context.{0,10}(length|window|overflow|too.?long)/.test(message) ||
162
- /prompt is too long/.test(message) ||
163
- /maximum context length/.test(message)
164
- ) {
165
- return build(FailoverReason.CONTEXT_OVERFLOW, err);
166
- }
167
-
168
- // 3. Auth.
169
- if (status === 401 || status === 403) {
170
- return build(FailoverReason.AUTH_ERROR, err);
171
- }
172
- if (
173
- /not authenticated/.test(message) ||
174
- /invalid[_ ]api[_ ]key/.test(message) ||
175
- /unauthorized/.test(message) ||
176
- /authentication/.test(message)
177
- ) {
178
- return build(FailoverReason.AUTH_ERROR, err);
179
- }
180
-
181
- // 4. Tool not found.
182
- if (/tool not found/.test(message) || /unknown tool/.test(message) || /no such tool/.test(message)) {
183
- return build(FailoverReason.TOOL_NOT_FOUND, err);
184
- }
185
-
186
- // 5. Network transient: 5xx or low-level errno.
187
- if (typeof status === 'number' && status >= 500 && status < 600) {
188
- return build(FailoverReason.NETWORK_TRANSIENT, err);
189
- }
190
- if (
191
- errno === 'ECONNRESET' ||
192
- errno === 'ETIMEDOUT' ||
193
- errno === 'EAI_AGAIN' ||
194
- errno === 'ECONNREFUSED' ||
195
- errno === 'ENETUNREACH' ||
196
- errno === 'EPIPE'
197
- ) {
198
- return build(FailoverReason.NETWORK_TRANSIENT, err);
199
- }
200
- if (/\bsocket\b/.test(message) || /network/.test(message) || /\btimeout\b/.test(message)) {
201
- return build(FailoverReason.NETWORK_TRANSIENT, err);
202
- }
203
-
204
- // 6. Other 4xx → validation.
205
- if (typeof status === 'number' && status >= 400 && status < 500) {
206
- return build(FailoverReason.VALIDATION, err);
207
- }
208
-
209
- // 7. Other >= 400 (e.g. 6xx exotic gateway codes).
210
- if (typeof status === 'number' && status >= 400) {
211
- return build(FailoverReason.NETWORK_PERMANENT, err);
212
- }
213
-
214
- // 8. Fallthrough.
215
- return build(FailoverReason.UNKNOWN, err);
216
- }
217
-
218
- function build(reason, raw) {
219
- return {
220
- reason,
221
- retryable: RETRYABLE[reason] === true,
222
- suggestedAction: SUGGESTED_ACTIONS[reason],
223
- raw,
224
- };
16
+ // Emits a DeprecationWarning exactly ONCE per process: the module-level
17
+ // `warned` flag plus Node's module cache (this file is evaluated once per
18
+ // process regardless of how many times it is required).
19
+
20
+ let warned = false;
21
+ if (!warned) {
22
+ warned = true;
23
+ process.emitWarning(
24
+ 'scripts/lib/error-classifier.cjs is deprecated; import sdk/primitives/error-classifier instead. Removed in v1.33.0.',
25
+ 'DeprecationWarning',
26
+ );
225
27
  }
226
28
 
227
- module.exports = {
228
- FailoverReason,
229
- classify,
230
- SUGGESTED_ACTIONS,
231
- RETRYABLE,
232
- };
29
+ module.exports = require('../../sdk/primitives/error-classifier.cjs');