@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.
Files changed (163) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +44 -0
  4. package/NOTICE +224 -0
  5. package/README.md +1 -1
  6. package/agents/design-authority-watcher.md +1 -1
  7. package/agents/perf-analyzer.md +2 -2
  8. package/bin/gdd-mcp +78 -0
  9. package/bin/gdd-sdk +34 -24
  10. package/bin/gdd-state-mcp +78 -0
  11. package/{README.de.md → docs/i18n/README.de.md} +1 -1
  12. package/{README.fr.md → docs/i18n/README.fr.md} +1 -1
  13. package/{README.it.md → docs/i18n/README.it.md} +1 -1
  14. package/{README.ja.md → docs/i18n/README.ja.md} +1 -1
  15. package/{README.ko.md → docs/i18n/README.ko.md} +1 -1
  16. package/{README.zh-CN.md → docs/i18n/README.zh-CN.md} +1 -1
  17. package/hooks/_hook-emit.js +1 -1
  18. package/hooks/budget-enforcer.ts +5 -5
  19. package/hooks/context-exhaustion.ts +2 -2
  20. package/hooks/gdd-precompact-snapshot.js +3 -3
  21. package/hooks/gdd-read-injection-scanner.ts +2 -2
  22. package/hooks/gdd-sessionstart-recap.js +1 -1
  23. package/hooks/gdd-turn-closeout.js +1 -1
  24. package/package.json +20 -9
  25. package/recipes/.gitkeep +0 -0
  26. package/reference/schemas/recipe.schema.json +33 -0
  27. package/scripts/cli/gdd-events.mjs +5 -5
  28. package/scripts/lib/cache/gdd-cache-manager.cjs +1 -1
  29. package/scripts/lib/cli/index.ts +22 -160
  30. package/scripts/lib/connection-probe/index.cjs +1 -1
  31. package/scripts/lib/discuss-parallel-runner/aggregator.ts +1 -1
  32. package/scripts/lib/discuss-parallel-runner/index.ts +1 -1
  33. package/scripts/lib/error-classifier.cjs +24 -227
  34. package/scripts/lib/event-stream/index.ts +25 -193
  35. package/scripts/lib/gdd-errors/index.ts +24 -213
  36. package/scripts/lib/gdd-state/index.ts +23 -161
  37. package/scripts/lib/iteration-budget.cjs +23 -199
  38. package/scripts/lib/jittered-backoff.cjs +24 -107
  39. package/scripts/lib/lockfile.cjs +23 -195
  40. package/scripts/lib/logger/index.ts +1 -1
  41. package/scripts/lib/parallelism-engine/concurrency-tuner.cjs +1 -1
  42. package/scripts/lib/perf-analyzer/index.cjs +1 -1
  43. package/scripts/lib/pipeline-runner/index.ts +4 -4
  44. package/scripts/lib/pipeline-runner/state-machine.ts +1 -1
  45. package/scripts/lib/prompt-dedup/index.cjs +1 -1
  46. package/scripts/lib/rate-guard.cjs +2 -2
  47. package/scripts/lib/recipe-loader.cjs +142 -0
  48. package/scripts/lib/session-runner/errors.ts +3 -3
  49. package/scripts/lib/session-runner/index.ts +3 -3
  50. package/scripts/lib/session-runner/transcript.ts +1 -1
  51. package/scripts/lib/tool-scoping/index.ts +1 -1
  52. package/scripts/mcp-servers/gdd-mcp/server.ts +29 -311
  53. package/scripts/mcp-servers/gdd-state/server.ts +28 -282
  54. package/sdk/README.md +45 -0
  55. package/{scripts/lib → sdk}/cli/commands/audit.ts +3 -3
  56. package/{scripts/lib → sdk}/cli/commands/init.ts +3 -3
  57. package/{scripts/lib → sdk}/cli/commands/query.ts +4 -4
  58. package/{scripts/lib → sdk}/cli/commands/run.ts +5 -5
  59. package/{scripts/lib → sdk}/cli/commands/stage.ts +5 -5
  60. package/sdk/cli/index.js +8091 -0
  61. package/sdk/cli/index.ts +172 -0
  62. package/{scripts/lib → sdk}/cli/parse-args.ts +2 -2
  63. package/{scripts/lib/gdd-errors → sdk/errors}/classification.ts +1 -1
  64. package/sdk/errors/index.ts +218 -0
  65. package/{scripts/lib → sdk}/event-stream/emitter.ts +1 -1
  66. package/sdk/event-stream/index.ts +197 -0
  67. package/{scripts/lib → sdk}/event-stream/reader.ts +1 -1
  68. package/{scripts/lib → sdk}/event-stream/types.ts +2 -2
  69. package/{scripts/lib → sdk}/event-stream/writer.ts +1 -1
  70. package/sdk/index.ts +19 -0
  71. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/README.md +3 -3
  72. package/sdk/mcp/gdd-mcp/server.js +1924 -0
  73. package/sdk/mcp/gdd-mcp/server.ts +325 -0
  74. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_cycle_recap.ts +3 -3
  75. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_decisions_list.ts +2 -2
  76. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_events_tail.ts +3 -3
  77. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_health.ts +2 -2
  78. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_intel_get.ts +2 -2
  79. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_learnings_digest.ts +2 -2
  80. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_phase_current.ts +2 -2
  81. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_phases_list.ts +2 -2
  82. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_plans_list.ts +2 -2
  83. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_reflections_latest.ts +2 -2
  84. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_status.ts +3 -3
  85. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/gdd_telemetry_query.ts +3 -3
  86. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/index.ts +2 -2
  87. package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/tools/shared.ts +3 -3
  88. package/sdk/mcp/gdd-state/server.js +2790 -0
  89. package/sdk/mcp/gdd-state/server.ts +294 -0
  90. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/add_blocker.ts +3 -3
  91. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/add_decision.ts +3 -3
  92. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/add_must_have.ts +3 -3
  93. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/checkpoint.ts +2 -2
  94. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/frontmatter_update.ts +2 -2
  95. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/get.ts +3 -3
  96. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/index.ts +1 -1
  97. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/probe_connections.ts +3 -3
  98. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/resolve_blocker.ts +3 -3
  99. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/set_status.ts +2 -2
  100. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/shared.ts +8 -8
  101. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/transition_stage.ts +4 -4
  102. package/{scripts/mcp-servers → sdk/mcp}/gdd-state/tools/update_progress.ts +2 -2
  103. package/sdk/primitives/error-classifier.cjs +232 -0
  104. package/sdk/primitives/iteration-budget.cjs +205 -0
  105. package/sdk/primitives/jittered-backoff.cjs +112 -0
  106. package/sdk/primitives/lockfile.cjs +201 -0
  107. package/{scripts/lib/gdd-state → sdk/state}/gates.ts +1 -1
  108. package/sdk/state/index.ts +167 -0
  109. package/{scripts/lib/gdd-state → sdk/state}/lockfile.ts +1 -1
  110. package/{scripts/lib/gdd-state → sdk/state}/mutator.ts +1 -1
  111. package/{scripts/lib/gdd-state → sdk/state}/parser.ts +1 -1
  112. package/{scripts/lib/gdd-state → sdk/state}/types.ts +4 -4
  113. package/skills/quality-gate/SKILL.md +2 -2
  114. package/scripts/aggregate-agent-metrics.ts +0 -282
  115. package/scripts/bootstrap-manifest.txt +0 -3
  116. package/scripts/bootstrap.sh +0 -80
  117. package/scripts/build-distribution-bundles.cjs +0 -549
  118. package/scripts/build-intel.cjs +0 -486
  119. package/scripts/codegen-schema-types.ts +0 -149
  120. package/scripts/detect-stale-refs.cjs +0 -107
  121. package/scripts/e2e/run-headless.ts +0 -514
  122. package/scripts/extract-changelog-section.cjs +0 -58
  123. package/scripts/gsd-cleanup-incubator.cjs +0 -367
  124. package/scripts/injection-patterns.cjs +0 -58
  125. package/scripts/lint-agentskills-spec.cjs +0 -457
  126. package/scripts/release-smoke-test.cjs +0 -200
  127. package/scripts/rollback-release.sh +0 -42
  128. package/scripts/run-injection-scanner-ci.cjs +0 -83
  129. package/scripts/tests/test-authority-rejected-kinds.sh +0 -58
  130. package/scripts/tests/test-authority-watcher-diff.sh +0 -113
  131. package/scripts/tests/test-motion-provenance.sh +0 -64
  132. package/scripts/validate-frontmatter.ts +0 -409
  133. package/scripts/validate-incubator-scope.cjs +0 -133
  134. package/scripts/validate-schemas.ts +0 -401
  135. package/scripts/validate-skill-length.cjs +0 -283
  136. package/scripts/verify-version-sync.cjs +0 -30
  137. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_cycle_recap.schema.json +0 -0
  138. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_decisions_list.schema.json +0 -0
  139. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_events_tail.schema.json +0 -0
  140. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_health.schema.json +0 -0
  141. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_intel_get.schema.json +0 -0
  142. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_learnings_digest.schema.json +0 -0
  143. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_phase_current.schema.json +0 -0
  144. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_phases_list.schema.json +0 -0
  145. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_plans_list.schema.json +0 -0
  146. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_reflections_latest.schema.json +0 -0
  147. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_status.schema.json +0 -0
  148. /package/{scripts/mcp-servers → sdk/mcp}/gdd-mcp/schemas/gdd_telemetry_query.schema.json +0 -0
  149. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/add_blocker.schema.json +0 -0
  150. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/add_decision.schema.json +0 -0
  151. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/add_must_have.schema.json +0 -0
  152. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/checkpoint.schema.json +0 -0
  153. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/frontmatter_update.schema.json +0 -0
  154. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/get.schema.json +0 -0
  155. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/probe_connections.schema.json +0 -0
  156. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/resolve_blocker.schema.json +0 -0
  157. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/set_status.schema.json +0 -0
  158. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/transition_stage.schema.json +0 -0
  159. /package/{scripts/mcp-servers → sdk/mcp}/gdd-state/schemas/update_progress.schema.json +0 -0
  160. /package/{scripts/lib → sdk/primitives}/error-classifier.d.cts +0 -0
  161. /package/{scripts/lib → sdk/primitives}/iteration-budget.d.cts +0 -0
  162. /package/{scripts/lib → sdk/primitives}/jittered-backoff.d.cts +0 -0
  163. /package/{scripts/lib → sdk/primitives}/lockfile.d.cts +0 -0
