@assistkick/create 1.12.0 → 1.15.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.
- package/package.json +1 -1
- package/templates/assistkick-product-system/packages/backend/src/routes/skills.test.ts +3 -5
- package/templates/assistkick-product-system/packages/backend/src/routes/skills.ts +2 -5
- package/templates/assistkick-product-system/packages/backend/src/server.ts +1 -1
- package/templates/assistkick-product-system/packages/frontend/src/components/ToolDetailView.tsx +273 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/ToolUseCard.tsx +14 -4
- package/templates/skills/product-system/graph.json +0 -1890
- package/templates/skills/product-system/kanban.json +0 -304
- package/templates/skills/product-system/nodes/comp_001.md +0 -56
- package/templates/skills/product-system/nodes/comp_002.md +0 -57
- package/templates/skills/product-system/nodes/data_001.md +0 -51
- package/templates/skills/product-system/nodes/data_002.md +0 -40
- package/templates/skills/product-system/nodes/data_004.md +0 -38
- package/templates/skills/product-system/nodes/dec_001.md +0 -34
- package/templates/skills/product-system/nodes/dec_016.md +0 -32
- package/templates/skills/product-system/nodes/feat_008.md +0 -30
- package/templates/skills/video-composition-agent/SKILL.md +0 -232
- package/templates/skills/video-script-writer/SKILL.md +0 -136
|
@@ -1,304 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"feat_001": {
|
|
3
|
-
"column": "done",
|
|
4
|
-
"rejection_count": 0,
|
|
5
|
-
"notes": []
|
|
6
|
-
},
|
|
7
|
-
"feat_002": {
|
|
8
|
-
"column": "done",
|
|
9
|
-
"rejection_count": 0,
|
|
10
|
-
"notes": []
|
|
11
|
-
},
|
|
12
|
-
"feat_003": {
|
|
13
|
-
"column": "done",
|
|
14
|
-
"rejection_count": 0,
|
|
15
|
-
"notes": []
|
|
16
|
-
},
|
|
17
|
-
"feat_004": {
|
|
18
|
-
"column": "done",
|
|
19
|
-
"rejection_count": 0,
|
|
20
|
-
"notes": []
|
|
21
|
-
},
|
|
22
|
-
"feat_005": {
|
|
23
|
-
"column": "done",
|
|
24
|
-
"rejection_count": 0,
|
|
25
|
-
"notes": []
|
|
26
|
-
},
|
|
27
|
-
"feat_006": {
|
|
28
|
-
"column": "done",
|
|
29
|
-
"rejection_count": 0,
|
|
30
|
-
"notes": []
|
|
31
|
-
},
|
|
32
|
-
"feat_007": {
|
|
33
|
-
"column": "done",
|
|
34
|
-
"rejection_count": 0,
|
|
35
|
-
"notes": []
|
|
36
|
-
},
|
|
37
|
-
"feat_008": {
|
|
38
|
-
"column": "done",
|
|
39
|
-
"rejection_count": 0,
|
|
40
|
-
"notes": []
|
|
41
|
-
},
|
|
42
|
-
"feat_009": {
|
|
43
|
-
"column": "done",
|
|
44
|
-
"rejection_count": 0,
|
|
45
|
-
"notes": []
|
|
46
|
-
},
|
|
47
|
-
"feat_010": {
|
|
48
|
-
"column": "done",
|
|
49
|
-
"rejection_count": 0,
|
|
50
|
-
"notes": []
|
|
51
|
-
},
|
|
52
|
-
"feat_011": {
|
|
53
|
-
"column": "done",
|
|
54
|
-
"rejection_count": 0,
|
|
55
|
-
"notes": []
|
|
56
|
-
},
|
|
57
|
-
"feat_012": {
|
|
58
|
-
"column": "done",
|
|
59
|
-
"rejection_count": 0,
|
|
60
|
-
"notes": []
|
|
61
|
-
},
|
|
62
|
-
"feat_013": {
|
|
63
|
-
"column": "done",
|
|
64
|
-
"rejection_count": 0,
|
|
65
|
-
"notes": []
|
|
66
|
-
},
|
|
67
|
-
"feat_014": {
|
|
68
|
-
"column": "done",
|
|
69
|
-
"rejection_count": 0,
|
|
70
|
-
"notes": []
|
|
71
|
-
},
|
|
72
|
-
"feat_015": {
|
|
73
|
-
"column": "done",
|
|
74
|
-
"rejection_count": 1,
|
|
75
|
-
"notes": [
|
|
76
|
-
{
|
|
77
|
-
"from": "in_review",
|
|
78
|
-
"text": "REJECTED: Breaks feat_012 (Neighborhood Focus Mode, currently in QA). The implementation: (1) Deleted neighborhood_focus.test.js — the entire test file for feat_012; (2) Removed the getNeighborIds method from GraphRenderer; (3) Removed the this.links instance property; (4) Changed selectNode to only highlight the clicked node instead of the node + its neighbors. The feat_015 changes themselves (NODE_SHAPES, nodeShapePath, shape-based rendering) are correct and tests pass. But the fix is to preserve the neighborhood focus logic: keep getNeighborIds, keep this.links, keep the neighbor-aware opacity in selectNode, and keep neighborhood_focus.test.js. Only change circles to path shapes — do not alter selection/focus behavior.",
|
|
79
|
-
"timestamp": "2026-02-26T21:21:25.658Z"
|
|
80
|
-
}
|
|
81
|
-
]
|
|
82
|
-
},
|
|
83
|
-
"feat_016": {
|
|
84
|
-
"column": "done",
|
|
85
|
-
"rejection_count": 1,
|
|
86
|
-
"notes": [
|
|
87
|
-
{
|
|
88
|
-
"from": "in_review",
|
|
89
|
-
"text": "REJECTED: feat_016 implementation itself is correct (edge colors, labels, toggle, arrows all work), but the branch deletes unrelated code: (1) Removes entire NodeSearch integration from app.js and index.html (feat_020 search container HTML, import, init, setNodes, closeResults, handleSearchSelect all deleted), (2) Deletes test files: node_search.test.js (feat_020), node_sizing.test.js (feat_014), zoom_pan.test.js (feat_019). Fix: keep only feat_016 additions, do not remove search functionality or other features' test files.",
|
|
90
|
-
"timestamp": "2026-02-26T21:38:10.666Z"
|
|
91
|
-
}
|
|
92
|
-
]
|
|
93
|
-
},
|
|
94
|
-
"feat_017": {
|
|
95
|
-
"column": "done",
|
|
96
|
-
"rejection_count": 1,
|
|
97
|
-
"notes": []
|
|
98
|
-
},
|
|
99
|
-
"feat_018": {
|
|
100
|
-
"column": "done",
|
|
101
|
-
"rejection_count": 0,
|
|
102
|
-
"notes": []
|
|
103
|
-
},
|
|
104
|
-
"feat_019": {
|
|
105
|
-
"column": "done",
|
|
106
|
-
"rejection_count": 0,
|
|
107
|
-
"notes": []
|
|
108
|
-
},
|
|
109
|
-
"feat_020": {
|
|
110
|
-
"column": "done",
|
|
111
|
-
"rejection_count": 1,
|
|
112
|
-
"notes": [
|
|
113
|
-
{
|
|
114
|
-
"id": "580ee91f",
|
|
115
|
-
"text": "The UI is there, but it does not work",
|
|
116
|
-
"created_at": "2026-02-27T07:37:42.201Z",
|
|
117
|
-
"updated_at": "2026-02-27T07:37:42.201Z"
|
|
118
|
-
}
|
|
119
|
-
]
|
|
120
|
-
},
|
|
121
|
-
"feat_021": {
|
|
122
|
-
"column": "done",
|
|
123
|
-
"rejection_count": 0,
|
|
124
|
-
"notes": []
|
|
125
|
-
},
|
|
126
|
-
"feat_022": {
|
|
127
|
-
"column": "done",
|
|
128
|
-
"rejection_count": 0,
|
|
129
|
-
"notes": []
|
|
130
|
-
},
|
|
131
|
-
"feat_023": {
|
|
132
|
-
"column": "done",
|
|
133
|
-
"rejection_count": 1,
|
|
134
|
-
"notes": [
|
|
135
|
-
{
|
|
136
|
-
"id": "8cba0018",
|
|
137
|
-
"text": "rejection 1",
|
|
138
|
-
"created_at": "2026-02-26T18:08:57.398Z",
|
|
139
|
-
"updated_at": "2026-02-26T18:08:57.398Z"
|
|
140
|
-
}
|
|
141
|
-
]
|
|
142
|
-
},
|
|
143
|
-
"feat_025": {
|
|
144
|
-
"column": "done",
|
|
145
|
-
"rejection_count": 0,
|
|
146
|
-
"notes": []
|
|
147
|
-
},
|
|
148
|
-
"feat_026": {
|
|
149
|
-
"column": "done",
|
|
150
|
-
"rejection_count": 0,
|
|
151
|
-
"notes": []
|
|
152
|
-
},
|
|
153
|
-
"feat_027": {
|
|
154
|
-
"column": "done",
|
|
155
|
-
"rejection_count": 0,
|
|
156
|
-
"notes": []
|
|
157
|
-
},
|
|
158
|
-
"feat_028": {
|
|
159
|
-
"column": "done",
|
|
160
|
-
"rejection_count": 1,
|
|
161
|
-
"notes": [
|
|
162
|
-
{
|
|
163
|
-
"id": "0b8c863c",
|
|
164
|
-
"text": "The search should appear inside the legend card, just above the legend section",
|
|
165
|
-
"created_at": "2026-02-27T10:34:30.774Z",
|
|
166
|
-
"updated_at": "2026-02-27T10:34:30.774Z"
|
|
167
|
-
}
|
|
168
|
-
]
|
|
169
|
-
},
|
|
170
|
-
"feat_029": {
|
|
171
|
-
"column": "done",
|
|
172
|
-
"rejection_count": 1,
|
|
173
|
-
"notes": [
|
|
174
|
-
{
|
|
175
|
-
"from": "in_review",
|
|
176
|
-
"text": "REJECTED: graph_legend.js has 3 unresolved merge conflicts (<<<<<<< HEAD / ======= / >>>>>>> main markers at lines 29, 95, and 155). The application will not load. Issues: (1) Constructor conflict: HEAD adds collapsed/hiddenTypes/onTypeToggle but loses edgesCollapsed property needed by existing legend collapse feature. (2) buildHTML conflict: HEAD adds type-toggle-container and changes legend-header to legend-toggle but loses the legend-header div from main. (3) Method conflict: HEAD adds bindTypeToggleChips/getHiddenTypes/toggleCollapse but deletes toggleEdgesCollapse which is called in render(). The merge must be resolved to combine BOTH the new type toggle chip feature AND the existing edges-collapsed functionality. All three conflict regions need manual resolution that preserves main's edgesCollapsed logic while adding the new hiddenTypes toggle chips.",
|
|
177
|
-
"timestamp": "2026-02-27T11:20:49.508Z"
|
|
178
|
-
}
|
|
179
|
-
]
|
|
180
|
-
},
|
|
181
|
-
"feat_030": {
|
|
182
|
-
"column": "done",
|
|
183
|
-
"rejection_count": 0,
|
|
184
|
-
"notes": []
|
|
185
|
-
},
|
|
186
|
-
"feat_031": {
|
|
187
|
-
"column": "done",
|
|
188
|
-
"rejection_count": 0,
|
|
189
|
-
"notes": []
|
|
190
|
-
},
|
|
191
|
-
"feat_024": {
|
|
192
|
-
"column": "done",
|
|
193
|
-
"moved_at": "2026-02-27T09:05:26.762Z",
|
|
194
|
-
"notes": [
|
|
195
|
-
{
|
|
196
|
-
"id": "62ed7a0d",
|
|
197
|
-
"text": "When the user tries to manually move a card from todo to in progress in the kanban board they can see the possible drop columns higlighed but when they drop the feature in the in progress nothing happens, the backend shows the following logs\n\n[09:18:13.261] [API] GET /api/kanban\n[09:18:15.088] [ROUTER] POST /api/kanban/feat_023/move\n[09:18:15.089] [API] POST /api/kanban/feat_023/move\n[09:18:15.089] [MOVE] feat_023 → target: in_progress\n[09:18:15.090] [MOVE] feat_023: current=todo allowed=[]\n[09:18:15.090] [MOVE] REJECT: todo → in_progress not allowed\n[09:18:17.388] [ROUTER] POST /api/kanban/feat_023/move\n[09:18:17.388] [API] POST /api/kanban/feat_023/move\n[09:18:17.389] [MOVE] feat_023 → target: in_progress\n[09:18:17.390] [MOVE] feat_023: current=todo allowed=[]\n[09:18:17.390] [MOVE] REJECT: todo → in_progress not allowed\n[09:18:27.086] [ROUTER] GET /api/graph\n[09:18:27.086] [API] GET /api/graph\n[09:18:28.986] [ROUTER] GET /api/kanban\n[09:18:28.986] [API] GET /api/kanban\n[09:18:30.604] [ROUTER] POST /api/kanban/feat_023/move\n[09:18:30.604] [API] POST /api/kanban/feat_023/move\n[09:18:30.605] [MOVE] feat_023 → target: in_progress\n[09:18:30.605] [MOVE] feat_023: current=todo allowed=[]\n[09:18:30.605] [MOVE] REJECT: todo → in_progress not allowed\n[09:18:45.489] [ROUTER] POST /api/kanban/feat_023/move\n[09:18:45.490] [API] POST /api/kanban/feat_023/move\n[09:18:45.490] [MOVE] feat_023 → target: in_progress\n[09:18:45.491] [MOVE] feat_023: current=todo allowed=[]\n[09:18:45.491] [MOVE] REJECT: todo → in_progress not allowed\n\nAll transitions should be allowed for human users in the kanban board.",
|
|
198
|
-
"created_at": "2026-02-27T09:20:44.258Z",
|
|
199
|
-
"updated_at": "2026-02-27T09:20:44.258Z"
|
|
200
|
-
}
|
|
201
|
-
],
|
|
202
|
-
"rejection_count": 1
|
|
203
|
-
},
|
|
204
|
-
"feat_032": {
|
|
205
|
-
"column": "done",
|
|
206
|
-
"rejection_count": 0,
|
|
207
|
-
"notes": []
|
|
208
|
-
},
|
|
209
|
-
"feat_034": {
|
|
210
|
-
"column": "done",
|
|
211
|
-
"rejection_count": 0,
|
|
212
|
-
"notes": []
|
|
213
|
-
},
|
|
214
|
-
"feat_035": {
|
|
215
|
-
"column": "done",
|
|
216
|
-
"rejection_count": 1,
|
|
217
|
-
"notes": [],
|
|
218
|
-
"moved_at": "2026-02-27T14:11:18.076Z"
|
|
219
|
-
},
|
|
220
|
-
"feat_036": {
|
|
221
|
-
"column": "done",
|
|
222
|
-
"rejection_count": 0,
|
|
223
|
-
"notes": [],
|
|
224
|
-
"moved_at": "2026-02-27T13:42:38.833Z"
|
|
225
|
-
},
|
|
226
|
-
"feat_033": {
|
|
227
|
-
"column": "done",
|
|
228
|
-
"rejection_count": 0,
|
|
229
|
-
"notes": [],
|
|
230
|
-
"moved_at": "2026-02-27T13:42:30.978Z"
|
|
231
|
-
},
|
|
232
|
-
"feat_037": {
|
|
233
|
-
"column": "done",
|
|
234
|
-
"rejection_count": 0,
|
|
235
|
-
"notes": [],
|
|
236
|
-
"moved_at": "2026-02-27T13:43:07.183Z"
|
|
237
|
-
},
|
|
238
|
-
"feat_038": {
|
|
239
|
-
"column": "done",
|
|
240
|
-
"rejection_count": 0,
|
|
241
|
-
"notes": [],
|
|
242
|
-
"moved_at": "2026-02-27T13:53:02.202Z"
|
|
243
|
-
},
|
|
244
|
-
"feat_039": {
|
|
245
|
-
"column": "done",
|
|
246
|
-
"rejection_count": 1,
|
|
247
|
-
"notes": [
|
|
248
|
-
{
|
|
249
|
-
"from": "qa",
|
|
250
|
-
"text": "Bug found: feat_039 implementation is completely missing. The inline notes UI from feat_022 was never replaced with the side sheet. See feat_042 for detailed investigation and fix guidance.",
|
|
251
|
-
"timestamp": "2026-02-27T18:14:32.514Z"
|
|
252
|
-
}
|
|
253
|
-
],
|
|
254
|
-
"moved_at": "2026-02-27T18:24:26.331Z"
|
|
255
|
-
},
|
|
256
|
-
"feat_040": {
|
|
257
|
-
"column": "qa",
|
|
258
|
-
"rejection_count": 1,
|
|
259
|
-
"notes": [
|
|
260
|
-
{
|
|
261
|
-
"from": "in_review",
|
|
262
|
-
"text": "Reviewer process died silently during parallel pipeline run with feat_041. Worktree and branch cleaned up. Ready for re-run.",
|
|
263
|
-
"timestamp": "2026-02-28T07:42:01.496Z"
|
|
264
|
-
}
|
|
265
|
-
],
|
|
266
|
-
"moved_at": "2026-02-28T08:45:51.004Z"
|
|
267
|
-
},
|
|
268
|
-
"feat_041": {
|
|
269
|
-
"column": "qa",
|
|
270
|
-
"rejection_count": 0,
|
|
271
|
-
"notes": [],
|
|
272
|
-
"moved_at": "2026-02-27T18:50:01.745Z"
|
|
273
|
-
},
|
|
274
|
-
"feat_042": {
|
|
275
|
-
"column": "done",
|
|
276
|
-
"rejection_count": 0,
|
|
277
|
-
"notes": [],
|
|
278
|
-
"moved_at": "2026-02-27T18:24:29.757Z"
|
|
279
|
-
},
|
|
280
|
-
"feat_043": {
|
|
281
|
-
"column": "todo",
|
|
282
|
-
"rejection_count": 0,
|
|
283
|
-
"notes": [],
|
|
284
|
-
"moved_at": "2026-02-28T08:31:18.178Z"
|
|
285
|
-
},
|
|
286
|
-
"feat_044": {
|
|
287
|
-
"column": "todo",
|
|
288
|
-
"rejection_count": 0,
|
|
289
|
-
"notes": [],
|
|
290
|
-
"moved_at": "2026-02-28T08:31:21.696Z"
|
|
291
|
-
},
|
|
292
|
-
"feat_045": {
|
|
293
|
-
"column": "todo",
|
|
294
|
-
"rejection_count": 0,
|
|
295
|
-
"notes": [],
|
|
296
|
-
"moved_at": "2026-02-28T08:31:24.631Z"
|
|
297
|
-
},
|
|
298
|
-
"feat_046": {
|
|
299
|
-
"column": "todo",
|
|
300
|
-
"rejection_count": 0,
|
|
301
|
-
"notes": [],
|
|
302
|
-
"moved_at": "2026-02-28T08:31:27.401Z"
|
|
303
|
-
}
|
|
304
|
-
}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: comp_001
|
|
3
|
-
type: component
|
|
4
|
-
name: Graph Engine
|
|
5
|
-
status: defined
|
|
6
|
-
priority: high
|
|
7
|
-
created_at: '2026-02-26T12:13:09.364Z'
|
|
8
|
-
updated_at: '2026-02-26T12:21:39.425Z'
|
|
9
|
-
---
|
|
10
|
-
## Description
|
|
11
|
-
Core data layer managing graph.json — the central index of all nodes and edges. Handles atomic reads/writes using temp file + rename. Stores node metadata (id, type, name, status, completeness, open_questions_count, file path, timestamps) and typed edges (from, relation, to).
|
|
12
|
-
|
|
13
|
-
## Responsibilities
|
|
14
|
-
- Load and save graph.json atomically (temp file + rename)
|
|
15
|
-
- Maintain the nodes array with metadata (id, type, name, status, completeness, open_questions_count, file, timestamps)
|
|
16
|
-
- Maintain the edges array with typed relations (from, relation, to)
|
|
17
|
-
- Generate sequential IDs per node type (e.g. feat_001, feat_002)
|
|
18
|
-
- Provide lookup functions for nodes by id and edges by endpoints
|
|
19
|
-
- Initialize empty graph structure for new projects
|
|
20
|
-
- Update node metadata when completeness or status changes
|
|
21
|
-
|
|
22
|
-
## Tech
|
|
23
|
-
- Node.js fs module for file I/O
|
|
24
|
-
- JSON.parse / JSON.stringify for serialization
|
|
25
|
-
- Atomic write pattern: write to .tmp file then fs.renameSync
|
|
26
|
-
- Path resolution relative to skill base directory
|
|
27
|
-
|
|
28
|
-
## Exposes
|
|
29
|
-
- loadGraph() → full graph object
|
|
30
|
-
- saveGraph(graph) → atomic write to graph.json
|
|
31
|
-
- findNode(id) → node metadata or null
|
|
32
|
-
- nextId(type) → next sequential ID string
|
|
33
|
-
- addNodeMeta(node) → appends to nodes array
|
|
34
|
-
- updateNodeMeta(id, updates) → patches node metadata
|
|
35
|
-
- addEdgeMeta(edge) → appends to edges array
|
|
36
|
-
- removeEdgeMeta(from, rel, to) → removes matching edge
|
|
37
|
-
|
|
38
|
-
## Consumes
|
|
39
|
-
- lib/constants.js for type prefix mappings
|
|
40
|
-
- Node.js fs and path modules
|
|
41
|
-
|
|
42
|
-
## Resolved Questions
|
|
43
|
-
|
|
44
|
-
## Notes
|
|
45
|
-
|
|
46
|
-
## Relations
|
|
47
|
-
- implemented_with ← feat_001 (Node CRUD Operations)
|
|
48
|
-
- implemented_with ← feat_002 (Edge Management)
|
|
49
|
-
- implemented_with ← feat_006 (Search and Discovery)
|
|
50
|
-
- implemented_with ← feat_008 (Index Rebuild)
|
|
51
|
-
- reads_writes → data_001 (graph.json)
|
|
52
|
-
- depends_on ← comp_007 (CLI Tools Layer)
|
|
53
|
-
- governed_by → dec_002 (Atomic File Writes)
|
|
54
|
-
- implemented_with ← feat_041 (Graph Coherence Review Process)
|
|
55
|
-
- relates_to ← feat_044 (Turso Connection and Database Layer)
|
|
56
|
-
- relates_to ← feat_046 (Remove Local File Dependencies)
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: comp_002
|
|
3
|
-
type: component
|
|
4
|
-
name: Markdown System
|
|
5
|
-
status: defined
|
|
6
|
-
priority: high
|
|
7
|
-
created_at: '2026-02-26T12:13:10.832Z'
|
|
8
|
-
updated_at: '2026-02-26T12:21:39.463Z'
|
|
9
|
-
---
|
|
10
|
-
## Description
|
|
11
|
-
Handles parsing and serializing node markdown files. Uses gray-matter for YAML frontmatter. Provides section-based read/write/append/move operations. Markdown files are the source of truth; graph.json is derived metadata.
|
|
12
|
-
|
|
13
|
-
## Responsibilities
|
|
14
|
-
- Parse node markdown files into structured {frontmatter, sections} objects
|
|
15
|
-
- Serialize structured data back to markdown with YAML frontmatter
|
|
16
|
-
- Read, write, and append content to named sections (## headers)
|
|
17
|
-
- Move lines between sections (for question resolution)
|
|
18
|
-
- Generate blank section templates per node type
|
|
19
|
-
- Derive metadata (completeness, open_questions_count, status) from content
|
|
20
|
-
- Preserve section ordering and formatting on write
|
|
21
|
-
|
|
22
|
-
## Tech
|
|
23
|
-
- gray-matter library for YAML frontmatter parsing and serialization
|
|
24
|
-
- Custom section parser splitting body on ## headers
|
|
25
|
-
- String manipulation for section content operations
|
|
26
|
-
- Regex for checkbox counting in open questions
|
|
27
|
-
|
|
28
|
-
## Exposes
|
|
29
|
-
- readNode(filepath) → {frontmatter, sections}
|
|
30
|
-
- writeNode(filepath, fm, sections) → serialized .md file
|
|
31
|
-
- getSection(sections, name) → section content string
|
|
32
|
-
- setSection(sections, name, content) → updated sections
|
|
33
|
-
- appendToSection(sections, name, line) → creates section if missing
|
|
34
|
-
- moveLineAcrossSections(sections, from, to, line) → for question resolution
|
|
35
|
-
- deriveMetadata(fm, sections, type) → {completeness, open_questions_count, status}
|
|
36
|
-
- templateSections(type) → blank section map for node type
|
|
37
|
-
|
|
38
|
-
## Consumes
|
|
39
|
-
- gray-matter (npm) for frontmatter parsing
|
|
40
|
-
- lib/constants.js for section templates and scoring rules
|
|
41
|
-
- lib/completeness.js for score calculation
|
|
42
|
-
- Node.js fs and path modules
|
|
43
|
-
|
|
44
|
-
## Resolved Questions
|
|
45
|
-
|
|
46
|
-
## Notes
|
|
47
|
-
|
|
48
|
-
## Relations
|
|
49
|
-
- implemented_with ← feat_001 (Node CRUD Operations)
|
|
50
|
-
- implemented_with ← feat_003 (Question Lifecycle)
|
|
51
|
-
- implemented_with ← feat_008 (Index Rebuild)
|
|
52
|
-
- reads_writes → data_002 (Node Markdown Files)
|
|
53
|
-
- depends_on ← comp_007 (CLI Tools Layer)
|
|
54
|
-
- governed_by → dec_001 (Markdown as Source of Truth)
|
|
55
|
-
- governed_by → dec_005 (Bidirectional Relation Recording)
|
|
56
|
-
- implemented_with → tech_002 (gray-matter)
|
|
57
|
-
- relates_to ← feat_046 (Remove Local File Dependencies)
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: data_001
|
|
3
|
-
type: data_entity
|
|
4
|
-
name: graph.json
|
|
5
|
-
status: defined
|
|
6
|
-
priority: high
|
|
7
|
-
created_at: '2026-02-26T12:13:45.234Z'
|
|
8
|
-
updated_at: '2026-02-26T12:21:39.691Z'
|
|
9
|
-
---
|
|
10
|
-
## Description
|
|
11
|
-
Central index file storing all node metadata and edges. Contains version, project info, nodes array (id, type, name, status, completeness, open_questions_count, file, timestamps), and edges array (from, relation, to). Written atomically via temp file + rename.
|
|
12
|
-
|
|
13
|
-
## Fields
|
|
14
|
-
- version: string (currently "1.0")
|
|
15
|
-
- project.name: string
|
|
16
|
-
- project.description: string
|
|
17
|
-
- project.created_at: ISO 8601 timestamp
|
|
18
|
-
- project.updated_at: ISO 8601 timestamp
|
|
19
|
-
- nodes[]: array of node metadata objects
|
|
20
|
-
- nodes[].id: string (type prefix + sequential number, e.g. feat_001)
|
|
21
|
-
- nodes[].type: string (one of 12 valid types)
|
|
22
|
-
- nodes[].name: string
|
|
23
|
-
- nodes[].status: draft | partially_defined | defined
|
|
24
|
-
- nodes[].completeness: number 0.0 to 1.0
|
|
25
|
-
- nodes[].open_questions_count: integer
|
|
26
|
-
- nodes[].file: string (relative path to .md file)
|
|
27
|
-
- nodes[].created_at: ISO 8601 timestamp
|
|
28
|
-
- nodes[].updated_at: ISO 8601 timestamp
|
|
29
|
-
- edges[]: array of edge objects
|
|
30
|
-
- edges[].from: string (source node ID)
|
|
31
|
-
- edges[].relation: string (one of 11 valid relations)
|
|
32
|
-
- edges[].to: string (target node ID)
|
|
33
|
-
|
|
34
|
-
## Used By
|
|
35
|
-
- comp_001 (Graph Engine) — reads and writes this file
|
|
36
|
-
- All CLI tools via Graph Engine
|
|
37
|
-
- get_status, get_gaps, search_nodes for metadata queries
|
|
38
|
-
- rebuild_index regenerates this file from markdown
|
|
39
|
-
|
|
40
|
-
## Resolved Questions
|
|
41
|
-
|
|
42
|
-
## Notes
|
|
43
|
-
|
|
44
|
-
## Relations
|
|
45
|
-
- reads_writes ← comp_001 (Graph Engine)
|
|
46
|
-
- reads_writes ← feat_021 (Kanban Board View)
|
|
47
|
-
- relates_to ← dec_016 (SQLite Index for Scale)
|
|
48
|
-
- reads_writes ← feat_009 (Graph Visualization Web UI)
|
|
49
|
-
- reads_writes ← feat_038 (Kanban Card Copy Button)
|
|
50
|
-
- reads_writes ← feat_041 (Graph Coherence Review Process)
|
|
51
|
-
- relates_to ← feat_045 (Data Migration Script)
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: data_002
|
|
3
|
-
type: data_entity
|
|
4
|
-
name: Node Markdown Files
|
|
5
|
-
status: defined
|
|
6
|
-
priority: high
|
|
7
|
-
created_at: '2026-02-26T12:13:47.815Z'
|
|
8
|
-
updated_at: '2026-02-26T12:21:39.730Z'
|
|
9
|
-
---
|
|
10
|
-
## Description
|
|
11
|
-
Individual .md files in nodes/ directory, one per specification node. Use YAML frontmatter (id, type, name, status, priority, timestamps) + section-based body (Description, Acceptance Criteria, Open Questions, Resolved Questions, Notes, Relations, plus type-specific sections). These are the source of truth.
|
|
12
|
-
|
|
13
|
-
## Fields
|
|
14
|
-
- Frontmatter (YAML):
|
|
15
|
-
- id: string (matches graph.json node ID)
|
|
16
|
-
- type: string (node type)
|
|
17
|
-
- name: string (display name)
|
|
18
|
-
- status: draft | partially_defined | defined
|
|
19
|
-
- priority: low | medium | high | blocking
|
|
20
|
-
- created_at: ISO 8601 timestamp
|
|
21
|
-
- updated_at: ISO 8601 timestamp
|
|
22
|
-
- Body sections (## headers):
|
|
23
|
-
- Type-specific required sections (vary by node type)
|
|
24
|
-
- Resolved Questions: completed question-answer pairs
|
|
25
|
-
- Notes: session notes and annotations
|
|
26
|
-
- Relations: auto-populated edge descriptions
|
|
27
|
-
|
|
28
|
-
## Used By
|
|
29
|
-
- comp_002 (Markdown System) — reads and writes these files
|
|
30
|
-
- All CLI tools that modify or display node content
|
|
31
|
-
- rebuild_index reads these to regenerate graph.json
|
|
32
|
-
- The AI interviewer and product owner review these for specification content
|
|
33
|
-
|
|
34
|
-
## Resolved Questions
|
|
35
|
-
|
|
36
|
-
## Notes
|
|
37
|
-
|
|
38
|
-
## Relations
|
|
39
|
-
- reads_writes ← comp_002 (Markdown System)
|
|
40
|
-
- relates_to ← feat_045 (Data Migration Script)
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: data_004
|
|
3
|
-
type: data_entity
|
|
4
|
-
name: kanban.json
|
|
5
|
-
status: defined
|
|
6
|
-
priority: medium
|
|
7
|
-
created_at: '2026-02-26T16:17:04.615Z'
|
|
8
|
-
updated_at: '2026-02-27T17:48:49.256Z'
|
|
9
|
-
---
|
|
10
|
-
## Description
|
|
11
|
-
Stores implementation tracking state separate from the spec graph. Structure per feature: { featureId: { column: 'todo|in_progress|qa|done', rejection_count: number, notes: [{ id, text, created_at, updated_at, addressed: boolean }] } }. Only features with spec status=defined are represented. The 'addressed' field on notes tracks whether the debugger agent has investigated a given issue.
|
|
12
|
-
|
|
13
|
-
## Fields
|
|
14
|
-
|
|
15
|
-
## Used By
|
|
16
|
-
|
|
17
|
-
## Resolved Questions
|
|
18
|
-
|
|
19
|
-
## Notes
|
|
20
|
-
> Session 13: Added 'addressed' boolean field to note objects for feat_040 debug pipeline tracking.
|
|
21
|
-
|
|
22
|
-
## Relations
|
|
23
|
-
- reads_writes ← feat_021 (Kanban Board View)
|
|
24
|
-
- reads_writes ← feat_022 (QA Rejection Notes)
|
|
25
|
-
- reads_writes ← feat_023 (QA Rejection Counter)
|
|
26
|
-
- reads_writes ← feat_024 (Free-Form Kanban Column Transitions)
|
|
27
|
-
- reads_writes ← feat_025 (Retry Attempt Label on Kanban Cards)
|
|
28
|
-
- relates_to ← dec_016 (SQLite Index for Scale)
|
|
29
|
-
- reads_writes ← feat_036 (All Features on Kanban Board)
|
|
30
|
-
- reads_writes ← feat_038 (Kanban Card Copy Button)
|
|
31
|
-
- reads_writes ← feat_039 (QA Issue Reporting Side Sheet)
|
|
32
|
-
- reads_writes ← feat_040 (Debug-First Pipeline Step for QA Issues)
|
|
33
|
-
- relates_to ← feat_045 (Data Migration Script)
|
|
34
|
-
|
|
35
|
-
## Acceptance Criteria
|
|
36
|
-
- Stores column, rejection_count, and notes array per feature
|
|
37
|
-
- File is auto-created when the kanban is first accessed
|
|
38
|
-
- New defined features default to todo column with rejection_count 0
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: dec_001
|
|
3
|
-
type: decision
|
|
4
|
-
name: Markdown as Source of Truth
|
|
5
|
-
status: defined
|
|
6
|
-
priority: high
|
|
7
|
-
created_at: '2026-02-26T12:13:57.346Z'
|
|
8
|
-
updated_at: '2026-02-28T08:31:00.783Z'
|
|
9
|
-
---
|
|
10
|
-
## Description
|
|
11
|
-
Node markdown files are the canonical data source. graph.json is derived metadata that can be regenerated via rebuild_index. This ensures human-readable specs and enables manual editing when needed.
|
|
12
|
-
|
|
13
|
-
## Rationale
|
|
14
|
-
Markdown files are human-readable, diffable in git, and editable with any text editor. Making them the source of truth means the system degrades gracefully — even if graph.json is corrupted, all specification content is preserved in individual files and can be rebuilt via rebuild_index.
|
|
15
|
-
|
|
16
|
-
## Alternatives Considered
|
|
17
|
-
- Database (SQLite/JSON-DB): More structured but loses human readability and git diffability
|
|
18
|
-
- graph.json as source of truth: Simpler but single point of failure and harder to manually inspect
|
|
19
|
-
- YAML-only files: More structured than markdown but less flexible for free-form content
|
|
20
|
-
|
|
21
|
-
## Affects
|
|
22
|
-
- comp_002 (Markdown System) — primary consumer of this decision
|
|
23
|
-
- feat_008 (Index Rebuild) — enables recovery from graph.json corruption
|
|
24
|
-
- All tools must go through markdown.js for content changes
|
|
25
|
-
|
|
26
|
-
## Resolved Questions
|
|
27
|
-
|
|
28
|
-
## Notes
|
|
29
|
-
> Session 15: Superseded by dec_018 (Turso Database as Source of Truth). Markdown is no longer stored as local files. Content lives in Turso database TEXT columns. The rationale (human-readability, git-diffability) is preserved conceptually — content is still markdown format — but the storage layer has changed.
|
|
30
|
-
|
|
31
|
-
## Relations
|
|
32
|
-
- governed_by ← comp_002 (Markdown System)
|
|
33
|
-
- relates_to ← dec_016 (SQLite Index for Scale)
|
|
34
|
-
- relates_to ← dec_018 (Turso Database as Source of Truth)
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: dec_016
|
|
3
|
-
type: decision
|
|
4
|
-
name: SQLite Index for Scale
|
|
5
|
-
status: defined
|
|
6
|
-
priority: high
|
|
7
|
-
created_at: '2026-02-27T07:55:59.733Z'
|
|
8
|
-
updated_at: '2026-02-28T08:30:58.271Z'
|
|
9
|
-
---
|
|
10
|
-
## Description
|
|
11
|
-
When the project grows beyond ~200-300 features, replace graph.json and kanban.json (the derived index files) with a SQLite database. Markdown files remain the source of truth (dec_001 unchanged). SQLite replaces only the derived index layer — rebuild_index would regenerate the SQLite DB from markdown instead of regenerating graph.json. This gives indexed queries, proper joins for edge lookups, and eliminates the full-file read/parse/write cycle on every tool call. Trigger point: when tool operations start feeling slow, likely around 200-300 features with 1000+ edges.
|
|
12
|
-
|
|
13
|
-
## Rationale
|
|
14
|
-
JSON files require full read/parse/modify/serialize/write on every operation. At 500+ nodes with 2500+ edges, graph.json reaches ~500KB-1MB, causing noticeable latency. SQLite provides indexed lookups, partial reads, and atomic row-level writes. Markdown stays as source of truth (dec_001), so git diffability and human readability are preserved. SQLite only replaces the derived index — rebuild_index regenerates it from markdown.
|
|
15
|
-
|
|
16
|
-
## Alternatives Considered
|
|
17
|
-
1. **Keep JSON files** — works now at 65 nodes, degrades at 200-300+. Current approach.\n2. **Split graph.json per type** — e.g. features.json, decisions.json. Reduces per-file size but adds complexity and cross-type queries still need multiple files.\n3. **Full SQLite (replace markdown too)** — loses git diffability, human readability, and the rebuild safety net. Over-migration.
|
|
18
|
-
|
|
19
|
-
## Affects
|
|
20
|
-
- comp_001 (Graph Engine) — graph.js would use better-sqlite3 instead of JSON read/write\n- feat_008 (Index Rebuild) — rebuild_index regenerates SQLite DB instead of graph.json\n- data_001 (graph.json) — replaced by graph.db\n- data_004 (kanban.json) — absorbed into graph.db as a kanban table\n- All CLI tools — transparent if graph.js API stays the same
|
|
21
|
-
|
|
22
|
-
## Resolved Questions
|
|
23
|
-
|
|
24
|
-
## Notes
|
|
25
|
-
> Session 14: The scale argument is now secondary. The primary driver is correctness under concurrent pipeline access. feat_040's reviewer crashed because feat_041's stash/merge/pop disrupted kanban.json mid-write. JSON files are entangled with git state — any git operation on the working tree can corrupt concurrent readers/writers. A database decouples data access from git entirely, making concurrent pipelines safe. This elevates the migration from 'nice-to-have at scale' to 'needed for pipeline reliability now'.
|
|
26
|
-
> Session 15: Scope expanded significantly. Now using Turso (hosted LibSQL) instead of local better-sqlite3, with Drizzle ORM. Markdown files no longer stored locally — full content stored in Turso TEXT columns. dec_018 supersedes dec_001 as the source-of-truth decision. S3 dropped — Turso alone handles all persistence.
|
|
27
|
-
|
|
28
|
-
## Relations
|
|
29
|
-
- relates_to → dec_001 (Markdown as Source of Truth)
|
|
30
|
-
- relates_to → data_001 (graph.json)
|
|
31
|
-
- relates_to → data_004 (kanban.json)
|
|
32
|
-
- relates_to ← dec_018 (Turso Database as Source of Truth)
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: feat_008
|
|
3
|
-
type: feature
|
|
4
|
-
name: Index Rebuild
|
|
5
|
-
status: defined
|
|
6
|
-
priority: medium
|
|
7
|
-
created_at: '2026-02-26T12:13:39.739Z'
|
|
8
|
-
updated_at: '2026-02-26T12:19:57.630Z'
|
|
9
|
-
---
|
|
10
|
-
## Description
|
|
11
|
-
Regenerates graph.json from all node markdown files. Recovers from manual file edits or corruption. Preserves valid edges, removes edges referencing deleted nodes. Supports dry-run mode.
|
|
12
|
-
|
|
13
|
-
## Acceptance Criteria
|
|
14
|
-
- Regenerates graph.json from all node markdown files in nodes/ directory
|
|
15
|
-
- Preserves valid edges where both endpoint nodes still exist
|
|
16
|
-
- Removes edges referencing deleted nodes
|
|
17
|
-
- Supports --dry-run mode to preview changes without writing
|
|
18
|
-
- Recalculates completeness and status for all nodes
|
|
19
|
-
|
|
20
|
-
## Open Questions
|
|
21
|
-
|
|
22
|
-
## Resolved Questions
|
|
23
|
-
|
|
24
|
-
## Notes
|
|
25
|
-
|
|
26
|
-
## Relations
|
|
27
|
-
- implemented_with → comp_001 (Graph Engine)
|
|
28
|
-
- implemented_with → comp_002 (Markdown System)
|
|
29
|
-
- relates_to ← feat_041 (Graph Coherence Review Process)
|
|
30
|
-
- relates_to ← feat_046 (Remove Local File Dependencies)
|