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,312 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- const fs = require('fs');
4
- const path = require('path');
5
-
6
- class KBChunkParser {
7
- constructor() {
8
- this.chunks = [];
9
- this.currentChunk = {};
10
- this.inChunk = false;
11
- this.currentFile = '';
12
- this.currentLine = 0;
13
- }
14
-
15
- async parseDirectory(dirPath) {
16
- this.chunks = [];
17
-
18
- const walkDir = (dir, fileList = []) => {
19
- const files = fs.readdirSync(dir);
20
-
21
- for (const file of files) {
22
- const filePath = path.join(dir, file);
23
- const stat = fs.statSync(filePath);
24
-
25
- if (stat.isDirectory()) {
26
- // Skip certain directories
27
- if (!['node_modules', '.git', 'dist', 'src/v2-assembled'].includes(file)) {
28
- walkDir(filePath, fileList);
29
- }
30
- } else if (file.match(/\.(ts|js|tsx|jsx)$/)) {
31
- fileList.push(filePath);
32
- }
33
- }
34
-
35
- return fileList;
36
- };
37
-
38
- const files = walkDir(dirPath);
39
-
40
- for (const filePath of files) {
41
- await this.parseFile(filePath);
42
- }
43
-
44
- return this.chunks;
45
- }
46
-
47
- async parseFile(filePath) {
48
- this.currentFile = filePath;
49
- this.currentLine = 0;
50
- this.inChunk = false;
51
- this.currentChunk = {};
52
-
53
- try {
54
- const content = fs.readFileSync(filePath, 'utf8');
55
- const lines = content.split('\n');
56
-
57
- for (let i = 0; i < lines.length; i++) {
58
- this.currentLine = i + 1;
59
- const line = lines[i];
60
-
61
- if (line.includes('CHUNK_START:')) {
62
- this.handleChunkStart(line);
63
- } else if (line.includes('CHUNK_END:')) {
64
- this.handleChunkEnd();
65
- } else if (this.inChunk && this.currentChunk.code !== undefined) {
66
- this.currentChunk.code += line + '\n';
67
- }
68
- }
69
- } catch (error) {
70
- console.error(`Error parsing file ${filePath}:`, error.message);
71
- }
72
- }
73
-
74
- handleChunkStart(line) {
75
- const match = line.match(/CHUNK_START:\s*(.+?)\s*─/);
76
- if (!match) {
77
- console.warn(`Invalid CHUNK_START format at line ${this.currentLine}: ${line}`);
78
- return;
79
- }
80
-
81
- const identifier = match[1].trim();
82
- this.inChunk = true;
83
- this.currentChunk = {
84
- identifier,
85
- code: '',
86
- metadata: {
87
- chunk_id: '',
88
- file_path: this.currentFile,
89
- line_start: this.currentLine,
90
- line_end: 0,
91
- chunk_type: 'function',
92
- purpose: '',
93
- hash: '',
94
- dependencies: [],
95
- dependents: [],
96
- source: {
97
- source_type: 'core',
98
- ref: this.currentFile,
99
- line_start: this.currentLine,
100
- line_end: 0
101
- }
102
- }
103
- };
104
- }
105
-
106
- handleChunkEnd() {
107
- if (!this.inChunk) {
108
- console.warn(`CHUNK_END without CHUNK_START at line ${this.currentLine}`);
109
- return;
110
- }
111
-
112
- const match = this.currentChunk.code?.match(/@chunk-id\s+(.+)/);
113
- if (!match) {
114
- console.warn(`Missing @chunk-id in chunk ${this.currentChunk.identifier}`);
115
- this.inChunk = false;
116
- return;
117
- }
118
-
119
- const chunkId = match[1].trim();
120
- const hash = this.generateHash(this.currentChunk.code || '');
121
-
122
- // Parse JSDoc-style comments
123
- const parsed = this.parseChunkDoc(this.currentChunk.code || '');
124
-
125
- const chunk = {
126
- identifier: this.currentChunk.identifier,
127
- chunk_id: chunkId,
128
- version: '1.0.0',
129
- hash,
130
- macro: parsed.macro || '',
131
- micro: parsed.micro || '',
132
- inputs: parsed.inputs || {},
133
- outputs: parsed.outputs || '',
134
- depends_on: parsed.depends_on || [],
135
- depended_by: parsed.depended_by || [],
136
- side_effects: parsed.side_effects || [],
137
- tags: parsed.tags || [],
138
- code: (this.currentChunk.code || '').trim(),
139
- metadata: {
140
- ...this.currentChunk.metadata,
141
- chunk_id: chunkId,
142
- hash,
143
- line_end: this.currentLine,
144
- source: {
145
- ...this.currentChunk.metadata.source,
146
- line_end: this.currentLine
147
- }
148
- }
149
- };
150
-
151
- this.chunks.push(chunk);
152
- this.inChunk = false;
153
- this.currentChunk = {};
154
- }
155
-
156
- parseChunkDoc(code) {
157
- const doc = {};
158
-
159
- // Extract @chunk-id
160
- const chunkIdMatch = code.match(/@chunk-id\s+(.+)/);
161
- if (chunkIdMatch) {
162
- doc.chunk_id = chunkIdMatch[1].trim();
163
- }
164
-
165
- // Extract @version
166
- const versionMatch = code.match(/@version\s+(.+)/);
167
- if (versionMatch) {
168
- doc.version = versionMatch[1].trim();
169
- }
170
-
171
- // Extract @hash
172
- const hashMatch = code.match(/@hash\s+(.+)/);
173
- if (hashMatch) {
174
- doc.hash = hashMatch[1].trim();
175
- }
176
-
177
- // Extract @macro
178
- const macroMatch = code.match(/@macro\s+(.+)/);
179
- if (macroMatch) {
180
- doc.macro = macroMatch[1].trim();
181
- }
182
-
183
- // Extract @micro
184
- const microMatch = code.match(/@micro\s+(.+)/);
185
- if (microMatch) {
186
- doc.micro = microMatch[1].trim();
187
- }
188
-
189
- // Extract @inputs
190
- const inputsMatch = code.match(/@inputs\s+(.+)/);
191
- if (inputsMatch) {
192
- doc.inputs = this.parseKeyValuePairs(inputsMatch[1].trim());
193
- }
194
-
195
- // Extract @outputs
196
- const outputsMatch = code.match(/@outputs\s+(.+)/);
197
- if (outputsMatch) {
198
- doc.outputs = outputsMatch[1].trim();
199
- }
200
-
201
- // Extract @depends-on
202
- const dependsOnMatch = code.match(/@depends-on\s+(.+)/);
203
- if (dependsOnMatch) {
204
- doc.depends_on = this.parseList(dependsOnMatch[1].trim());
205
- }
206
-
207
- // Extract @depended-by
208
- const dependedByMatch = code.match(/@depended-by\s+(.+)/);
209
- if (dependedByMatch) {
210
- doc.depended_by = this.parseList(dependedByMatch[1].trim());
211
- }
212
-
213
- // Extract @side-effects
214
- const sideEffectsMatch = code.match(/@side-effects\s+(.+)/);
215
- if (sideEffectsMatch) {
216
- doc.side_effects = this.parseList(sideEffectsMatch[1].trim());
217
- }
218
-
219
- // Extract @tags
220
- const tagsMatch = code.match(/@tags\s+(.+)/);
221
- if (tagsMatch) {
222
- doc.tags = this.parseList(tagsMatch[1].trim());
223
- }
224
-
225
- return doc;
226
- }
227
-
228
- parseKeyValuePairs(str) {
229
- const pairs = {};
230
- const regex = /(\w+):\s*([^,]+)(?:,\s*|$)/g;
231
- let match;
232
-
233
- while ((match = regex.exec(str)) !== null) {
234
- pairs[match[1]] = match[2].trim();
235
- }
236
-
237
- return pairs;
238
- }
239
-
240
- parseList(str) {
241
- return str.split(',').map(s => s.trim()).filter(Boolean);
242
- }
243
-
244
- generateHash(content) {
245
- // Simple hash function for demonstration
246
- let hash = 0;
247
- for (let i = 0; i < content.length; i++) {
248
- const char = content.charCodeAt(i);
249
- hash = ((hash << 5) - hash) + char;
250
- hash = hash & hash; // Convert to 32-bit integer
251
- }
252
- return Math.abs(hash).toString(16);
253
- }
254
-
255
- async saveChunks(outputFile) {
256
- const output = {
257
- generated_at: new Date().toISOString(),
258
- total_chunks: this.chunks.length,
259
- chunks: this.chunks
260
- };
261
-
262
- fs.writeFileSync(outputFile, JSON.stringify(output, null, 2));
263
- console.log(`Saved ${this.chunks.length} chunks to ${outputFile}`);
264
- }
265
- }
266
-
267
- // CLI usage
268
- async function main() {
269
- const args = process.argv.slice(2);
270
-
271
- if (args.length < 2) {
272
- console.log('Usage: node kb-chunk-parser.js <source-dir> <output-file>');
273
- console.log('Example: node kb-chunk-parser.js v2-core/functions chunks.json');
274
- process.exit(1);
275
- }
276
-
277
- const [sourceDir, outputFile] = args;
278
-
279
- if (!fs.existsSync(sourceDir)) {
280
- console.error(`Source directory not found: ${sourceDir}`);
281
- process.exit(1);
282
- }
283
-
284
- const parser = new KBChunkParser();
285
-
286
- try {
287
- console.log(`Parsing chunks from ${sourceDir}...`);
288
- const chunks = await parser.parseDirectory(sourceDir);
289
-
290
- console.log(`Found ${chunks.length} chunks`);
291
-
292
- await parser.saveChunks(outputFile);
293
-
294
- // Display summary
295
- console.log('\nSummary:');
296
- console.log(`- Functions: ${chunks.filter(c => c.metadata.chunk_type === 'function').length}`);
297
- console.log(`- Classes: ${chunks.filter(c => c.metadata.chunk_type === 'class').length}`);
298
- console.log(`- Interfaces: ${chunks.filter(c => c.metadata.chunk_type === 'interface').length}`);
299
- console.log(`- Configs: ${chunks.filter(c => c.metadata.chunk_type === 'config').length}`);
300
- console.log(`- Objects: ${chunks.filter(c => c.metadata.chunk_type === 'object').length}`);
301
-
302
- } catch (error) {
303
- console.error('Error:', error.message);
304
- process.exit(1);
305
- }
306
- }
307
-
308
- if (require.main === module) {
309
- main();
310
- }
311
-
312
- module.exports = { KBChunkParser };
@@ -1,330 +0,0 @@
1
- #!/usr/bin/env deno run --allow-read --allow-write
2
-
3
- import { walk } from 'https://deno.land/std@0.168.0/fs/mod.ts'
4
- import { readAll } from 'https://deno.land/std@0.168.0/streams/mod.ts'
5
-
6
- interface ChunkMetadata {
7
- chunk_id: string
8
- file_path: string
9
- line_start: number
10
- line_end: number
11
- chunk_type: 'function' | 'class' | 'interface' | 'config' | 'object'
12
- purpose: string
13
- hash: string
14
- dependencies: string[]
15
- dependents: string[]
16
- source: {
17
- source_type: 'core'
18
- ref: string
19
- line_start: number
20
- line_end: number
21
- }
22
- }
23
-
24
- interface ParsedChunk {
25
- identifier: string
26
- chunk_id: string
27
- version: string
28
- hash: string
29
- macro: string
30
- micro: string
31
- inputs: Record<string, string>
32
- outputs: string
33
- depends_on: string[]
34
- depended_by: string[]
35
- side_effects: string[]
36
- tags: string[]
37
- code: string
38
- metadata: ChunkMetadata
39
- }
40
-
41
- class KBChunkParser {
42
- private chunks: ParsedChunk[] = []
43
- private currentChunk: Partial<ParsedChunk> = {}
44
- private inChunk = false
45
- private currentFile = ''
46
- private currentLine = 0
47
-
48
- async parseDirectory(dirPath: string): Promise<ParsedChunk[]> {
49
- this.chunks = []
50
-
51
- for await (const entry of walk(dirPath, {
52
- includeDirs: false,
53
- exts: ['.ts', '.tsx', '.js', '.jsx'],
54
- skip: [/node_modules/, /\.git/, /dist/, /src\/v2-assembled/]
55
- })) {
56
- if (entry.isFile) {
57
- await this.parseFile(entry.path)
58
- }
59
- }
60
-
61
- return this.chunks
62
- }
63
-
64
- async parseFile(filePath: string): Promise<void> {
65
- this.currentFile = filePath
66
- this.currentLine = 0
67
- this.inChunk = false
68
- this.currentChunk = {}
69
-
70
- try {
71
- const content = await Deno.readTextFile(filePath)
72
- const lines = content.split('\n')
73
-
74
- for (let i = 0; i < lines.length; i++) {
75
- this.currentLine = i + 1
76
- const line = lines[i]
77
-
78
- if (line.includes('CHUNK_START:')) {
79
- this.handleChunkStart(line)
80
- } else if (line.includes('CHUNK_END:')) {
81
- this.handleChunkEnd()
82
- } else if (this.inChunk && this.currentChunk.code !== undefined) {
83
- this.currentChunk.code += line + '\n'
84
- }
85
- }
86
- } catch (error) {
87
- console.error(`Error parsing file ${filePath}:`, error.message)
88
- }
89
- }
90
-
91
- private handleChunkStart(line: string): void {
92
- const match = line.match(/CHUNK_START:\s*(.+?)\s*─/)
93
- if (!match) {
94
- console.warn(`Invalid CHUNK_START format at line ${this.currentLine}: ${line}`)
95
- return
96
- }
97
-
98
- const identifier = match[1].trim()
99
- this.inChunk = true
100
- this.currentChunk = {
101
- identifier,
102
- code: '',
103
- metadata: {
104
- chunk_id: '',
105
- file_path: this.currentFile,
106
- line_start: this.currentLine,
107
- line_end: 0,
108
- chunk_type: 'function',
109
- purpose: '',
110
- hash: '',
111
- dependencies: [],
112
- dependents: [],
113
- source: {
114
- source_type: 'core',
115
- ref: this.currentFile,
116
- line_start: this.currentLine,
117
- line_end: 0
118
- }
119
- }
120
- }
121
- }
122
-
123
- private handleChunkEnd(): void {
124
- if (!this.inChunk) {
125
- console.warn(`CHUNK_END without CHUNK_START at line ${this.currentLine}`)
126
- return
127
- }
128
-
129
- const match = this.currentChunk.code?.match(/@chunk-id\s+(.+)/)
130
- if (!match) {
131
- console.warn(`Missing @chunk-id in chunk ${this.currentChunk.identifier}`)
132
- this.inChunk = false
133
- return
134
- }
135
-
136
- const chunkId = match[1].trim()
137
- const hash = this.generateHash(this.currentChunk.code || '')
138
-
139
- // Parse JSDoc-style comments
140
- const parsed = this.parseChunkDoc(this.currentChunk.code || '')
141
-
142
- const chunk: ParsedChunk = {
143
- identifier: this.currentChunk.identifier!,
144
- chunk_id: chunkId,
145
- version: '1.0.0',
146
- hash,
147
- macro: parsed.macro || '',
148
- micro: parsed.micro || '',
149
- inputs: parsed.inputs || {},
150
- outputs: parsed.outputs || '',
151
- depends_on: parsed.depends_on || [],
152
- depended_by: parsed.depended_by || [],
153
- side_effects: parsed.side_effects || [],
154
- tags: parsed.tags || [],
155
- code: (this.currentChunk.code || '').trim(),
156
- metadata: {
157
- ...this.currentChunk.metadata!,
158
- chunk_id: chunkId,
159
- hash,
160
- line_end: this.currentLine,
161
- source: {
162
- ...this.currentChunk.metadata!.source,
163
- line_end: this.currentLine
164
- }
165
- }
166
- }
167
-
168
- this.chunks.push(chunk)
169
- this.inChunk = false
170
- this.currentChunk = {}
171
- }
172
-
173
- private parseChunkDoc(code: string): any {
174
- const doc: any = {}
175
-
176
- // Extract @chunk-id
177
- const chunkIdMatch = code.match(/@chunk-id\s+(.+)/)
178
- if (chunkIdMatch) {
179
- doc.chunk_id = chunkIdMatch[1].trim()
180
- }
181
-
182
- // Extract @version
183
- const versionMatch = code.match(/@version\s+(.+)/)
184
- if (versionMatch) {
185
- doc.version = versionMatch[1].trim()
186
- }
187
-
188
- // Extract @hash
189
- const hashMatch = code.match(/@hash\s+(.+)/)
190
- if (hashMatch) {
191
- doc.hash = hashMatch[1].trim()
192
- }
193
-
194
- // Extract @macro
195
- const macroMatch = code.match(/@macro\s+(.+)/)
196
- if (macroMatch) {
197
- doc.macro = macroMatch[1].trim()
198
- }
199
-
200
- // Extract @micro
201
- const microMatch = code.match(/@micro\s+(.+)/)
202
- if (microMatch) {
203
- doc.micro = microMatch[1].trim()
204
- }
205
-
206
- // Extract @inputs
207
- const inputsMatch = code.match(/@inputs\s+(.+)/)
208
- if (inputsMatch) {
209
- doc.inputs = this.parseKeyValuePairs(inputsMatch[1].trim())
210
- }
211
-
212
- // Extract @outputs
213
- const outputsMatch = code.match(/@outputs\s+(.+)/)
214
- if (outputsMatch) {
215
- doc.outputs = outputsMatch[1].trim()
216
- }
217
-
218
- // Extract @depends-on
219
- const dependsOnMatch = code.match(/@depends-on\s+(.+)/)
220
- if (dependsOnMatch) {
221
- doc.depends_on = this.parseList(dependsOnMatch[1].trim())
222
- }
223
-
224
- // Extract @depended-by
225
- const dependedByMatch = code.match(/@depended-by\s+(.+)/)
226
- if (dependedByMatch) {
227
- doc.depended_by = this.parseList(dependedByMatch[1].trim())
228
- }
229
-
230
- // Extract @side-effects
231
- const sideEffectsMatch = code.match(/@side-effects\s+(.+)/)
232
- if (sideEffectsMatch) {
233
- doc.side_effects = this.parseList(sideEffectsMatch[1].trim())
234
- }
235
-
236
- // Extract @tags
237
- const tagsMatch = code.match(/@tags\s+(.+)/)
238
- if (tagsMatch) {
239
- doc.tags = this.parseList(tagsMatch[1].trim())
240
- }
241
-
242
- return doc
243
- }
244
-
245
- private parseKeyValuePairs(str: string): Record<string, string> {
246
- const pairs: Record<string, string> = {}
247
- const regex = /(\w+):\s*([^,]+)(?:,\s*|$)/g
248
- let match
249
-
250
- while ((match = regex.exec(str)) !== null) {
251
- pairs[match[1]] = match[2].trim()
252
- }
253
-
254
- return pairs
255
- }
256
-
257
- private parseList(str: string): string[] {
258
- return str.split(',').map(s => s.trim()).filter(Boolean)
259
- }
260
-
261
- private generateHash(content: string): string {
262
- // Simple hash function for demonstration
263
- // In production, use crypto.subtle.digest
264
- let hash = 0
265
- for (let i = 0; i < content.length; i++) {
266
- const char = content.charCodeAt(i)
267
- hash = ((hash << 5) - hash) + char
268
- hash = hash & hash // Convert to 32-bit integer
269
- }
270
- return Math.abs(hash).toString(16)
271
- }
272
-
273
- async saveChunks(outputFile: string): Promise<void> {
274
- const output = {
275
- generated_at: new Date().toISOString(),
276
- total_chunks: this.chunks.length,
277
- chunks: this.chunks
278
- }
279
-
280
- await Deno.writeTextFile(outputFile, JSON.stringify(output, null, 2))
281
- console.log(`Saved ${this.chunks.length} chunks to ${outputFile}`)
282
- }
283
- }
284
-
285
- // CLI usage
286
- async function main() {
287
- const args = Deno.args
288
-
289
- if (args.length < 2) {
290
- console.log('Usage: deno run --allow-read --allow-write kb-chunk-parser.ts <source-dir> <output-file>')
291
- console.log('Example: deno run --allow-read --allow-write kb-chunk-parser.ts v2-core/src chunks.json')
292
- Deno.exit(1)
293
- }
294
-
295
- const [sourceDir, outputFile] = args
296
-
297
- if (!await Deno.stat(sourceDir).catch(() => false)) {
298
- console.error(`Source directory not found: ${sourceDir}`)
299
- Deno.exit(1)
300
- }
301
-
302
- const parser = new KBChunkParser()
303
-
304
- try {
305
- console.log(`Parsing chunks from ${sourceDir}...`)
306
- const chunks = await parser.parseDirectory(sourceDir)
307
-
308
- console.log(`Found ${chunks.length} chunks`)
309
-
310
- await parser.saveChunks(outputFile)
311
-
312
- // Display summary
313
- console.log('\nSummary:')
314
- console.log(`- Functions: ${chunks.filter(c => c.metadata.chunk_type === 'function').length}`)
315
- console.log(`- Classes: ${chunks.filter(c => c.metadata.chunk_type === 'class').length}`)
316
- console.log(`- Interfaces: ${chunks.filter(c => c.metadata.chunk_type === 'interface').length}`)
317
- console.log(`- Configs: ${chunks.filter(c => c.metadata.chunk_type === 'config').length}`)
318
- console.log(`- Objects: ${chunks.filter(c => c.metadata.chunk_type === 'object').length}`)
319
-
320
- } catch (error) {
321
- console.error('Error:', error.message)
322
- Deno.exit(1)
323
- }
324
- }
325
-
326
- if (import.meta.main) {
327
- await main()
328
- }
329
-
330
- export { KBChunkParser, ParsedChunk }