specky-sdd 3.10.0 → 3.10.2

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 (61) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/README.md +49 -12
  3. package/apm.lock.yaml +2 -2
  4. package/apm.yml +1 -1
  5. package/config.yml +1 -1
  6. package/dist/cli/commands/init.d.ts.map +1 -1
  7. package/dist/cli/commands/init.js +3 -0
  8. package/dist/cli/commands/init.js.map +1 -1
  9. package/dist/cli/lib/cursor-plugin-writer.d.ts +10 -0
  10. package/dist/cli/lib/cursor-plugin-writer.d.ts.map +1 -0
  11. package/dist/cli/lib/cursor-plugin-writer.js +53 -0
  12. package/dist/cli/lib/cursor-plugin-writer.js.map +1 -0
  13. package/dist/cli/lib/gitignore-writer.d.ts.map +1 -1
  14. package/dist/cli/lib/gitignore-writer.js +2 -0
  15. package/dist/cli/lib/gitignore-writer.js.map +1 -1
  16. package/dist/index.js +4 -10
  17. package/dist/index.js.map +1 -1
  18. package/dist/services/diagram-generator.d.ts.map +1 -1
  19. package/dist/services/diagram-generator.js +9 -3
  20. package/dist/services/diagram-generator.js.map +1 -1
  21. package/dist/services/git-manager.d.ts.map +1 -1
  22. package/dist/services/git-manager.js +10 -8
  23. package/dist/services/git-manager.js.map +1 -1
  24. package/dist/services/state-machine.d.ts.map +1 -1
  25. package/dist/services/state-machine.js +13 -0
  26. package/dist/services/state-machine.js.map +1 -1
  27. package/dist/services/work-item-exporter.d.ts.map +1 -1
  28. package/dist/services/work-item-exporter.js +14 -33
  29. package/dist/services/work-item-exporter.js.map +1 -1
  30. package/dist/templates/compliance.md +1 -2
  31. package/dist/templates/verification.md +1 -2
  32. package/dist/tools/integration.d.ts.map +1 -1
  33. package/dist/tools/integration.js +11 -19
  34. package/dist/tools/integration.js.map +1 -1
  35. package/dist/tools/pipeline.d.ts.map +1 -1
  36. package/dist/tools/pipeline.js +38 -41
  37. package/dist/tools/pipeline.js.map +1 -1
  38. package/dist/tools/quality.d.ts.map +1 -1
  39. package/dist/tools/quality.js +22 -15
  40. package/dist/tools/quality.js.map +1 -1
  41. package/dist/tools/transcript.d.ts.map +1 -1
  42. package/dist/tools/transcript.js +24 -8
  43. package/dist/tools/transcript.js.map +1 -1
  44. package/dist/tools/visualization.d.ts.map +1 -1
  45. package/dist/tools/visualization.js +17 -3
  46. package/dist/tools/visualization.js.map +1 -1
  47. package/dist/utils/design-stubs.d.ts +32 -0
  48. package/dist/utils/design-stubs.d.ts.map +1 -0
  49. package/dist/utils/design-stubs.js +103 -0
  50. package/dist/utils/design-stubs.js.map +1 -0
  51. package/dist/utils/server-icon.d.ts +10 -0
  52. package/dist/utils/server-icon.d.ts.map +1 -0
  53. package/dist/utils/server-icon.js +31 -0
  54. package/dist/utils/server-icon.js.map +1 -0
  55. package/dist/utils/task-parser.d.ts +18 -0
  56. package/dist/utils/task-parser.d.ts.map +1 -0
  57. package/dist/utils/task-parser.js +159 -0
  58. package/dist/utils/task-parser.js.map +1 -0
  59. package/package.json +1 -1
  60. package/templates/compliance.md +1 -2
  61. package/templates/verification.md +1 -2
