@slycode/slycode 0.2.21 → 0.2.23

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 (271) hide show
  1. package/dist/bridge/api.d.ts +2 -1
  2. package/dist/bridge/api.js +114 -1
  3. package/dist/bridge/api.js.map +1 -1
  4. package/dist/bridge/git-utils.d.ts +9 -0
  5. package/dist/bridge/git-utils.js +49 -0
  6. package/dist/bridge/git-utils.js.map +1 -0
  7. package/dist/bridge/index.js +8 -2
  8. package/dist/bridge/index.js.map +1 -1
  9. package/dist/bridge/provider-utils.d.ts +10 -0
  10. package/dist/bridge/provider-utils.js +5 -1
  11. package/dist/bridge/provider-utils.js.map +1 -1
  12. package/dist/bridge/response-store.d.ts +46 -0
  13. package/dist/bridge/response-store.js +95 -0
  14. package/dist/bridge/response-store.js.map +1 -0
  15. package/dist/bridge/session-manager.d.ts +33 -1
  16. package/dist/bridge/session-manager.js +191 -2
  17. package/dist/bridge/session-manager.js.map +1 -1
  18. package/dist/bridge/types.d.ts +41 -0
  19. package/dist/data/scaffold-templates/tutorial-project/documentation/kanban.json +1 -1
  20. package/dist/messaging/bridge-client.d.ts +7 -3
  21. package/dist/messaging/bridge-client.js +26 -5
  22. package/dist/messaging/bridge-client.js.map +1 -1
  23. package/dist/messaging/index.js +149 -30
  24. package/dist/messaging/index.js.map +1 -1
  25. package/dist/messaging/state.d.ts +3 -0
  26. package/dist/messaging/state.js +13 -0
  27. package/dist/messaging/state.js.map +1 -1
  28. package/dist/messaging/types.d.ts +3 -0
  29. package/dist/scripts/kanban.js +448 -2
  30. package/dist/store/actions/checkpoint.md +1 -1
  31. package/dist/store/actions/context.md +1 -1
  32. package/dist/store/actions/create-card.md +1 -1
  33. package/dist/store/actions/deep-design.md +13 -3
  34. package/dist/store/actions/design-requirements.md +11 -1
  35. package/dist/store/actions/explore.md +1 -1
  36. package/dist/store/actions/onboard.md +2 -4
  37. package/dist/store/actions/summarize.md +1 -1
  38. package/dist/store/skills/kanban/SKILL.md +77 -3
  39. package/dist/web/.next/BUILD_ID +1 -1
  40. package/dist/web/.next/app-path-routes-manifest.json +1 -0
  41. package/dist/web/.next/build-manifest.json +2 -2
  42. package/dist/web/.next/prerender-manifest.json +3 -3
  43. package/dist/web/.next/routes-manifest.json +6 -0
  44. package/dist/web/.next/server/app/_global-error.html +2 -2
  45. package/dist/web/.next/server/app/_global-error.rsc +1 -1
  46. package/dist/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  47. package/dist/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  48. package/dist/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  49. package/dist/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  50. package/dist/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  51. package/dist/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  52. package/dist/web/.next/server/app/_not-found.html +1 -1
  53. package/dist/web/.next/server/app/_not-found.rsc +10 -10
  54. package/dist/web/.next/server/app/_not-found.segments/_full.segment.rsc +10 -10
  55. package/dist/web/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  56. package/dist/web/.next/server/app/_not-found.segments/_index.segment.rsc +5 -5
  57. package/dist/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  58. package/dist/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  59. package/dist/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  60. package/dist/web/.next/server/app/api/areas/route.js +1 -1
  61. package/dist/web/.next/server/app/api/areas/route.js.nft.json +1 -1
  62. package/dist/web/.next/server/app/api/bridge/[...path]/route.js +1 -1
  63. package/dist/web/.next/server/app/api/bridge/[...path]/route.js.nft.json +1 -1
  64. package/dist/web/.next/server/app/api/changelog/route/app-paths-manifest.json +3 -0
  65. package/dist/web/.next/server/app/api/changelog/route/build-manifest.json +11 -0
  66. package/dist/web/.next/server/app/api/changelog/route/server-reference-manifest.json +4 -0
  67. package/dist/web/.next/server/app/api/changelog/route.js +7 -0
  68. package/dist/web/.next/server/app/api/changelog/route.js.map +5 -0
  69. package/dist/web/.next/server/app/api/changelog/route.js.nft.json +1 -0
  70. package/dist/web/.next/server/app/api/changelog/route_client-reference-manifest.js +2 -0
  71. package/dist/web/.next/server/app/api/cli-assets/assistant/route.js +1 -1
  72. package/dist/web/.next/server/app/api/cli-assets/assistant/route.js.nft.json +1 -1
  73. package/dist/web/.next/server/app/api/cli-assets/fix/route.js +1 -1
  74. package/dist/web/.next/server/app/api/cli-assets/fix/route.js.nft.json +1 -1
  75. package/dist/web/.next/server/app/api/cli-assets/import/route.js +1 -1
  76. package/dist/web/.next/server/app/api/cli-assets/import/route.js.nft.json +1 -1
  77. package/dist/web/.next/server/app/api/cli-assets/route.js +2 -2
  78. package/dist/web/.next/server/app/api/cli-assets/route.js.nft.json +1 -1
  79. package/dist/web/.next/server/app/api/cli-assets/store/preview/route.js +1 -1
  80. package/dist/web/.next/server/app/api/cli-assets/store/preview/route.js.nft.json +1 -1
  81. package/dist/web/.next/server/app/api/cli-assets/store/route.js +2 -2
  82. package/dist/web/.next/server/app/api/cli-assets/store/route.js.nft.json +1 -1
  83. package/dist/web/.next/server/app/api/cli-assets/sync/route.js +1 -1
  84. package/dist/web/.next/server/app/api/cli-assets/sync/route.js.nft.json +1 -1
  85. package/dist/web/.next/server/app/api/cli-assets/updates/route.js +2 -2
  86. package/dist/web/.next/server/app/api/cli-assets/updates/route.js.nft.json +1 -1
  87. package/dist/web/.next/server/app/api/dashboard/route.js +2 -2
  88. package/dist/web/.next/server/app/api/dashboard/route.js.nft.json +1 -1
  89. package/dist/web/.next/server/app/api/events/route.js +1 -1
  90. package/dist/web/.next/server/app/api/events/route.js.nft.json +1 -1
  91. package/dist/web/.next/server/app/api/file/route.js +1 -1
  92. package/dist/web/.next/server/app/api/file/route.js.nft.json +1 -1
  93. package/dist/web/.next/server/app/api/git-status/route.js +1 -1
  94. package/dist/web/.next/server/app/api/git-status/route.js.nft.json +1 -1
  95. package/dist/web/.next/server/app/api/kanban/route.js +1 -1
  96. package/dist/web/.next/server/app/api/kanban/route.js.nft.json +1 -1
  97. package/dist/web/.next/server/app/api/kanban/stream/route.js +1 -1
  98. package/dist/web/.next/server/app/api/kanban/stream/route.js.nft.json +1 -1
  99. package/dist/web/.next/server/app/api/projects/[id]/route.js +2 -2
  100. package/dist/web/.next/server/app/api/projects/[id]/route.js.nft.json +1 -1
  101. package/dist/web/.next/server/app/api/projects/analyze/route.js +1 -1
  102. package/dist/web/.next/server/app/api/projects/analyze/route.js.nft.json +1 -1
  103. package/dist/web/.next/server/app/api/projects/reorder/route.js +2 -2
  104. package/dist/web/.next/server/app/api/projects/reorder/route.js.nft.json +1 -1
  105. package/dist/web/.next/server/app/api/projects/route.js +2 -2
  106. package/dist/web/.next/server/app/api/projects/route.js.nft.json +1 -1
  107. package/dist/web/.next/server/app/api/providers/route.js +1 -1
  108. package/dist/web/.next/server/app/api/providers/route.js.nft.json +1 -1
  109. package/dist/web/.next/server/app/api/scheduler/route.js +1 -1
  110. package/dist/web/.next/server/app/api/scheduler/route.js.nft.json +1 -1
  111. package/dist/web/.next/server/app/api/search/route.js +1 -1
  112. package/dist/web/.next/server/app/api/search/route.js.nft.json +1 -1
  113. package/dist/web/.next/server/app/api/settings/route.js +1 -1
  114. package/dist/web/.next/server/app/api/settings/route.js.nft.json +1 -1
  115. package/dist/web/.next/server/app/api/sly-actions/invalidate/route.js +1 -1
  116. package/dist/web/.next/server/app/api/sly-actions/invalidate/route.js.nft.json +1 -1
  117. package/dist/web/.next/server/app/api/sly-actions/route.js +1 -1
  118. package/dist/web/.next/server/app/api/sly-actions/route.js.nft.json +1 -1
  119. package/dist/web/.next/server/app/api/sly-actions/stream/route.js +1 -1
  120. package/dist/web/.next/server/app/api/sly-actions/stream/route.js.nft.json +1 -1
  121. package/dist/web/.next/server/app/api/system-stats/route.js +1 -1
  122. package/dist/web/.next/server/app/api/system-stats/route.js.nft.json +1 -1
  123. package/dist/web/.next/server/app/api/terminal-classes/route.js +1 -1
  124. package/dist/web/.next/server/app/api/terminal-classes/route.js.nft.json +1 -1
  125. package/dist/web/.next/server/app/api/transcribe/route.js +5 -5
  126. package/dist/web/.next/server/app/api/transcribe/route.js.nft.json +1 -1
  127. package/dist/web/.next/server/app/api/version-check/route.js +1 -1
  128. package/dist/web/.next/server/app/api/version-check/route.js.nft.json +1 -1
  129. package/dist/web/.next/server/app/page.js +1 -1
  130. package/dist/web/.next/server/app/page.js.nft.json +1 -1
  131. package/dist/web/.next/server/app/page_client-reference-manifest.js +1 -1
  132. package/dist/web/.next/server/app/project/[id]/page.js +2 -2
  133. package/dist/web/.next/server/app/project/[id]/page.js.nft.json +1 -1
  134. package/dist/web/.next/server/app/project/[id]/page_client-reference-manifest.js +1 -1
  135. package/dist/web/.next/server/app-paths-manifest.json +1 -0
  136. package/dist/web/.next/server/chunks/{[externals]__c6831f39._.js → [externals]__78e522ea._.js} +2 -2
  137. package/dist/web/.next/server/chunks/{[root-of-the-server]__1ec21ccc._.js → [root-of-the-server]__029203cd._.js} +3 -3
  138. package/dist/web/.next/server/chunks/{[root-of-the-server]__4297cb97._.js → [root-of-the-server]__0d6d4443._.js} +1 -1
  139. package/dist/web/.next/server/chunks/[root-of-the-server]__172ad0b1._.js +18 -0
  140. package/dist/web/.next/server/chunks/[root-of-the-server]__1c5f4ef9._.js +3 -0
  141. package/dist/web/.next/server/chunks/[root-of-the-server]__1cab11f0._.js +3 -0
  142. package/dist/web/.next/server/chunks/{[root-of-the-server]__0f69c28a._.js → [root-of-the-server]__1eb3f172._.js} +2 -2
  143. package/dist/web/.next/server/chunks/[root-of-the-server]__22cba275._.js +3 -0
  144. package/dist/web/.next/server/chunks/[root-of-the-server]__2543e413._.js +3 -0
  145. package/dist/web/.next/server/chunks/[root-of-the-server]__2c42a835._.js +3 -0
  146. package/dist/web/.next/server/chunks/[root-of-the-server]__2ed0ff47._.js +3 -0
  147. package/dist/web/.next/server/chunks/[root-of-the-server]__35454eea._.js +27 -0
  148. package/dist/web/.next/server/chunks/[root-of-the-server]__35768b56._.js +3 -0
  149. package/dist/web/.next/server/chunks/[root-of-the-server]__3880228a._.js +3 -0
  150. package/dist/web/.next/server/chunks/[root-of-the-server]__42322d88._.js +3 -0
  151. package/dist/web/.next/server/chunks/{[root-of-the-server]__d0f4efec._.js → [root-of-the-server]__5152eeff._.js} +3 -3
  152. package/dist/web/.next/server/chunks/[root-of-the-server]__527c7f57._.js +3 -0
  153. package/dist/web/.next/server/chunks/[root-of-the-server]__5c5dac4b._.js +3 -0
  154. package/dist/web/.next/server/chunks/[root-of-the-server]__5cb130f2._.js +3 -0
  155. package/dist/web/.next/server/chunks/[root-of-the-server]__68927e75._.js +3 -0
  156. package/dist/web/.next/server/chunks/[root-of-the-server]__719517c7._.js +3 -0
  157. package/dist/web/.next/server/chunks/[root-of-the-server]__73cf49c2._.js +3 -0
  158. package/dist/web/.next/server/chunks/{[root-of-the-server]__f5dae2ad._.js → [root-of-the-server]__7af4ab09._.js} +1 -1
  159. package/dist/web/.next/server/chunks/{[root-of-the-server]__4244617a._.js → [root-of-the-server]__7e6860e0._.js} +3 -3
  160. package/dist/web/.next/server/chunks/[root-of-the-server]__88bf5e22._.js +3 -0
  161. package/dist/web/.next/server/chunks/{[root-of-the-server]__f97e93fa._.js → [root-of-the-server]__8b4259cb._.js} +3 -3
  162. package/dist/web/.next/server/chunks/[root-of-the-server]__92f81907._.js +3 -0
  163. package/dist/web/.next/server/chunks/[root-of-the-server]__967603e9._.js +3 -0
  164. package/dist/web/.next/server/chunks/[root-of-the-server]__9e4bd28f._.js +3 -0
  165. package/dist/web/.next/server/chunks/[root-of-the-server]__a259539f._.js +3 -0
  166. package/dist/web/.next/server/chunks/[root-of-the-server]__ba1d2e56._.js +3 -0
  167. package/dist/web/.next/server/chunks/[root-of-the-server]__c942d872._.js +3 -0
  168. package/dist/web/.next/server/chunks/[root-of-the-server]__d7893622._.js +3 -0
  169. package/dist/web/.next/server/chunks/{[root-of-the-server]__3b9d3e43._.js → [root-of-the-server]__d843611b._.js} +6 -6
  170. package/dist/web/.next/server/chunks/[root-of-the-server]__f4d2627f._.js +3 -0
  171. package/dist/web/.next/server/chunks/[root-of-the-server]__f597835d._.js +3 -0
  172. package/dist/web/.next/server/chunks/{[root-of-the-server]__cf14e306._.js → [root-of-the-server]__fe8b9abd._.js} +1 -1
  173. package/dist/web/.next/server/chunks/_next-internal_server_app_api_changelog_route_actions_d6e239bf.js +3 -0
  174. package/dist/web/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_18324462.js +1 -1
  175. package/dist/web/.next/server/chunks/src_677020aa._.js +1 -1
  176. package/dist/web/.next/server/chunks/src_lib_scheduler_ts_03988e3e._.js +1 -1
  177. package/dist/web/.next/server/chunks/src_lib_scheduler_ts_7120457c._.js +1 -1
  178. package/dist/web/.next/server/chunks/ssr/[root-of-the-server]__1f5fc489._.js +4 -3
  179. package/dist/web/.next/server/chunks/ssr/[root-of-the-server]__43d93717._.js +3 -0
  180. package/dist/web/.next/server/chunks/ssr/{[root-of-the-server]__077f472c._.js → [root-of-the-server]__6183d28c._.js} +1 -1
  181. package/dist/web/.next/server/chunks/ssr/[root-of-the-server]__90f82e6d._.js +3 -0
  182. package/dist/web/.next/server/chunks/ssr/[root-of-the-server]__bcbe4bf2._.js +4 -3
  183. package/dist/web/.next/server/chunks/ssr/src_components_Dashboard_tsx_efc4dc27._.js +1 -1
  184. package/dist/web/.next/server/chunks/ssr/src_components_c4135402._.js +1 -1
  185. package/dist/web/.next/server/chunks/ssr/src_contexts_VoiceContext_tsx_cfba7292._.js +1 -1
  186. package/dist/web/.next/server/chunks/ssr/src_lib_registry_ts_2fc87c9c._.js +1 -1
  187. package/dist/web/.next/server/pages/404.html +1 -1
  188. package/dist/web/.next/server/pages/500.html +2 -2
  189. package/dist/web/.next/server/server-reference-manifest.js +1 -1
  190. package/dist/web/.next/server/server-reference-manifest.json +1 -1
  191. package/dist/web/.next/static/chunks/293449b828207656.css +1 -0
  192. package/dist/web/.next/static/chunks/{f55f3c8c1a52f80c.js → 3859477038c381ad.js} +1 -1
  193. package/dist/web/.next/static/chunks/3a5721af09d1c753.js +5 -0
  194. package/dist/web/.next/static/chunks/{8fb2a99c64580de7.js → 98311243e9a5a0ec.js} +1 -1
  195. package/dist/web/.next/static/chunks/{b8e0c1aeea4a14bc.js → a47f36b030917d1f.js} +1 -1
  196. package/dist/web/.next/static/chunks/d60c422421920130.js +5 -0
  197. package/dist/web/.next/static/chunks/{4049cceee6a49323.js → fa78afe3ceed998b.js} +1 -1
  198. package/dist/web/src/app/api/changelog/route.ts +45 -0
  199. package/dist/web/src/app/api/kanban/route.ts +52 -12
  200. package/dist/web/src/app/api/projects/analyze/route.ts +12 -2
  201. package/dist/web/src/app/api/projects/route.ts +1 -11
  202. package/dist/web/src/app/api/providers/route.ts +4 -0
  203. package/dist/web/src/components/ActivityFeed.tsx +3 -0
  204. package/dist/web/src/components/BranchTab.tsx +115 -0
  205. package/dist/web/src/components/ChangelogModal.tsx +234 -0
  206. package/dist/web/src/components/ClaudeTerminalPanel.tsx +124 -70
  207. package/dist/web/src/components/Dashboard.tsx +11 -0
  208. package/dist/web/src/components/GlobalClaudePanel.tsx +6 -0
  209. package/dist/web/src/components/ProjectKanban.tsx +38 -8
  210. package/dist/web/src/components/VersionUpdateToast.tsx +6 -4
  211. package/dist/web/src/components/VoiceControlBar.tsx +1 -1
  212. package/dist/web/src/lib/paths.ts +14 -0
  213. package/dist/web/src/lib/scheduler.ts +2 -1
  214. package/dist/web/src/lib/types.ts +24 -0
  215. package/dist/web/tsconfig.tsbuildinfo +1 -1
  216. package/package.json +1 -1
  217. package/templates/changelog.json +242 -0
  218. package/templates/kanban-seed.json +1 -1
  219. package/templates/store/actions/checkpoint.md +1 -1
  220. package/templates/store/actions/context.md +1 -1
  221. package/templates/store/actions/create-card.md +1 -1
  222. package/templates/store/actions/deep-design.md +13 -3
  223. package/templates/store/actions/design-requirements.md +11 -1
  224. package/templates/store/actions/explore.md +1 -1
  225. package/templates/store/actions/onboard.md +2 -4
  226. package/templates/store/actions/summarize.md +1 -1
  227. package/templates/store/skills/kanban/SKILL.md +77 -3
  228. package/templates/tutorial-project/documentation/kanban.json +1 -1
  229. package/templates/updates/actions/checkpoint.md +1 -1
  230. package/templates/updates/actions/context.md +1 -1
  231. package/templates/updates/actions/create-card.md +1 -1
  232. package/templates/updates/actions/deep-design.md +13 -3
  233. package/templates/updates/actions/design-requirements.md +11 -1
  234. package/templates/updates/actions/explore.md +1 -1
  235. package/templates/updates/actions/onboard.md +2 -4
  236. package/templates/updates/actions/summarize.md +1 -1
  237. package/templates/updates/skills/kanban/SKILL.md +77 -3
  238. package/dist/web/.next/server/chunks/[root-of-the-server]__09aec55a._.js +0 -3
  239. package/dist/web/.next/server/chunks/[root-of-the-server]__12f6cd6f._.js +0 -3
  240. package/dist/web/.next/server/chunks/[root-of-the-server]__15fc9266._.js +0 -18
  241. package/dist/web/.next/server/chunks/[root-of-the-server]__198f01e0._.js +0 -3
  242. package/dist/web/.next/server/chunks/[root-of-the-server]__279e9bf3._.js +0 -3
  243. package/dist/web/.next/server/chunks/[root-of-the-server]__2b639eab._.js +0 -3
  244. package/dist/web/.next/server/chunks/[root-of-the-server]__2d1f0ed9._.js +0 -3
  245. package/dist/web/.next/server/chunks/[root-of-the-server]__3f239285._.js +0 -3
  246. package/dist/web/.next/server/chunks/[root-of-the-server]__47dd878e._.js +0 -3
  247. package/dist/web/.next/server/chunks/[root-of-the-server]__5b8c9374._.js +0 -3
  248. package/dist/web/.next/server/chunks/[root-of-the-server]__5e08b942._.js +0 -3
  249. package/dist/web/.next/server/chunks/[root-of-the-server]__6ffce934._.js +0 -3
  250. package/dist/web/.next/server/chunks/[root-of-the-server]__71bb3374._.js +0 -3
  251. package/dist/web/.next/server/chunks/[root-of-the-server]__7603305e._.js +0 -3
  252. package/dist/web/.next/server/chunks/[root-of-the-server]__7c476ad6._.js +0 -3
  253. package/dist/web/.next/server/chunks/[root-of-the-server]__846ca56f._.js +0 -3
  254. package/dist/web/.next/server/chunks/[root-of-the-server]__98d88050._.js +0 -3
  255. package/dist/web/.next/server/chunks/[root-of-the-server]__b273cc05._.js +0 -3
  256. package/dist/web/.next/server/chunks/[root-of-the-server]__b90bbd70._.js +0 -3
  257. package/dist/web/.next/server/chunks/[root-of-the-server]__d5272169._.js +0 -3
  258. package/dist/web/.next/server/chunks/[root-of-the-server]__d56e68cb._.js +0 -3
  259. package/dist/web/.next/server/chunks/[root-of-the-server]__d6362272._.js +0 -3
  260. package/dist/web/.next/server/chunks/[root-of-the-server]__de1277ee._.js +0 -27
  261. package/dist/web/.next/server/chunks/[root-of-the-server]__e88a19d2._.js +0 -3
  262. package/dist/web/.next/server/chunks/[root-of-the-server]__f3e501b6._.js +0 -3
  263. package/dist/web/.next/server/chunks/[root-of-the-server]__f59af2bc._.js +0 -3
  264. package/dist/web/.next/server/chunks/ssr/[root-of-the-server]__9ac6ea25._.js +0 -3
  265. package/dist/web/.next/server/chunks/ssr/[root-of-the-server]__dfe2728c._.js +0 -3
  266. package/dist/web/.next/static/chunks/3d5195b57fc05540.js +0 -4
  267. package/dist/web/.next/static/chunks/59fb302a5bfd2dc0.js +0 -4
  268. package/dist/web/.next/static/chunks/747f5e5f9dcf2621.css +0 -1
  269. /package/dist/web/.next/static/{0sPAbk-Qw-InZ0rdHjHnC → aN-jqftQVvSm0qVskLybH}/_buildManifest.js +0 -0
  270. /package/dist/web/.next/static/{0sPAbk-Qw-InZ0rdHjHnC → aN-jqftQVvSm0qVskLybH}/_clientMiddlewareManifest.json +0 -0
  271. /package/dist/web/.next/static/{0sPAbk-Qw-InZ0rdHjHnC → aN-jqftQVvSm0qVskLybH}/_ssgManifest.js +0 -0
