spine-framework 0.3.145 → 0.4.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 (451) hide show
  1. package/.env.example +76 -0
  2. package/.framework/.spine-manifest.json +19 -0
  3. package/.framework/cli/commands/agents.ts +61 -33
  4. package/.framework/cli/commands/auth.ts +60 -28
  5. package/.framework/cli/commands/create-app.ts +212 -80
  6. package/.framework/cli/commands/dev.ts +184 -68
  7. package/.framework/cli/commands/doctor.ts +324 -152
  8. package/.framework/cli/commands/generate.ts +119 -68
  9. package/.framework/cli/commands/init.ts +141 -242
  10. package/.framework/cli/commands/install-app.ts +1336 -314
  11. package/.framework/cli/commands/items.ts +31 -29
  12. package/.framework/cli/commands/migrate.ts +299 -156
  13. package/.framework/cli/commands/migrations.ts +62 -30
  14. package/.framework/cli/commands/pipelines.ts +31 -29
  15. package/.framework/cli/commands/status.ts +105 -45
  16. package/.framework/cli/commands/system.ts +47 -42
  17. package/.framework/cli/commands/test.ts +161 -102
  18. package/.framework/cli/commands/upgrade.ts +260 -0
  19. package/.framework/cli/commands/validate-app.ts +517 -161
  20. package/.framework/cli/context.ts +117 -85
  21. package/.framework/cli/env-loader.ts +74 -43
  22. package/.framework/cli/index.ts +70 -46
  23. package/.framework/cli/lib/project-files.ts +404 -0
  24. package/.framework/docs/guides/testing-guide.md +1 -1
  25. package/.framework/docs/runtime-types.md +72 -72
  26. package/.framework/functions/_shared/access.ts +84 -0
  27. package/.framework/functions/_shared/agent-runner.ts +5051 -1026
  28. package/.framework/functions/_shared/app-manifest.ts +214 -94
  29. package/.framework/functions/_shared/ast.ts +214 -0
  30. package/.framework/functions/_shared/audit.ts +91 -55
  31. package/.framework/functions/_shared/cil.ts +368 -127
  32. package/.framework/functions/_shared/db.ts +337 -68
  33. package/.framework/functions/_shared/funnel.ts +228 -0
  34. package/.framework/functions/_shared/geo.ts +105 -0
  35. package/.framework/functions/_shared/hash-api-key.ts +94 -17
  36. package/.framework/functions/_shared/index.ts +22 -224
  37. package/.framework/functions/_shared/kb.ts +832 -58
  38. package/.framework/functions/_shared/llm.ts +118 -18
  39. package/.framework/functions/_shared/logging.ts +317 -19
  40. package/.framework/functions/_shared/middleware.ts +701 -131
  41. package/.framework/functions/_shared/notify.ts +70 -0
  42. package/.framework/functions/_shared/outcomes.ts +34 -19
  43. package/.framework/functions/_shared/permissions.ts +501 -315
  44. package/.framework/functions/_shared/pipeline-runner.ts +704 -155
  45. package/.framework/functions/_shared/principal.ts +436 -263
  46. package/.framework/functions/_shared/rate-limit.ts +233 -0
  47. package/.framework/functions/_shared/resolve-credentials.ts +86 -19
  48. package/.framework/functions/_shared/resolve-ids.ts +203 -139
  49. package/.framework/functions/_shared/retry-deliveries.ts +51 -16
  50. package/.framework/functions/_shared/schema-utils.ts +602 -521
  51. package/.framework/functions/_shared/security.ts +345 -0
  52. package/.framework/functions/_shared/testing.ts +197 -172
  53. package/.framework/functions/_shared/tracing.ts +351 -21
  54. package/.framework/functions/_shared/trigger-engine.ts +425 -136
  55. package/.framework/functions/_shared/webhook-registration.ts +71 -70
  56. package/.framework/functions/_shared/webhook-registry.ts +126 -83
  57. package/.framework/functions/account-nodes.ts +30 -30
  58. package/.framework/functions/adapters/generic-webhook-inbound.ts +49 -16
  59. package/.framework/functions/adapters/generic-webhook-outbound.ts +17 -17
  60. package/.framework/functions/adapters/openai-outbound.ts +15 -16
  61. package/.framework/functions/admin-data.ts +596 -173
  62. package/.framework/functions/admin-funnel.ts +64 -60
  63. package/.framework/functions/admin-install-funnel.ts +84 -66
  64. package/.framework/functions/admin-signals.ts +69 -51
  65. package/.framework/functions/ai-agents.ts +431 -106
  66. package/.framework/functions/ai-interactions.ts +186 -112
  67. package/.framework/functions/api-keys.ts +107 -107
  68. package/.framework/functions/apps.ts +154 -136
  69. package/.framework/functions/auth.ts +83 -65
  70. package/.framework/functions/cil-agent-ingest.ts +189 -232
  71. package/.framework/functions/cil-agent.ts +433 -177
  72. package/.framework/functions/cil-callmap.ts +642 -430
  73. package/.framework/functions/cil-config.ts +139 -135
  74. package/.framework/functions/cil-context.ts +214 -127
  75. package/.framework/functions/cil-doc.ts +587 -458
  76. package/.framework/functions/cil-embeddings.ts +453 -364
  77. package/.framework/functions/cil-graph.ts +427 -142
  78. package/.framework/functions/cil-ingest.ts +1418 -1154
  79. package/.framework/functions/cil-pipeline.ts +276 -21
  80. package/.framework/functions/cil-project.ts +659 -132
  81. package/.framework/functions/cil-validate.ts +198 -164
  82. package/.framework/functions/debug-auth.ts +57 -55
  83. package/.framework/functions/deliveries.ts +80 -21
  84. package/.framework/functions/embeddings.ts +1023 -318
  85. package/.framework/functions/eval-harness.ts +146 -108
  86. package/.framework/functions/integration-outbound.ts +205 -75
  87. package/.framework/functions/integration-routes.ts +128 -23
  88. package/.framework/functions/integrations.ts +125 -100
  89. package/.framework/functions/invites.ts +1095 -460
  90. package/.framework/functions/item-progress.ts +158 -102
  91. package/.framework/functions/kb.ts +34 -10
  92. package/.framework/functions/logs.ts +133 -133
  93. package/.framework/functions/observability.ts +152 -122
  94. package/.framework/functions/pipeline-executions.ts +147 -132
  95. package/.framework/functions/pipelines.ts +134 -119
  96. package/.framework/functions/prompt-configs.ts +96 -80
  97. package/.framework/functions/roles.ts +112 -82
  98. package/.framework/functions/security.ts +450 -0
  99. package/.framework/functions/system-cron.ts +117 -80
  100. package/.framework/functions/system.ts +158 -98
  101. package/.framework/functions/tests.ts +29 -29
  102. package/.framework/functions/timers.ts +94 -95
  103. package/.framework/functions/trigger-scheduler.ts +10 -0
  104. package/.framework/functions/triggers.ts +179 -149
  105. package/.framework/functions/types.ts +137 -125
  106. package/.framework/mcp/index.ts +133 -0
  107. package/.framework/mcp/load-env.ts +60 -0
  108. package/.framework/mcp/shared/app-manifest.ts +275 -0
  109. package/.framework/mcp/shared/db.ts +477 -0
  110. package/.framework/mcp/shared/kb.ts +118 -0
  111. package/.framework/mcp/tools/architect.ts +431 -0
  112. package/.framework/mcp/tools/cil/context.ts +345 -0
  113. package/.framework/mcp/tools/cil/graph.ts +242 -0
  114. package/.framework/mcp/tools/cil/ingest.ts +1217 -0
  115. package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +693 -0
  116. package/.framework/mcp/tools/cil/pipeline.ts +767 -0
  117. package/.framework/mcp/tools/cil/project.ts +791 -0
  118. package/.framework/mcp/tools/cil/retrieval.ts +336 -0
  119. package/.framework/mcp/tools/cil/search-core.ts +454 -0
  120. package/.framework/mcp/tools/cil/search.ts +97 -0
  121. package/.framework/mcp/tools/cil/suggest.ts +186 -0
  122. package/.framework/mcp/tools/cil/validate.ts +1369 -0
  123. package/.framework/mcp/tools/kb/delete.ts +139 -0
  124. package/.framework/mcp/tools/kb/index.ts +52 -0
  125. package/.framework/mcp/tools/kb/ingest.ts +84 -0
  126. package/.framework/mcp/tools/kb/list-types.ts +102 -0
  127. package/.framework/mcp/tools/kb/publish.ts +100 -0
  128. package/.framework/mcp/tools/kb/reindex.ts +86 -0
  129. package/.framework/mcp/tools/kb/revoke.ts +85 -0
  130. package/.framework/mcp/tools/kb/search.ts +101 -0
  131. package/.framework/mcp/tools/kb/upsert.ts +125 -0
  132. package/.framework/mcp/tools/observability.ts +510 -0
  133. package/.framework/migrations/001_core_schema.sql +15 -0
  134. package/.framework/migrations/002_core_rls_and_functions.sql +15 -0
  135. package/.framework/migrations/003_core_system_data.sql +16 -1
  136. package/.framework/migrations/004_core_rpc_and_broker.sql +17 -1
  137. package/.framework/migrations/005_core_observability.sql +17 -1
  138. package/.framework/migrations/006_security_hardening_rls.sql +15 -0
  139. package/.framework/migrations/007_kb_article_list.sql +17 -1
  140. package/.framework/migrations/008_items_target.sql +15 -0
  141. package/.framework/migrations/009_roles_slug_unique.sql +15 -0
  142. package/.framework/migrations/010_auth_user_trigger.sql +15 -0
  143. package/.framework/migrations/011_spine_system_account.sql +16 -0
  144. package/.framework/migrations/012_service_role_grants.sql +16 -0
  145. package/.framework/migrations/013_get_account_apps_role_filter.sql +15 -0
  146. package/.framework/migrations/014_apps_required_roles.sql +16 -0
  147. package/.framework/migrations/015_types_kind_slug_unique.sql +15 -0
  148. package/.framework/migrations/016_cil_types.sql +281 -0
  149. package/.framework/migrations/017_cil_stable_ids.sql +37 -0
  150. package/.framework/migrations/018_runtime_tables.sql +129 -0
  151. package/.framework/migrations/019_agent_prompt_columns.sql +56 -0
  152. package/.framework/migrations/020_schema_reconciliation.sql +67 -0
  153. package/.framework/migrations/021_kb_embedding_lifecycle.sql +31 -0
  154. package/.framework/migrations/032_cil_status_migration.sql +73 -0
  155. package/.framework/migrations/033_cil_versioning.sql +73 -0
  156. package/.framework/migrations/034_match_embeddings_knn.sql +115 -0
  157. package/.framework/migrations/035_rate_limits.sql +55 -0
  158. package/.framework/migrations/036_demo_record_flags.sql +72 -0
  159. package/.framework/migrations/037_kb_types_canonical.sql +244 -0
  160. package/.framework/migrations/038_drop_demo_record_flags.sql +38 -0
  161. package/.framework/migrations/042_registration_hierarchy.sql +309 -0
  162. package/.framework/migrations/043_policy_actor_cleanup.sql +39 -0
  163. package/.framework/migrations/044_match_embeddings_filtered_knn.sql +151 -0
  164. package/.framework/migrations/045_security_critical_rls.sql +139 -0
  165. package/.framework/migrations/046_security_missing_rls.sql +79 -0
  166. package/.framework/migrations/047_people_updated_by.sql +27 -0
  167. package/.framework/migrations/048_watcher_last_seen_at.sql +24 -0
  168. package/.framework/migrations/049_security_blocklist.sql +148 -0
  169. package/.framework/migrations/050_notifications.sql +49 -0
  170. package/.framework/migrations/051_message_agent_fields.sql +74 -0
  171. package/.framework/migrations/052_registration_security.sql +421 -0
  172. package/.framework/migrations/053_builtin_action_seeds.sql +66 -0
  173. package/.framework/migrations/054_kb_ingest_lease.sql +157 -0
  174. package/.framework/migrations/055_type_id_drift_reconciliation.sql +33 -0
  175. package/.framework/migrations/056_slug_column_reconciliation.sql +38 -0
  176. package/.framework/migrations/057_pipelines_slug_identity.sql +14 -0
  177. package/.framework/migrations/058_account_data_field_declarations.sql +53 -0
  178. package/.framework/migrations/059_registration_placement_fixes.sql +269 -0
  179. package/.framework/migrations/060_account_person_record_permissions.sql +38 -0
  180. package/.framework/migrations/061_fk_dedup.sql +32 -0
  181. package/.framework/public/spine-logo.svg +10 -3
  182. package/.framework/scripts/app-install-cli.ts +190 -93
  183. package/.framework/scripts/assemble-frontend.sh +127 -44
  184. package/.framework/scripts/assemble-functions.sh +128 -30
  185. package/.framework/scripts/boundary-check.sh +6 -2
  186. package/.framework/scripts/build-manifest.sh +24 -68
  187. package/.framework/scripts/check-core-integrity.sh +15 -76
  188. package/.framework/scripts/checksum-manifest.mts +343 -0
  189. package/.framework/scripts/cil-migrate-markers.ts +403 -0
  190. package/.framework/scripts/fix-cil-markers.mjs +176 -0
  191. package/.framework/scripts/verify-integrity.sh +21 -57
  192. package/.framework/scripts/verify-manifest.mts +305 -0
  193. package/.framework/seeds/types/funnel_signal_use.json +74 -21
  194. package/.framework/seeds/types/spine_instance.json +73 -21
  195. package/.framework/src/App.tsx +118 -72
  196. package/.framework/src/apps/admin/index.tsx +855 -58
  197. package/.framework/src/components/AppWrapper.tsx +43 -45
  198. package/.framework/src/components/CustomAppLoader.tsx +160 -116
  199. package/.framework/src/components/admin/AdminListPage.tsx +46 -44
  200. package/.framework/src/components/admin/AdminSidebar.tsx +57 -47
  201. package/.framework/src/components/admin/AdminStatsCard.tsx +46 -44
  202. package/.framework/src/components/admin/PageInstructions.tsx +98 -2
  203. package/.framework/src/components/admin/SortableTableHeader.tsx +44 -45
  204. package/.framework/src/components/app-shell/GenericAppShell.tsx +64 -65
  205. package/.framework/src/components/app-shell/GenericDetailPage.tsx +44 -47
  206. package/.framework/src/components/app-shell/GenericListPage.tsx +45 -49
  207. package/.framework/src/components/app-sidebar.tsx +42 -45
  208. package/.framework/src/components/auth/ProtectedRoute.tsx +48 -41
  209. package/.framework/src/components/auth/TurnstileWidget.tsx +27 -0
  210. package/.framework/src/components/kb/KBArticleEditor.tsx +231 -22
  211. package/.framework/src/components/kb/KBArticleList.tsx +251 -10
  212. package/.framework/src/components/layout/AppShell.tsx +51 -45
  213. package/.framework/src/components/layout/Header.tsx +42 -43
  214. package/.framework/src/components/layout/Layout.tsx +46 -46
  215. package/.framework/src/components/layout/Sidebar.tsx +196 -96
  216. package/.framework/src/components/runtime/DataDetailHeader.tsx +55 -30
  217. package/.framework/src/components/runtime/DataDetailPage.tsx +31 -269
  218. package/.framework/src/components/runtime/DataFilters.tsx +49 -74
  219. package/.framework/src/components/runtime/DataHeader.tsx +53 -32
  220. package/.framework/src/components/runtime/DataListPage.tsx +51 -155
  221. package/.framework/src/components/runtime/DataStats.tsx +66 -44
  222. package/.framework/src/components/runtime/DataTable.tsx +49 -149
  223. package/.framework/src/components/runtime/SchemaDetailForm.tsx +45 -75
  224. package/.framework/src/components/runtime/index.ts +119 -16
  225. package/.framework/src/components/search-form.tsx +46 -29
  226. package/.framework/src/components/shared/AgentView.tsx +65 -48
  227. package/.framework/src/components/shared/FieldRenderer.tsx +144 -50
  228. package/.framework/src/components/shared/InviteManager.tsx +207 -97
  229. package/.framework/src/components/shared/MemberList.tsx +97 -0
  230. package/.framework/src/components/shared/SchemaFields.tsx +107 -86
  231. package/.framework/src/components/ui/DataTable.tsx +80 -68
  232. package/.framework/src/components/ui/Form.tsx +157 -146
  233. package/.framework/src/components/ui/ItemCard.tsx +74 -67
  234. package/.framework/src/components/ui/ItemListView.tsx +73 -68
  235. package/.framework/src/components/ui/LoadingSpinner.tsx +43 -48
  236. package/.framework/src/components/ui/Modal.tsx +78 -68
  237. package/.framework/src/components/ui/RichTextEditor.tsx +89 -69
  238. package/.framework/src/components/ui/accordion.tsx +85 -86
  239. package/.framework/src/components/ui/alert-dialog.tsx +197 -184
  240. package/.framework/src/components/ui/alert.tsx +105 -94
  241. package/.framework/src/components/ui/aspect-ratio.tsx +57 -43
  242. package/.framework/src/components/ui/avatar.tsx +122 -107
  243. package/.framework/src/components/ui/badge.tsx +60 -55
  244. package/.framework/src/components/ui/breadcrumb.tsx +127 -128
  245. package/.framework/src/components/ui/button-group.tsx +86 -72
  246. package/.framework/src/components/ui/button.tsx +71 -50
  247. package/.framework/src/components/ui/calendar.tsx +72 -57
  248. package/.framework/src/components/ui/card.tsx +136 -129
  249. package/.framework/src/components/ui/carousel.tsx +226 -107
  250. package/.framework/src/components/ui/chart.tsx +252 -147
  251. package/.framework/src/components/ui/checkbox.tsx +43 -44
  252. package/.framework/src/components/ui/collapsible.tsx +86 -71
  253. package/.framework/src/components/ui/combobox.tsx +282 -249
  254. package/.framework/src/components/ui/command.tsx +158 -146
  255. package/.framework/src/components/ui/context-menu.tsx +239 -240
  256. package/.framework/src/components/ui/dialog.tsx +174 -157
  257. package/.framework/src/components/ui/direction.tsx +72 -56
  258. package/.framework/src/components/ui/drawer.tsx +168 -169
  259. package/.framework/src/components/ui/dropdown-menu.tsx +254 -223
  260. package/.framework/src/components/ui/empty.tsx +131 -120
  261. package/.framework/src/components/ui/field.tsx +205 -173
  262. package/.framework/src/components/ui/hover-card.tsx +71 -72
  263. package/.framework/src/components/ui/input-group.tsx +148 -133
  264. package/.framework/src/components/ui/input-otp.tsx +99 -86
  265. package/.framework/src/components/ui/input.tsx +43 -41
  266. package/.framework/src/components/ui/item.tsx +207 -185
  267. package/.framework/src/components/ui/kbd.tsx +57 -56
  268. package/.framework/src/components/ui/label.tsx +45 -41
  269. package/.framework/src/components/ui/menubar.tsx +268 -236
  270. package/.framework/src/components/ui/native-select.tsx +85 -86
  271. package/.framework/src/components/ui/navigation-menu.tsx +166 -156
  272. package/.framework/src/components/ui/pagination.tsx +131 -141
  273. package/.framework/src/components/ui/popover.tsx +125 -128
  274. package/.framework/src/components/ui/progress.tsx +47 -44
  275. package/.framework/src/components/ui/radio-group.tsx +60 -55
  276. package/.framework/src/components/ui/resizable.tsx +85 -72
  277. package/.framework/src/components/ui/scroll-area.tsx +57 -58
  278. package/.framework/src/components/ui/select.tsx +182 -169
  279. package/.framework/src/components/ui/separator.tsx +42 -43
  280. package/.framework/src/components/ui/sheet.tsx +170 -159
  281. package/.framework/src/components/ui/sidebar.tsx +395 -398
  282. package/.framework/src/components/ui/skeleton.tsx +42 -43
  283. package/.framework/src/components/ui/slider.tsx +61 -44
  284. package/.framework/src/components/ui/sonner.tsx +44 -44
  285. package/.framework/src/components/ui/spinner.tsx +47 -42
  286. package/.framework/src/components/ui/switch.tsx +56 -42
  287. package/.framework/src/components/ui/table-primitives.tsx +272 -132
  288. package/.framework/src/components/ui/table.tsx +140 -142
  289. package/.framework/src/components/ui/tabs.tsx +110 -93
  290. package/.framework/src/components/ui/textarea.tsx +43 -44
  291. package/.framework/src/components/ui/toggle-group.tsx +87 -71
  292. package/.framework/src/components/ui/toggle.tsx +56 -56
  293. package/.framework/src/components/ui/tooltip.tsx +99 -85
  294. package/.framework/src/contexts/AppContext.tsx +166 -114
  295. package/.framework/src/contexts/AuthContext.tsx +232 -137
  296. package/.framework/src/hooks/use-mobile.ts +43 -44
  297. package/.framework/src/hooks/useApi.ts +185 -172
  298. package/.framework/src/hooks/useAppPath.ts +31 -29
  299. package/.framework/src/hooks/useApps.ts +77 -42
  300. package/.framework/src/hooks/useEntityList.ts +66 -29
  301. package/.framework/src/hooks/useEntityRecord.ts +76 -32
  302. package/.framework/src/hooks/useForm.ts +62 -30
  303. package/.framework/src/hooks/useListSchema.ts +60 -43
  304. package/.framework/src/hooks/useSchemaRecord.ts +115 -95
  305. package/.framework/src/lib/api.ts +258 -134
  306. package/.framework/src/lib/registration.ts +181 -0
  307. package/.framework/src/lib/supabase.ts +118 -81
  308. package/.framework/src/lib/utils.ts +266 -266
  309. package/.framework/src/main.tsx +43 -44
  310. package/.framework/src/pages/DashboardPage.tsx +44 -43
  311. package/.framework/src/pages/NoAppPage.tsx +50 -0
  312. package/.framework/src/pages/NotFoundPage.tsx +32 -29
  313. package/.framework/src/pages/SetupPage.tsx +34 -33
  314. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +69 -58
  315. package/.framework/src/pages/admin/AIAgentsPage.tsx +43 -40
  316. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +63 -55
  317. package/.framework/src/pages/admin/APIKeysPage.tsx +44 -42
  318. package/.framework/src/pages/admin/AlertsConfigPage.tsx +117 -94
  319. package/.framework/src/pages/admin/AppDetailPage.tsx +48 -42
  320. package/.framework/src/pages/admin/AppsPage.tsx +45 -42
  321. package/.framework/src/pages/admin/DeliveriesPage.tsx +49 -17
  322. package/.framework/src/pages/admin/DesignedPage.tsx +31 -30
  323. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +58 -0
  324. package/.framework/src/pages/admin/EmbeddingsPage.tsx +49 -0
  325. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +31 -29
  326. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +46 -29
  327. package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -29
  328. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +68 -55
  329. package/.framework/src/pages/admin/IntegrationsPage.tsx +45 -42
  330. package/.framework/src/pages/admin/InvitesPage.tsx +60 -44
  331. package/.framework/src/pages/admin/LogsPage.tsx +87 -137
  332. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +31 -29
  333. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +150 -89
  334. package/.framework/src/pages/admin/PipelineDetailPage.tsx +77 -104
  335. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +44 -43
  336. package/.framework/src/pages/admin/PipelinesPage.tsx +59 -145
  337. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +53 -42
  338. package/.framework/src/pages/admin/PromptConfigsPage.tsx +47 -117
  339. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +31 -44
  340. package/.framework/src/pages/admin/RoleDetailPage.tsx +49 -92
  341. package/.framework/src/pages/admin/RolesPage.tsx +47 -164
  342. package/.framework/src/pages/admin/SecurityPage.tsx +310 -0
  343. package/.framework/src/pages/admin/SelectTestPage.tsx +30 -32
  344. package/.framework/src/pages/admin/ShadcnTestPage.tsx +37 -44
  345. package/.framework/src/pages/admin/SimpleDashboard.tsx +32 -44
  346. package/.framework/src/pages/admin/TestRunDetailPage.tsx +97 -44
  347. package/.framework/src/pages/admin/TestingDashboard.tsx +126 -71
  348. package/.framework/src/pages/admin/TimerDetailPage.tsx +67 -55
  349. package/.framework/src/pages/admin/TimersPage.tsx +44 -42
  350. package/.framework/src/pages/admin/TriggerDetailPage.tsx +47 -42
  351. package/.framework/src/pages/admin/TriggersPage.tsx +58 -57
  352. package/.framework/src/pages/admin/TypeDetailPage.tsx +91 -55
  353. package/.framework/src/pages/admin/TypesPage.tsx +45 -42
  354. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +258 -128
  355. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +127 -123
  356. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +308 -235
  357. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +159 -110
  358. package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +432 -0
  359. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +200 -178
  360. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +286 -239
  361. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +211 -90
  362. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +156 -143
  363. package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +379 -0
  364. package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +337 -0
  365. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +219 -214
  366. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
  367. package/.framework/src/pages/auth/AuthConfirmPage.tsx +135 -65
  368. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +39 -31
  369. package/.framework/src/pages/auth/LoginPage.tsx +38 -32
  370. package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -28
  371. package/.framework/src/pages/auth/RegisterPage.tsx +429 -155
  372. package/.framework/src/pages/spine-framework/APIPage.tsx +33 -30
  373. package/.framework/src/pages/spine-framework/CLIPage.tsx +32 -30
  374. package/.framework/src/types/auth.ts +101 -93
  375. package/.framework/src/types/types.ts +283 -262
  376. package/.framework/templates/project.json +87 -0
  377. package/.framework/templates/spine.config.neutral.json +7 -0
  378. package/.framework/tests/api/api-surface.test.ts +381 -0
  379. package/.framework/tests/fixtures/seed.ts +427 -0
  380. package/.framework/tests/fixtures/teardown.ts +228 -0
  381. package/.framework/tests/reporter.ts +351 -0
  382. package/.framework/tests/setup.ts +135 -0
  383. package/.framework/tests/ui/ui-sweep.ts +278 -0
  384. package/.framework/tests/unit/admin-data-logger.test.ts +310 -0
  385. package/.framework/tests/unit/agent-runner.test.ts +2389 -0
  386. package/.framework/tests/unit/ai-interactions.test.ts +81 -0
  387. package/.framework/tests/unit/app-manifest.test.ts +359 -0
  388. package/.framework/tests/unit/assembly-scripts.test.ts +172 -0
  389. package/.framework/tests/unit/cil-determinism.test.ts +85 -0
  390. package/.framework/tests/unit/core-isolation.test.ts +153 -0
  391. package/.framework/tests/unit/funnel-signals.test.ts +135 -0
  392. package/.framework/tests/unit/install-app.test.ts +1759 -0
  393. package/.framework/tests/unit/invites-security.test.ts +572 -0
  394. package/.framework/tests/unit/kb-ingest-lease.test.ts +287 -0
  395. package/.framework/tests/unit/kb-search.test.ts +119 -0
  396. package/.framework/tests/unit/migrate.test.ts +509 -0
  397. package/.framework/tests/unit/notify.test.ts +136 -0
  398. package/.framework/tests/unit/permissions.test.ts +269 -0
  399. package/.framework/tests/unit/pipeline-runner.test.ts +755 -0
  400. package/.framework/tests/unit/principal-cache.test.ts +138 -0
  401. package/.framework/tests/unit/retrieval-golden.test.ts +520 -0
  402. package/.framework/tests/unit/runtime-isolation.test.ts +642 -0
  403. package/.framework/tests/unit/schema-utils.test.ts +225 -0
  404. package/.framework/tests/unit/trigger-engine.test.ts +513 -0
  405. package/.framework/tests/unit/validate-app.test.ts +527 -0
  406. package/README.md +34 -3
  407. package/bin/spine-framework.cjs +1 -0
  408. package/config/tailwind.config.cjs +7 -0
  409. package/config/tsconfig.functions.json +42 -0
  410. package/config/tsconfig.json +37 -9
  411. package/config/vite.config.ts +31 -2
  412. package/netlify.toml +31 -3
  413. package/package.json +46 -29
  414. package/scripts/assemble-frontend.sh +127 -44
  415. package/scripts/assemble-functions.sh +127 -29
  416. package/scripts/boundary-check.sh +6 -2
  417. package/scripts/build-manifest.sh +24 -68
  418. package/scripts/checksum-manifest.mts +345 -0
  419. package/scripts/dev-clean.sh +86 -0
  420. package/scripts/dev-netlify.sh +49 -0
  421. package/scripts/netlify-dev-wrapper.sh +2 -0
  422. package/scripts/verify-install.ts +358 -0
  423. package/scripts/verify-integrity.sh +21 -57
  424. package/scripts/verify-manifest.mts +305 -0
  425. package/templates/project/gitignore +45 -0
  426. package/{config → templates/project}/package-lock.json +22335 -9366
  427. package/vitest.config.ts +46 -0
  428. package/.framework/public/spine.config.json +0 -91
  429. package/config/deno.lock +0 -108
  430. package/config/tsconfig.node.tsbuildinfo +0 -1
  431. package/config/tsconfig.tsbuildinfo +0 -1
  432. package/config/vite.config.d.ts +0 -2
  433. package/custom/.devin/AGENT.md +0 -357
  434. package/custom/.devin/skills/install-app/SKILL.md +0 -39
  435. package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +0 -39
  436. package/custom/.devin/skills/spine-workbench-idea/SKILL.md +0 -36
  437. package/custom/.devin/skills/spine-workbench-implement/SKILL.md +0 -46
  438. package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +0 -28
  439. package/custom/.devin/skills/spine-workbench-plan/SKILL.md +0 -38
  440. package/custom/.devin/workflows/app-install.yaml +0 -83
  441. package/custom/README.md +0 -79
  442. package/docs/README.md +0 -15
  443. package/scripts/app-install-cli.ts +0 -286
  444. package/scripts/check-core-integrity.sh +0 -82
  445. package/scripts/ingest-chunks.cjs +0 -202
  446. package/scripts/kb-chunk-parser.cjs +0 -312
  447. package/scripts/kb-chunk-parser.ts +0 -330
  448. package/scripts/kb-ingest-docs.ts +0 -203
  449. package/scripts/load-test-app-install.ts +0 -484
  450. package/scripts/test-login.js +0 -33
  451. package/spine.config.json +0 -91