@@ -0,0 +1,159 @@
1
+ /**
2
+ * task-parser.ts — Dual-format TASKS.md parser.
3
+ *
4
+ * Canonical writers (sdd_write_tasks, auto_pipeline) emit markdown tables.
5
+ * Legacy / hand-edited files may use checkbox bullets (`- [ ] T-001: …`).
6
+ * This module accepts both and merges by task ID.
7
+ */
8
+ import { extractRequirementIds, normalizeTaskId, TASK_ID_PATTERN, TASK_LINE_PATTERN, } from "./id-contracts.js";
9
+ const TASK_TABLE_ROW = /^\|\s*(T-?\d{3})\s*\|\s*([^|]*?)\s*\|\s*([^|]*?)\s*\|\s*([^|]*?)\s*\|\s*([^|]*?)\s*\|\s*([^|]*?)\s*\|$/i;
10
+ const SUBTASK_LINE = /^\s{2,}-\s+(?:\[[ x]\]\s+)?(.+)/;
11
+ const TRAILING_TRACE_SUFFIX = /\s*[(\[]?\s*(?:traces?(?:_to)?\s*:\s*)?REQ-[A-Z]+-\d{3}(?:\s*,\s*REQ-[A-Z]+-\d{3})*\s*[)\]]?\s*$/i;
12
+ function splitCellList(cell) {
13
+ const trimmed = cell.trim();
14
+ if (!trimmed || trimmed === "—" || trimmed === "-" || trimmed === "–")
15
+ return [];
16
+ return trimmed
17
+ .split(/[,;]/)
18
+ .map((part) => part.trim())
19
+ .filter((part) => part.length > 0 && part !== "—" && part !== "-" && part !== "–");
20
+ }
21
+ function parseDependencies(cell) {
22
+ const ids = [];
23
+ for (const token of splitCellList(cell)) {
24
+ for (const match of token.matchAll(TASK_ID_PATTERN)) {
25
+ try {
26
+ ids.push(normalizeTaskId(match[0]));
27
+ }
28
+ catch {
29
+ // skip malformed tokens
30
+ }
31
+ }
32
+ }
33
+ return [...new Set(ids)];
34
+ }
35
+ function parseTraces(cell, title) {
36
+ const fromCell = extractRequirementIds(cell);
37
+ const fromTitle = extractRequirementIds(title);
38
+ return [...new Set([...fromCell, ...fromTitle])].sort((a, b) => a.localeCompare(b));
39
+ }
40
+ function cleanTitle(raw) {
41
+ return raw.replace(TRAILING_TRACE_SUFFIX, "").trim() || raw.trim();
42
+ }
43
+ function isSeparatorOrHeader(line) {
44
+ if (/^\|\s*[-:| ]+\s*\|$/.test(line))
45
+ return true;
46
+ if (/^\|\s*ID\s*\|/i.test(line))
47
+ return true;
48
+ if (/^\|\s*\*\*/.test(line))
49
+ return true; // effort summary totals
50
+ return false;
51
+ }
52
+ function parseTableRows(content) {
53
+ const tasks = [];
54
+ for (const line of content.split("\n")) {
55
+ const trimmed = line.trim();
56
+ if (!trimmed.startsWith("|") || isSeparatorOrHeader(trimmed))
57
+ continue;
58
+ const match = TASK_TABLE_ROW.exec(trimmed);
59
+ if (!match)
60
+ continue;
61
+ let id;
62
+ try {
63
+ id = normalizeTaskId(match[1]);
64
+ }
65
+ catch {
66
+ continue;
67
+ }
68
+ const rawTitle = match[2].trim();
69
+ if (!rawTitle)
70
+ continue;
71
+ const parallelCell = match[3].trim();
72
+ const effortCell = match[4].trim();
73
+ const depsCell = match[5];
74
+ const tracesCell = match[6];
75
+ tasks.push({
76
+ id,
77
+ title: cleanTitle(rawTitle),
78
+ parallel: /\[P\]/i.test(parallelCell) || /\[P\]/i.test(rawTitle),
79
+ effort: effortCell && effortCell !== "—" ? effortCell : undefined,
80
+ dependencies: parseDependencies(depsCell),
81
+ traces_to: parseTraces(tracesCell, rawTitle),
82
+ claimed_done: false,
83
+ subtasks: [],
84
+ });
85
+ }
86
+ return tasks;
87
+ }
88
+ function parseCheckboxTasks(content) {
89
+ const tasks = [];
90
+ const lines = content.split("\n");
91
+ const linePattern = new RegExp(TASK_LINE_PATTERN.source, "i");
92
+ for (let i = 0; i < lines.length; i++) {
93
+ const line = lines[i];
94
+ const match = linePattern.exec(line);
95
+ if (!match)
96
+ continue;
97
+ let id;
98
+ try {
99
+ id = normalizeTaskId(match[1]);
100
+ }
101
+ catch {
102
+ continue;
103
+ }
104
+ const rawTitle = (match[3] ?? "").trim();
105
+ const parallel = /\[P\]/i.test(line);
106
+ const claimed_done = /^-\s+\[x\]/i.test(line.trim());
107
+ const dependencySection = /depends?:\s*([^;.)]+)/i.exec(rawTitle)?.[1] ?? "";
108
+ const dependencies = [...dependencySection.matchAll(TASK_ID_PATTERN)].map((dep) => normalizeTaskId(dep[0]));
109
+ const subtasks = [];
110
+ for (let j = i + 1; j < lines.length; j++) {
111
+ const sub = SUBTASK_LINE.exec(lines[j]);
112
+ if (!sub)
113
+ break;
114
+ subtasks.push(sub[1].trim());
115
+ i = j;
116
+ }
117
+ tasks.push({
118
+ id,
119
+ title: cleanTitle(rawTitle),
120
+ parallel,
121
+ dependencies,
122
+ traces_to: extractRequirementIds(rawTitle),
123
+ claimed_done,
124
+ subtasks,
125
+ });
126
+ }
127
+ return tasks;
128
+ }
129
+ /**
130
+ * Parse TASKS.md content supporting both canonical table rows and checkbox bullets.
131
+ * When both formats mention the same ID, checkbox wins for claimed_done / subtasks;
132
+ * table wins for effort / structured dependencies when checkbox deps are empty.
133
+ */
134
+ export function parseTasksFromMarkdown(content) {
135
+ const byId = new Map();
136
+ for (const task of parseTableRows(content)) {
137
+ byId.set(task.id, task);
138
+ }
139
+ for (const task of parseCheckboxTasks(content)) {
140
+ const existing = byId.get(task.id);
141
+ if (!existing) {
142
+ byId.set(task.id, task);
143
+ continue;
144
+ }
145
+ byId.set(task.id, {
146
+ ...existing,
147
+ title: task.title || existing.title,
148
+ parallel: task.parallel || existing.parallel,
149
+ claimed_done: task.claimed_done,
150
+ subtasks: task.subtasks.length > 0 ? task.subtasks : existing.subtasks,
151
+ dependencies: task.dependencies.length > 0 ? task.dependencies : existing.dependencies,
152
+ traces_to: task.traces_to.length > 0
153
+ ? [...new Set([...existing.traces_to, ...task.traces_to])].sort((a, b) => a.localeCompare(b))
154
+ : existing.traces_to,
155
+ });
156
+ }
157
+ return [...byId.values()].sort((a, b) => a.id.localeCompare(b.id));
158
+ }
159
+ //# sourceMappingURL=task-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-parser.js","sourceRoot":"","sources":["../../src/utils/task-parser.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "specky-sdd",
3
- "version": "3.10.0",
3
+ "version": "3.10.2",
4
4
  "description": "Specky — Spec-Driven Development CLI toolkit. 58 MCP tools, 13 agents, 22 prompts, 14 skills, 16 hooks. Unified `specky` CLI installs to Claude Code, GitHub Copilot, Cursor, or OpenCode on macOS, Linux, and Windows.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -12,8 +12,7 @@
12
12
 
13
13
  | Control ID | Name | Status | Evidence | Remediation |
14
14
  |-----------|------|--------|----------|-------------|
15
- {{#each findings}}
16
- | {{control_id}} | {{control_name}} | {{status}} | {{evidence}} | {{remediation}} |
15
+ {{#each findings}}{{this}}
17
16
  {{/each}}
18
17
 
19
18
  ## Summary
@@ -11,8 +11,7 @@
11
11
 
12
12
  | Task | Claimed | Verified | Phantom? | Evidence |
13
13
  |------|---------|----------|----------|----------|
14
- {{#each results}}
15
- | {{task_id}} | {{claimed_status}} | {{verified_status}} | {{phantom}} | {{evidence}} |
14
+ {{#each results}}{{this}}
16
15
  {{/each}}
17
16
 
18
17
  ## Summary