spine-framework 0.3.144 → 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 +20 -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,65 +1,161 @@
1
1
  #!/usr/bin/env bash
2
2
 
3
+ # CIL[BEGIN stable_id="~/.framework/scripts/assemble-functions.sh:module:script" type="script" identity="assemble-functions" parent="~/.framework/scripts/assemble-functions.sh"]
4
+ # CIL[DOC-MACRO purpose="Assemble .framework/functions + custom functions into the flat .assembled/netlify/functions dir Netlify deploys, with duplicate-handler detection."]
5
+ # CIL[DOC-RESPONSIBILITY responsibility="Stage framework functions then custom/functions and custom/apps/*/functions into a temp dir, enforcing basename uniqueness; publish via mtime-preserving rsync."]
6
+ # CIL[DOC-CONTEXT module="assembly" layer="build" related_files="scripts/assemble-frontend.sh,scripts/assemble.sh,netlify.toml"]
7
+ # CIL[DOC-CONTRACT inputs=".framework/functions,custom/functions,custom/apps/*/functions; env SPINE_PROJECT_ROOT (fixture override for tests)" outputs=".assembled/netlify/functions; exit 1 on duplicate basename" errors="hard error naming both sources on basename collision; symlink dev-aliases resolving inside .framework/functions skip silently" side_effects="rewrites .assembled/netlify/functions"]
8
+ # CIL[DOC-MICRO logic_summary="Manifest-tracked staging: each staged basename records its source path; collisions resolve via is_dev_alias (macOS-safe readlink resolution) or fail. Excludes _quarantine and *-test.ts/*.test.ts." notable_decisions="flat layout is required by Netlify, so last-wins overwrite is forbidden; PROJECT_ROOT canonicalized with pwd -P so /var→/private/var symlinked TMPDIR fixtures still match"]
9
+ # CIL[DOC-CONFIDENCE pass="first" score="0.9" flags="none"]
10
+ # CIL[DOC-STABILITY stability="stable"]
11
+ # CIL[END stable_id="~/.framework/scripts/assemble-functions.sh:module:script"]
12
+
3
13
  # Functions Assembly - Merge .framework + custom functions into .assembled/
4
- #
14
+ #
5
15
  # Purpose: Create unified functions directory for Netlify deployment.
6
16
  # - .framework/functions are the canonical Spine runtime
7
- # - custom/functions are your custom extensions
17
+ # - custom/functions + custom/apps/<app>/functions are your custom extensions
8
18
  # - Netlify requires a single functions directory, so we assemble at build time
9
- #
10
- # Process:
19
+ #
20
+ # Process:
11
21
  # 1. Assemble into temp directory first (prevents Netlify observing half-deleted dir)
12
22
  # 2. Copy core functions
13
- # 3. Overlay custom functions (overwrites existing)
14
- # 4. Atomic move to target directory
15
- #
16
- # Dependencies: standard bash utilities, find, cp, rsync, mv
23
+ # 3. Overlay custom functions — with duplicate-handler detection:
24
+ # a custom file whose basename is already staged must either be a symlink
25
+ # resolving inside .framework/functions (safe dev alias → skipped silently)
26
+ # or a HARD ERROR naming both source paths (no silent last-wins overwrite)
27
+ # 4. rsync -c into target so unchanged files keep their mtimes — Netlify/esbuild
28
+ # then only rebundles functions that actually changed
29
+ #
30
+ # SPINE_PROJECT_ROOT (optional): override the project root — used by the
31
+ # fixture-based unit tests; production use leaves it unset.
32
+ #
33
+ # Dependencies: standard bash utilities, find, cp, rsync, readlink
17
34
 
18
35
  set -euo pipefail
19
36
 
20
37
  SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
21
- PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
38
+ # Canonicalize (-P resolves symlinks) so dev-alias prefix checks compare
39
+ # physical paths — e.g. macOS /var → /private/var under TMPDIR.
40
+ PROJECT_ROOT="$(cd "${SPINE_PROJECT_ROOT:-$(dirname "$SCRIPT_DIR")}" && pwd -P)"
22
41
 
23
42
  CORE_DIR="$PROJECT_ROOT/.framework/functions"
24
43
  CUSTOM_DIR="$PROJECT_ROOT/custom"
