@specship/specship-darwin-arm64 0.28.0 → 0.29.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 (50) hide show
  1. package/lib/dist/bin/specship.js +37 -0
  2. package/lib/dist/bin/specship.js.map +1 -1
  3. package/lib/dist/commands/specship/spec.md +7 -1
  4. package/lib/dist/design-md/check.d.ts +51 -0
  5. package/lib/dist/design-md/check.d.ts.map +1 -0
  6. package/lib/dist/design-md/check.js +335 -0
  7. package/lib/dist/design-md/check.js.map +1 -0
  8. package/lib/dist/design-md/css.d.ts +40 -0
  9. package/lib/dist/design-md/css.d.ts.map +1 -0
  10. package/lib/dist/design-md/css.js +224 -0
  11. package/lib/dist/design-md/css.js.map +1 -0
  12. package/lib/dist/design-md/extract.d.ts +84 -0
  13. package/lib/dist/design-md/extract.d.ts.map +1 -0
  14. package/lib/dist/design-md/extract.js +595 -0
  15. package/lib/dist/design-md/extract.js.map +1 -0
  16. package/lib/dist/design-md/maintain.d.ts +45 -0
  17. package/lib/dist/design-md/maintain.d.ts.map +1 -0
  18. package/lib/dist/design-md/maintain.js +127 -0
  19. package/lib/dist/design-md/maintain.js.map +1 -0
  20. package/lib/dist/design-md/render.d.ts +28 -0
  21. package/lib/dist/design-md/render.d.ts.map +1 -0
  22. package/lib/dist/design-md/render.js +178 -0
  23. package/lib/dist/design-md/render.js.map +1 -0
  24. package/lib/dist/design-md/upkeep.d.ts +48 -0
  25. package/lib/dist/design-md/upkeep.d.ts.map +1 -0
  26. package/lib/dist/design-md/upkeep.js +169 -0
  27. package/lib/dist/design-md/upkeep.js.map +1 -0
  28. package/lib/dist/design-md/verify.d.ts +65 -0
  29. package/lib/dist/design-md/verify.d.ts.map +1 -0
  30. package/lib/dist/design-md/verify.js +311 -0
  31. package/lib/dist/design-md/verify.js.map +1 -0
  32. package/lib/dist/installer/gemini-commands.d.ts.map +1 -1
  33. package/lib/dist/installer/gemini-commands.js +7 -0
  34. package/lib/dist/installer/gemini-commands.js.map +1 -1
  35. package/lib/dist/installer/targets/claude.d.ts +1 -1
  36. package/lib/dist/installer/targets/claude.d.ts.map +1 -1
  37. package/lib/dist/installer/targets/claude.js +7 -2
  38. package/lib/dist/installer/targets/claude.js.map +1 -1
  39. package/lib/dist/skills/design-md/SKILL.md +172 -0
  40. package/lib/dist/skills/design-md/references/authored-sections.md +90 -0
  41. package/lib/dist/skills/design-md/references/sources.md +71 -0
  42. package/lib/dist/spec-quality/postcheck.d.ts +7 -1
  43. package/lib/dist/spec-quality/postcheck.d.ts.map +1 -1
  44. package/lib/dist/spec-quality/postcheck.js +31 -0
  45. package/lib/dist/spec-quality/postcheck.js.map +1 -1
  46. package/lib/dist/workflows/defaults/claude-design-implement.yaml +34 -5
  47. package/lib/dist/workflows/defaults/spec-implement.yaml +16 -0
  48. package/lib/node_modules/.package-lock.json +1 -1
  49. package/lib/package.json +1 -1
  50. package/package.json +1 -1