@@ -34,7 +34,7 @@ if (!PROJECT_ROOT) {
34
34
  console.error('Run this command from within a project that has a kanban board.');
35
35
  process.exit(1);
36
36
  }
37
- const PROJECT_NAME = path.basename(PROJECT_ROOT);
37
+ const PROJECT_NAME = path.basename(PROJECT_ROOT).replace(/_/g, '-');
38
38
  const KANBAN_PATH = path.join(PROJECT_ROOT, 'documentation', 'kanban.json');
39
39
  const EVENTS_PATH = path.join(PROJECT_ROOT, 'documentation', 'events.json');
40
40
  const AREA_INDEX_PATH = path.join(PROJECT_ROOT, '.claude', 'skills', 'context-priming', 'references', 'area-index.md');
@@ -65,6 +65,8 @@ Commands:
65
65
  problem Manage problems/issues
66
66
  notes Manage cross-agent notes
67
67
  automation Manage card automations (scheduled prompt execution)
68
+ prompt Send a prompt to another card's session (cross-card execution)
69
+ respond Reply to a cross-card prompt (callback for --wait mode)
68
70
  areas List available areas from context-priming
69
71
 
70
72
  Run 'kanban <command> --help' for command-specific options.
@@ -289,6 +291,38 @@ List available areas from context-priming area-index.md.
289
291
  These are valid values for the --areas option.