25
44
  TARGET_DIR="$PROJECT_ROOT/.assembled/netlify/functions"
26
45
  TMP_DIR="$PROJECT_ROOT/.functions-assemble-tmp"
46
+ # basename → source-file map for duplicate-handler error messages
47
+ STAGE_MANIFEST="$TMP_DIR.manifest.tsv"
27
48
 
28
49
  echo "🔧 Assembling functions → $TARGET_DIR"
29
50
 
30
51
  # 1. Assemble into a temp directory first so Netlify never observes a half-deleted functions dir
31
52
  rm -rf "$TMP_DIR"
32
53
  mkdir -p "$TMP_DIR"
54
+ : > "$STAGE_MANIFEST"
55
+
56
+ # Resolve a symlink to an absolute path (macOS readlink has no -f).
57
+ resolve_link() {
58
+ local f="$1" t d
59
+ t="$(readlink "$f")" || return 1
60
+ case "$t" in
61
+ /*) printf '%s\n' "$t" ;;
62
+ *)
63
+ d="$(cd "$(dirname "$f")" && cd "$(dirname "$t")" && pwd -P)" || return 1
64
+ printf '%s/%s\n' "$d" "$(basename "$t")"
65
+ ;;
66
+ esac
67
+ }
68
+
69
+ # True when $1 is a symlink whose target resolves inside $CORE_DIR —
70
+ # a safe dev alias back to the framework copy, not an override.
71
+ is_dev_alias() {
72
+ local f="$1" resolved
73
+ [ -L "$f" ] || return 1
74
+ resolved="$(resolve_link "$f")" || return 1
75
+ case "$resolved" in
76
+ "$CORE_DIR"|"$CORE_DIR"/*) return 0 ;;
77
+ *) return 1 ;;
78
+ esac
79
+ }
80
+
81
+ # Copy top-level .ts files from $1 (excluding tests) into the flat TMP_DIR.
82
+ # Basename already staged → dev-alias skip or hard error naming both sources.
83
+ stage_fn_files() {
84
+ local src_dir="$1"
85
+ local f base staged prev
86
+ while IFS= read -r -d '' f; do
87
+ base="$(basename "$f")"
88
+ staged="$TMP_DIR/$base"
89
+ if [ -e "$staged" ]; then
90
+ if is_dev_alias "$f"; then
91
+ continue # dev alias → framework copy already staged, skip silently
92
+ fi
93
+ prev="$(awk -F '\t' -v b="$base" '$1 == b { print $2; exit }' "$STAGE_MANIFEST")"
94
+ echo " ✗ Duplicate function handler: '$base' is provided by both" >&2
95
+ echo " - $prev" >&2
96
+ echo " - $f" >&2
97
+ echo " Rename one of them — functions assemble flat, last-wins is forbidden." >&2
98
+ exit 1
99
+ fi
100
+ cp "$f" "$staged"
101
+ printf '%s\t%s\n' "$base" "$f" >> "$STAGE_MANIFEST"
102
+ done < <(find "$src_dir" -maxdepth 1 -name '*.ts' ! -name '*-test.ts' ! -name '*.test.ts' -print0 | sort -z)
103
+ }
104
+
105
+ # Copy subdirectories of $1 into TMP_DIR, merging by basename. A real custom
106
+ # dir may overlay a framework dir (e.g. _shared helpers); a symlinked dir is a
107
+ # dev alias when it resolves inside .framework/functions — skipped silently if
108
+ # the name is already staged — otherwise a colliding symlink is a hard error.
109
+ stage_fn_dirs() {
110
+ local src_dir="$1"
111
+ local d base
112
+ while IFS= read -r -d '' d; do
113
+ base="$(basename "$d")"
114
+ [ "$base" = "_quarantine" ] && continue
115
+ if [ -L "$d" ]; then
116
+ if [ -e "$TMP_DIR/$base" ]; then
117
+ if is_dev_alias "$d"; then
118
+ continue
119
+ fi
120
+ echo " ✗ Duplicate function path: '$base' is provided by both" >&2
121
+ echo " - $TMP_DIR/$base (already staged)" >&2
122
+ echo " - $d -> $(readlink "$d")" >&2
123
+ exit 1
124
+ fi
125
+ cp -R "$d" "$TMP_DIR/" 2>/dev/null || true
126
+ continue
127
+ fi
128
+ # real dir: merge into staged dir if present (cp of dir/. includes dotfiles)
129
+ mkdir -p "$TMP_DIR/$base"
130
+ cp -r "$d"/. "$TMP_DIR/$base/" 2>/dev/null || true
131
+ done < <(find "$src_dir" -mindepth 1 -maxdepth 1 \( -type d -o -type l \) -print0 | sort -z)
132
+ }
33
133
 
34
134
  # 2. Copy core functions (base layer), excluding _quarantine and test files
35
135
  if [ -d "$CORE_DIR" ]; then
36
- # Copy all files except _quarantine directory and test files (*-test.ts, *.test.ts)
37
- find "$CORE_DIR" -maxdepth 1 -name '*.ts' ! -name '*-test.ts' ! -name '*.test.ts' -exec cp {} "$TMP_DIR"/ \;
38
- # Copy subdirectories except _quarantine
39
- find "$CORE_DIR" -maxdepth 1 -mindepth 1 -type d ! -name '_quarantine' -exec cp -r {} "$TMP_DIR"/ \;
136
+ stage_fn_files "$CORE_DIR"
137
+ stage_fn_dirs "$CORE_DIR"
40
138
  echo " ✓ Core: $(find "$CORE_DIR" -name '*.ts' | grep -v '_quarantine' | grep -v '\-test\.ts$' | grep -v '\.test\.ts$' | wc -l | tr -d ' ') files"
41
139
  fi
42
140
 
43
- # 3. Overlay custom functions (overrides + additions), excluding test files
141
+ # 3. Overlay custom functions (additions; basename collisions error out above),
142
+ # excluding test files
44
143
  CUSTOM_COUNT=0
45
144
 
46
- # 3a. Copy functions from custom/functions/
145
+ # 3a. Functions from custom/functions/
47
146
  if [ -d "$CUSTOM_DIR/functions" ]; then
48
- # Copy all files except test files (*-test.ts, *.test.ts)
49
- find "$CUSTOM_DIR/functions" -maxdepth 1 -name '*.ts' ! -name '*-test.ts' ! -name '*.test.ts' -exec cp {} "$TMP_DIR"/ \; 2>/dev/null || true
50
- # Copy subdirectories if any
51
- find "$CUSTOM_DIR/functions" -mindepth 1 -type d -exec sh -c 'dir="$1"; base=$(basename "$dir"); mkdir -p "'"$TMP_DIR"'/$base" && cp -r "$dir"/* "'"$TMP_DIR"'/$base/"' _ {} \; 2>/dev/null || true
147
+ stage_fn_files "$CUSTOM_DIR/functions"
148
+ stage_fn_dirs "$CUSTOM_DIR/functions"
52
149
  CUSTOM_COUNT=$((CUSTOM_COUNT + $(find "$CUSTOM_DIR/functions" -name '*.ts' ! -name '*-test.ts' ! -name '*.test.ts' 2>/dev/null | wc -l | tr -d ' ')))
53
150
  fi
54
151
 
55
- # 3b. Copy functions from custom/apps/*/functions/
152
+ # 3b. Functions from custom/apps/*/functions/ — app-vs-framework AND
153
+ # app-vs-app basename collisions both hit the same staged-name check.
56
154
  if [ -d "$CUSTOM_DIR/apps" ]; then
57
- for app_dir in "$CUSTOM_DIR/apps"/*; do
155
+ for app_dir in "$CUSTOM_DIR/apps"/*/; do
58
156
  if [ -d "$app_dir/functions" ]; then
59
- # Copy all files except test files (*-test.ts, *.test.ts)
60
- find "$app_dir/functions" -maxdepth 1 -name '*.ts' ! -name '*-test.ts' ! -name '*.test.ts' -exec cp {} "$TMP_DIR"/ \; 2>/dev/null || true
61
- # Copy subdirectories if any
62
- find "$app_dir/functions" -mindepth 1 -type d -exec sh -c 'dir="$1"; base=$(basename "$dir"); mkdir -p "'"$TMP_DIR"'/$base" && cp -r "$dir"/* "'"$TMP_DIR"'/$base/"' _ {} \; 2>/dev/null || true
157
+ stage_fn_files "$app_dir/functions"
158
+ stage_fn_dirs "$app_dir/functions"
63
159
  APP_COUNT=$(find "$app_dir/functions" -name '*.ts' ! -name '*-test.ts' ! -name '*.test.ts' 2>/dev/null | wc -l | tr -d ' ')
64
160
  CUSTOM_COUNT=$((CUSTOM_COUNT + APP_COUNT))
65
161
  echo " ✓ $(basename "$app_dir"): $APP_COUNT files"
@@ -67,16 +163,18 @@ if [ -d "$CUSTOM_DIR/apps" ]; then
67
163
  done
68
164
  fi
69
165
 
70
- if [ $CUSTOM_COUNT -gt 0 ]; then
71
- echo " ✓ Custom: $CUSTOM_COUNT files"
166
+ if [ "$CUSTOM_COUNT" -gt 0 ]; then
167
+ echo " ✓ Custom: $CUSTOM_COUNT total files"
72
168
  else
73
169
  echo " ○ Custom: (empty)"
74
170
  fi
75
171
 
76
- # 4. Atomically swap temp into place
77
- rm -rf "$TARGET_DIR"
172
+ # 4. Sync temp into place. -c compares content checksums; deliberately NO -t —
173
+ # otherwise rsync "corrects" mtimes of unchanged files to the fresh temp-copy
174
+ # time and Netlify/esbuild reloads all ~100 functions on every assemble.
78
175
  mkdir -p "$(dirname "$TARGET_DIR")"
79
- mv "$TMP_DIR" "$TARGET_DIR"
176
+ rsync -rlc --delete "$TMP_DIR"/ "$TARGET_DIR"/
177
+ rm -rf "$TMP_DIR" "$STAGE_MANIFEST"
80
178
 
81
179
  echo " ✓ Assembled: $(find "$TARGET_DIR" -name '*.ts' ! -name '*-test.ts' ! -name '*.test.ts' | wc -l | tr -d ' ') total functions"
82
180
  echo "✅ Done"
@@ -18,8 +18,9 @@ echo ""
18
18
  VIOLATIONS=0
19
19
 
20
20
  # Check 1: Core importing from custom/ directory
21
+ # Only flag actual import/require statements — comments and docs are fine
21
22
  echo "1. Checking for imports from custom/ in core..."
22
- if grep -r "from.*custom/\|import.*@custom" .framework/ --include="*.ts" --include="*.tsx" --exclude-dir=tests 2>/dev/null; then
23
+ if grep -rE "^\s*(import|export).*['\"].*custom/|require\(['\"].*custom/" .framework/ --include="*.ts" --include="*.tsx" --exclude-dir=tests 2>/dev/null; then
23
24
  echo " ❌ FAIL: Core files import from custom/"
24
25
  VIOLATIONS=$((VIOLATIONS + 1))
25
26
  else
@@ -48,8 +49,11 @@ fi
48
49
  echo ""
49
50
 
50
51
  # Check 3: App-specific references in core
52
+ # Only flag actual code (imports, JSX, logic) — comments, JSDoc, and string literals in examples are fine
51
53
  echo "3. Checking for app-specific references in core..."
52
- APP_REFS=$(grep -r "cortex\|funnel\|support-triage\|kb-chunker\|portal-signals" .framework/src/ --include="*.ts" --include="*.tsx" 2>/dev/null | grep -v "manifest.json\|webhook-registry" || true)
54
+ APP_REFS=$(grep -rE "^\s*(import|export|from|<[A-Z])" .framework/src/ --include="*.ts" --include="*.tsx" 2>/dev/null \
55
+ | grep -E "cortex|funnel|support-triage|kb-chunker|portal-signals" \
56
+ | grep -v "manifest\.json\|webhook-registry" || true)
53
57
  if [ -n "$APP_REFS" ]; then
54
58
  echo " ❌ FAIL: App-specific references found in core:"
55
59
  echo "$APP_REFS"
@@ -1,80 +1,36 @@
1
1
  #!/usr/bin/env bash
2
-
3
- /**
4
- * @module scripts/build-manifest
5
- * @audience installer
6
- * @layer build
7
- * @stability orphaned
8
- *
9
- * Build Manifest Generator - Generate a signed manifest of core file hashes.
10
- * **ORPHANED**: References non-existent `core/` directory (should be `v2-core/`).
11
- *
12
- * **Intended Purpose**: Used for build-time integrity verification.
13
- * - In dev mode (SPINE_INTEGRITY=warn), mismatches log warnings
14
- * - In production (SPINE_INTEGRITY=enforce), mismatches fail the build
15
- *
16
- * **Current State**: Cannot function - references wrong directory paths.
17
- *
18
- * **Dependencies**: shasum, standard bash utilities
19
- *
20
- * @tags orphaned, build, integrity, manifest, verification
21
- */
2
+ # CIL[BEGIN stable_id="~/scripts/build-manifest.sh:module:script" type="script" identity="build-manifest" parent="~/scripts/build-manifest.sh"]
3
+ # CIL[DOC-MACRO purpose="Thin wrapper that regenerates .spine-manifest.json via scripts/checksum-manifest.mts"]
4
+ # CIL[DOC-RESPONSIBILITY responsibility="Resolve the repo-local tsx binary and invoke the Node manifest generator against this repo root"]
5
+ # CIL[DOC-CONTEXT module="spine-integrity" layer="build" related_files="scripts/checksum-manifest.mts,scripts/verify-integrity.sh,package.json"]
6
+ # CIL[DOC-CONTRACT inputs="optional passthrough args (e.g. --include-dir)" outputs=".spine-manifest.json at repo root" errors="exit 1 when tsx is missing or the generator fails" side_effects="rewrites .spine-manifest.json, echoes SPINE_INTEGRITY mode for compatibility"]
7
+ # CIL[DOC-MICRO logic_summary="Replaces the legacy inline-bash implementation that used GNU-only sort -z and a broken JSDoc header" notable_decisions="hashing lives in Node — BSD/GNU portability and deterministic ordering come free"]
8
+ # CIL[DOC-CONFIDENCE pass="first" score="0.9" flags="none"]
9
+ # CIL[DOC-STABILITY stability="stable"]
10
+ # CIL[DOC-AUDIENCE audience="system-admin"]
11
+ # CIL[DOC-VECTOR type="context" content="Invoked by npm run manifest"]
12
+ # CIL[DOC-VECTOR type="implementation_pattern" content="Sibling thin wrapper of verify-integrity.sh; real logic in scripts/checksum-manifest.mts" status="ready"]
13
+ # CIL[END stable_id="~/scripts/build-manifest.sh:module:script"]
22
14
 
23
15
  set -euo pipefail
24
16
 
25
17
  SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
26
18
  PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
27
19
 
28
- CORE_DIR="$PROJECT_ROOT/.framework"
29
- CORE_SRC_DIR="$PROJECT_ROOT/.framework/src"
30
- MANIFEST_FILE="$PROJECT_ROOT/.spine-manifest.json"
31
-
32
20
  INTEGRITY_MODE="${SPINE_INTEGRITY:-warn}"
21
+ echo "🔒 Generating spine integrity manifest (mode: $INTEGRITY_MODE)"
33
22
 
34
- echo "🔒 Generating core integrity manifest (mode: $INTEGRITY_MODE)"
35
-
36
- # Collect hashes of all core files
37
- HASHES="{"
38
- FIRST=true
39
-
40
- # Core functions
41
- while IFS= read -r -d '' file; do
42
- REL_PATH="${file#$PROJECT_ROOT/}"
43
- HASH=$(shasum -a 256 "$file" | cut -d' ' -f1)
44
- if [ "$FIRST" = true ]; then
45
- FIRST=false
46
- else
47
- HASHES="$HASHES,"
48
- fi
49
- HASHES="$HASHES\"$REL_PATH\":\"$HASH\""
50
- done < <(find "$CORE_DIR" -type f -name '*.ts' -print0 | sort -z)
51
-
52
- # Core src components (shared, layout, hooks, lib)
53
- for SUBDIR in components/shared components/layout hooks lib; do
54
- DIR="$CORE_SRC_DIR/$SUBDIR"
55
- if [ -d "$DIR" ]; then
56
- while IFS= read -r -d '' file; do
57
- REL_PATH="${file#$PROJECT_ROOT/}"
58
- HASH=$(shasum -a 256 "$file" | cut -d' ' -f1)
59
- HASHES="$HASHES,\"$REL_PATH\":\"$HASH\""
60
- done < <(find "$DIR" -type f \( -name '*.ts' -o -name '*.tsx' \) -print0 | sort -z)
61
- fi
62
- done
23
+ if [ -f "$PROJECT_ROOT/.spine-export-manifest.json" ]; then
24
+ echo "❌ Frozen standalone export — .spine-manifest.json regeneration is only allowed in the monorepo (.spine-export-manifest.json present)" >&2
25
+ exit 1
26
+ fi
63
27
 
64
- HASHES="$HASHES}"
28
+ TSX="$PROJECT_ROOT/node_modules/.bin/tsx"
29
+ if [ ! -x "$TSX" ]; then
30
+ echo "❌ tsx not found at $TSX — run 'npm install' first" >&2
31
+ exit 1
32
+ fi
65
33
 
66
- # Write manifest
67
- TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
68
- cat > "$MANIFEST_FILE" <<EOF
69
- {
70
- "version": "1",
71
- "generated_at": "$TIMESTAMP",
72
- "integrity_mode": "$INTEGRITY_MODE",
73
- "file_count": $(echo "$HASHES" | tr ',' '\n' | wc -l | tr -d ' '),
74
- "hashes": $HASHES
75
- }
76
- EOF
34
+ "$TSX" "$SCRIPT_DIR/checksum-manifest.mts" "$PROJECT_ROOT" "$PROJECT_ROOT/.spine-manifest.json" "$@"
77
35
 
78
- echo " ✓ Manifest written to $MANIFEST_FILE"
79
- echo " ✓ $(echo "$HASHES" | tr ',' '\n' | wc -l | tr -d ' ') files hashed"
80
- echo "✅ Done"
36
+ echo "✅ Manifest written"
@@ -1,82 +1,21 @@
1
1
  #!/usr/bin/env bash
2
-
3
- /**
4
- * @module scripts/check-core-integrity
5
- * @audience installer
6
- * @layer build
7
- * @stability stable
8
- *
9
- * V2 Core Integrity Checker - Verify v2-core hasn't been modified.
10
- *
11
- * **Purpose**: Check v2-core directory integrity against stored manifest.
12
- * - Compares current source and functions hashes with stored values
13
- * - Used to detect unauthorized modifications to core framework
14
- *
15
- * **Process**:
16
- * 1. Check for manifest file existence
17
- * 2. Calculate current hashes for src and functions
18
- * 3. Compare with stored manifest values
19
- * 4. Report any mismatches
20
- *
21
- * **Dependencies**: find, sha256sum, .spine-manifest.json
22
- *
23
- * @tags build, integrity, verification, v2-core, security
24
- */
2
+ # CIL[BEGIN stable_id="~/.framework/scripts/check-core-integrity.sh:module:script" type="script" identity="check-core-integrity" parent="~/.framework/scripts/check-core-integrity.sh"]
3
+ # CIL[DOC-MACRO purpose="RETIRED — deprecated shim that delegates to verify-integrity.sh"]
4
+ # CIL[DOC-RESPONSIBILITY responsibility="Preserve the historical entrypoint name while forwarding all integrity checks to the unified manifest verifier"]
5
+ # CIL[DOC-CONTEXT module="spine-integrity" layer="build" related_files="scripts/verify-integrity.sh,scripts/verify-manifest.mts,.framework/scripts/check-core-integrity.sh"]
6
+ # CIL[DOC-CONTRACT inputs="passthrough args" outputs="exit code of verify-integrity.sh" errors="same as verify-integrity.sh" side_effects="deprecation notice on stderr"]
7
+ # CIL[DOC-MICRO logic_summary="The legacy implementation compared aggregate src/functions hashes and used GNU-only tools with invalid bash markers; it had no callers" notable_decisions="kept as a shim rather than deleted so external muscle memory and docs links do not 404"]
8
+ # CIL[DOC-CONFIDENCE pass="first" score="0.9" flags="superseded"]
9
+ # CIL[DOC-STABILITY stability="deprecated"]
10
+ # CIL[DOC-AUDIENCE audience="system-admin"]
11
+ # CIL[DOC-NOTE type="deprecated" content="No repo callers found via git grep; use npm run verify / scripts/verify-integrity.sh directly"]
12
+ # CIL[DOC-VECTOR type="context" content="Retired in favor of scripts/verify-integrity.sh during the hard-lock manifest batch"]
13
+ # CIL[DOC-VECTOR type="implementation_pattern" content="exec passthrough shim" status="ready"]
14
+ # CIL[END stable_id="~/.framework/scripts/check-core-integrity.sh:module:script"]
25
15
 
26
16
  set -euo pipefail
27
17
 
28
18
  SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
29
- PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
30
- CORE_DIR="$PROJECT_ROOT/.framework"
31
- MANIFEST_FILE="$CORE_DIR/.spine-manifest.json"
32
-
33
- echo "Checking .framework integrity..."
34
-
35
- if [ ! -f "$MANIFEST_FILE" ]; then
36
- echo " ERROR: Manifest file not found at $MANIFEST_FILE"
37
- exit 1
38
- fi
39
-
40
- // ─── CHUNK_START: CHECK_CORE_INTEGRITY_MAIN ──────────────────────────────────────────────
41
- /**
42
- * @chunk-id CHECK_CORE_INTEGRITY_MAIN_1_0_0
43
- * @version 1.0.0
44
- * @hash 3799437312b1f95c807f0862818bf01651792c0d5e2bb81d91d734251a76fc75
45
- * @macro Core Integrity Verification
46
- * @micro Calculate and compare v2-core file hashes against manifest
47
- * @inputs $MANIFEST_FILE: string — Path to .spine-manifest.json
48
- * @outputs exit code — 0 for pass, 1 for failure
49
- * @depends-on [find, sha256sum, jq/grep, .spine-manifest.json]
50
- * @depended-by [CI/CD pipelines, pre-deploy hooks]
51
- * @side-effects [console output, exit with status code]
52
- * @tags integrity, verification, security, v2-core
53
- */
54
- # Calculate current hashes
55
- CURRENT_SRC_HASH=$(find "$CORE_DIR/src" -type f -name '*.tsx' -o -name '*.ts' -o -name '*.css' 2>/dev/null | LC_ALL=C sort | xargs cat 2>/dev/null | sha256sum | cut -d' ' -f1)
56
- CURRENT_FUNCTIONS_HASH=$(find "$CORE_DIR/functions" -type f -name '*.ts' 2>/dev/null | LC_ALL=C sort | xargs cat 2>/dev/null | sha256sum | cut -d' ' -f1)
57
-
58
- # Extract expected hashes from manifest (using jq if available, fallback to grep)
59
- if command -v jq >/dev/null 2>&1; then
60
- EXPECTED_SRC_HASH=$(jq -r '.integrity.src' "$MANIFEST_FILE" | sed 's/sha256-//')
61
- EXPECTED_FUNCTIONS_HASH=$(jq -r '.integrity.functions' "$MANIFEST_FILE" | sed 's/sha256-//')
62
- else
63
- EXPECTED_SRC_HASH=$(grep '"src"' "$MANIFEST_FILE" | cut -d'"' -f4 | sed 's/sha256-//')
64
- EXPECTED_FUNCTIONS_HASH=$(grep '"functions"' "$MANIFEST_FILE" | cut -d'"' -f4 | sed 's/sha256-//')
65
- fi
66
19
 
67
- # Check integrity
68
- if [ "$CURRENT_SRC_HASH" = "$EXPECTED_SRC_HASH" ] && [ "$CURRENT_FUNCTIONS_HASH" = "$EXPECTED_FUNCTIONS_HASH" ]; then
69
- echo " Integrity check PASSED - Core files are unchanged"
70
- exit 0
71
- else
72
- echo " INTEGRITY CHECK FAILED - Core files have been modified!"
73
- echo " WARRANTY VOIDED - Core tampering detected"
74
- echo ""
75
- echo " Expected src hash: $EXPECTED_SRC_HASH"
76
- echo " Current src hash: $CURRENT_SRC_HASH"
77
- echo ""
78
- echo " Expected functions hash: $EXPECTED_FUNCTIONS_HASH"
79
- echo " Current functions hash: $CURRENT_FUNCTIONS_HASH"
80
- exit 1
81
- fi
82
- // ─── CHUNK_END: CHECK_CORE_INTEGRITY_MAIN ────────────────────────────────────────────────
20
+ echo "⚠️ check-core-integrity.sh is retired — delegating to verify-integrity.sh" >&2
21
+ exec bash "$SCRIPT_DIR/verify-integrity.sh" "$@"