@@ -0,0 +1,224 @@
1
+ "use strict";
2
+ /**
3
+ * A small, dependency-free CSS reader for design.md (DESIGNMD-DOC,
4
+ * REQ-DESIGNMD-001).
5
+ *
6
+ * It does not validate CSS or compute the cascade. It walks the text and
7
+ * records what is written: each rule's selector and declarations verbatim
8
+ * (whitespace collapsed), the `@media` / `@supports` / `@container` condition
9
+ * a rule sits under, `@keyframes` bodies and `@font-face` blocks. Native CSS
10
+ * nesting is flattened (`&` replaced by the parent selector). The output order
11
+ * is source order, so the same text always yields the same result.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.collapse = collapse;
15
+ exports.splitTopLevel = splitTopLevel;
16
+ exports.parseDeclarationList = parseDeclarationList;
17
+ exports.parseCss = parseCss;
18
+ const CONDITIONAL_AT_RULES = /^@(media|supports|container|layer|document|scope)\b/i;
19
+ const KEYFRAMES_AT_RULE = /^@(-webkit-|-moz-)?keyframes\s+/i;
20
+ function collapse(text) {
21
+ return text.replace(/\s+/g, ' ').trim();
22
+ }
23
+ /** Remove comments, leaving strings intact. */
24
+ function stripComments(text) {
25
+ let out = '';
26
+ let i = 0;
27
+ while (i < text.length) {
28
+ const ch = text[i];
29
+ if (ch === '"' || ch === "'") {
30
+ const end = skipString(text, i);
31
+ out += text.slice(i, end);
32
+ i = end;
33
+ }
34
+ else if (ch === '/' && text[i + 1] === '*') {
35
+ const end = text.indexOf('*/', i + 2);
36
+ i = end === -1 ? text.length : end + 2;
37
+ out += ' ';
38
+ }
39
+ else {
40
+ out += ch;
41
+ i++;
42
+ }
43
+ }
44
+ return out;
45
+ }
46
+ /** Index just past the string literal starting at `start`. */
47
+ function skipString(text, start) {
48
+ const quote = text[start];
49
+ let i = start + 1;
50
+ while (i < text.length) {
51
+ if (text[i] === '\\')
52
+ i += 2;
53
+ else if (text[i] === quote)
54
+ return i + 1;
55
+ else
56
+ i++;
57
+ }
58
+ return text.length;
59
+ }
60
+ /** Index of the `}` matching the `{` at `open`. */
61
+ function matchBrace(text, open) {
62
+ let depth = 0;
63
+ let i = open;
64
+ while (i < text.length) {
65
+ const ch = text[i];
66
+ if (ch === '"' || ch === "'") {
67
+ i = skipString(text, i);
68
+ continue;
69
+ }
70
+ if (ch === '{')
71
+ depth++;
72
+ else if (ch === '}') {
73
+ depth--;
74
+ if (depth === 0)
75
+ return i;
76
+ }
77
+ i++;
78
+ }
79
+ return text.length;
80
+ }
81
+ /** Split one block's contents into top-level statements and nested blocks. */
82
+ function scan(text) {
83
+ const items = [];
84
+ let buf = '';
85
+ let parens = 0;
86
+ let i = 0;
87
+ while (i < text.length) {
88
+ const ch = text[i];
89
+ if (ch === '"' || ch === "'") {
90
+ const end = skipString(text, i);
91
+ buf += text.slice(i, end);
92
+ i = end;
93
+ continue;
94
+ }
95
+ if (ch === '(')
96
+ parens++;
97
+ else if (ch === ')')
98
+ parens = Math.max(0, parens - 1);
99
+ if (parens === 0 && ch === ';') {
100
+ if (buf.trim())
101
+ items.push({ kind: 'stmt', text: buf.trim() });
102
+ buf = '';
103
+ i++;
104
+ continue;
105
+ }
106
+ if (parens === 0 && ch === '{') {
107
+ const close = matchBrace(text, i);
108
+ items.push({ kind: 'block', prelude: buf.trim(), body: text.slice(i + 1, close) });
109
+ buf = '';
110
+ i = close + 1;
111
+ continue;
112
+ }
113
+ buf += ch;
114
+ i++;
115
+ }
116
+ if (buf.trim())
117
+ items.push({ kind: 'stmt', text: buf.trim() });
118
+ return items;
119
+ }
120
+ /** Split on commas that are not inside parentheses or brackets. */
121
+ function splitTopLevel(text, sep = ',') {
122
+ const parts = [];
123
+ let depth = 0;
124
+ let buf = '';
125
+ for (let i = 0; i < text.length; i++) {
126
+ const ch = text[i];
127
+ if (ch === '(' || ch === '[')
128
+ depth++;
129
+ else if (ch === ')' || ch === ']')
130
+ depth = Math.max(0, depth - 1);
131
+ if (ch === sep && depth === 0) {
132
+ parts.push(buf);
133
+ buf = '';
134
+ }
135
+ else
136
+ buf += ch;
137
+ }
138
+ parts.push(buf);
139
+ return parts.map((p) => p.trim()).filter(Boolean);
140
+ }
141
+ function nestSelector(parent, child) {
142
+ const own = splitTopLevel(collapse(child));
143
+ if (!parent)
144
+ return own.join(', ');
145
+ const parents = splitTopLevel(parent);
146
+ const combined = [];
147
+ for (const p of parents) {
148
+ for (const c of own)
149
+ combined.push(c.includes('&') ? c.replace(/&/g, p) : `${p} ${c}`);
150
+ }
151
+ return combined.join(', ');
152
+ }
153
+ function parseDeclaration(text) {
154
+ const colon = text.indexOf(':');
155
+ if (colon <= 0)
156
+ return null;
157
+ const property = collapse(text.slice(0, colon));
158
+ const value = collapse(text.slice(colon + 1));
159
+ if (!property || /\s/.test(property))
160
+ return null;
161
+ // An empty value is valid only for a custom property (`--tw-blur: ;`), and
162
+ // it matters: Tailwind composes `backdrop-filter` / `filter` from such
163
+ // variables, so dropping them changes what renders.
164
+ if (!value && !property.startsWith('--'))
165
+ return null;
166
+ // Custom property names are case-sensitive; standard ones are not.
167
+ return { property: property.startsWith('--') ? property : property.toLowerCase(), value };
168
+ }
169
+ /** Parse a `style=""` attribute or any `prop: value; …` list. */
170
+ function parseDeclarationList(text) {
171
+ return scan(stripComments(text))
172
+ .filter((item) => item.kind === 'stmt')
173
+ .map((item) => parseDeclaration(item.text))
174
+ .filter((d) => d !== null);
175
+ }
176
+ function walk(items, out, media, selector) {
177
+ const declarations = [];
178
+ for (const item of items) {
179
+ if (item.kind !== 'stmt')
180
+ continue;
181
+ if (item.text.startsWith('@')) {
182
+ const imp = /^@import\s+(.+)$/i.exec(item.text);
183
+ if (imp)
184
+ out.imports.push(collapse(imp[1]));
185
+ continue;
186
+ }
187
+ const decl = parseDeclaration(item.text);
188
+ if (decl)
189
+ declarations.push(decl);
190
+ }
191
+ if (selector && declarations.length > 0) {
192
+ out.rules.push(media ? { selector, declarations, media } : { selector, declarations });
193
+ }
194
+ for (const item of items) {
195
+ if (item.kind !== 'block')
196
+ continue;
197
+ const prelude = collapse(item.prelude);
198
+ if (KEYFRAMES_AT_RULE.test(prelude)) {
199
+ const name = prelude.replace(KEYFRAMES_AT_RULE, '').trim();
200
+ const body = collapse(item.body);
201
+ out.keyframes.push(media ? { name, body, media } : { name, body });
202
+ }
203
+ else if (/^@font-face\b/i.test(prelude)) {
204
+ out.fontFaces.push(parseDeclarationList(item.body));
205
+ }
206
+ else if (CONDITIONAL_AT_RULES.test(prelude)) {
207
+ const condition = /^@layer\b/i.test(prelude) ? media : media ? `${media} and ${prelude}` : prelude;
208
+ walk(scan(item.body), out, condition, selector);
209
+ }
210
+ else if (prelude.startsWith('@')) {
211
+ // @page, @property, … — keep their declarations under the at-rule prelude.
212
+ walk(scan(item.body), out, media, prelude);
213
+ }
214
+ else if (prelude) {
215
+ walk(scan(item.body), out, media, nestSelector(selector, prelude));
216
+ }
217
+ }
218
+ }
219
+ function parseCss(text) {
220
+ const out = { rules: [], keyframes: [], fontFaces: [], imports: [] };
221
+ walk(scan(stripComments(text)), out, undefined, undefined);
222
+ return out;
223
+ }
224
+ //# sourceMappingURL=css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css.js","sourceRoot":"","sources":["../../src/design-md/css.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Deterministic design-value extraction for design.md (DESIGNMD-DOC,
3
+ * REQ-DESIGNMD-001).
4
+ *
5
+ * A low-end model asked to read a 2,000-line design snapshot rounds values,
6
+ * invents near-miss colors and misses state rules. This module does that
7
+ * reading in code instead: every custom property, every rule, every literal
8
+ * value, counted and attributed to the selectors that use it. Nothing here
9
+ * interprets the design — it records what is written.
10
+ *
11
+ * Sources: Claude Design snapshots (`.html` + the local stylesheets they
12
+ * link), plain `.css`, Figma code exports (`.tsx` / `.jsx`), and Figma
13
+ * variables exports (`.json`).
14
+ */
15
+ import { CssDeclaration, CssKeyframes, CssRule, splitTopLevel } from './css';
16
+ export type SourceKind = 'html' | 'css' | 'code' | 'variables';
17
+ export interface DesignSource {
18
+ /** Project-relative path, `/`-separated. */
19
+ path: string;
20
+ sha256: string;
21
+ kind: SourceKind;
22
+ }
23
+ export interface CustomProperty {
24
+ selector: string;
25
+ name: string;
26
+ value: string;
27
+ media?: string;
28
+ }
29
+ export interface DesignVariable {
30
+ name: string;
31
+ value: string;
32
+ }
33
+ export declare const INVENTORY_KINDS: readonly ["Colors", "Font families", "Font sizes", "Font weights", "Line heights", "Letter spacing", "Spacing", "Sizes", "Radii", "Borders", "Shadows", "Motion", "Opacity", "Z-index", "Breakpoints"];
34
+ export type InventoryKind = (typeof INVENTORY_KINDS)[number];
35
+ export interface InventoryEntry {
36
+ value: string;
37
+ count: number;
38
+ /** Selectors (or `file:line` for code) that use the value, sorted. */
39
+ usedBy: string[];
40
+ }
41
+ export interface InlineSvg {
42
+ id: string;
43
+ /** The element's markup, whitespace collapsed. */
44
+ markup: string;
45
+ count: number;
46
+ }
47
+ export interface DesignExtraction {
48
+ sources: DesignSource[];
49
+ customProperties: CustomProperty[];
50
+ variables: DesignVariable[];
51
+ rules: CssRule[];
52
+ keyframes: CssKeyframes[];
53
+ fontFaces: CssDeclaration[][];
54
+ /** Remote stylesheet / font links, verbatim. */
55
+ fontLinks: string[];
56
+ inventories: Record<InventoryKind, InventoryEntry[]>;
57
+ /** Utility classes from code exports (`p-4`, `text-sm`), with counts. */
58
+ utilityClasses: InventoryEntry[];
59
+ /** Image / icon / font file references. */
60
+ assets: InventoryEntry[];
61
+ /** Indented element outline of HTML sources, with inline styles and text. */
62
+ outline: string[];
63
+ /** Distinct inline SVG elements (verbatim markup + use count). */
64
+ svgs: InlineSvg[];
65
+ outlineTruncated: boolean;
66
+ /** Local stylesheets the source links to that could not be read. */
67
+ missingLinks: string[];
68
+ }
69
+ export declare class DesignSourceError extends Error {
70
+ }
71
+ /** Max outline lines — the verbatim snapshot carries the rest. */
72
+ export declare const OUTLINE_LIMIT = 3000;
73
+ /** Every color literal written in a value, in order. */
74
+ export declare function colorLiterals(value: string): string[];
75
+ /**
76
+ * Extract every literal visual value from the given sources. Paths resolve
77
+ * against `projectRoot`. Throws `DesignSourceError` when a source is missing
78
+ * or unreadable — the caller writes nothing in that case (REQ-DESIGNMD-001.A6).
79
+ */
80
+ export declare function extractDesign(paths: string[], opts: {
81
+ projectRoot: string;
82
+ }): DesignExtraction;
83
+ export { splitTopLevel };
84
+ //# sourceMappingURL=extract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/design-md/extract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,OAAO,EAA4C,aAAa,EAAE,MAAM,OAAO,CAAC;AAEvH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,WAAW,CAAC;AAE/D,MAAM,WAAW,YAAY;IAC3B,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,eAAe,wMAgBlB,CAAC;AACX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,gBAAgB,EAAE,cAAc,EAAE,CAAC;IACnC,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,SAAS,EAAE,cAAc,EAAE,EAAE,CAAC;IAC9B,gDAAgD;IAChD,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,aAAa,EAAE,cAAc,EAAE,CAAC,CAAC;IACrD,yEAAyE;IACzE,cAAc,EAAE,cAAc,EAAE,CAAC;IACjC,2CAA2C;IAC3C,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,6EAA6E;IAC7E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,kEAAkE;IAClE,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,oEAAoE;IACpE,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,qBAAa,iBAAkB,SAAQ,KAAK;CAAG;AAE/C,kEAAkE;AAClE,eAAO,MAAM,aAAa,OAAO,CAAC;AAKlC,wDAAwD;AACxD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAErD;AAgbD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,gBAAgB,CAsB9F;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}