@@ -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');
@@ -1,197 +1,29 @@
1
- // scripts/lib/event-stream/index.ts — public API for the Phase 20+
2
- // telemetry stream (Plan 20-06, SDK-08).
1
+ // scripts/lib/event-stream/index.ts — GDD-DEPRECATION-SHIM (Plan 31-5-06, SDK-05, D-02).
3
2
  //
4
- // Consumers import ONLY from this file. The internal parts
5
- // (`./types.ts`, `./writer.ts`, `./emitter.ts`) are implementation
6
- // detail; changing them without updating this export surface is a
7
- // breaking change for downstream plans (20-05 MCP handlers, 20-13 hooks).
3
+ // Thin deprecation shim. The real implementation moved to
4
+ // sdk/event-stream/index.ts in Plan 31-5-04 (SDK consolidation). This file
5
+ // is re-created at the OLD path so undocumented EXTERNAL importers (anyone
6
+ // who reached into node_modules/@hegemonart/get-design-done/scripts/lib/
7
+ // event-stream/index.ts directly) keep working for one minor grace window.
8
8
  //
9
- // Surface:
10
- // * appendEvent(ev) — persist + broadcast one event
11
- // * getWriter(opts?) lazy singleton EventWriter
12
- // * getBus() — lazy singleton EventBus
13
- // * reset() — clear module-level singletons (tests)
14
- // * types — BaseEvent, KnownEvent, and every pre-
15
- // registered subtype (StateMutationEvent,
16
- // StateTransitionEvent, …).
17
-
18
- import { hostname } from 'node:os';
19
-
20
- import { EventBus } from './emitter.ts';
21
- import type { Unsubscribe, EventHandler } from './emitter.ts';
22
- import { EventWriter } from './writer.ts';
23
- import type { WriterOptions } from './writer.ts';
24
- import type { BaseEvent, EventMeta } from './types.ts';
25
-
26
- export type {
27
- BaseEvent,
28
- EventMeta,
29
- KnownEvent,
30
- StateMutationEvent,
31
- StateTransitionEvent,
32
- StageEnteredEvent,
33
- StageExitedEvent,
34
- HookFiredEvent,
35
- ErrorEvent,
36
- WaveStartedEvent,
37
- WaveCompletedEvent,
38
- BlockerAddedEvent,
39
- DecisionAddedEvent,
40
- MustHaveAddedEvent,
41
- ParallelismVerdictEvent,
42
- CostUpdateEvent,
43
- RateLimitEvent,
44
- ApiRetryEvent,
45
- CompactBoundaryEvent,
46
- McpProbeEvent,
47
- ReflectionProposedEvent,
48
- ConnectionStatusChangeEvent,
49
- ToolCallStartedEvent,
50
- ToolCallCompletedEvent,
51
- AgentSpawnEvent,
52
- AgentOutcomeEvent,
53
- // Phase 27 / Plan 27-08 — peer-CLI delegation events (D-09).
54
- RuntimeRole,
55
- PeerCallStartedEvent,
56
- PeerCallCompleteEvent,
57
- PeerCallFailedEvent,
58
- } from './types.ts';
59
- export {
60
- KNOWN_EVENT_TYPES,
61
- // Phase 27 / Plan 27-08 — symbolic constants for peer-CLI event names.
62
- PEER_CALL_STARTED,
63
- PEER_CALL_COMPLETE,
64
- PEER_CALL_FAILED,
65
- PEER_CALL_EVENT_TYPES,
66
- DEFAULT_RUNTIME_ROLE,
67
- } from './types.ts';
68
- export { EventBus } from './emitter.ts';
69
- export type { EventHandler, Unsubscribe } from './emitter.ts';
70
- export { EventWriter, DEFAULT_EVENTS_PATH, DEFAULT_MAX_LINE_BYTES } from './writer.ts';
71
- export type { WriterOptions } from './writer.ts';
72
- export { readEvents, aggregate } from './reader.ts';
73
- export type { ReadEventsOptions, AggregateResult } from './reader.ts';
74
-
75
- /**
76
- * Lazily-constructed module-level singletons. `getWriter()` honors the
77
- * first `opts` it receives; subsequent calls with different options are
78
- * ignored. Tests that need to vary options across runs should call
79
- * {@link reset} between runs.
80
- */
81
- let defaultWriter: EventWriter | null = null;
82
- let defaultBus: EventBus | null = null;
83
- /**
84
- * Cached host name. `os.hostname()` is cheap but not free (syscall on
85
- * some platforms) and we stamp it onto every event; compute once.
86
- */
87
- let cachedHost: string | null = null;
88
-
89
- /**
90
- * Return the module-level default writer, constructing it on first
91
- * call. Passing `opts` on subsequent calls is a no-op (the first
92
- * caller wins); that matches the "single shared file per process"
93
- * intent.
94
- */
95
- export function getWriter(opts?: WriterOptions): EventWriter {
96
- if (defaultWriter === null) {
97
- // Honor GDD_EVENTS_PATH env var as the first-choice default path
98
- // when the caller doesn't pass an explicit `opts.path`. Lets test
99
- // harnesses and Plan 21-11's E2E subprocess steer the on-disk
100
- // stream into a fixture-specific directory without chdir'ing the
101
- // entire process. Explicit `opts.path` always wins.
102
- const envPath: string | undefined = process.env['GDD_EVENTS_PATH'];
103
- const finalOpts: WriterOptions =
104
- opts?.path === undefined && envPath !== undefined && envPath.length > 0
105
- ? { ...(opts ?? {}), path: envPath }
106
- : (opts ?? {});
107
- defaultWriter = new EventWriter(finalOpts);
108
- }
109
- return defaultWriter;
110
- }
111
-
112
- /** Return the module-level default bus, constructing it on first call. */
113
- export function getBus(): EventBus {
114
- if (defaultBus === null) {
115
- defaultBus = new EventBus();
116
- }
117
- return defaultBus;
118
- }
119
-
120
- /**
121
- * Persist `ev` to the on-disk JSONL stream AND broadcast it to the
122
- * in-process bus. This is the normal emission path for every Phase 20+
123
- * event producer.
124
- *
125
- * Ordering:
126
- * 1. Stamp `_meta` (pid/host/source) if the caller didn't supply it.
127
- * 2. Persist via `getWriter().append(ev)` — sync, never throws.
128
- * 3. Broadcast via `getBus().emit(ev.type, ev)` AND `emit('*', ev)`
129
- * so typed subscribers and `subscribeAll` observers both see it.
130
- *
131
- * Bus emission can still throw if a subscriber handler throws; we
132
- * intentionally surface that rather than silently swallowing, since a
133
- * failing handler is a programming bug, not an expected runtime
134
- * condition. Plan 20-13's hooks wrap their handler bodies defensively
135
- * for this reason.
136
- */
137
- export function appendEvent(ev: BaseEvent): void {
138
- // Stamp writer-injected metadata if absent. We don't clone the full
139
- // event — callers typically build it fresh per emission — but we do
140
- // need to ensure `_meta` is present by the time we persist.
141
- if (ev._meta === undefined) {
142
- if (cachedHost === null) {
143
- try {
144
- cachedHost = hostname();
145
- } catch {
146
- cachedHost = 'unknown';
147
- }
148
- }
149
- const meta: EventMeta = {
150
- pid: process.pid,
151
- host: cachedHost,
152
- source: 'event-stream',
153
- };
154
- ev._meta = meta;
155
- }
156
-
157
- // Persist first. Bus emission is synchronous; if a subscriber throws
158
- // after we've persisted, the durable record is already safe.
159
- getWriter().append(ev);
160
-
161
- const bus = getBus();
162
- bus.emit(ev.type, ev);
163
- bus.emit('*', ev);
164
- }
165
-
166
- /**
167
- * Reset module-level singletons. Intended for tests that want a fresh
168
- * writer (e.g. pointed at a new temp directory) or a fresh bus (e.g.
169
- * to assert isolation between test cases).
170
- *
171
- * Safe to call from production code but the intended caller is a test.
172
- * `appendEvent()` will lazily reconstruct both singletons on the next
173
- * emission.
174
- */
175
- export function reset(): void {
176
- if (defaultBus !== null) {
177
- defaultBus.removeAllListeners();
178
- }
179
- defaultWriter = null;
180
- defaultBus = null;
181
- }
182
-
183
- // Re-export `subscribe`/`subscribeAll` convenience: some callers only
184
- // need to subscribe, not emit, and `getBus().subscribe(…)` reads fine
185
- // but the shorter form keeps consumer code terse.
186
- /** Convenience: subscribe to one event type on the default bus. */
187
- export function subscribe<T extends BaseEvent = BaseEvent>(
188
- type: T['type'],
189
- handler: EventHandler<T>,
190
- ): Unsubscribe {
191
- return getBus().subscribe<T>(type, handler);
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.
14
+ //
15
+ // Runs under --experimental-strip-types, so `export *` re-export is
16
+ // strip-types-clean.
17
+
18
+ import { emitWarning } from 'node:process';
19
+
20
+ let warned = false;
21
+ if (!warned) {
22
+ warned = true;
23
+ emitWarning(
24
+ 'scripts/lib/event-stream/index.ts is deprecated; import sdk/event-stream instead. Removed in v1.33.0.',
25
+ 'DeprecationWarning',
26
+ );
192
27
  }
193
28
 
194
- /** Convenience: subscribe to every event on the default bus. */
195
- export function subscribeAll(handler: EventHandler<BaseEvent>): Unsubscribe {
196
- return getBus().subscribeAll(handler);
197
- }
29
+ export * from '../../../sdk/event-stream/index.ts';