290
292
  `;
291
293
 
294
+ const PROMPT_HELP = `
295
+ Usage: kanban prompt <card-id> "prompt text" [options]
296
+
297
+ Send a prompt to another card's session (cross-card execution).
298
+ If no running session exists, one is created automatically.
299
+
300
+ Options:
301
+ --provider <id> Target provider (claude|codex|gemini). Default: stage default
302
+ --model <id> Model for new sessions (e.g. opus, o3)
303
+ --wait Wait for a response (sync mode with callback)
304
+ --timeout <secs> Timeout for --wait mode (default: 120 seconds)
305
+ --force Bypass session lock and busy checks
306
+ --fresh Stop any existing session and start a clean one
307
+
308
+ Modes:
309
+ Fire-and-forget: kanban prompt <card-id> "do something"
310
+ Wait for response: kanban prompt <card-id> "analyze this" --wait --timeout 60
311
+ Fresh session: kanban prompt <card-id> "review" --fresh --provider codex --wait
312
+
313
+ When using --wait, the called card must run 'kanban respond <id> "response"' to return data.
314
+ `;
315
+
316
+ const RESPOND_HELP = `
317
+ Usage: kanban respond <response-id> "response data"
318
+
319
+ Reply to a cross-card prompt that used --wait mode.
320
+ The response-id is provided in the callback instruction appended to the prompt.
321
+
322
+ Example:
323
+ kanban respond abc-123-def "Analysis complete. Found 3 issues..."
324
+ `;
325
+
292
326
  const BOARD_HELP = `
