spine-framework 0.3.17 → 0.3.19

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 (270) hide show
  1. package/.framework/cli/bin.mjs +16 -0
  2. package/.framework/cli/commands/create-app.ts +1 -1
  3. package/.framework/cli/commands/dev.ts +215 -33
  4. package/.framework/cli/index.ts +37 -75
  5. package/.framework/functions/_shared/app-manifest.ts +8 -15
  6. package/.framework/functions/_shared/db.ts +11 -15
  7. package/.framework/functions/_shared/index.ts +7 -16
  8. package/.framework/functions/_shared/principal.ts +4 -62
  9. package/.framework/functions/_shared/resolve-ids.ts +6 -6
  10. package/.framework/functions/_shared/webhook-registry.ts +43 -1
  11. package/.framework/functions/admin-funnel.ts +104 -0
  12. package/.framework/functions/admin-install-funnel.ts +225 -0
  13. package/.framework/functions/admin-signals.ts +241 -0
  14. package/.framework/functions/integration-routes.ts +4 -8
  15. package/.framework/migrations/001_schema.sql +406 -0
  16. package/.framework/migrations/002_rls_and_functions.sql +710 -0
  17. package/.framework/migrations/003_system_data.sql +520 -0
  18. package/.framework/migrations/004_enhancements.sql +43 -0
  19. package/.framework/public/_redirects +3 -0
  20. package/.framework/public/spine-logo.jpg +0 -0
  21. package/.framework/public/spine-logo.svg +3 -0
  22. package/{scripts → .framework/scripts}/assemble-frontend.sh +8 -5
  23. package/{scripts → .framework/scripts}/assemble-functions.sh +4 -47
  24. package/{scripts → .framework/scripts}/assemble.sh +2 -8
  25. package/{scripts → .framework/scripts}/boundary-check.sh +5 -9
  26. package/{scripts → .framework/scripts}/check-core-integrity.sh +0 -0
  27. package/.framework/seeds/link_types/account_cli_instances.json +9 -0
  28. package/.framework/seeds/types/funnel_signal_use.json +98 -0
  29. package/.framework/seeds/types/spine_instance.json +109 -0
  30. package/.framework/src/App.tsx +11 -21
  31. package/.framework/src/components/CustomAppLoader.tsx +2 -19
  32. package/.framework/src/components/ui/accordion.tsx +1 -1
  33. package/.framework/src/components/ui/alert-dialog.tsx +1 -1
  34. package/.framework/src/components/ui/aspect-ratio.tsx +1 -1
  35. package/.framework/src/components/ui/avatar.tsx +1 -1
  36. package/.framework/src/components/ui/badge.tsx +2 -2
  37. package/.framework/src/components/ui/breadcrumb.tsx +2 -2
  38. package/.framework/src/components/ui/button-group.tsx +2 -2
  39. package/.framework/src/components/ui/button.tsx +2 -2
  40. package/.framework/src/components/ui/chart.tsx +6 -1
  41. package/.framework/src/components/ui/checkbox.tsx +1 -1
  42. package/.framework/src/components/ui/collapsible.tsx +1 -1
  43. package/.framework/src/components/ui/context-menu.tsx +1 -1
  44. package/.framework/src/components/ui/dialog.tsx +1 -1
  45. package/.framework/src/components/ui/direction.tsx +17 -1
  46. package/.framework/src/components/ui/dropdown-menu.tsx +1 -1
  47. package/.framework/src/components/ui/hover-card.tsx +1 -1
  48. package/.framework/src/components/ui/item.tsx +2 -2
  49. package/.framework/src/components/ui/label.tsx +1 -1
  50. package/.framework/src/components/ui/menubar.tsx +1 -1
  51. package/.framework/src/components/ui/navigation-menu.tsx +1 -1
  52. package/.framework/src/components/ui/popover.tsx +1 -1
  53. package/.framework/src/components/ui/progress.tsx +1 -1
  54. package/.framework/src/components/ui/radio-group.tsx +1 -1
  55. package/.framework/src/components/ui/scroll-area.tsx +1 -1
  56. package/.framework/src/components/ui/select.tsx +1 -1
  57. package/.framework/src/components/ui/separator.tsx +1 -1
  58. package/.framework/src/components/ui/sheet.tsx +1 -1
  59. package/.framework/src/components/ui/sidebar.tsx +6 -6
  60. package/.framework/src/components/ui/slider.tsx +1 -1
  61. package/.framework/src/components/ui/switch.tsx +1 -1
  62. package/.framework/src/components/ui/tabs.tsx +1 -1
  63. package/.framework/src/components/ui/toggle-group.tsx +1 -1
  64. package/.framework/src/components/ui/toggle.tsx +1 -1
  65. package/.framework/src/components/ui/tooltip.tsx +1 -1
  66. package/.framework/src/pages/auth/LoginPage.tsx +10 -9
  67. package/LICENSE.md +63 -93
  68. package/README.md +254 -129
  69. package/custom/.devin/skills/install-app/SKILL.md +39 -0
  70. package/custom/.devin/workflows/app-install.yaml +83 -0
  71. package/custom/README.md +79 -0
  72. package/docs/APPS.md +232 -0
  73. package/docs/ARCHITECTURE.md +246 -0
  74. package/docs/INSTALL.md +155 -0
  75. package/docs/README.md +170 -0
  76. package/docs/design-schema-spec.md +1837 -0
  77. package/docs/dev-guides/01-create-an-app.md +183 -0
  78. package/docs/dev-guides/02-create-a-function.md +178 -0
  79. package/docs/dev-guides/03-create-a-component.md +178 -0
  80. package/docs/dev-guides/04-webhook-handlers.md +129 -0
  81. package/docs/dev-guides/05-testing.md +168 -0
  82. package/docs/dev-guides/README.md +40 -0
  83. package/docs/npm-packages-plan.md +288 -0
  84. package/docs/spine-core--api-reference.md +822 -0
  85. package/package.json +79 -150
  86. package/.framework/cli/bin.cjs +0 -14
  87. package/.framework/cli/commands/claim.ts +0 -430
  88. package/.framework/cli/commands/init.ts +0 -219
  89. package/.framework/cli/commands/install-app.ts +0 -685
  90. package/.framework/cli/commands/migrate.ts +0 -178
  91. package/.framework/cli/commands/publish.ts +0 -191
  92. package/.framework/cli/commands/status.ts +0 -268
  93. package/.framework/cli/commands/uninstall-app.ts +0 -166
  94. package/.framework/cli/commands/update-app.ts +0 -397
  95. package/.framework/cli/welcome.cjs +0 -45
  96. package/.framework/config/signal-client.ts +0 -147
  97. package/.framework/config/signals.ts +0 -70
  98. package/.framework/docs/STABILITY.md +0 -52
  99. package/.framework/docs/examples/custom-app/README.md +0 -77
  100. package/.framework/docs/examples/custom-function/README.md +0 -27
  101. package/.framework/docs/examples/custom-function/handler.ts +0 -48
  102. package/.framework/docs/examples/custom-webhook/README.md +0 -68
  103. package/.framework/functions/handler-registry.ts +0 -22
  104. package/.framework/functions/signal.ts +0 -168
  105. package/.framework/migrations/000_foundation.sql +0 -1302
  106. package/.framework/migrations/001_seed.sql +0 -163
  107. package/.framework/migrations/002_seed_constraints.sql +0 -19
  108. package/.framework/migrations/003_auth_user_trigger.sql +0 -67
  109. package/.framework/migrations/004_app_version_tracking.sql +0 -8
  110. package/.framework/migrations/005_pipelines_slug_stages.sql +0 -21
  111. package/.framework/src/pages/auth/RegisterPage.tsx +0 -163
  112. package/CHANGELOG.md +0 -71
  113. package/STRUCTURE.md +0 -150
  114. package/bin/spine-framework.cjs +0 -62
  115. package/bin/welcome.cjs +0 -58
  116. package/bin/ws-shim.ts +0 -10
  117. package/config/components.json +0 -25
  118. package/config/deno.lock +0 -108
  119. package/config/package-lock.json +0 -17183
  120. package/config/postcss.config.cjs +0 -10
  121. package/config/tailwind.config.cjs +0 -78
  122. package/config/tsconfig.build.json +0 -32
  123. package/config/tsconfig.cli.json +0 -18
  124. package/config/tsconfig.json +0 -41
  125. package/config/tsconfig.node.json +0 -17
  126. package/config/tsconfig.node.tsbuildinfo +0 -1
  127. package/config/tsconfig.tsbuildinfo +0 -1
  128. package/config/typedoc.json +0 -16
  129. package/config/vite.config.d.ts +0 -2
  130. package/config/vite.config.ts +0 -71
  131. package/dist/cli/commands/agents.d.ts +0 -39
  132. package/dist/cli/commands/agents.d.ts.map +0 -1
  133. package/dist/cli/commands/auth.d.ts +0 -36
  134. package/dist/cli/commands/auth.d.ts.map +0 -1
  135. package/dist/cli/commands/claim.d.ts +0 -38
  136. package/dist/cli/commands/claim.d.ts.map +0 -1
  137. package/dist/cli/commands/create-app.d.ts +0 -23
  138. package/dist/cli/commands/create-app.d.ts.map +0 -1
  139. package/dist/cli/commands/dev.d.ts +0 -24
  140. package/dist/cli/commands/dev.d.ts.map +0 -1
  141. package/dist/cli/commands/doctor.d.ts +0 -42
  142. package/dist/cli/commands/doctor.d.ts.map +0 -1
  143. package/dist/cli/commands/generate.d.ts +0 -36
  144. package/dist/cli/commands/generate.d.ts.map +0 -1
  145. package/dist/cli/commands/init.d.ts +0 -20
  146. package/dist/cli/commands/init.d.ts.map +0 -1
  147. package/dist/cli/commands/install-app.d.ts +0 -30
  148. package/dist/cli/commands/install-app.d.ts.map +0 -1
  149. package/dist/cli/commands/items.d.ts +0 -45
  150. package/dist/cli/commands/items.d.ts.map +0 -1
  151. package/dist/cli/commands/migrate.d.ts +0 -21
  152. package/dist/cli/commands/migrate.d.ts.map +0 -1
  153. package/dist/cli/commands/migrations.d.ts +0 -41
  154. package/dist/cli/commands/migrations.d.ts.map +0 -1
  155. package/dist/cli/commands/pipelines.d.ts +0 -40
  156. package/dist/cli/commands/pipelines.d.ts.map +0 -1
  157. package/dist/cli/commands/publish.d.ts +0 -23
  158. package/dist/cli/commands/publish.d.ts.map +0 -1
  159. package/dist/cli/commands/status.d.ts +0 -23
  160. package/dist/cli/commands/status.d.ts.map +0 -1
  161. package/dist/cli/commands/system.d.ts +0 -29
  162. package/dist/cli/commands/system.d.ts.map +0 -1
  163. package/dist/cli/commands/test.d.ts +0 -46
  164. package/dist/cli/commands/test.d.ts.map +0 -1
  165. package/dist/cli/commands/uninstall-app.d.ts +0 -23
  166. package/dist/cli/commands/uninstall-app.d.ts.map +0 -1
  167. package/dist/cli/commands/update-app.d.ts +0 -24
  168. package/dist/cli/commands/update-app.d.ts.map +0 -1
  169. package/dist/cli/context.d.ts +0 -88
  170. package/dist/cli/context.d.ts.map +0 -1
  171. package/dist/cli/env-loader.d.ts +0 -14
  172. package/dist/cli/env-loader.d.ts.map +0 -1
  173. package/dist/cli/index.d.ts +0 -44
  174. package/dist/cli/index.d.ts.map +0 -1
  175. package/dist/config/signals.d.ts +0 -82
  176. package/dist/config/signals.d.ts.map +0 -1
  177. package/dist/functions/_shared/agent-runner.d.ts +0 -156
  178. package/dist/functions/_shared/agent-runner.d.ts.map +0 -1
  179. package/dist/functions/_shared/app-manifest.d.ts +0 -68
  180. package/dist/functions/_shared/app-manifest.d.ts.map +0 -1
  181. package/dist/functions/_shared/audit.d.ts +0 -91
  182. package/dist/functions/_shared/audit.d.ts.map +0 -1
  183. package/dist/functions/_shared/db.d.ts +0 -125
  184. package/dist/functions/_shared/db.d.ts.map +0 -1
  185. package/dist/functions/_shared/index.d.ts +0 -299
  186. package/dist/functions/_shared/index.d.ts.map +0 -1
  187. package/dist/functions/_shared/middleware.d.ts +0 -315
  188. package/dist/functions/_shared/middleware.d.ts.map +0 -1
  189. package/dist/functions/_shared/permissions.d.ts +0 -626
  190. package/dist/functions/_shared/permissions.d.ts.map +0 -1
  191. package/dist/functions/_shared/pipeline-runner.d.ts +0 -124
  192. package/dist/functions/_shared/pipeline-runner.d.ts.map +0 -1
  193. package/dist/functions/_shared/principal.d.ts +0 -284
  194. package/dist/functions/_shared/principal.d.ts.map +0 -1
  195. package/dist/functions/_shared/resolve-ids.d.ts +0 -10
  196. package/dist/functions/_shared/resolve-ids.d.ts.map +0 -1
  197. package/dist/functions/_shared/schema-utils.d.ts +0 -181
  198. package/dist/functions/_shared/schema-utils.d.ts.map +0 -1
  199. package/dist/functions/_shared/testing.d.ts +0 -172
  200. package/dist/functions/_shared/testing.d.ts.map +0 -1
  201. package/dist/functions/_shared/trigger-engine.d.ts +0 -140
  202. package/dist/functions/_shared/trigger-engine.d.ts.map +0 -1
  203. package/dist/functions/_shared/webhook-registration.d.ts +0 -81
  204. package/dist/functions/_shared/webhook-registration.d.ts.map +0 -1
  205. package/dist/functions/_shared/webhook-registry.d.ts +0 -41
  206. package/dist/functions/_shared/webhook-registry.d.ts.map +0 -1
  207. package/dist/functions/account-nodes.d.ts +0 -48
  208. package/dist/functions/account-nodes.d.ts.map +0 -1
  209. package/dist/functions/admin-data.d.ts +0 -178
  210. package/dist/functions/admin-data.d.ts.map +0 -1
  211. package/dist/functions/ai-agents.d.ts +0 -125
  212. package/dist/functions/ai-agents.d.ts.map +0 -1
  213. package/dist/functions/api-keys.d.ts +0 -140
  214. package/dist/functions/api-keys.d.ts.map +0 -1
  215. package/dist/functions/apps.d.ts +0 -163
  216. package/dist/functions/apps.d.ts.map +0 -1
  217. package/dist/functions/auth.d.ts +0 -74
  218. package/dist/functions/auth.d.ts.map +0 -1
  219. package/dist/functions/debug-auth.d.ts +0 -33
  220. package/dist/functions/debug-auth.d.ts.map +0 -1
  221. package/dist/functions/embeddings.d.ts +0 -205
  222. package/dist/functions/embeddings.d.ts.map +0 -1
  223. package/dist/functions/handler-registry.d.ts +0 -22
  224. package/dist/functions/handler-registry.d.ts.map +0 -1
  225. package/dist/functions/integration-routes.d.ts +0 -45
  226. package/dist/functions/integration-routes.d.ts.map +0 -1
  227. package/dist/functions/integrations.d.ts +0 -124
  228. package/dist/functions/integrations.d.ts.map +0 -1
  229. package/dist/functions/item-progress.d.ts +0 -41
  230. package/dist/functions/item-progress.d.ts.map +0 -1
  231. package/dist/functions/logs.d.ts +0 -162
  232. package/dist/functions/logs.d.ts.map +0 -1
  233. package/dist/functions/observability.d.ts +0 -123
  234. package/dist/functions/observability.d.ts.map +0 -1
  235. package/dist/functions/pipeline-executions.d.ts +0 -190
  236. package/dist/functions/pipeline-executions.d.ts.map +0 -1
  237. package/dist/functions/pipelines.d.ts +0 -171
  238. package/dist/functions/pipelines.d.ts.map +0 -1
  239. package/dist/functions/prompt-configs.d.ts +0 -125
  240. package/dist/functions/prompt-configs.d.ts.map +0 -1
  241. package/dist/functions/roles.d.ts +0 -118
  242. package/dist/functions/roles.d.ts.map +0 -1
  243. package/dist/functions/signal.d.ts +0 -73
  244. package/dist/functions/signal.d.ts.map +0 -1
  245. package/dist/functions/system-cron.d.ts +0 -65
  246. package/dist/functions/system-cron.d.ts.map +0 -1
  247. package/dist/functions/system.d.ts +0 -29
  248. package/dist/functions/system.d.ts.map +0 -1
  249. package/dist/functions/tests.d.ts +0 -28
  250. package/dist/functions/tests.d.ts.map +0 -1
  251. package/dist/functions/timers.d.ts +0 -139
  252. package/dist/functions/timers.d.ts.map +0 -1
  253. package/dist/functions/triggers.d.ts +0 -203
  254. package/dist/functions/triggers.d.ts.map +0 -1
  255. package/dist/functions/types.d.ts +0 -151
  256. package/dist/functions/types.d.ts.map +0 -1
  257. package/dist/src/types/types.d.ts +0 -364
  258. package/dist/src/types/types.d.ts.map +0 -1
  259. package/index.html +0 -13
  260. package/netlify.toml +0 -36
  261. package/package-project.json +0 -71
  262. package/scripts/ingest-chunks.cjs +0 -202
  263. package/scripts/kb-chunk-parser.cjs +0 -312
  264. package/scripts/kb-chunk-parser.ts +0 -330
  265. package/scripts/load-test-app-install.ts +0 -484
  266. package/scripts/netlify-dev-wrapper.sh +0 -22
  267. package/vitest.config.ts +0 -45
  268. /package/{scripts → .framework/scripts}/app-install-cli.ts +0 -0
  269. /package/{scripts → .framework/scripts}/build-manifest.sh +0 -0
  270. /package/{scripts → .framework/scripts}/verify-integrity.sh +0 -0
