@hegemonart/get-design-done 1.60.3 → 1.60.4
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 +16 -0
- package/package.json +1 -1
- package/scripts/lib/install/converters/codex-plugin.cjs +18 -1
- package/scripts/lib/install/converters/cursor-marketplace.cjs +29 -8
- package/scripts/lib/install/converters/shared.cjs +55 -3
|
@@ -5,14 +5,14 @@
|
|
|
5
5
|
},
|
|
6
6
|
"metadata": {
|
|
7
7
|
"description": "Get Design Done — 5-stage agent-orchestrated design pipeline (Brief → Explore → Plan → Design → Verify) for AI coding agents. 64 agents, 96 skills, 39 connection integrations, two MCP servers, opt-in SQLite state backbone, bidirectional Figma write-back, and a reflector-driven self-improvement loop. Cross-runtime install for Claude Code, Codex, Cursor, OpenCode, Gemini, and more.",
|
|
8
|
-
"version": "1.60.
|
|
8
|
+
"version": "1.60.4"
|
|
9
9
|
},
|
|
10
10
|
"plugins": [
|
|
11
11
|
{
|
|
12
12
|
"name": "get-design-done",
|
|
13
13
|
"source": "./",
|
|
14
14
|
"description": "Agent-orchestrated 5-stage design pipeline (Brief → Explore → Plan → Design → Verify) for AI coding agents. 64 specialized agents, 96 skills, 39 connection integrations (Figma, Refero, Preview, Storybook, Chromatic, Graphify, Linear, Jira, Notion, …), bidirectional Figma write-back, queryable intel store, opt-in SQLite state backbone, and a reflector-driven self-improvement loop. Two MCP servers (gdd-state for typed STATE mutators, gdd-mcp for 13 read-only project-priming tools), tier-aware routing with cost telemetry, and defense-in-depth hooks (protected paths, MCP circuit breaker, injection scanner, budget enforcer). Cross-runtime install for Claude Code, Codex, Cursor, OpenCode, Gemini, Copilot, and more.",
|
|
15
|
-
"version": "1.60.
|
|
15
|
+
"version": "1.60.4",
|
|
16
16
|
"author": {
|
|
17
17
|
"name": "hegemonart"
|
|
18
18
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "get-design-done",
|
|
3
3
|
"short_name": "gdd",
|
|
4
|
-
"version": "1.60.
|
|
4
|
+
"version": "1.60.4",
|
|
5
5
|
"description": "Agent-orchestrated 5-stage design pipeline (Brief → Explore → Plan → Design → Verify) for AI coding agents. 64 specialized agents, 96 skills, 39 connection integrations (Figma, Refero, Preview, Storybook, Chromatic, Graphify, Linear, Jira, Notion, …), bidirectional Figma write-back, queryable intel store for O(1) design-surface lookups, opt-in SQLite state backbone, and a reflector-driven self-improvement loop. Two MCP servers (`gdd-state` for typed STATE mutators, `gdd-mcp` for 13 read-only project-priming tools), tier-aware agent routing with cost telemetry, defense-in-depth hooks (protected paths, MCP circuit breaker, injection scanner, budget enforcer), and a cross-runtime install layer for Claude Code, Codex, Cursor, OpenCode, Gemini, Copilot, and more.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "hegemonart",
|
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,22 @@ All notable changes to get-design-done are documented here. Versions follow [sem
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
## [1.60.4] - 2026-07-06
|
|
8
|
+
|
|
9
|
+
**Multi-runtime install fix (Tier-2 bundles)** - follow-up to 1.60.3. The same Claude-only `model:` frontmatter directive is now stripped from the Tier-2 marketplace distribution bundles, not just the Tier-1 file-drop command files.
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- **`model:` frontmatter stripped from Tier-2 marketplace bundles** (`scripts/lib/install/converters/codex-plugin.cjs`, `scripts/lib/install/converters/cursor-marketplace.cjs`). These converters copied the `skills/` tree verbatim, so `model: inherit` still leaked into the Codex-plugin and Cursor-marketplace bundles and would crash non-Claude consumers exactly as the file-drop path did before 1.60.3 (`Model not found: inherit/.`). A new shared helper `stripModelFromFrontmatter` drops the `model:` line from each `SKILL.md` frontmatter during the copy; files that carry no `model:` line are still copied byte-for-byte, so the verbatim-copy guarantee holds for everything else. `buildFrontmatter` and the new helper share a single `MODEL_FIELD_RE` so the Tier-1 and Tier-2 paths strip identically. Regression coverage in `test/suite/converters/codex-plugin.test.cjs`, `test/suite/converters/cursor-marketplace.test.cjs`, and a `stripModelFromFrontmatter` unit in `test/suite/converters-wave4.test.cjs`.
|
|
14
|
+
|
|
15
|
+
### Breaking changes
|
|
16
|
+
|
|
17
|
+
None.
|
|
18
|
+
|
|
19
|
+
5,148/5,148 tests pass.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
7
23
|
## [1.60.3] - 2026-07-06
|
|
8
24
|
|
|
9
25
|
**Multi-runtime install fix** - the Claude-only `model:` frontmatter directive no longer leaks into the command files generated for non-Claude runtimes. Running any `/gdd-*` command on Kilo Code (Qwen) crashed with `Model not found: inherit/.` because the installer round-tripped `model: inherit` verbatim into the command file and Kilo parsed the value as a literal model id.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hegemonart/get-design-done",
|
|
3
|
-
"version": "1.60.
|
|
3
|
+
"version": "1.60.4",
|
|
4
4
|
"description": "A design-quality pipeline for AI coding agents: brief, explore, plan, design, and verify UI work against your design system.",
|
|
5
5
|
"author": "Hegemon",
|
|
6
6
|
"homepage": "https://github.com/hegemonart/get-design-done",
|
|
@@ -44,6 +44,7 @@
|
|
|
44
44
|
|
|
45
45
|
const fs = require('node:fs');
|
|
46
46
|
const path = require('node:path');
|
|
47
|
+
const shared = require('./shared.cjs');
|
|
47
48
|
|
|
48
49
|
// Per research § Top-level fields: name, version, description are the only
|
|
49
50
|
// strictly-required spec fields. All other manifest fields are optional.
|
|
@@ -112,6 +113,12 @@ function curateKeywords(arr) {
|
|
|
112
113
|
/**
|
|
113
114
|
* Copy a directory tree recursively. Vanilla fs only — no deps. Mirrors
|
|
114
115
|
* the helper used by cursor-marketplace.cjs (Plan 28-8-B1).
|
|
116
|
+
*
|
|
117
|
+
* `SKILL.md` files are sanitized in transit: the Claude-only `model:`
|
|
118
|
+
* frontmatter directive is stripped so non-Claude marketplace consumers do
|
|
119
|
+
* not choke on `model: inherit` (Kilo: `Model not found: inherit/.`). Files
|
|
120
|
+
* that carry no `model:` line are copied byte-for-byte (copyFileSync), so the
|
|
121
|
+
* verbatim-copy guarantee still holds for everything else.
|
|
115
122
|
*/
|
|
116
123
|
function copyDirRecursive(src, dest) {
|
|
117
124
|
fs.mkdirSync(dest, { recursive: true });
|
|
@@ -121,7 +128,17 @@ function copyDirRecursive(src, dest) {
|
|
|
121
128
|
if (entry.isDirectory()) {
|
|
122
129
|
copyDirRecursive(srcPath, destPath);
|
|
123
130
|
} else if (entry.isFile()) {
|
|
124
|
-
|
|
131
|
+
if (entry.name === 'SKILL.md') {
|
|
132
|
+
const original = fs.readFileSync(srcPath, 'utf8');
|
|
133
|
+
const stripped = shared.stripModelFromFrontmatter(original);
|
|
134
|
+
if (stripped === original) {
|
|
135
|
+
fs.copyFileSync(srcPath, destPath); // byte-exact, no re-encode
|
|
136
|
+
} else {
|
|
137
|
+
fs.writeFileSync(destPath, stripped, 'utf8');
|
|
138
|
+
}
|
|
139
|
+
} else {
|
|
140
|
+
fs.copyFileSync(srcPath, destPath);
|
|
141
|
+
}
|
|
125
142
|
}
|
|
126
143
|
// symlinks + other: ignored (skills tree is regular files only).
|
|
127
144
|
}
|
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
|
|
35
35
|
const fs = require('node:fs');
|
|
36
36
|
const path = require('node:path');
|
|
37
|
+
const shared = require('./shared.cjs');
|
|
37
38
|
|
|
38
39
|
// Curated keyword subset for Cursor's marketplace card display.
|
|
39
40
|
// Per Wave A research § Schema Mapping `keywords` row: marketplace card
|
|
@@ -201,6 +202,12 @@ function buildManifest(sources, opts) {
|
|
|
201
202
|
/**
|
|
202
203
|
* Copy a directory tree recursively. Vanilla fs only — no deps.
|
|
203
204
|
* Returns the list of relative paths written (relative to `dest`).
|
|
205
|
+
*
|
|
206
|
+
* `SKILL.md` files are sanitized in transit: the Claude-only `model:`
|
|
207
|
+
* frontmatter directive is stripped so non-Claude marketplace consumers do
|
|
208
|
+
* not choke on `model: inherit` (Kilo: `Model not found: inherit/.`). Files
|
|
209
|
+
* that carry no `model:` line are copied byte-for-byte (copyFileSync), so the
|
|
210
|
+
* verbatim-copy guarantee still holds for everything else.
|
|
204
211
|
*/
|
|
205
212
|
function copyDirRecursive(src, dest, relPrefix) {
|
|
206
213
|
const written = [];
|
|
@@ -208,16 +215,30 @@ function copyDirRecursive(src, dest, relPrefix) {
|
|
|
208
215
|
while (stack.length > 0) {
|
|
209
216
|
const { s, d, rel } = stack.pop();
|
|
210
217
|
fs.mkdirSync(d, { recursive: true });
|
|
211
|
-
|
|
218
|
+
// Use withFileTypes so dir/file classification comes from the single
|
|
219
|
+
// readdir syscall (the dirent), not a follow-up statSync — this collapses
|
|
220
|
+
// the check-then-use file race (CodeQL js/file-system-race) between the
|
|
221
|
+
// stat and the readFileSync/copyFileSync. Mirrors codex-plugin.cjs.
|
|
222
|
+
const entries = fs.readdirSync(s, { withFileTypes: true });
|
|
212
223
|
for (const entry of entries) {
|
|
213
|
-
const
|
|
214
|
-
const
|
|
215
|
-
const
|
|
216
|
-
const
|
|
217
|
-
if (
|
|
224
|
+
const name = entry.name;
|
|
225
|
+
const sp = path.join(s, name);
|
|
226
|
+
const dp = path.join(d, name);
|
|
227
|
+
const relPath = rel ? `${rel}/${name}` : name;
|
|
228
|
+
if (entry.isDirectory()) {
|
|
218
229
|
stack.push({ s: sp, d: dp, rel: relPath });
|
|
219
|
-
} else if (
|
|
220
|
-
|
|
230
|
+
} else if (entry.isFile()) {
|
|
231
|
+
if (name === 'SKILL.md') {
|
|
232
|
+
const original = fs.readFileSync(sp, 'utf8');
|
|
233
|
+
const stripped = shared.stripModelFromFrontmatter(original);
|
|
234
|
+
if (stripped === original) {
|
|
235
|
+
fs.copyFileSync(sp, dp); // byte-exact, no re-encode
|
|
236
|
+
} else {
|
|
237
|
+
fs.writeFileSync(dp, stripped, 'utf8');
|
|
238
|
+
}
|
|
239
|
+
} else {
|
|
240
|
+
fs.copyFileSync(sp, dp);
|
|
241
|
+
}
|
|
221
242
|
written.push(relPath);
|
|
222
243
|
}
|
|
223
244
|
// symlinks + other: ignored (skills tree is regular files only)
|
|
@@ -101,6 +101,21 @@ const CODEX_TOOL_MAP = Object.freeze({
|
|
|
101
101
|
WebFetch: 'shell',
|
|
102
102
|
});
|
|
103
103
|
|
|
104
|
+
// ---------------------------------------------------------------------------
|
|
105
|
+
// MODEL_FIELD_RE — the Claude-only `model:` frontmatter key
|
|
106
|
+
// ---------------------------------------------------------------------------
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Matches a `model:` frontmatter line (optional leading whitespace, exact key).
|
|
110
|
+
* The `model:` directive is Claude-Code-only: its values (`inherit`, or a
|
|
111
|
+
* Claude tier name `opus`/`sonnet`/`haiku`) are not valid model ids on any
|
|
112
|
+
* non-Claude runtime, whose command loaders parse the value as a literal
|
|
113
|
+
* `<provider>/<model>` and fail (Kilo: `Model not found: inherit/.`). Every
|
|
114
|
+
* converter that emits artifacts for a non-Claude consumer strips this line.
|
|
115
|
+
* Anchored to the exact key so `default-tier:` / `model-notes:` never match.
|
|
116
|
+
*/
|
|
117
|
+
const MODEL_FIELD_RE = /^\s*model\s*:/;
|
|
118
|
+
|
|
104
119
|
// ---------------------------------------------------------------------------
|
|
105
120
|
// extractFrontmatterAndBody — YAML frontmatter parser
|
|
106
121
|
// ---------------------------------------------------------------------------
|
|
@@ -356,11 +371,11 @@ function buildFrontmatter(originalFrontmatter, skillName, runtimePrefix) {
|
|
|
356
371
|
// job of `default-tier`/`reasoning-class` + tier-resolver.cjs, NOT this
|
|
357
372
|
// per-command harness directive, so we strip the whole line here.
|
|
358
373
|
//
|
|
359
|
-
//
|
|
360
|
-
//
|
|
374
|
+
// `MODEL_FIELD_RE` matches only the exact `model` key — sibling keys like
|
|
375
|
+
// `model-notes:` or `default-tier:` are preserved.
|
|
361
376
|
const lines = originalFrontmatter
|
|
362
377
|
.split(/\r?\n/)
|
|
363
|
-
.filter((line) =>
|
|
378
|
+
.filter((line) => !MODEL_FIELD_RE.test(line));
|
|
364
379
|
let nameSeen = false;
|
|
365
380
|
for (let i = 0; i < lines.length; i++) {
|
|
366
381
|
const m = lines[i].match(/^(\s*name\s*:\s*)(.*)$/);
|
|
@@ -383,6 +398,41 @@ function buildFrontmatter(originalFrontmatter, skillName, runtimePrefix) {
|
|
|
383
398
|
return '---\n' + lines.join('\n') + '\n---\n';
|
|
384
399
|
}
|
|
385
400
|
|
|
401
|
+
// ---------------------------------------------------------------------------
|
|
402
|
+
// stripModelFromFrontmatter — drop the Claude-only `model:` line, keep body
|
|
403
|
+
// ---------------------------------------------------------------------------
|
|
404
|
+
|
|
405
|
+
/**
|
|
406
|
+
* Strip the Claude-only `model:` directive from a full SKILL.md string's
|
|
407
|
+
* frontmatter, leaving the body untouched.
|
|
408
|
+
*
|
|
409
|
+
* Used by the Tier-2 marketplace bundle emitters (codex-plugin.cjs,
|
|
410
|
+
* cursor-marketplace.cjs), which copy the `skills/` tree for non-Claude
|
|
411
|
+
* consumers. A verbatim copy would ship `model: inherit` and crash those
|
|
412
|
+
* consumers exactly as the Tier-1 file-drop path did before `buildFrontmatter`
|
|
413
|
+
* learned to drop it (Kilo: `Model not found: inherit/.`).
|
|
414
|
+
*
|
|
415
|
+
* Byte-preserving when there is nothing to strip: if `content` has no
|
|
416
|
+
* frontmatter, or the frontmatter carries no `model:` line, the ORIGINAL
|
|
417
|
+
* string is returned unchanged. Callers can therefore compare `stripped ===
|
|
418
|
+
* original` and fall back to a byte-exact `copyFileSync` for untouched files.
|
|
419
|
+
*
|
|
420
|
+
* The `model:` field is always a single-line scalar (`model: inherit`) in the
|
|
421
|
+
* GDD source set, so a line filter is sufficient — no block-scalar handling.
|
|
422
|
+
*
|
|
423
|
+
* @param {string} content Full SKILL.md content (frontmatter + body).
|
|
424
|
+
* @returns {string}
|
|
425
|
+
*/
|
|
426
|
+
function stripModelFromFrontmatter(content) {
|
|
427
|
+
if (typeof content !== 'string' || content === '') return content;
|
|
428
|
+
const { frontmatter, body } = extractFrontmatterAndBody(content);
|
|
429
|
+
if (frontmatter == null) return content; // no frontmatter → nothing to strip
|
|
430
|
+
const lines = frontmatter.split(/\r?\n/);
|
|
431
|
+
const kept = lines.filter((line) => !MODEL_FIELD_RE.test(line));
|
|
432
|
+
if (kept.length === lines.length) return content; // no model line → unchanged
|
|
433
|
+
return '---\n' + kept.join('\n') + '\n---\n' + body;
|
|
434
|
+
}
|
|
435
|
+
|
|
386
436
|
// ---------------------------------------------------------------------------
|
|
387
437
|
// Exports
|
|
388
438
|
// ---------------------------------------------------------------------------
|
|
@@ -393,5 +443,7 @@ module.exports = {
|
|
|
393
443
|
rewriteCodeFenceTools,
|
|
394
444
|
ensureAdapterHeader,
|
|
395
445
|
buildFrontmatter,
|
|
446
|
+
stripModelFromFrontmatter,
|
|
447
|
+
MODEL_FIELD_RE,
|
|
396
448
|
CODEX_TOOL_MAP,
|
|
397
449
|
};
|