293
327
  Usage: kanban board [options]
294
328
 
@@ -364,6 +398,7 @@ function writeKanban(data) {
364
398
  }
365
399
 
366
400
  function findCard(kanban, cardId, includeArchived = false) {
401
+ // First try exact ID match
367
402
  for (const stage of VALID_STAGES) {
368
403
  const cards = kanban.stages[stage] || [];
369
404
  const card = cards.find(c => c.id === cardId);
@@ -374,6 +409,17 @@ function findCard(kanban, cardId, includeArchived = false) {
374
409
  return { card, stage };
375
410
  }
376
411
  }
412
+
413
+ // Fall back to exact title match (case-insensitive, non-archived only)
414
+ const titleLower = cardId.toLowerCase();
415
+ for (const stage of VALID_STAGES) {
416
+ const cards = kanban.stages[stage] || [];
417
+ const card = cards.find(c => !c.archived && c.title && c.title.toLowerCase() === titleLower);
418
+ if (card) {
419
+ return { card, stage };
420
+ }
421
+ }
422
+
377
423
  return null;
378
424
  }
379
425
 
@@ -1817,7 +1863,7 @@ function cmdAutomation(args) {
1817
1863
  const bridgePort = process.env.BRIDGE_PORT || process.env.PORT || '3004';
1818
1864
  const bridgeUrl = process.env.BRIDGE_URL || `http://localhost:${bridgePort}`;
1819
1865
  const provider = auto.provider || 'claude';
1820
- const sessionName = `${PROJECT_NAME}:${provider}:card:${cardId}`;
1866
+ const sessionName = `${PROJECT_NAME}:${provider}:card:${card.id}`;
1821
1867
 
1822
1868
  console.log(`Triggering automation: ${cardId}`);
1823
1869
  console.log(` Session: ${sessionName}`);
@@ -2157,6 +2203,400 @@ function cmdReorder(args) {
2157
2203
  applyAndConfirm([...listedCards, ...unlistedCards]);
2158
2204
  }
2159
2205
 
2206
+ // ============================================================================
2207
+ // Prompt Command (cross-card execution)
2208
+ // ============================================================================
2209
+
2210
+ function cmdPrompt(args) {
2211
+ const opts = parseArgs(args);
2212
+
2213
+ if (opts.help || args.length === 0) {
2214
+ console.log(PROMPT_HELP);
2215
+ return;
2216
+ }
2217
+
2218
+ const cardId = opts._[0];
2219
+ const promptText = opts._[1];
2220
+
2221
+ if (!cardId) {
2222
+ console.error('Error: Card ID required');
2223
+ process.exit(1);
2224
+ }
2225
+
2226
+ if (!promptText) {
2227
+ console.error('Error: Prompt text required');
2228
+ console.error('Usage: kanban prompt <card-id> "your prompt text"');
2229
+ process.exit(1);
2230
+ }
2231
+
2232
+ const kanban = readKanban();
2233
+ const result = findCard(kanban, cardId);
2234
+ if (!result) {
2235
+ console.error(`Error: Card '${cardId}' not found`);
2236
+ process.exit(1);
2237
+ }
2238
+
2239
+ const { card, stage } = result;
2240
+ const providerFlag = opts.provider;
2241
+ const modelFlag = opts.model;
2242
+ const create = opts.create || false;
2243
+ const wait = opts.wait || false;
2244
+ const timeout = parseInt(opts.timeout || '120', 10);
2245
+ const force = opts.force || false;
2246
+ const fresh = opts.fresh || false;
2247
+
2248
+ // Determine bridge URL
2249
+ const bridgePort = process.env.BRIDGE_PORT || process.env.PORT || '3004';
2250
+ const bridgeUrl = process.env.BRIDGE_URL || `http://localhost:${bridgePort}`;
2251
+
2252
+ // Load providers.json for stage defaults
2253
+ let providers = null;
2254
+ try {
2255
+ const providersPath = path.join(PROJECT_ROOT, 'data', 'providers.json');
2256
+ providers = JSON.parse(fs.readFileSync(providersPath, 'utf-8'));
2257
+ } catch { /* providers.json optional */ }
2258
+
2259
+ const doPrompt = async () => {
2260
+ try {
2261
+ // Resolve provider: flag > stage default > 'claude'
2262
+ let provider = providerFlag;
2263
+ if (!provider && providers?.defaults?.stages?.[stage]) {
2264
+ provider = providers.defaults.stages[stage].provider;
2265
+ }
2266
+ if (!provider) provider = 'claude';
2267
+
2268
+ const sessionName = `${PROJECT_NAME}:${provider}:card:${card.id}`;
2269
+
2270
+ // Check if session exists on bridge
2271
+ let sessionExists = false;
2272
+ let sessionRunning = false;
2273
+ let sessionStatus = 'not_found';
2274
+ try {
2275
+ const infoRes = await fetch(`${bridgeUrl}/sessions/${encodeURIComponent(sessionName)}`);
2276
+ if (infoRes.ok) {
2277
+ const info = await infoRes.json();
2278
+ if (info && info.status) {
2279
+ sessionExists = true;
2280
+ sessionStatus = info.status;
2281
+ sessionRunning = info.status === 'running';
2282
+ }
2283
+ }
2284
+ } catch (err) {
2285
+ if (err.cause?.code === 'ECONNREFUSED' || err.message?.includes('fetch failed')) {
2286
+ console.error('Error: Bridge is not running. Start it with: cd bridge && npm run dev');
2287
+ process.exit(1);
2288
+ }
2289
+ throw err;
2290
+ }
2291
+
2292
+ // --fresh: stop existing session so we get a clean one with CLI-arg delivery
2293
+ if (fresh && sessionRunning) {
2294
+ console.log(` Stopping existing session (--fresh)...`);
2295
+ try {
2296
+ await fetch(`${bridgeUrl}/sessions/${encodeURIComponent(sessionName)}?action=stop`, { method: 'DELETE' });
2297
+ // Brief wait for cleanup
2298
+ await new Promise(r => setTimeout(r, 1000));
2299
+ } catch { /* best effort */ }
2300
+ sessionRunning = false;
2301
+ sessionStatus = 'stopped';
2302
+ }
2303
+
2304
+ // Build the full prompt upfront (with callback instruction for --wait)
2305
+ // This must happen BEFORE session creation so it can be passed as a CLI arg
2306
+ // Auto-prepend card context so the called AI always knows its own card
2307
+ const cardContext = `[Card: ${card.title} (${card.id})]
2308
+ Stage: ${stage} | Type: ${card.type || 'unknown'} | Priority: ${card.priority || 'unknown'}
2309
+ Description: ${card.description || '(no description)'}
2310
+ ---
2311
+
2312
+ `;
2313
+ let fullPrompt = cardContext + promptText;
2314
+ let responseId = null;
2315
+
2316
+ if (wait) {
2317
+ responseId = `resp-${Date.now()}-${Math.random().toString(36).substring(2, 10)}`;
2318
+ fullPrompt += `\n\nIMPORTANT: When you have completed this task, you MUST run the following command to return your response:\nsly-kanban respond ${responseId} "<your response here>"`;
2319
+
2320
+ // Register response on bridge
2321
+ const currentSessionName = process.env.SLYCODE_SESSION || `${PROJECT_NAME}:unknown:caller`;
2322
+ const regRes = await fetch(`${bridgeUrl}/responses`, {
2323
+ method: 'POST',
2324
+ headers: { 'Content-Type': 'application/json' },
2325
+ body: JSON.stringify({
2326
+ responseId,
2327
+ callingSession: currentSessionName,
2328
+ targetSession: sessionName,
2329
+ }),
2330
+ });
2331
+ if (!regRes.ok) {
2332
+ console.error('Error: Failed to register response on bridge.');
2333
+ process.exit(1);
2334
+ }
2335
+ }
2336
+
2337
+ // Handle no running session — resume if stopped, create fresh if none exists
2338
+ if (!sessionRunning) {
2339
+ const isStopped = sessionExists && (sessionStatus === 'stopped' || sessionStatus === 'detached');
2340
+ const isFresh = fresh || !isStopped; // --fresh forces fresh; no prior session = fresh
2341
+
2342
+ if (isStopped && !fresh) {
2343
+ console.log(`Resuming stopped session for card ${cardId}...`);
2344
+ } else {
2345
+ console.log(`No running session for card ${cardId}. Starting one...`);
2346
+ }
2347
+ console.log(`${isFresh ? 'Creating' : 'Resuming'} session: ${sessionName} (provider: ${provider}${modelFlag ? ', model: ' + modelFlag : ''})`);
2348
+
2349
+ // Record prompt chain depth BEFORE creating session (prevents race condition)
2350
+ const callingSessionForCreate = process.env.SLYCODE_SESSION || undefined;
2351
+ if (callingSessionForCreate) {
2352
+ try {
2353
+ const chainRes = await fetch(`${bridgeUrl}/sessions/${encodeURIComponent(sessionName)}/chain`, {
2354
+ method: 'POST',
2355
+ headers: { 'Content-Type': 'application/json' },
2356
+ body: JSON.stringify({ callingSession: callingSessionForCreate }),
2357
+ });
2358
+ const chainResult = await chainRes.json();
2359
+ if (!chainResult.success) {
2360
+ console.error(`Error: ${chainResult.error || 'Depth limit reached'}`);
2361
+ process.exit(1);
2362
+ }
2363
+ } catch { /* best effort */ }
2364
+ }
2365
+ const createBody = {
2366
+ name: sessionName,
2367
+ provider,
2368
+ skipPermissions: true,
2369
+ cwd: PROJECT_ROOT,
2370
+ fresh: isFresh,
2371
+ prompt: fullPrompt, // Always pass prompt as CLI arg — OS-level delivery, no timing issues
2372
+ };
2373
+ if (isFresh && modelFlag) createBody.model = modelFlag; // Model only on fresh (resume reconnects to existing)
2374
+
2375
+ const createRes = await fetch(`${bridgeUrl}/sessions`, {
2376
+ method: 'POST',
2377
+ headers: { 'Content-Type': 'application/json' },
2378
+ body: JSON.stringify(createBody),
2379
+ });
2380
+
2381
+ if (!createRes.ok) {
2382
+ const errBody = await createRes.text();
2383
+ console.error(`Error creating session: ${errBody}`);
2384
+ process.exit(1);
2385
+ }
2386
+
2387
+ // Wait for session to be alive (liveness check)
2388
+ console.log(' Waiting for session to start...');
2389
+ const livenessStart = Date.now();
2390
+ const livenessTimeout = 20000; // 20s
2391
+ let alive = false;
2392
+ while (Date.now() - livenessStart < livenessTimeout) {
2393
+ await new Promise(r => setTimeout(r, 2000));
2394
+ try {
2395
+ const checkRes = await fetch(`${bridgeUrl}/sessions/${encodeURIComponent(sessionName)}`);
2396
+ if (checkRes.ok) {
2397
+ const checkInfo = await checkRes.json();
2398
+ if (checkInfo && checkInfo.status === 'running') {
2399
+ alive = true;
2400
+ break;
2401
+ }
2402
+ if (checkInfo && checkInfo.status === 'stopped') {
2403
+ console.error('Error: Session stopped during startup.');
2404
+ process.exit(1);
2405
+ }
2406
+ }
2407
+ } catch { /* retry */ }
2408
+ }
2409
+
2410
+ if (!alive) {
2411
+ console.error('Error: Session did not start within 20s.');
2412
+ process.exit(1);
2413
+ }
2414
+ console.log(' Session started. Prompt delivered via CLI arg.');
2415
+
2416
+ // For fire-and-forget, prompt was passed as CLI arg — we're done
2417
+ if (!wait) {
2418
+ console.log(`Prompt delivered to ${cardId} via session creation.`);
2419
+ emitEvent(kanban, 'card.prompt', { cardId, provider, mode: 'fire-and-forget', created: true });
2420
+ return;
2421
+ }
2422
+
2423
+ // For --wait, prompt was already delivered via CLI arg — skip to polling
2424
+ } else {
2425
+ // Session was already running — submit prompt via bridge submit endpoint
2426
+ // Pass callingSession for depth tracking (derive from SLYCODE_SESSION env or best guess)
2427
+ const callingSession = process.env.SLYCODE_SESSION || undefined;
2428
+ const submitRes = await fetch(`${bridgeUrl}/sessions/${encodeURIComponent(sessionName)}/submit`, {
2429
+ method: 'POST',
2430
+ headers: { 'Content-Type': 'application/json' },
2431
+ body: JSON.stringify({ prompt: fullPrompt, force, callingSession }),
2432
+ });
2433
+
2434
+ const submitResult = await submitRes.json();
2435
+
2436
+ if (!submitRes.ok) {
2437
+ if (submitResult.locked) {
2438
+ console.error(`Error: ${submitResult.error}`);
2439
+ } else if (submitResult.busy) {
2440
+ console.error(`Warning: ${submitResult.error}`);
2441
+ } else {
2442
+ console.error(`Error: ${submitResult.error || 'Failed to submit prompt'}`);
2443
+ }
2444
+ process.exit(1);
2445
+ }
2446
+
2447
+ // Fire-and-forget mode
2448
+ if (!wait) {
2449
+ console.log(`Prompt delivered to ${cardId} (session: ${sessionName}).`);
2450
+ emitEvent(kanban, 'card.prompt', { cardId, provider, mode: 'fire-and-forget' });
2451
+ return;
2452
+ }
2453
+ }
2454
+
2455
+ // --wait mode: poll for response
2456
+ console.log(`Prompt sent to ${cardId}. Waiting for response (timeout: ${timeout}s)...`);
2457
+ const pollStart = Date.now();
2458
+ const pollInterval = 2000; // 2 seconds
2459
+ const timeoutMs = timeout * 1000;
2460
+
2461
+ while (Date.now() - pollStart < timeoutMs) {
2462
+ await new Promise(r => setTimeout(r, pollInterval));
2463
+
2464
+ try {
2465
+ const pollRes = await fetch(`${bridgeUrl}/responses/${responseId}`);
2466
+ if (pollRes.ok) {
2467
+ const pollData = await pollRes.json();
2468
+ if (pollData.status === 'received' && pollData.data) {
2469
+ // Happy path: response received
2470
+ console.log(pollData.data);
2471
+ emitEvent(kanban, 'card.prompt', { cardId, provider, mode: 'wait', outcome: 'received' });
2472
+ return;
2473
+ }
2474
+ }
2475
+ } catch { /* retry */ }
2476
+ }
2477
+
2478
+ // Timeout — determine which outcome
2479
+ // Mark caller as timed out so bridge can inject late responses
2480
+ try {
2481
+ await fetch(`${bridgeUrl}/responses/${responseId}/timeout`, { method: 'POST' });
2482
+ } catch { /* best effort */ }
2483
+
2484
+ // Check if target session is still active
2485
+ let isActive = false;
2486
+ try {
2487
+ const statsRes = await fetch(`${bridgeUrl}/sessions/${encodeURIComponent(sessionName)}`);
2488
+ if (statsRes.ok) {
2489
+ const statsData = await statsRes.json();
2490
+ if (statsData && statsData.lastOutputAt) {
2491
+ const outputAge = Date.now() - new Date(statsData.lastOutputAt).getTime();
2492
+ isActive = outputAge < 3000; // active if output within 3s
2493
+ }
2494
+ }
2495
+ } catch { /* ignore */ }
2496
+
2497
+ if (isActive) {
2498
+ // Outcome 2: timeout + activity ongoing
2499
+ console.error(`[TIMEOUT] Target session is still actively processing (active for ${Math.round((Date.now() - pollStart) / 1000)}s).`);
2500
+ console.error('A response may still arrive — the session appears to be working.');
2501
+ console.error('If you need the response, you can wait longer.');
2502
+ console.error(`Session: ${sessionName}`);
2503
+ } else {
2504
+ // Outcome 3: timeout + activity stopped — fetch snapshot
2505
+ let snapshot = '';
2506
+ try {
2507
+ const snapRes = await fetch(`${bridgeUrl}/sessions/${encodeURIComponent(sessionName)}/snapshot?lines=20`);
2508
+ if (snapRes.ok) {
2509
+ const snapData = await snapRes.json();
2510
+ snapshot = snapData.content || '';
2511
+ }
2512
+ } catch { /* ignore */ }
2513
+
2514
+ console.error(`[TIMEOUT] Target session stopped processing without responding (timeout: ${timeout}s).`);
2515
+ if (snapshot) {
2516
+ console.error('\nTerminal snapshot (last 20 lines):');
2517
+ console.error('---');
2518
+ console.error(snapshot);
2519
+ console.error('---');
2520
+ }
2521
+ console.error('\nPossible cause: Permission prompt, user-facing question, or agent did not call respond.');
2522
+ console.error(`Session: ${sessionName}`);
2523
+ }
2524
+
2525
+ emitEvent(kanban, 'card.prompt', { cardId, provider, mode: 'wait', outcome: 'timeout', active: isActive });
2526
+ process.exit(1);
2527
+
2528
+ } catch (err) {
2529
+ if (err.cause?.code === 'ECONNREFUSED' || err.message?.includes('fetch failed')) {
2530
+ console.error('Error: Bridge is not running. Start it with: cd bridge && npm run dev');
2531
+ } else {
2532
+ console.error('Error:', err.message);
2533
+ }
2534
+ process.exit(1);
2535
+ }
2536
+ };
2537
+
2538
+ doPrompt();
2539
+ }
2540
+
2541
+ // ============================================================================
2542
+ // Respond Command (cross-card callback)
2543
+ // ============================================================================
2544
+
2545
+ function cmdRespond(args) {
2546
+ const opts = parseArgs(args);
2547
+
2548
+ if (opts.help || args.length === 0) {
2549
+ console.log(RESPOND_HELP);
2550
+ return;
2551
+ }
2552
+
2553
+ const responseId = opts._[0];
2554
+ const responseData = opts._[1];
2555
+
2556
+ if (!responseId) {
2557
+ console.error('Error: Response ID required');
2558
+ process.exit(1);
2559
+ }
2560
+
2561
+ if (!responseData) {
2562
+ console.error('Error: Response data required');
2563
+ console.error('Usage: kanban respond <response-id> "your response data"');
2564
+ process.exit(1);
2565
+ }
2566
+
2567
+ // Determine bridge URL
2568
+ const bridgePort = process.env.BRIDGE_PORT || process.env.PORT || '3004';
2569
+ const bridgeUrl = process.env.BRIDGE_URL || `http://localhost:${bridgePort}`;
2570
+
2571
+ const doRespond = async () => {
2572
+ try {
2573
+ const res = await fetch(`${bridgeUrl}/responses/${encodeURIComponent(responseId)}`, {
2574
+ method: 'POST',
2575
+ headers: { 'Content-Type': 'application/json' },
2576
+ body: JSON.stringify({ data: responseData }),
2577
+ });
2578
+
2579
+ if (!res.ok) {
2580
+ const errBody = await res.json().catch(() => ({ error: 'Unknown error' }));
2581
+ console.error(`Error: ${errBody.error || 'Failed to deliver response'}`);
2582
+ process.exit(1);
2583
+ }
2584
+
2585
+ const result = await res.json();
2586
+ console.log(`Response delivered.${result.lateInjection ? ' (late injection — caller had already timed out)' : ''}`);
2587
+ } catch (err) {
2588
+ if (err.cause?.code === 'ECONNREFUSED' || err.message?.includes('fetch failed')) {
2589
+ console.error('Error: Bridge is not running.');
2590
+ } else {
2591
+ console.error('Error:', err.message);
2592
+ }
2593
+ process.exit(1);
2594
+ }
2595
+ };
2596
+
2597
+ doRespond();
2598
+ }
2599
+
2160
2600
  // ============================================================================
2161
2601
  // Main
2162
2602
  // ============================================================================
@@ -2208,6 +2648,12 @@ function main() {
2208
2648
  case 'automation':
2209
2649
  cmdAutomation(commandArgs);
2210
2650
  break;
2651
+ case 'prompt':
2652
+ cmdPrompt(commandArgs);
2653
+ break;
2654
+ case 'respond':
2655
+ cmdRespond(commandArgs);
2656
+ break;
2211
2657
  case 'areas':
2212
2658
  cmdAreas(commandArgs);
2213
2659
  break;
@@ -9,7 +9,7 @@ scope: global
9
9
  classes:
10
10
  design: 60
11
11
  implementation: 30
12
- project-terminal: 50
12
+ project-terminal: 60
13
13
  ---
14
14
 
15
15
  /checkpoint
@@ -11,7 +11,7 @@ classes:
11
11
  design: 90
12
12
  done: 30
13
13
  implementation: 60
14
- project-terminal: 60
14
+ project-terminal: 10
15
15
  testing: 60
16
16
  ---
17
17
 
@@ -7,7 +7,7 @@ group: "Project"
7
7
  placement: startup
8
8
  scope: global
9
9
  classes:
10
- project-terminal: 40
10
+ project-terminal: 50
11
11
  ---
12
12
 
13
13
  {{projectContext}}
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: deep-design
3
- version: 1.0.0
3
+ version: 1.1.0
4
4
  label: "Deep Design"
5
5
  description: "Thorough design with parallel analysis agents for creative, risk, and quality perspectives"
6
6
  group: "Card Actions"
@@ -21,6 +21,8 @@ classes:
21
21
 
22
22
  We're starting a **deep design** session for card `{{card.id}}`. This is the thorough version — after creating the initial design doc, we'll run parallel analysis agents to stress-test the design from multiple angles before iterating.
23
23
 
24
+ **Your role is to investigate and advise.** You must NOT unilaterally cut scope, drop requirements, or decide what to build. All scope and direction decisions belong to the user. Present findings, options, and trade-offs — then ask.
25
+
24
26
  ---
25
27
 
26
28
  ### Phase 1 — Initial Design Doc
@@ -48,6 +50,7 @@ Now launch sub-agents to analyse the design from different perspectives. Each ag
48
50
  - Read the card details
49
51
  - If the card has Areas, use `/context-priming` with those areas for codebase awareness
50
52
  - Return a focused brief (aim for 5-15 bullet points, not essays)
53
+ - **Advise only** — do not recommend cutting scope or dropping requirements. Flag risks and trade-offs, but respect the stated scope as given
51
54
 
52
55
  Here are the 6 available perspectives:
53
56
 
@@ -64,7 +67,7 @@ Here are the 6 available perspectives:
64
67
  > You are a codebase archaeologist. Read the design doc and card details, then search the existing codebase for related patterns, reusable components, utilities, or conventions. Use `/context-priming` with the card's Areas and explore the code. Report: What existing code can be reused? What patterns should this design follow for consistency? Are there similar features we can learn from? Is there anything we'd be duplicating unnecessarily?
65
68
 
66
69
  #### 5. Simplification Advocate
67
- > You are a complexity skeptic. Read the design doc and card details, then challenge every piece of complexity. For each requirement or design decision, ask: Is this truly needed? Could it be simpler? Could we defer this part? Is there a 20% effort solution that delivers 80% of the value? Your job is to push back on over-engineering and scope creep. Propose concrete simplifications with clear trade-offs.
70
+ > You are a complexity skeptic. Read the design doc and card details, then look for ways the *implementation* could be simpler while still meeting the stated requirements. For each design decision, ask: Could the implementation be simpler? Is there a less complex way to achieve this requirement? Are we over-engineering the solution? Propose concrete simplifications with clear trade-offs. **Important:** Do NOT recommend cutting requirements or reducing scope the requirements are the user's decision. Focus on simpler ways to achieve what's been asked for.
68
71
 
69
72
  #### 6. Edge Case Hunter
70
73
  > You are a boundary condition specialist. Read the design doc and card details, then enumerate edge cases, boundary conditions, and scenarios the design should handle. Think about: empty/null/missing data, concurrent access, very large inputs, rapid repeated actions, permission boundaries, network failures, interrupted operations, first-use vs power-user flows. Rate each edge case by likelihood and severity.
@@ -81,7 +84,7 @@ Once the agents return, **synthesize** their findings:
81
84
  - 🟡 **Should consider** — meaningful improvement or risk worth discussing
82
85
  - 🟢 **Nice to know** — interesting perspective, may inform decisions later
83
86
  3. Update the design doc with a new **"Analysis Notes"** section capturing the key findings.
84
- 4. Recommend which items should be folded into the design requirements vs deferred.
87
+ 4. Present options and suggestions do NOT unilaterally fold findings into requirements or cut scope. The user decides what to act on.
85
88
 
86
89
  ---
87
90
 
@@ -93,6 +96,13 @@ Now begin the normal design iteration:
93
96
  - Update the design doc as decisions are made
94
97
  - Focus on goals, constraints, and acceptance criteria
95
98
 
99
+ **IMPORTANT — Surface everything in your message.** Do not assume the user has read the design document. Every time you respond, list in your conversation message:
100
+ - Any **outstanding questions** that need answers
101
+ - Any **options or trade-offs** that need a decision
102
+ - Any **suggestions** you want feedback on
103
+
104
+ Questions written into the doc but not surfaced in your message are effectively invisible.
105
+
96
106
  **When design is complete — assess complexity:**
97
107
 
98
108
  Look at the scope of work:
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: design-requirements
3
- version: 1.0.0
3
+ version: 1.1.0
4
4
  label: "Design Doc"
5
5
  description: "Create a requirements document through iterative discovery"
6
6
  group: "Card Actions"
@@ -21,6 +21,8 @@ classes:
21
21
 
22
22
  We're starting a **requirements discovery** session for card `{{card.id}}`. The goal is to create a design document that captures WHAT we're building and WHY - not HOW (unless architectural decisions are essential to the requirements).
23
23
 
24
+ **Your role is to investigate and advise.** You must NOT unilaterally cut scope, drop requirements, or decide what to build. All scope and direction decisions belong to the user. Present findings, options, and trade-offs — then ask.
25
+
24
26
  > Card details are provided above. Run `sly-kanban show {{card.id}}` only if you need additional detail.
25
27
 
26
28
  **Workflow:**
@@ -68,6 +70,14 @@ When in doubt, lean toward creating the feature spec — it's better to over-doc
68
70
  - Keep the document updated after each decision
69
71
  - Focus on goals, constraints, and acceptance criteria
70
72
  - Flag when you think the requirements are complete
73
+ - Do NOT unilaterally cut scope or drop requirements — the user decides what's in and out
74
+
75
+ **IMPORTANT — Surface everything in your message.** Do not assume the user has read the design document. Every time you respond, list in your conversation message:
76
+ - Any **outstanding questions** that need answers
77
+ - Any **options or trade-offs** that need a decision
78
+ - Any **suggestions** you want feedback on
79
+
80
+ Questions written into the doc but not surfaced in your message are effectively invisible.
71
81
 
72
82
  ---
73
83
 
@@ -8,7 +8,7 @@ placement: startup
8
8
  scope: global
9
9
  classes:
10
10
  global-terminal: 10
11
- project-terminal: 30
11
+ project-terminal: 40
12
12
  ---
13
13
 
14
14
  {{projectContext}}
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: onboard
3
- version: 1.0.0
3
+ version: 1.1.0
4
4
  label: "Onboard"
5
5
  description: "Analyze and improve a backlog item, then move to design"
6
6
  group: "Card Actions"
@@ -23,7 +23,7 @@ Onboard this backlog item. Analyze it, improve it, and move it to design.
23
23
  **Do this:**
24
24
  1. Analyze the card - understand the intent from title and description
25
25
  2. Improve the title - make it clear, concise, action-oriented
26
- 3. Rewrite the description - structure logically, capture the essential gist
26
+ 3. Rewrite the description - structure logically, capture the essential gist. **Do not add new solutions or implementation suggestions** — that belongs in the design phase. However, preserve any solution ideas already present in the original description.
27
27
  4. Set appropriate areas (run `sly-kanban areas` to see options)
28
28
  4.5 Potentially use context-priming to understand that area better
29
29
  5. Set correct type and priority
@@ -34,5 +34,3 @@ Onboard this backlog item. Analyze it, improve it, and move it to design.
34
34
  - What you understood the intent to be
35
35
  - What changes you made and why
36
36
  - Ask for confirmation - if I disagree, I'll tell you what to adjust
37
- # test change
38
- # user edit
@@ -10,7 +10,7 @@ classes:
10
10
  design: 50
11
11
  done: 20
12
12
  implementation: 50
13
- project-terminal: 20
13
+ project-terminal: 30
14
14
  testing: 50
15
15
  ---
16
16