@assistkick/create 1.7.0 → 1.9.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 (206) hide show
  1. package/dist/bin/create.js +0 -0
  2. package/package.json +9 -7
  3. package/templates/assistkick-product-system/.env.example +1 -0
  4. package/templates/assistkick-product-system/local.db +0 -0
  5. package/templates/assistkick-product-system/package.json +4 -2
  6. package/templates/assistkick-product-system/packages/backend/package.json +2 -0
  7. package/templates/assistkick-product-system/packages/backend/src/routes/agents.ts +165 -0
  8. package/templates/assistkick-product-system/packages/backend/src/routes/files.test.ts +358 -0
  9. package/templates/assistkick-product-system/packages/backend/src/routes/files.ts +356 -0
  10. package/templates/assistkick-product-system/packages/backend/src/routes/git.ts +96 -1
  11. package/templates/assistkick-product-system/packages/backend/src/routes/graph.ts +1 -0
  12. package/templates/assistkick-product-system/packages/backend/src/routes/kanban.ts +61 -6
  13. package/templates/assistkick-product-system/packages/backend/src/routes/pipeline.ts +200 -84
  14. package/templates/assistkick-product-system/packages/backend/src/routes/projects.ts +6 -3
  15. package/templates/assistkick-product-system/packages/backend/src/routes/terminal.ts +53 -17
  16. package/templates/assistkick-product-system/packages/backend/src/routes/video.ts +218 -0
  17. package/templates/assistkick-product-system/packages/backend/src/routes/workflow_groups.ts +119 -0
  18. package/templates/assistkick-product-system/packages/backend/src/routes/workflows.ts +158 -0
  19. package/templates/assistkick-product-system/packages/backend/src/server.ts +60 -9
  20. package/templates/assistkick-product-system/packages/backend/src/services/agent_service.test.ts +489 -0
  21. package/templates/assistkick-product-system/packages/backend/src/services/agent_service.ts +416 -0
  22. package/templates/assistkick-product-system/packages/backend/src/services/bundle_service.test.ts +189 -0
  23. package/templates/assistkick-product-system/packages/backend/src/services/bundle_service.ts +182 -0
  24. package/templates/assistkick-product-system/packages/backend/src/services/init.ts +43 -77
  25. package/templates/assistkick-product-system/packages/backend/src/services/project_service.test.ts +16 -0
  26. package/templates/assistkick-product-system/packages/backend/src/services/project_service.ts +73 -2
  27. package/templates/assistkick-product-system/packages/backend/src/services/project_workspace_service.test.ts +4 -4
  28. package/templates/assistkick-product-system/packages/backend/src/services/project_workspace_service.ts +87 -11
  29. package/templates/assistkick-product-system/packages/backend/src/services/pty_session_manager.test.ts +210 -69
  30. package/templates/assistkick-product-system/packages/backend/src/services/pty_session_manager.ts +210 -215
  31. package/templates/assistkick-product-system/packages/backend/src/services/ssh_key_service.test.ts +162 -0
  32. package/templates/assistkick-product-system/packages/backend/src/services/ssh_key_service.ts +148 -0
  33. package/templates/assistkick-product-system/packages/backend/src/services/terminal_ws_handler.ts +11 -5
  34. package/templates/assistkick-product-system/packages/backend/src/services/tts_service.test.ts +64 -0
  35. package/templates/assistkick-product-system/packages/backend/src/services/tts_service.ts +134 -0
  36. package/templates/assistkick-product-system/packages/backend/src/services/video_render_service.test.ts +256 -0
  37. package/templates/assistkick-product-system/packages/backend/src/services/video_render_service.ts +258 -0
  38. package/templates/assistkick-product-system/packages/backend/src/services/workflow_group_service.ts +106 -0
  39. package/templates/assistkick-product-system/packages/backend/src/services/workflow_service.test.ts +275 -0
  40. package/templates/assistkick-product-system/packages/backend/src/services/workflow_service.ts +245 -0
  41. package/templates/assistkick-product-system/packages/frontend/package-lock.json +3455 -0
  42. package/templates/assistkick-product-system/packages/frontend/package.json +6 -0
  43. package/templates/assistkick-product-system/packages/frontend/src/App.tsx +8 -0
  44. package/templates/assistkick-product-system/packages/frontend/src/api/client.ts +458 -18
  45. package/templates/assistkick-product-system/packages/frontend/src/api/client_files.test.ts +172 -0
  46. package/templates/assistkick-product-system/packages/frontend/src/api/client_video.test.ts +238 -0
  47. package/templates/assistkick-product-system/packages/frontend/src/components/AgentsView.tsx +307 -0
  48. package/templates/assistkick-product-system/packages/frontend/src/components/CoherenceView.tsx +82 -66
  49. package/templates/assistkick-product-system/packages/frontend/src/components/CompositionPlaceholder.tsx +97 -0
  50. package/templates/assistkick-product-system/packages/frontend/src/components/DesignSystemView.tsx +20 -0
  51. package/templates/assistkick-product-system/packages/frontend/src/components/EditorTabBar.tsx +57 -0
  52. package/templates/assistkick-product-system/packages/frontend/src/components/FileTree.tsx +313 -0
  53. package/templates/assistkick-product-system/packages/frontend/src/components/FileTreeContextMenu.tsx +61 -0
  54. package/templates/assistkick-product-system/packages/frontend/src/components/FileTreeInlineInput.tsx +73 -0
  55. package/templates/assistkick-product-system/packages/frontend/src/components/FilesView.tsx +404 -0
  56. package/templates/assistkick-product-system/packages/frontend/src/components/GitRepoModal.tsx +187 -56
  57. package/templates/assistkick-product-system/packages/frontend/src/components/GraphLegend.tsx +71 -73
  58. package/templates/assistkick-product-system/packages/frontend/src/components/GraphSettings.tsx +8 -8
  59. package/templates/assistkick-product-system/packages/frontend/src/components/GraphView.tsx +1 -1
  60. package/templates/assistkick-product-system/packages/frontend/src/components/InviteUserDialog.tsx +15 -11
  61. package/templates/assistkick-product-system/packages/frontend/src/components/IterationCommentModal.tsx +80 -0
  62. package/templates/assistkick-product-system/packages/frontend/src/components/KanbanView.tsx +263 -167
  63. package/templates/assistkick-product-system/packages/frontend/src/components/LoginPage.tsx +14 -14
  64. package/templates/assistkick-product-system/packages/frontend/src/components/ProjectSelector.tsx +54 -33
  65. package/templates/assistkick-product-system/packages/frontend/src/components/QaIssueSheet.tsx +32 -49
  66. package/templates/assistkick-product-system/packages/frontend/src/components/SidePanel.tsx +43 -48
  67. package/templates/assistkick-product-system/packages/frontend/src/components/TerminalView.tsx +121 -52
  68. package/templates/assistkick-product-system/packages/frontend/src/components/Toolbar.tsx +20 -14
  69. package/templates/assistkick-product-system/packages/frontend/src/components/UsersView.tsx +52 -52
  70. package/templates/assistkick-product-system/packages/frontend/src/components/VideoGallery.tsx +313 -0
  71. package/templates/assistkick-product-system/packages/frontend/src/components/VideographyView.tsx +250 -0
  72. package/templates/assistkick-product-system/packages/frontend/src/components/WorkflowsView.tsx +474 -0
  73. package/templates/assistkick-product-system/packages/frontend/src/components/ds/AccentBorderList.tsx +53 -0
  74. package/templates/assistkick-product-system/packages/frontend/src/components/ds/Button.tsx +87 -0
  75. package/templates/assistkick-product-system/packages/frontend/src/components/ds/ButtonGroup.tsx +29 -0
  76. package/templates/assistkick-product-system/packages/frontend/src/components/ds/ButtonShowcase.tsx +221 -0
  77. package/templates/assistkick-product-system/packages/frontend/src/components/ds/CardGlass.tsx +141 -0
  78. package/templates/assistkick-product-system/packages/frontend/src/components/ds/CompletionRing.tsx +30 -0
  79. package/templates/assistkick-product-system/packages/frontend/src/components/ds/ContentCard.tsx +34 -0
  80. package/templates/assistkick-product-system/packages/frontend/src/components/ds/IconButton.tsx +74 -0
  81. package/templates/assistkick-product-system/packages/frontend/src/components/ds/KanbanCard.tsx +103 -87
  82. package/templates/assistkick-product-system/packages/frontend/src/components/ds/KanbanCardShowcase.tsx +9 -188
  83. package/templates/assistkick-product-system/packages/frontend/src/components/ds/Kbd.tsx +11 -0
  84. package/templates/assistkick-product-system/packages/frontend/src/components/ds/KindBadge.tsx +21 -0
  85. package/templates/assistkick-product-system/packages/frontend/src/components/ds/NavBarSidekick.tsx +81 -37
  86. package/templates/assistkick-product-system/packages/frontend/src/components/ds/SidePanelShowcase.tsx +370 -0
  87. package/templates/assistkick-product-system/packages/frontend/src/components/ds/SideSheet.tsx +64 -0
  88. package/templates/assistkick-product-system/packages/frontend/src/components/ds/StatusDot.tsx +18 -0
  89. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/CheckCardPositionNode.tsx +36 -0
  90. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/CheckCycleCountNode.tsx +60 -0
  91. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/EndNode.tsx +42 -0
  92. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/GenerateTTSNode.tsx +52 -0
  93. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/GroupNode.tsx +189 -0
  94. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/NodePalette.tsx +123 -0
  95. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/RebuildBundleNode.tsx +20 -0
  96. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/RenderVideoNode.tsx +72 -0
  97. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/RunAgentNode.tsx +51 -0
  98. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/SetCardMetadataNode.tsx +53 -0
  99. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/StartNode.tsx +18 -0
  100. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/TransitionCardNode.tsx +59 -0
  101. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/WorkflowCanvas.tsx +341 -0
  102. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/WorkflowMonitorModal.tsx +643 -0
  103. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/autoLayout.ts +103 -0
  104. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/edgeColors.ts +35 -0
  105. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/monitor_nodes.tsx +246 -0
  106. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/workflow_types.test.ts +119 -0
  107. package/templates/assistkick-product-system/packages/frontend/src/components/workflow/workflow_types.ts +136 -0
  108. package/templates/assistkick-product-system/packages/frontend/src/constants/graph.ts +13 -11
  109. package/templates/assistkick-product-system/packages/frontend/src/hooks/useAutoSave.ts +75 -0
  110. package/templates/assistkick-product-system/packages/frontend/src/hooks/useToast.tsx +16 -3
  111. package/templates/assistkick-product-system/packages/frontend/src/pages/accept_invitation_page.tsx +30 -27
  112. package/templates/assistkick-product-system/packages/frontend/src/pages/forgot_password_page.tsx +18 -15
  113. package/templates/assistkick-product-system/packages/frontend/src/pages/register_page.tsx +21 -18
  114. package/templates/assistkick-product-system/packages/frontend/src/pages/reset_password_page.tsx +28 -25
  115. package/templates/assistkick-product-system/packages/frontend/src/routes/AgentsRoute.tsx +6 -0
  116. package/templates/assistkick-product-system/packages/frontend/src/routes/CoherenceRoute.tsx +1 -1
  117. package/templates/assistkick-product-system/packages/frontend/src/routes/DashboardLayout.tsx +2 -2
  118. package/templates/assistkick-product-system/packages/frontend/src/routes/FilesRoute.tsx +13 -0
  119. package/templates/assistkick-product-system/packages/frontend/src/routes/GraphRoute.tsx +2 -2
  120. package/templates/assistkick-product-system/packages/frontend/src/routes/VideographyRoute.tsx +13 -0
  121. package/templates/assistkick-product-system/packages/frontend/src/routes/WorkflowsRoute.tsx +6 -0
  122. package/templates/assistkick-product-system/packages/frontend/src/stores/useProjectStore.ts +6 -3
  123. package/templates/assistkick-product-system/packages/frontend/src/stores/useSidePanelStore.ts +4 -4
  124. package/templates/assistkick-product-system/packages/frontend/src/styles/index.css +275 -3535
  125. package/templates/assistkick-product-system/packages/frontend/src/utils/auto_save_service.test.ts +167 -0
  126. package/templates/assistkick-product-system/packages/frontend/src/utils/auto_save_service.ts +101 -0
  127. package/templates/assistkick-product-system/packages/frontend/src/utils/composition_matcher.test.ts +42 -0
  128. package/templates/assistkick-product-system/packages/frontend/src/utils/composition_matcher.ts +17 -0
  129. package/templates/assistkick-product-system/packages/frontend/src/utils/file_utils.test.ts +145 -0
  130. package/templates/assistkick-product-system/packages/frontend/src/utils/file_utils.ts +42 -0
  131. package/templates/assistkick-product-system/packages/frontend/src/utils/task_status.test.ts +4 -10
  132. package/templates/assistkick-product-system/packages/frontend/src/utils/task_status.ts +19 -1
  133. package/templates/assistkick-product-system/packages/frontend/vite.config.ts +5 -0
  134. package/templates/assistkick-product-system/packages/shared/db/local.db +0 -0
  135. package/templates/assistkick-product-system/packages/shared/db/migrations/0004_tidy_matthew_murdock.sql +9 -0
  136. package/templates/assistkick-product-system/packages/shared/db/migrations/0005_mysterious_falcon.sql +692 -0
  137. package/templates/assistkick-product-system/packages/shared/db/migrations/0006_next_venom.sql +9 -0
  138. package/templates/assistkick-product-system/packages/shared/db/migrations/0007_deep_barracuda.sql +39 -0
  139. package/templates/assistkick-product-system/packages/shared/db/migrations/0008_puzzling_hannibal_king.sql +1 -0
  140. package/templates/assistkick-product-system/packages/shared/db/migrations/0009_amused_beast.sql +8 -0
  141. package/templates/assistkick-product-system/packages/shared/db/migrations/0010_spotty_moira_mactaggert.sql +9 -0
  142. package/templates/assistkick-product-system/packages/shared/db/migrations/0011_goofy_snowbird.sql +3 -0
  143. package/templates/assistkick-product-system/packages/shared/db/migrations/0011_supreme_doctor_octopus.sql +3 -0
  144. package/templates/assistkick-product-system/packages/shared/db/migrations/0013_reflective_prowler.sql +15 -0
  145. package/templates/assistkick-product-system/packages/shared/db/migrations/0014_nifty_punisher.sql +15 -0
  146. package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0004_snapshot.json +921 -0
  147. package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0005_snapshot.json +1042 -0
  148. package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0006_snapshot.json +1101 -0
  149. package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0007_snapshot.json +1336 -0
  150. package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0008_snapshot.json +1275 -0
  151. package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0009_snapshot.json +1327 -0
  152. package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0010_snapshot.json +1393 -0
  153. package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0011_snapshot.json +1436 -0
  154. package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0013_snapshot.json +1538 -0
  155. package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0014_snapshot.json +1545 -0
  156. package/templates/assistkick-product-system/packages/shared/db/migrations/meta/_journal.json +77 -0
  157. package/templates/assistkick-product-system/packages/shared/db/schema.ts +114 -0
  158. package/templates/assistkick-product-system/packages/shared/lib/claude-service.ts +32 -7
  159. package/templates/assistkick-product-system/packages/shared/lib/constants.ts +9 -0
  160. package/templates/assistkick-product-system/packages/shared/lib/git_workflow.ts +12 -4
  161. package/templates/assistkick-product-system/packages/shared/lib/graph.ts +5 -0
  162. package/templates/assistkick-product-system/packages/shared/lib/workflow_engine.test.ts +1999 -0
  163. package/templates/assistkick-product-system/packages/shared/lib/workflow_engine.ts +1437 -0
  164. package/templates/assistkick-product-system/packages/shared/lib/workflow_orchestrator.ts +211 -0
  165. package/templates/assistkick-product-system/packages/shared/tools/add_node.test.ts +43 -0
  166. package/templates/assistkick-product-system/packages/shared/tools/add_node.ts +13 -2
  167. package/templates/assistkick-product-system/packages/shared/tools/get_kanban.ts +1 -1
  168. package/templates/assistkick-product-system/packages/shared/tools/migrate_epics.test.ts +226 -0
  169. package/templates/assistkick-product-system/packages/shared/tools/migrate_epics.ts +251 -0
  170. package/templates/assistkick-product-system/packages/shared/tools/update_node.ts +2 -2
  171. package/templates/assistkick-product-system/packages/shared/utils/hello_workflow.test.ts +10 -0
  172. package/templates/assistkick-product-system/packages/shared/utils/hello_workflow.ts +6 -0
  173. package/templates/assistkick-product-system/packages/video/Root.tsx +85 -0
  174. package/templates/assistkick-product-system/packages/video/components/email_scene.tsx +231 -0
  175. package/templates/assistkick-product-system/packages/video/components/outro_scene.tsx +153 -0
  176. package/templates/assistkick-product-system/packages/video/components/part_divider.tsx +90 -0
  177. package/templates/assistkick-product-system/packages/video/components/scene.tsx +226 -0
  178. package/templates/assistkick-product-system/packages/video/components/theme.ts +22 -0
  179. package/templates/assistkick-product-system/packages/video/components/title_scene.tsx +169 -0
  180. package/templates/assistkick-product-system/packages/video/components/video_split_layout.tsx +84 -0
  181. package/templates/assistkick-product-system/packages/video/compositions/.gitkeep +0 -0
  182. package/templates/assistkick-product-system/packages/video/index.ts +4 -0
  183. package/templates/assistkick-product-system/packages/video/package.json +28 -0
  184. package/templates/assistkick-product-system/packages/video/remotion.config.ts +11 -0
  185. package/templates/assistkick-product-system/packages/video/scripts/process_script.test.ts +326 -0
  186. package/templates/assistkick-product-system/packages/video/scripts/process_script.ts +630 -0
  187. package/templates/assistkick-product-system/packages/video/style.css +1 -0
  188. package/templates/assistkick-product-system/packages/video/tsconfig.json +18 -0
  189. package/templates/assistkick-product-system/tests/graph_legend.test.ts +2 -1
  190. package/templates/assistkick-product-system/tests/video_render_service.test.ts +181 -0
  191. package/templates/assistkick-product-system/tests/web_terminal.test.ts +219 -455
  192. package/templates/assistkick-product-system/tests/workflow_integration.test.ts +341 -0
  193. package/templates/skills/assistkick-developer/SKILL.md +3 -0
  194. package/templates/skills/assistkick-developer/references/react_development_guidelines.md +225 -0
  195. package/templates/skills/product-system/graph.json +1890 -0
  196. package/templates/skills/product-system/kanban.json +304 -0
  197. package/templates/skills/product-system/nodes/comp_001.md +56 -0
  198. package/templates/skills/product-system/nodes/comp_002.md +57 -0
  199. package/templates/skills/product-system/nodes/data_001.md +51 -0
  200. package/templates/skills/product-system/nodes/data_002.md +40 -0
  201. package/templates/skills/product-system/nodes/data_004.md +38 -0
  202. package/templates/skills/product-system/nodes/dec_001.md +34 -0
  203. package/templates/skills/product-system/nodes/dec_016.md +32 -0
  204. package/templates/skills/product-system/nodes/feat_008.md +30 -0
  205. package/templates/skills/video-composition-agent/SKILL.md +232 -0
  206. package/templates/skills/video-script-writer/SKILL.md +136 -0
@@ -0,0 +1,304 @@
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
+ }
@@ -0,0 +1,56 @@
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)
@@ -0,0 +1,57 @@
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)
@@ -0,0 +1,51 @@
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)
@@ -0,0 +1,40 @@
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)
@@ -0,0 +1,38 @@
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
@@ -0,0 +1,34 @@
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)
@@ -0,0 +1,32 @@
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)
@@ -0,0 +1,30 @@
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)