@@ -1,357 +0,0 @@
1
- # Spine Framework — Custom Apps Agent Guide
2
-
3
- This document explains the structure, contract, and tooling for apps under `custom/apps/`. Read this before touching any app code.
4
-
5
- ---
6
-
7
- ## Directory Layout
8
-
9
- Every app lives at `custom/apps/{slug}/` and must follow this structure:
10
-
11
- ```
12
- custom/apps/{slug}/
13
- ├── package.json # npm identity + spine metadata block
14
- ├── manifest.json # runtime contract — the source of truth
15
- ├── index.tsx # default export: root React component
16
- ├── components/ # app-level shared components (sidebar, cards, etc.)
17
- ├── pages/ # route-mapped page components
18
- │ └── {section}/
19
- │ └── SomePage.tsx
20
- ├── functions/ # Netlify function handlers scoped to this app
21
- ├── hooks/ # React hooks
22
- ├── utils/ # Pure utility functions
23
- ├── public/ # Static assets copied to PROJECT_ROOT/public/ at assemble time
24
- └── seed/ # Data seeded into the DB on install
25
- ├── roles.json
26
- ├── types.json
27
- ├── link-types.json
28
- └── (any other declared seed files)
29
- ```
30
-
31
- No other top-level directories are allowed. `validate-app` will fail on unknown directories.
32
-
33
- ---
34
-
35
- ## package.json — Required Shape
36
-
37
- ```json
38
- {
39
- "name": "spine-framework-{slug}",
40
- "version": "X.Y.Z",
41
- "private": false,
42
- "description": "...",
43
- "peerDependencies": {
44
- "spine-framework": ">=0.1.0"
45
- },
46
- "files": [
47
- "index.tsx",
48
- "manifest.json",
49
- "seed/",
50
- "pages/",
51
- "components/",
52
- "hooks/",
53
- "utils/",
54
- "functions/",
55
- "public/",
56
- "README.md"
57
- ],
58
- "scripts": {
59
- "validate": "npx spine-framework validate-app ."
60
- },
61
- "spine": {
62
- "type": "app",
63
- "slug": "{slug}",
64
- "manifestPath": "manifest.json"
65
- }
66
- }
67
- ```
68
-
69
- **Rules:**
70
- - `"private": false` is required — apps must be publishable to npm
71
- - `files` must include every directory that exists in the app
72
- - `version` must match `manifest.json` version exactly
73
- - `spine.slug` must match `manifest.json` slug exactly
74
- - Package name convention: `spine-framework-{slug}`
75
-
76
- ---
77
-
78
- ## manifest.json — Full Contract
79
-
80
- ```json
81
- {
82
- "name": "My App",
83
- "slug": "my-app",
84
- "description": "...",
85
- "version": "X.Y.Z",
86
- "app_type": "full",
87
- "route_prefix": "/my-app",
88
- "required_roles": ["role-slug"],
89
- "routes": ["/", "/page"],
90
- "nav_items": [
91
- { "title": "Home", "path": "/", "icon": "Home", "order": 1 }
92
- ],
93
- "features": ["feature-a", "feature-b"],
94
- "dependencies": ["items", "accounts"],
95
- "entry_point": "./index.tsx",
96
- "sidebar_component": "./components/MyAppSidebar.tsx",
97
- "seed": [
98
- { "file": "seed/roles.json", "table": "roles", "conflict": "app_id,slug" },
99
- { "file": "seed/types.json", "table": "types", "conflict": "app_id,kind,slug" },
100
- { "file": "seed/link-types.json", "table": "link_types", "conflict": "app_id,slug" }
101
- ],
102
- "registration": {
103
- "enabled": true,
104
- "default_role": "role-slug",
105
- "redirect_path": "/my-app",
106
- "account_strategy": "new"
107
- }
108
- }
109
- ```
110
-
111
- ### Field Reference
112
-
113
- | Field | Required | Notes |
114
- |-------|----------|-------|
115
- | `name` | yes | Display name — written to `apps.name` in DB |
116
- | `slug` | yes | Unique identifier — written to `apps.slug` |
117
- | `version` | yes | Must match `package.json` version |
118
- | `app_type` | yes | One of: `full`, `ui`, `backend`, `data` |
119
- | `route_prefix` | yes | Where the app is mounted (e.g. `/cortex`, `/`, `/workspace`). Single source of truth for routing. |
120
- | `required_roles` | yes | Array of role slugs required to access the app |
121
- | `routes` | recommended | Root-relative paths the app handles — **must NOT include route_prefix** |
122
- | `nav_items` | recommended | Root-relative sidebar nav paths — **must NOT include route_prefix** |
123
- | `entry_point` | yes (full/ui) | Path to root React component (relative to app root) |
124
- | `sidebar_component` | yes (full/ui) | Path to sidebar component — used by AppWrapper |
125
- | `seed` | yes | Declares all seed files (see below) |
126
- | `registration` | if app supports self-registration | Controls `spine.config.json` registration entry |
127
-
128
- ### `app_type` values
129
-
130
- - `full` — has UI (pages, components) and backend (functions). Requires `index.tsx`, `pages/`, `functions/`
131
- - `ui` — frontend only. Requires `index.tsx`, `pages/`
132
- - `backend` — functions only. Requires `functions/`
133
- - `data` — schema/seed only. No UI or functions required
134
-
135
- ---
136
-
137
- ## Dynamic route_prefix
138
-
139
- `route_prefix` in `manifest.json` is the **single source of truth** for where an app is served. Changing it and running `update-db-app` is the only step needed to move an app to a different URL.
140
-
141
- ### How it flows
142
-
143
- 1. `manifest.json` declares `"route_prefix": "/cortex"` (or `/`, or anything)
144
- 2. `install-app` / `update-db-app` writes it to `apps.route_prefix` in the DB
145
- 3. `App.tsx` reads all app records and mounts each at `{route_prefix}/*`
146
- 4. Inside the app, `useAppPath()` prepends the prefix to all links — no hardcoded paths
147
-
148
- ### Rules for routes and nav_items
149
-
150
- Routes and nav_items must be **root-relative** — declared from the app's own root, not the full URL:
151
-
152
- ```json
153
- // CORRECT
154
- "route_prefix": "/cortex",
155
- "routes": ["/", "/dashboard", "/crm/accounts"],
156
- "nav_items": [{ "title": "Dashboard", "path": "/dashboard" }]
157
-
158
- // WRONG — validate-app will reject these
159
- "routes": ["/cortex", "/cortex/dashboard", "/cortex/crm/accounts"],
160
- "nav_items": [{ "title": "Dashboard", "path": "/cortex/dashboard" }]
161
- ```
162
-
163
- ### useAppPath() hook
164
-
165
- All absolute links inside an app must use `useAppPath()` instead of hardcoded strings:
166
-
167
- ```tsx
168
- import { useAppPath } from '@core/hooks/useAppPath'
169
-
170
- function MyComponent() {
171
- const appPath = useAppPath()
172
-
173
- return <a href={appPath('/dashboard')}>Dashboard</a>
174
- // → '/cortex/dashboard' if route_prefix is /cortex
175
- // → '/dashboard' if route_prefix is /
176
- }
177
- ```
178
-
179
- Use `useAppPath()` in: sidebar nav arrays, breadcrumbs, `navigate()` calls, any `<Link>` with an absolute path.
180
-
181
- ### Changing an app's location
182
-
183
- ```bash
184
- # 1. Edit manifest.json
185
- "route_prefix": "/" # was "/cortex"
186
-
187
- # 2. Sync to DB (no npm, no file changes)
188
- npx spine-framework update-db-app cortex
189
-
190
- # 3. Rebuild and serve
191
- npm run assemble && netlify dev
192
- ```
193
-
194
- That's the entire workflow. No code changes needed.
195
-
196
- ---
197
-
198
- ## Seed Block
199
-
200
- The `seed` array in `manifest.json` declares every file to be seeded into the DB at install time. `install-app` reads this array and runs a generic upsert loop — no hardcoded file names.
201
-
202
- ### Seed entry format
203
-
204
- ```json
205
- { "file": "seed/roles.json", "table": "roles", "conflict": "app_id,slug" }
206
- ```
207
-
208
- | Field | Required | Notes |
209
- |-------|----------|-------|
210
- | `file` | yes | Path relative to app root |
211
- | `table` | yes | Supabase table name |
212
- | `conflict` | yes | Column(s) for `onConflict` upsert (comma-separated) |
213
- | `inject_app_id` | no | Default `true` — set `false` for tables without `app_id` |
214
-
215
- ### Common conflict keys
216
-
217
- | Table | conflict |
218
- |-------|----------|
219
- | `roles` | `app_id,slug` |
220
- | `types` | `app_id,kind,slug` |
221
- | `link_types` | `app_id,slug` |
222
- | `triggers` | `app_id,name` |
223
-
224
- ### Seed file format
225
-
226
- Every seed file must be a JSON array. Each object maps to one DB row. Do NOT include `id` or `app_id` — these are set by the framework at install time.
227
-
228
- ```json
229
- [
230
- {
231
- "slug": "my-role",
232
- "name": "My Role",
233
- "description": "...",
234
- "permissions": ["*"],
235
- "is_system": true,
236
- "is_active": true,
237
- "is_protected": false
238
- }
239
- ]
240
- ```
241
-
242
- All seed files must be idempotent — safe to run against an existing DB without creating duplicates.
243
-
244
- ---
245
-
246
- ## registration block
247
-
248
- Controls how users self-register for this app. Written to `spine.config.json` by `install-app`.
249
-
250
- ```json
251
- "registration": {
252
- "enabled": true,
253
- "default_role": "member",
254
- "redirect_path": "/portal",
255
- "account_strategy": "new"
256
- }
257
- ```
258
-
259
- | `account_strategy` | Behavior |
260
- |--------------------|----------|
261
- | `new` | Creates a new account per registering user (customer-facing apps) |
262
- | `existing` | Assigns user to an existing account — requires `target_account` |
263
- | `choice` | User chooses at registration |
264
-
265
- If `account_strategy` is `existing`, `target_account` (account slug) is required.
266
-
267
- ---
268
-
269
- ## CLI Commands
270
-
271
- ```bash
272
- # Install an app from npm (first time)
273
- npx spine-framework install-app spine-framework-{slug}
274
- npx spine-framework install-app spine-framework-{slug}@next # pre-release
275
-
276
- # Sync local manifest.json changes to the DB (no npm, no file changes)
277
- # Use this after changing route_prefix, nav_items, registration, etc.
278
- npx spine-framework update-db-app {slug}
279
-
280
- # Validate an app before publishing
281
- npx spine-framework validate-app custom/apps/{slug}
282
- # or from inside the app directory:
283
- npm run validate
284
-
285
- # Uninstall an app
286
- npx spine-framework uninstall-app spine-framework-{slug}
287
-
288
- # Update app code from npm (preserves local manifest.json)
289
- npx spine-framework update-app spine-framework-{slug}
290
- ```
291
-
292
- **Key distinction:**
293
- - `install-app` = get/update code from npm. After first install, `manifest.json` is preserved — the developer owns it.
294
- - `update-db-app` = push local manifest changes to DB. No npm involved.
295
-
296
- `validate-app` checks:
297
- - `manifest.json` present, valid JSON, all required fields
298
- - `package.json` present, versions match, `"private": false`
299
- - Required files exist for `app_type`
300
- - `entry_point` and `sidebar_component` files exist (if declared)
301
- - `seed` block entries are valid and all declared files exist
302
- - `registration.account_strategy: "existing"` has `target_account`
303
- - No unknown directories
304
- - `.devin/` present → must contain `AGENTS.md` or `AGENT.md`
305
- - All directories in `files` array are present
306
-
307
- ---
308
-
309
- ## Assemble
310
-
311
- `assemble-frontend.sh` and `assemble-functions.sh` pick up app files at build time:
312
-
313
- - `functions/` → assembled into the Netlify functions directory
314
- - `public/` → copied to `PROJECT_ROOT/public/` (Vite's publicDir)
315
- - `pages/`, `components/`, `hooks/`, `utils/` → assembled into `.assembled/src/{slug}/`
316
-
317
- **Important:** `public/` assets must go to `PROJECT_ROOT/public/`, not `.assembled/src/public/`. This was a known bug fixed in `spine-framework@0.3.76`.
318
-
319
- ---
320
-
321
- ## Publishing
322
-
323
- Apps are published independently to npm, separate from `spine-framework`.
324
-
325
- ```bash
326
- # From inside custom/apps/{slug}/
327
- npm version patch # bump version (must match manifest.json!)
328
- # Also bump version in manifest.json to match
329
- npm publish --tag next --access public # pre-release
330
- npm publish --tag latest --access public # stable release
331
- ```
332
-
333
- Always publish with `--tag next` for development/testing. Promote to `--tag latest` only when stable and tested E2E in a dogfood project.
334
-
335
- Version must be kept in sync between `package.json` and `manifest.json` — `validate-app` will fail if they differ.
336
-
337
- ---
338
-
339
- ## Current Apps
340
-
341
- | Slug | Package | Description |
342
- |------|---------|-------------|
343
- | `cortex` | `spine-framework-cortex` | Internal workspace: CRM, Support, Community, KB |
344
- | `portal` | `spine-framework-portal` | Customer-facing: Tickets, KB, Courses, Community |
345
-
346
- ---
347
-
348
- ## Adding a New App
349
-
350
- 1. Create `custom/apps/{slug}/` with the directory structure above
351
- 2. Write `package.json` and `manifest.json` following the templates above
352
- 3. Write `index.tsx` exporting the root React component
353
- 4. Write `components/{Slug}Sidebar.tsx` and declare it as `sidebar_component`
354
- 5. Write seed files and declare them in the `seed` block
355
- 6. Run `npm run validate` — fix all errors before proceeding
356
- 7. Publish with `--tag next`
357
- 8. Test E2E: `npx spine-framework install-app spine-framework-{slug}@next`
@@ -1,39 +0,0 @@
1
- # Install App
2
-
3
- Installs a Spine Framework app into the custom workspace.
4
-
5
- ## When to Use
6
-
7
- Use this skill when you need to:
8
- - Install an app package (portal, cortex, or third-party) into custom/apps/
9
- - Configure seed data for the app
10
- - Set up migrations required by the app
11
-
12
- ## Installation Process
13
-
14
- 1. **Copy app files** from the package to `custom/apps/<app-slug>/`
15
- 2. **Copy seed data** to `custom/apps/<app-slug>/seed/`
16
- 3. **Copy migrations** (if any) to `custom/migrations/`
17
- 4. **Update workspace configuration** to include the app
18
-
19
- ## Critical Safeguards
20
-
21
- - **NEVER** delete existing `custom/apps/`, `custom/functions/`, or `custom/migrations/` content
22
- - **ALWAYS** preserve existing custom apps during installation
23
- - Seed data is additive - existing types/roles are not modified
24
-
25
- ## Usage
26
-
27
- ```
28
- Install the cortex app from spine-framework-cortex package
29
- ```
30
-
31
- The skill will:
32
- 1. Locate the package in node_modules or local path
33
- 2. Copy app files to custom/apps/cortex/
34
- 3. Copy seed files (types.json, roles.json, link-types.json)
35
- 4. Report what was installed
36
-
37
- ## Output
38
-
39
- Reports installed files and any conflicts that need manual resolution.
@@ -1,39 +0,0 @@
1
- ---
2
- name: spine-workbench-discovery
3
- description: "Promote an idea to discovery, run the Workbench Research Agent, and optionally link relevant code chunks."
4
- allowed-tools:
5
- - mcp_call_tool
6
- - read
7
- - ask_user_question
8
- ---
9
-
10
- # Spine Workbench — Discovery
11
-
12
- Promote an existing Workbench idea to a `workbench_discovery` and gather related code or knowledge.
13
-
14
- ## When to invoke
15
-
16
- - The user wants to start discovery on an idea.
17
- - They want to investigate the problem, find related code, and decide whether to approve.
18
-
19
- ## Steps
20
-
21
- 1. **Identify the idea**
22
- - Ask for the `idea_id` if not provided.
23
- - If the user gave a title instead of an ID, search with `spine_cil_search_chunks` or list relevant work items to resolve it.
24
-
25
- 2. **Start discovery**
26
- - Call `spine_workbench_start_discovery` with the `idea_id` and `account_id`.
27
- - Capture the returned `discovery.id`.
28
-
29
- 3. **Run the Research Agent (optional)**
30
- - Call `spine_workbench_run_research_agent` with the `idea_id` or new `discovery_id`.
31
- - Summarize the retrieved sources and recommendations.
32
-
33
- 4. **Link relevant code (optional)**
34
- - Use `spine_cil_search_chunks` to find CIL chunks related to the discovery topic.
35
- - For the strongest matches, call `spine_workbench_link_code` with `link_type: workbench_concerns_chunk`.
36
-
37
- 5. **Return the result**
38
- - Show the discovery `id`, `title`, `status`, and any linked code.
39
- - Suggest next step: `spine-workbench-initiative` to approve, or `spine-workbench-plan` if it is small enough to skip the initiative stage.
@@ -1,36 +0,0 @@
1
- ---
2
- name: spine-workbench-idea
3
- description: "Capture a new idea in the Workbench and, if helpful, gather relevant context from CIL before tracking it."
4
- allowed-tools:
5
- - mcp_call_tool
6
- - read
7
- - ask_user_question
8
- ---
9
-
10
- # Spine Workbench — Idea
11
-
12
- Capture a new idea as a `workbench_work_item` with `work_type: idea`.
13
-
14
- ## When to invoke
15
-
16
- - The user says "I have an idea", "track this", "capture a feature request", or similar.
17
- - They describe something that should go through the Workbench lifecycle (idea → discovery → initiative → plan → implement).
18
-
19
- ## Steps
20
-
21
- 1. **Confirm the title and description**
22
- - If the user only mentioned a vague concept, ask for a 1-sentence title and a short description before side effects.
23
- - If the input is clear, proceed directly.
24
-
25
- 2. **Optionally gather context**
26
- - If the idea relates to an existing file, chunk, or feature, call `spine_cil_search_chunks` to find relevant CIL context.
27
- - Summarize the top 1-3 most relevant chunks in your reasoning.
28
-
29
- 3. **Track the idea**
30
- - Call `spine_workbench_track_idea` with:
31
- - `account_id` — ask the user if not known.
32
- - `title` and `description` from the input.
33
-
34
- 4. **Return the result**
35
- - Show the new idea's `id`, `title`, and `status`.
36
- - Suggest next step: `spine-workbench-discovery` or `spine-workbench-plan`.
@@ -1,46 +0,0 @@
1
- ---
2
- name: spine-workbench-implement
3
- description: "Implement a Workbench work item: read context, edit code, verify with CIL, and post progress."
4
- allowed-tools:
5
- - mcp_call_tool
6
- - read
7
- - edit
8
- - write
9
- - exec
10
- - ask_user_question
11
- ---
12
-
13
- # Spine Workbench — Implement
14
-
15
- Implement the code for a Workbench work item and keep CIL in sync.
16
-
17
- ## When to invoke
18
-
19
- - The user says "implement this", "build it", "fix it", or is ready to code a planned work item.
20
-
21
- ## Steps
22
-
23
- 1. **Identify the work item**
24
- - Ask for `work_item_id` if not provided.
25
-
26
- 2. **Load context**
27
- - Use `spine_cil_get_context` or `spine_cil_find_context` on the most relevant chunk(s) linked to the work item.
28
- - If no chunks are linked, use `spine_cil_search_chunks` first.
29
-
30
- 3. **Implement the change**
31
- - Edit or create the files needed.
32
- - Follow the Spine Way: core-vs-custom boundary, design schema, permissions, and admin-data for runtime records.
33
-
34
- 4. **Re-index changed files in CIL**
35
- - After saving, call `spine_cil_reindex_chunk` with `also_embed: true` for each changed chunk.
36
- - Use `spine_cil_validate_file` to confirm no drift remains.
37
-
38
- 5. **Run verification**
39
- - Run the relevant build, lint, typecheck, or test commands for the changed code.
40
- - If verification fails, fix the issues before finishing.
41
-
42
- 6. **Post progress**
43
- - Call `spine_workbench_add_thread_message` with an implementation summary.
44
-
45
- 7. **Return the result**
46
- - Summarize the files changed, verification status, and next step (e.g., open a PR, run end-to-end tests).
@@ -1,28 +0,0 @@
1
- ---
2
- name: spine-workbench-initiative
3
- description: "Approve a discovery and promote it to a workbench_initiative."
4
- allowed-tools:
5
- - mcp_call_tool
6
- - read
7
- - ask_user_question
8
- ---
9
-
10
- # Spine Workbench — Initiative
11
-
12
- Approve an existing `workbench_discovery` and create a linked `workbench_initiative`.
13
-
14
- ## When to invoke
15
-
16
- - The user says "approve discovery", "promote to initiative", or wants to move from discovery to roadmap.
17
-
18
- ## Steps
19
-
20
- 1. **Identify the discovery**
21
- - Ask for the `discovery_id` if not provided.
22
-
23
- 2. **Approve the discovery**
24
- - Call `spine_workbench_approve_discovery` with the `discovery_id` and `account_id`.
25
-
26
- 3. **Return the result**
27
- - Show the new initiative `id`, `title`, and `status`.
28
- - Suggest next step: `spine-workbench-plan`.
@@ -1,38 +0,0 @@
1
- ---
2
- name: spine-workbench-plan
3
- description: "Create documentation and test-plan tickets for a work item and link the code chunks it concerns."
4
- allowed-tools:
5
- - mcp_call_tool
6
- - read
7
- - ask_user_question
8
- ---
9
-
10
- # Spine Workbench — Plan
11
-
12
- Create planning artifacts for a work item: docs ticket, test plan, and code links.
13
-
14
- ## When to invoke
15
-
16
- - The user wants to "write a test plan", "create docs", "link code", or generally prepare a work item for implementation.
17
- - The work item is an idea, discovery, or initiative.
18
-
19
- ## Steps
20
-
21
- 1. **Identify the work item**
22
- - Ask for `work_item_id` if not provided.
23
- - If the user mentions the initiative/discovery/idea by title, ask for the UUID or use search.
24
-
25
- 2. **Create the planning artifacts**
26
- - Call `spine_workbench_create_docs_ticket` to create a `workbench_docs_ticket`.
27
- - Call `spine_workbench_create_test_plan` to create a `workbench_test_plan`.
28
-
29
- 3. **Link relevant code**
30
- - Use `spine_cil_search_chunks` to find the most relevant chunks/files for this work item.
31
- - For each strongly relevant chunk, call `spine_workbench_link_code` with `work_item_id`, `chunk_id`, and `link_type: workbench_concerns_chunk`.
32
-
33
- 4. **Log progress**
34
- - Call `spine_workbench_add_thread_message` with a short progress note.
35
-
36
- 5. **Return the result**
37
- - Show the created docs ticket, test plan, and any code links.
38
- - Suggest next step: `spine-workbench-implement`.
@@ -1,83 +0,0 @@
1
- name: Install App
2
- version: 1.0.0
3
- description: Install a Spine Framework app into the custom workspace
4
-
5
- triggers:
6
- - type: user-prompt
7
- patterns:
8
- - "install app"
9
- - "add app"
10
- - "setup app"
11
-
12
- steps:
13
- - name: Identify app package
14
- action: ask-user
15
- prompt: "Which app would you like to install? (e.g., cortex, portal, or package name)"
16
- store: app_name
17
-
18
- - name: Check for existing installation
19
- action: shell
20
- command: "test -d /Users/thistle/CascadeProjects/spine-ia/custom/apps/${app_name} && echo 'exists' || echo 'new'"
21
- store: exists_status
22
-
23
- - name: Warn about existing installation
24
- condition: exists_status == "exists"
25
- action: ask-user
26
- prompt: "App ${app_name} already exists in custom/apps/. Overwrite? (yes/no)"
27
- store: confirm_overwrite
28
-
29
- - name: Exit on no confirmation
30
- condition: exists_status == "exists" && confirm_overwrite != "yes"
31
- action: exit
32
- message: "Installation cancelled. Existing app preserved."
33
-
34
- - name: Locate package
35
- action: shell
36
- command: |
37
- if [ -d "/Users/thistle/CascadeProjects/spine-ia/custom/apps/${app_name}" ]; then
38
- echo "/Users/thistle/CascadeProjects/spine-ia/custom/apps/${app_name}"
39
- elif [ -d "/Users/thistle/CascadeProjects/spine-ia/custom/npm/${app_name}" ]; then
40
- echo "/Users/thistle/CascadeProjects/spine-ia/custom/npm/${app_name}"
41
- else
42
- echo "not_found"
43
- fi
44
- store: package_path
45
-
46
- - name: Report package not found
47
- condition: package_path == "not_found"
48
- action: exit
49
- message: "Could not find app package. Expected at custom/apps/${app_name} or custom/npm/${app_name}"
50
-
51
- - name: Install app files
52
- action: shell
53
- command: |
54
- mkdir -p "/Users/thistle/CascadeProjects/spine-ia/custom/apps/${app_name}"
55
- cp -r "${package_path}"/*/ "/Users/thistle/CascadeProjects/spine-ia/custom/apps/${app_name}/" 2>/dev/null || true
56
- echo "App files copied"
57
-
58
- - name: Install seed data
59
- action: shell
60
- command: |
61
- if [ -d "${package_path}/seed" ]; then
62
- mkdir -p "/Users/thistle/CascadeProjects/spine-ia/custom/apps/${app_name}/seed"
63
- cp "${package_path}/seed/"*.json "/Users/thistle/CascadeProjects/spine-ia/custom/apps/${app_name}/seed/" 2>/dev/null || true
64
- echo "Seed data copied"
65
- else
66
- echo "No seed data found"
67
- fi
68
-
69
- - name: Report installation
70
- action: message
71
- message: |
72
- App ${app_name} installed successfully!
73
-
74
- Location: custom/apps/${app_name}/
75
-
76
- Next steps:
77
- 1. Review the installed files
78
- 2. Apply seed data: npm run seed -- --app=${app_name}
79
- 3. Restart the development server
80
-
81
- output:
82
- success: "App ${app_name} installed to custom/apps/${app_name}/"
83
- failure: "Failed to install app. Check the logs above."