@@ -1,202 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- const fs = require('fs');
4
- const https = require('https');
5
- const querystring = require('querystring');
6
-
7
- // Configuration - use local Netlify Functions
8
- const NETLIFY_URL = 'http://localhost:8888';
9
- const SUPABASE_SERVICE_ROLE_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InV5b2t1aWlienR3YXNkcHJzb3YiLCJyb2xlIjoic2VydmljZV9yb2xlIiwiaWF0IjoxNzM2MTY3Njk5LCJleHAiOjIwNTE3NDM2OTl9.qKqJv8N-IY9q8o_XJtq2o5s3RfD2W4x7J8L9q8o_XJt';
10
-
11
- // Read chunks from file
12
- function readChunks(filePath) {
13
- try {
14
- const content = fs.readFileSync(filePath, 'utf8');
15
- const data = JSON.parse(content);
16
- return data.chunks || [];
17
- } catch (error) {
18
- console.error('Error reading chunks file:', error.message);
19
- process.exit(1);
20
- }
21
- }
22
-
23
- // Make HTTP request to local Netlify Function
24
- function makeRequest(functionName, data) {
25
- return new Promise((resolve, reject) => {
26
- const postData = JSON.stringify(data);
27
- const url = `${NETLIFY_URL}/.netlify/functions/${functionName}`;
28
-
29
- console.log(` 🌐 Calling: ${url}`);
30
- console.log(` 📦 Data size: ${postData.length} bytes`);
31
-
32
- const options = {
33
- hostname: 'localhost',
34
- port: 8888,
35
- path: `/.netlify/functions/${functionName}`,
36
- method: 'POST',
37
- headers: {
38
- 'Content-Type': 'application/json',
39
- 'Authorization': `Bearer ${SUPABASE_SERVICE_ROLE_KEY}`,
40
- 'Content-Length': Buffer.byteLength(postData)
41
- }
42
- };
43
-
44
- const req = require('http').request(options, (res) => {
45
- let responseData = '';
46
-
47
- res.on('data', (chunk) => {
48
- responseData += chunk;
49
- });
50
-
51
- res.on('end', () => {
52
- console.log(` 📡 Response status: ${res.statusCode}`);
53
- console.log(` 📄 Response body: ${responseData.substring(0, 200)}${responseData.length > 200 ? '...' : ''}`);
54
-
55
- try {
56
- const parsed = JSON.parse(responseData);
57
- resolve({ status: res.statusCode, data: parsed });
58
- } catch (error) {
59
- resolve({ status: res.statusCode, data: responseData });
60
- }
61
- });
62
- });
63
-
64
- req.on('error', (error) => {
65
- console.log(` ❌ Request error: ${error.message}`);
66
- reject(error);
67
- });
68
-
69
- req.write(postData);
70
- req.end();
71
- });
72
- }
73
-
74
- // Ingest chunks in batches to avoid timeouts
75
- async function ingestChunks(chunks, batchSize = 10) {
76
- const results = {
77
- total: chunks.length,
78
- processed: 0,
79
- created: 0,
80
- updated: 0,
81
- errors: []
82
- };
83
-
84
- console.log(`Starting ingestion of ${chunks.length} chunks in batches of ${batchSize}...`);
85
-
86
- for (let i = 0; i < chunks.length; i += batchSize) {
87
- const batch = chunks.slice(i, i + batchSize);
88
- const batchNum = Math.floor(i / batchSize) + 1;
89
- const totalBatches = Math.ceil(chunks.length / batchSize);
90
-
91
- console.log(`Processing batch ${batchNum}/${totalBatches} (${batch.length} chunks)...`);
92
-
93
- try {
94
- const response = await makeRequest('custom_kb-ingestion', {
95
- chunks: batch,
96
- force_update: false
97
- });
98
-
99
- if (response.status === 200) {
100
- const result = response.data;
101
- results.processed += batch.length;
102
- results.created += result.items_created || 0;
103
- results.updated += result.items_updated || 0;
104
-
105
- if (result.errors && result.errors.length > 0) {
106
- results.errors.push(...result.errors);
107
- }
108
-
109
- if (result.skipped && result.skipped.length > 0) {
110
- console.log(` Batch ${batchNum}: ${result.items_created || 0} created, ${result.items_updated || 0} updated, ${result.skipped?.length || 0} skipped`);
111
- } else {
112
- console.log(` Batch ${batchNum}: ${result.items_created || 0} created, ${result.items_updated || 0} updated`);
113
- }
114
- } else {
115
- const error = `HTTP ${response.status}: ${JSON.stringify(response.data)}`;
116
- results.errors.push(`Batch ${batchNum}: ${error}`);
117
- console.error(` Batch ${batchNum} failed: ${error}`);
118
- }
119
- } catch (error) {
120
- const batchError = `Batch ${batchNum}: ${error.message}`;
121
- results.errors.push(batchError);
122
- console.error(` Batch ${batchNum} failed: ${error.message}`);
123
- }
124
-
125
- // Small delay between batches to avoid rate limiting
126
- if (i + batchSize < chunks.length) {
127
- await new Promise(resolve => setTimeout(resolve, 1000));
128
- }
129
- }
130
-
131
- return results;
132
- }
133
-
134
- // Main function
135
- async function main() {
136
- const args = process.argv.slice(2);
137
-
138
- if (args.length < 1) {
139
- console.log('Usage: node ingest-chunks.js <chunks.json>');
140
- console.log('Example: node ingest-chunks.js chunks.json');
141
- process.exit(1);
142
- }
143
-
144
- const chunksFile = args[0];
145
-
146
- if (!fs.existsSync(chunksFile)) {
147
- console.error(`Chunks file not found: ${chunksFile}`);
148
- process.exit(1);
149
- }
150
-
151
- try {
152
- const chunks = readChunks(chunksFile);
153
- console.log(`Loaded ${chunks.length} chunks from ${chunksFile}`);
154
-
155
- // Show sample chunk
156
- if (chunks.length > 0) {
157
- console.log('\nSample chunk:');
158
- console.log(`- ID: ${chunks[0].chunk_id}`);
159
- console.log(`- Macro: ${chunks[0].macro}`);
160
- console.log(`- Micro: ${chunks[0].micro}`);
161
- console.log(`- File: ${chunks[0].metadata.file_path}`);
162
- }
163
-
164
- // Ask for confirmation
165
- console.log('\nReady to ingest chunks into KB system.');
166
- console.log('This will create KB articles and embeddings for each chunk.');
167
- console.log('Continue? (y/N)');
168
-
169
- // For automation, we'll proceed without interactive confirmation
170
- console.log('Proceeding with ingestion...\n');
171
-
172
- const results = await ingestChunks(chunks);
173
-
174
- console.log('\n=== Ingestion Complete ===');
175
- console.log(`Total chunks: ${results.total}`);
176
- console.log(`Processed: ${results.processed}`);
177
- console.log(`Created: ${results.created}`);
178
- console.log(`Updated: ${results.updated}`);
179
- console.log(`Errors: ${results.errors.length}`);
180
-
181
- if (results.errors.length > 0) {
182
- console.log('\nErrors:');
183
- results.errors.slice(0, 10).forEach((error, i) => {
184
- console.log(`${i + 1}. ${error}`);
185
- });
186
-
187
- if (results.errors.length > 10) {
188
- console.log(`... and ${results.errors.length - 10} more errors`);
189
- }
190
- }
191
-
192
- console.log('\nYou can now check the KB articles in your Spine instance!');
193
-
194
- } catch (error) {
195
- console.error('Fatal error:', error.message);
196
- process.exit(1);
197
- }
198
- }
199
-
200
- if (require.main === module) {
201
- main();
202
- }
@@ -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 };