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,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 }