spine-framework 0.4.4 → 0.5.0-rc.4

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 (283) hide show
  1. package/.env.example +13 -3
  2. package/.framework/cli/commands/bootstrap.ts +392 -0
  3. package/.framework/cli/commands/dev.ts +91 -218
  4. package/.framework/cli/commands/doctor.ts +132 -26
  5. package/.framework/cli/commands/generate.ts +38 -298
  6. package/.framework/cli/commands/init.ts +20 -1
  7. package/.framework/cli/commands/migrate.ts +36 -30
  8. package/.framework/cli/commands/migrations.ts +16 -56
  9. package/.framework/cli/commands/upgrade.ts +35 -0
  10. package/.framework/cli/commands/validate-schema.ts +147 -0
  11. package/.framework/cli/context.ts +223 -110
  12. package/.framework/cli/index.ts +6 -0
  13. package/.framework/cli/lib/project-files.ts +241 -1
  14. package/.framework/functions/_shared/hash-api-key.ts +183 -79
  15. package/.framework/functions/_shared/logging.ts +562 -224
  16. package/.framework/functions/_shared/middleware.ts +47 -44
  17. package/.framework/functions/admin-data.ts +39 -28
  18. package/.framework/functions/ai-agents.ts +10 -6
  19. package/.framework/functions/api-keys.ts +301 -122
  20. package/.framework/functions/apps.ts +43 -26
  21. package/.framework/functions/cil-ingest.ts +48 -15
  22. package/.framework/functions/debug-auth.ts +14 -8
  23. package/.framework/functions/deliveries.ts +39 -12
  24. package/.framework/functions/embeddings.ts +145 -76
  25. package/.framework/functions/integration-outbound.ts +67 -27
  26. package/.framework/functions/integrations.ts +254 -127
  27. package/.framework/functions/logs.ts +273 -133
  28. package/.framework/functions/observability.ts +277 -147
  29. package/.framework/functions/pipeline-executions.ts +1 -1
  30. package/.framework/functions/pipelines.ts +14 -9
  31. package/.framework/functions/prompt-configs.ts +7 -4
  32. package/.framework/functions/roles.ts +8 -5
  33. package/.framework/functions/security.ts +30 -17
  34. package/.framework/functions/system-cron.ts +240 -127
  35. package/.framework/functions/tests.ts +7 -6
  36. package/.framework/functions/timers.ts +310 -107
  37. package/.framework/functions/triggers.ts +28 -13
  38. package/.framework/functions/types.ts +13 -10
  39. package/.framework/migrations/069_log_stats_window.sql +54 -0
  40. package/.framework/migrations/070_app_type_schema_rpcs.sql +166 -0
  41. package/.framework/migrations/071_timer_interval_keys.sql +96 -0
  42. package/.framework/migrations/072_slug_autofill.sql +77 -0
  43. package/.framework/migrations/073_seed_member_roles.sql +26 -0
  44. package/.framework/src/apps/admin/index.tsx +1141 -775
  45. package/.framework/src/components/ErrorBoundary.tsx +136 -0
  46. package/.framework/src/components/admin/AdminListPage.tsx +81 -73
  47. package/.framework/src/components/admin/AdminSidebar.tsx +88 -79
  48. package/.framework/src/components/admin/EntitySelect.tsx +181 -0
  49. package/.framework/src/components/admin/PageInstructions.tsx +86 -127
  50. package/.framework/src/components/app-shell/GenericDetailPage.tsx +37 -13
  51. package/.framework/src/components/app-shell/GenericListPage.tsx +28 -32
  52. package/.framework/src/components/layout/Sidebar.tsx +300 -177
  53. package/.framework/src/components/runtime/DataDetailPage.tsx +67 -35
  54. package/.framework/src/components/runtime/DataHeader.tsx +96 -48
  55. package/.framework/src/components/runtime/DataListPage.tsx +3 -26
  56. package/.framework/src/components/runtime/DataStats.tsx +10 -10
  57. package/.framework/src/components/runtime/DataTable.tsx +12 -10
  58. package/.framework/src/components/ui/sheet.tsx +24 -26
  59. package/.framework/src/components/ui/textarea.tsx +74 -48
  60. package/.framework/src/hooks/useEntityList.ts +12 -9
  61. package/.framework/src/hooks/useListSchema.ts +108 -58
  62. package/.framework/src/instructions/README.md +57 -0
  63. package/.framework/src/instructions/ai-agents.md +69 -0
  64. package/.framework/src/instructions/alerts.md +80 -0
  65. package/.framework/src/instructions/api-keys.md +87 -0
  66. package/.framework/src/instructions/apps.md +77 -0
  67. package/.framework/src/instructions/concepts/ai-and-prompts.md +150 -0
  68. package/.framework/src/instructions/concepts/apps-and-renderers.md +162 -0
  69. package/.framework/src/instructions/concepts/auth-and-api-keys.md +133 -0
  70. package/.framework/src/instructions/concepts/automation.md +186 -0
  71. package/.framework/src/instructions/concepts/concurrency-and-idempotency.md +125 -0
  72. package/.framework/src/instructions/concepts/core-vs-custom.md +124 -0
  73. package/.framework/src/instructions/concepts/design-schema.md +152 -0
  74. package/.framework/src/instructions/concepts/integrations-and-webhooks.md +127 -0
  75. package/.framework/src/instructions/concepts/observability.md +116 -0
  76. package/.framework/src/instructions/concepts/permissions.md +150 -0
  77. package/.framework/src/instructions/concepts/runtime-records.md +111 -0
  78. package/.framework/src/instructions/concepts/scope-and-accounts.md +112 -0
  79. package/.framework/src/instructions/concepts/spine-way.md +172 -0
  80. package/.framework/src/instructions/deliveries.md +59 -0
  81. package/.framework/src/instructions/guide/00-orientation.md +106 -0
  82. package/.framework/src/instructions/guide/01-install-and-first-run.md +253 -0
  83. package/.framework/src/instructions/guide/02-project-map.md +147 -0
  84. package/.framework/src/instructions/guide/03-domain-model.md +223 -0
  85. package/.framework/src/instructions/guide/04-first-app.md +227 -0
  86. package/.framework/src/instructions/guide/05-glossary.md +183 -0
  87. package/.framework/src/instructions/integrations.md +96 -0
  88. package/.framework/src/instructions/internal/cil-markers.md +83 -0
  89. package/.framework/src/instructions/invites.md +60 -0
  90. package/.framework/src/instructions/kb.md +80 -0
  91. package/.framework/src/instructions/logs.md +77 -0
  92. package/.framework/src/instructions/observability.md +61 -0
  93. package/.framework/src/instructions/operations/deployment.md +115 -0
  94. package/.framework/src/instructions/operations/migrations.md +125 -0
  95. package/.framework/src/instructions/operations/security-checklist.md +148 -0
  96. package/.framework/src/instructions/operations/troubleshooting.md +170 -0
  97. package/.framework/src/instructions/operations/upgrade.md +116 -0
  98. package/.framework/src/instructions/pipeline-executions.md +62 -0
  99. package/.framework/src/instructions/pipelines.md +78 -0
  100. package/.framework/src/instructions/prompts.md +95 -0
  101. package/.framework/src/instructions/reference/api/admin-data.md +162 -0
  102. package/.framework/src/instructions/reference/api/auth.md +113 -0
  103. package/.framework/src/instructions/reference/api/errors-and-envelopes.md +113 -0
  104. package/.framework/src/instructions/reference/app-manifest.md +150 -0
  105. package/.framework/src/instructions/reference/cli.md +124 -0
  106. package/.framework/src/instructions/reference/database.md +132 -0
  107. package/.framework/src/instructions/reference/design-schema.md +280 -0
  108. package/.framework/src/instructions/reference/env-vars.md +133 -0
  109. package/.framework/src/instructions/reference/functions/account-nodes.md +75 -0
  110. package/.framework/src/instructions/reference/functions/admin-data.md +195 -0
  111. package/.framework/src/instructions/reference/functions/admin-funnel.md +90 -0
  112. package/.framework/src/instructions/reference/functions/admin-install-funnel.md +107 -0
  113. package/.framework/src/instructions/reference/functions/admin-signals.md +102 -0
  114. package/.framework/src/instructions/reference/functions/ai-agents.md +148 -0
  115. package/.framework/src/instructions/reference/functions/ai-interactions.md +156 -0
  116. package/.framework/src/instructions/reference/functions/api-keys.md +130 -0
  117. package/.framework/src/instructions/reference/functions/apps.md +140 -0
  118. package/.framework/src/instructions/reference/functions/auth.md +99 -0
  119. package/.framework/src/instructions/reference/functions/debug-auth.md +91 -0
  120. package/.framework/src/instructions/reference/functions/deliveries.md +110 -0
  121. package/.framework/src/instructions/reference/functions/embeddings.md +166 -0
  122. package/.framework/src/instructions/reference/functions/eval-harness.md +149 -0
  123. package/.framework/src/instructions/reference/functions/index.md +103 -0
  124. package/.framework/src/instructions/reference/functions/integration-outbound.md +200 -0
  125. package/.framework/src/instructions/reference/functions/integration-routes.md +151 -0
  126. package/.framework/src/instructions/reference/functions/integrations.md +130 -0
  127. package/.framework/src/instructions/reference/functions/invites.md +182 -0
  128. package/.framework/src/instructions/reference/functions/item-progress.md +107 -0
  129. package/.framework/src/instructions/reference/functions/kb.md +166 -0
  130. package/.framework/src/instructions/reference/functions/logs.md +141 -0
  131. package/.framework/src/instructions/reference/functions/observability.md +105 -0
  132. package/.framework/src/instructions/reference/functions/pipeline-executions.md +132 -0
  133. package/.framework/src/instructions/reference/functions/pipeline-runner-background.md +121 -0
  134. package/.framework/src/instructions/reference/functions/pipelines.md +136 -0
  135. package/.framework/src/instructions/reference/functions/prompt-configs.md +121 -0
  136. package/.framework/src/instructions/reference/functions/roles.md +121 -0
  137. package/.framework/src/instructions/reference/functions/security.md +140 -0
  138. package/.framework/src/instructions/reference/functions/system-cron.md +136 -0
  139. package/.framework/src/instructions/reference/functions/system.md +106 -0
  140. package/.framework/src/instructions/reference/functions/tests.md +97 -0
  141. package/.framework/src/instructions/reference/functions/timers.md +117 -0
  142. package/.framework/src/instructions/reference/functions/trigger-scheduler.md +102 -0
  143. package/.framework/src/instructions/reference/functions/triggers.md +140 -0
  144. package/.framework/src/instructions/reference/functions/types.md +146 -0
  145. package/.framework/src/instructions/reference/seeds.md +126 -0
  146. package/.framework/src/instructions/reference/shared-modules.md +127 -0
  147. package/.framework/src/instructions/reference/spine-config.md +114 -0
  148. package/.framework/src/instructions/roles.md +80 -0
  149. package/.framework/src/instructions/runtime-detail.md +70 -0
  150. package/.framework/src/instructions/runtime-list.md +77 -0
  151. package/.framework/src/instructions/security.md +67 -0
  152. package/.framework/src/instructions/tasks/add-a-pipeline.md +110 -0
  153. package/.framework/src/instructions/tasks/add-a-role.md +96 -0
  154. package/.framework/src/instructions/tasks/add-a-timer.md +114 -0
  155. package/.framework/src/instructions/tasks/add-a-trigger.md +106 -0
  156. package/.framework/src/instructions/tasks/add-a-type.md +151 -0
  157. package/.framework/src/instructions/tasks/add-a-webhook.md +108 -0
  158. package/.framework/src/instructions/tasks/add-an-ai-agent.md +108 -0
  159. package/.framework/src/instructions/tasks/add-an-integration.md +124 -0
  160. package/.framework/src/instructions/tasks/build-a-custom-page.md +118 -0
  161. package/.framework/src/instructions/tasks/package-and-install-an-app.md +127 -0
  162. package/.framework/src/instructions/tasks/test-your-code.md +108 -0
  163. package/.framework/src/instructions/tasks/write-a-function.md +132 -0
  164. package/.framework/src/instructions/tasks/write-a-migration.md +110 -0
  165. package/.framework/src/instructions/testing.md +59 -0
  166. package/.framework/src/instructions/timers.md +82 -0
  167. package/.framework/src/instructions/triggers.md +69 -0
  168. package/.framework/src/instructions/types.md +93 -0
  169. package/.framework/src/pages/NotFoundPage.tsx +62 -31
  170. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +117 -106
  171. package/.framework/src/pages/admin/AIAgentsPage.tsx +86 -48
  172. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +153 -152
  173. package/.framework/src/pages/admin/APIKeysPage.tsx +91 -90
  174. package/.framework/src/pages/admin/AlertsConfigPage.tsx +29 -18
  175. package/.framework/src/pages/admin/AppDetailPage.tsx +6 -60
  176. package/.framework/src/pages/admin/AppsPage.tsx +104 -66
  177. package/.framework/src/pages/admin/DeliveriesPage.tsx +5 -5
  178. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +5 -23
  179. package/.framework/src/pages/admin/EmbeddingsPage.tsx +5 -26
  180. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +7 -7
  181. package/.framework/src/pages/admin/IntegrationsPage.tsx +85 -43
  182. package/.framework/src/pages/admin/LogsPage.tsx +144 -76
  183. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +223 -140
  184. package/.framework/src/pages/admin/PipelineDetailPage.tsx +134 -113
  185. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +108 -45
  186. package/.framework/src/pages/admin/PipelinesPage.tsx +160 -115
  187. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +96 -98
  188. package/.framework/src/pages/admin/PromptConfigsPage.tsx +101 -59
  189. package/.framework/src/pages/admin/RoleDetailPage.tsx +90 -79
  190. package/.framework/src/pages/admin/RolesPage.tsx +86 -43
  191. package/.framework/src/pages/admin/SecurityPage.tsx +1 -1
  192. package/.framework/src/pages/admin/TestingDashboard.tsx +16 -28
  193. package/.framework/src/pages/admin/TimerDetailPage.tsx +117 -100
  194. package/.framework/src/pages/admin/TimersPage.tsx +90 -62
  195. package/.framework/src/pages/admin/TriggerDetailPage.tsx +90 -83
  196. package/.framework/src/pages/admin/TriggersPage.tsx +124 -99
  197. package/.framework/src/pages/admin/TypeDetailPage.tsx +152 -138
  198. package/.framework/src/pages/admin/TypesPage.tsx +90 -48
  199. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +17 -25
  200. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +17 -27
  201. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +72 -40
  202. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +321 -129
  203. package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +18 -29
  204. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +26 -38
  205. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +34 -46
  206. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +189 -103
  207. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +246 -136
  208. package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +11 -22
  209. package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +9 -20
  210. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +26 -38
  211. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +7 -26
  212. package/.framework/templates/agent/AGENTS.md +150 -0
  213. package/.framework/templates/agent/skills/spine-add-ai-agent/SKILL.md +58 -0
  214. package/.framework/templates/agent/skills/spine-add-automation/SKILL.md +62 -0
  215. package/.framework/templates/agent/skills/spine-add-integration/SKILL.md +63 -0
  216. package/.framework/templates/agent/skills/spine-architect/SKILL.md +86 -0
  217. package/.framework/templates/agent/skills/spine-install-app/SKILL.md +72 -0
  218. package/.framework/templates/agent/skills/spine-migration/SKILL.md +75 -0
  219. package/.framework/templates/agent/skills/spine-new-app/SKILL.md +67 -0
  220. package/.framework/templates/agent/skills/spine-new-function/SKILL.md +65 -0
  221. package/.framework/templates/agent/skills/spine-new-type/SKILL.md +65 -0
  222. package/.framework/templates/agent/skills/spine-schema/SKILL.md +77 -0
  223. package/.framework/templates/agent/skills/spine-test/SKILL.md +67 -0
  224. package/.framework/templates/agent/skills/spine-troubleshoot/SKILL.md +74 -0
  225. package/.framework/templates/agent/skills/spine-upgrade/SKILL.md +69 -0
  226. package/.framework/templates/project.json +4 -1
  227. package/.framework/tests/unit/account-scoping-gates.test.ts +392 -0
  228. package/.framework/tests/unit/agent-files.test.ts +355 -0
  229. package/.framework/tests/unit/agent-runner.test.ts +479 -44
  230. package/.framework/tests/unit/api-keys-create-scope-gate.test.ts +160 -0
  231. package/.framework/tests/unit/api-keys-omit-secret-fields.test.ts +38 -0
  232. package/.framework/tests/unit/bootstrap.test.ts +242 -0
  233. package/.framework/tests/unit/cli-context-api-key.test.ts +114 -0
  234. package/.framework/tests/unit/debug-auth.test.ts +38 -0
  235. package/.framework/tests/unit/deliveries-account-scoping.test.ts +185 -0
  236. package/.framework/tests/unit/integration-outbound-credentials.test.ts +167 -0
  237. package/.framework/tests/unit/integrations-audit-redaction.test.ts +130 -0
  238. package/.framework/tests/unit/logging-app-id.test.ts +75 -0
  239. package/.framework/tests/unit/system-context-denial.test.ts +145 -0
  240. package/.framework/tests/unit/system-cron.test.ts +240 -0
  241. package/.framework/tests/unit/timers.test.ts +159 -0
  242. package/README.md +125 -166
  243. package/config/tsconfig.cli.json +2 -2
  244. package/package.json +15 -4
  245. package/templates/project/package-lock.json +2 -2
  246. package/.framework/docs/admin-routes.md +0 -76
  247. package/.framework/docs/api-docs-progress.md +0 -38
  248. package/.framework/docs/api-governance.md +0 -146
  249. package/.framework/docs/api-testing-results.md +0 -212
  250. package/.framework/docs/assembly-launch-guide.md +0 -138
  251. package/.framework/docs/audit-results.md +0 -590
  252. package/.framework/docs/db-api-inventory.md +0 -95
  253. package/.framework/docs/gap-remediation-backlog.md +0 -103
  254. package/.framework/docs/ui-adoption-verification.md +0 -111
  255. package/.framework/docs/ui-api-coverage.md +0 -84
  256. package/.framework/docs/v2-compatibility-audit.md +0 -228
  257. package/.framework/mcp/index.ts +0 -133
  258. package/.framework/mcp/load-env.ts +0 -60
  259. package/.framework/mcp/shared/app-manifest.ts +0 -275
  260. package/.framework/mcp/shared/db.ts +0 -477
  261. package/.framework/mcp/shared/kb.ts +0 -118
  262. package/.framework/mcp/tools/architect.ts +0 -431
  263. package/.framework/mcp/tools/cil/context.ts +0 -345
  264. package/.framework/mcp/tools/cil/graph.ts +0 -242
  265. package/.framework/mcp/tools/cil/ingest.ts +0 -1217
  266. package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +0 -693
  267. package/.framework/mcp/tools/cil/pipeline.ts +0 -767
  268. package/.framework/mcp/tools/cil/project.ts +0 -791
  269. package/.framework/mcp/tools/cil/retrieval.ts +0 -336
  270. package/.framework/mcp/tools/cil/search-core.ts +0 -454
  271. package/.framework/mcp/tools/cil/search.ts +0 -97
  272. package/.framework/mcp/tools/cil/suggest.ts +0 -186
  273. package/.framework/mcp/tools/cil/validate.ts +0 -1369
  274. package/.framework/mcp/tools/kb/delete.ts +0 -139
  275. package/.framework/mcp/tools/kb/index.ts +0 -52
  276. package/.framework/mcp/tools/kb/ingest.ts +0 -84
  277. package/.framework/mcp/tools/kb/list-types.ts +0 -102
  278. package/.framework/mcp/tools/kb/publish.ts +0 -100
  279. package/.framework/mcp/tools/kb/reindex.ts +0 -86
  280. package/.framework/mcp/tools/kb/revoke.ts +0 -85
  281. package/.framework/mcp/tools/kb/search.ts +0 -101
  282. package/.framework/mcp/tools/kb/upsert.ts +0 -125
  283. package/.framework/mcp/tools/observability.ts +0 -510
@@ -1,336 +0,0 @@
1
- /**
2
- * @module retrieval
3
- * @audience internal
4
- * @layer app-specific
5
- * @stability stable
6
- *
7
- * This module handles retrieval operations for the MCP framework, facilitating various search functionalities such as content, semantic, and title searches. It integrates with the admin database to fetch and normalize identifiers, ensuring consistent search results. INVARIANT: The module expects valid search queries to function correctly.
8
- *
9
- * @seeAlso search-core.js (provides core search functionalities).
10
- * @seeAlso ../../shared/db.js (accesses the admin database).
11
- *
12
- * @cil-generated
13
- */
14
-
15
- // CIL[BEGIN stable_id="~/.framework/mcp/tools/cil/retrieval.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/mcp/tools/cil/retrieval.ts"]
16
- // CIL[DOC-MACRO purpose="MCP retrieval tools and test registration for chunk search and example lookup"]
17
- // CIL[DOC-RESPONSIBILITY responsibility="Expose MCP tools that run retrieval tests and find code examples by querying search-core"]
18
- // CIL[DOC-CONTEXT module="retrieval" layer="app-specific" related_files=".framework/mcp/shared/db.ts,.framework/mcp/tools/cil/search-core.ts"]
19
- // CIL[DOC-CONTRACT inputs="McpServer instance; search query and optional project_id" outputs="Registered MCP tools and JSON result summaries" errors="Invalid query parameters or database failures propagate as tool errors" side_effects="Registers tools on the provided McpServer; performs database reads"]
20
- // CIL[DOC-MICRO logic_summary="Implements mergeResults, matchesExpectations, and register to wire up retrieval and example tools" notable_decisions="[]"]
21
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
22
- // CIL[DOC-STABILITY stability="stable"]
23
- // CIL[DOC-AUDIENCE audience="internal"]
24
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
25
- import { z } from 'zod'
26
- import {
27
- contentSearch,
28
- semanticSearch,
29
- titleSearch,
30
- normalizeIdentifier,
31
- buildSearchResult,
32
- SearchResult,
33
- } from './search-core.js'
34
- import { adminDb } from '../../shared/db.js'
35
- // CIL[DOC-VECTOR type="context" content="purpose='MCP retrieval tools and test registration for chunk search and example lookup'; No verified external callers; imports: .framework/mcp/tools/cil/search-core.ts,.framework/mcp/shared/db.ts"]
36
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
37
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
38
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
39
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
40
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
41
- // CIL[END stable_id="~/.framework/mcp/tools/cil/retrieval.ts:module_header:module_header"]
42
-
43
- // CIL[BEGIN stable_id="~/.framework/mcp/tools/cil/retrieval.ts:mergeResults:function" type="function" identity="mergeResults" parent="~/.framework/mcp/tools/cil/retrieval.ts"]
44
- // CIL[DOC-MACRO purpose="Merge two search result arrays, keeping the highest similarity per id and sorting descending"]
45
- // CIL[DOC-RESPONSIBILITY responsibility="Combine results from multiple search strategies without duplicates"]
46
- // CIL[DOC-CONTEXT module="retrieval" layer="app-specific" related_files=".framework/mcp/shared/db.ts,.framework/mcp/tools/cil/retrieval.ts,.framework/mcp/tools/cil/search-core.ts"]
47
- // CIL[DOC-CONTRACT inputs="a: SearchResult[], b: SearchResult[]" outputs="SearchResult[] sorted by similarity descending" errors="none" side_effects="none"]
48
- // CIL[DOC-MICRO logic_summary="Index results by id, keep the highest similarity score, then return sorted values" notable_decisions="[]"]
49
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
50
- // CIL[DOC-STABILITY stability="stable"]
51
- /**
52
- * Merges two arrays of search results, prioritizing results with higher similarity scores. This function ensures that the most relevant results are retained from both input arrays.
53
- *
54
- * @inputSpec
55
- * - a: SearchResult[] (required) — the first array of search results.
56
- * - b: SearchResult[] (required) — the second array of search results.
57
- * @outputSpec SearchResult[] — an array of merged search results sorted by similarity score.
58
- * @sideEffects none
59
- * @stability stable
60
- * @cil-generated
61
- */
62
- function mergeResults(a: SearchResult[], b: SearchResult[]): SearchResult[] {
63
- const byId = new Map<string, SearchResult>()
64
- for (const r of a) byId.set(r.id, r)
65
- for (const r of b) {
66
- const existing = byId.get(r.id)
67
- if (!existing || (r.similarity ?? 0) > (existing.similarity ?? 0)) {
68
- byId.set(r.id, r)
69
- }
70
- }
71
- return Array.from(byId.values()).sort(
72
- (x, y) => (y.similarity ?? 0) - (x.similarity ?? 0),
73
- )
74
- }
75
- // CIL[DOC-VECTOR type="context" content="purpose='Merge two search result arrays, keeping the highest similarity per id and sorting descending'; No verified external callers; imports: .framework/mcp/tools/cil/search-core.ts,.framework/mcp/shared/db.ts"]
76
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
77
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
78
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
79
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
80
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
81
- // CIL[END stable_id="~/.framework/mcp/tools/cil/retrieval.ts:mergeResults:function"]
82
-
83
- // CIL[BEGIN stable_id="~/.framework/mcp/tools/cil/retrieval.ts:matchesExpectations:function" type="function" identity="matchesExpectations" parent="~/.framework/mcp/tools/cil/retrieval.ts"]
84
- // CIL[DOC-MACRO purpose="Check whether a search result matches expected chunk names and/or file path substrings"]
85
- // CIL[DOC-RESPONSIBILITY responsibility="Filter search results against caller-provided expected values"]
86
- // CIL[DOC-CONTEXT module="retrieval" layer="app-specific" related_files=".framework/mcp/shared/db.ts,.framework/mcp/tools/cil/retrieval.ts,.framework/mcp/tools/cil/search-core.ts"]
87
- // CIL[DOC-CONTRACT inputs="result: SearchResult, expectedChunkNames?: string[], expectedFiles?: string[]" outputs="boolean" errors="none" side_effects="none"]
88
- // CIL[DOC-MICRO logic_summary="Case-insensitive substring match against chunk_name, macro, and file_path; missing or empty expectations pass" notable_decisions="[]"]
89
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
90
- // CIL[DOC-STABILITY stability="stable"]
91
- /**
92
- * Determines if a search result matches expected chunk names and file paths. This function is used to validate the relevance of search results against predefined criteria.
93
- *
94
- * @inputSpec
95
- * - result: SearchResult (required) — the search result object to evaluate.
96
- * - expectedChunkNames: string[] (optional) — an array of expected chunk names to match against.
97
- * - expectedFiles: string[] (optional) — an array of expected file paths to match against.
98
- * @outputSpec boolean — true if the search result matches the expectations, false otherwise.
99
- * @sideEffects none
100
- * @stability stable
101
- * @cil-generated
102
- */
103
- function matchesExpectations(
104
- result: SearchResult,
105
- expectedChunkNames?: string[],
106
- expectedFiles?: string[],
107
- ): boolean {
108
- const nameMatch =
109
- !expectedChunkNames ||
110
- expectedChunkNames.length === 0 ||
111
- expectedChunkNames.some(
112
- (name) =>
113
- result.chunk_name.toLowerCase().includes(name.toLowerCase()) ||
114
- result.macro.toLowerCase().includes(name.toLowerCase()),
115
- )
116
- const fileMatch =
117
- !expectedFiles ||
118
- expectedFiles.length === 0 ||
119
- expectedFiles.some((f) =>
120
- result.file_path.toLowerCase().includes(f.toLowerCase()),
121
- )
122
- return nameMatch && fileMatch
123
- }
124
- // CIL[DOC-VECTOR type="context" content="purpose='Check whether a search result matches expected chunk names and/or file path substrings'; No verified external callers; imports: .framework/mcp/tools/cil/search-core.ts,.framework/mcp/shared/db.ts"]
125
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
126
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
127
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
128
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
129
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
130
- // CIL[END stable_id="~/.framework/mcp/tools/cil/retrieval.ts:matchesExpectations:function"]
131
-
132
- /**
133
- * Registers tools for running retrieval tests against CIL chunks and finding code examples. This function facilitates the evaluation of search results based on specified queries and expected outcomes.
134
- *
135
- * @macro Tool registration function for search retrieval and example finding.
136
- * @micro Utilizes various search strategies (text, semantic, hybrid) to evaluate and return results based on test cases.
137
- * @inputSpec
138
- * server: McpServer (required) — the server instance to register tools with.
139
- * @outputSpec Promise<{ content: Array<{ type: 'text', text: string }> }> — returns a structured summary of test results.
140
- * @sideEffects registers tools with the server instance.
141
- * @stability stable
142
- * @calls titleSearch, semanticSearch, contentSearch, mergeResults, matchesExpectations
143
- * @cil-generated
144
- */
145
- // CIL[BEGIN stable_id="~/.framework/mcp/tools/cil/retrieval.ts:register:function" type="function" identity="register" parent="~/.framework/mcp/tools/cil/retrieval.ts"]
146
- // CIL[DOC-MACRO purpose="Register MCP tools for retrieval testing and code example lookup"]
147
- // CIL[DOC-RESPONSIBILITY responsibility="Bind spine_cil_test_retrieval, spine_cil_find_examples, and spine_cil_find_pattern tools to the McpServer"]
148
- // CIL[DOC-CONTEXT module="retrieval" layer="app-specific" related_files=".framework/mcp/shared/db.ts,.framework/mcp/tools/cil/retrieval.ts,.framework/mcp/tools/cil/search-core.ts"]
149
- // CIL[DOC-CONTRACT inputs="server: McpServer" outputs="Promise<{ content: Array<{ type: 'text', text: string }> }> from tool handlers" errors="Invalid inputs from zod schema or database errors" side_effects="Registers three tools on the McpServer; reads from adminDb and search-core"]
150
- // CIL[DOC-MICRO logic_summary="Defines three tool handlers: test retrieval, find examples, and find pattern; each queries search-core or adminDb and returns structured JSON" notable_decisions="[]"]
151
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
152
- // CIL[DOC-STABILITY stability="stable"]
153
- export function register(server: McpServer) {
154
- server.registerTool(
155
- 'spine_cil_test_retrieval',
156
- {
157
- description: 'Run a retrieval test suite against CIL chunks. Each test runs the same search pipeline as spine_cil_search_chunks and checks whether expected chunk names/files appear in the top results.',
158
- inputSchema: z.object({
159
- project_id: z.string().optional().describe('Limit to a project UUID'),
160
- limit: z.number().int().min(1).max(50).default(10).optional().describe('Max results to evaluate per query'),
161
- tests: z.array(
162
- z.object({
163
- q: z.string().describe('Search query'),
164
- expected_chunk_names: z.array(z.string()).optional().describe('One or more chunk_name/macro substrings that should appear in results'),
165
- expected_files: z.array(z.string()).optional().describe('One or more file_path substrings that should appear in results'),
166
- mode: z.enum(['hybrid', 'semantic', 'text']).default('hybrid').optional(),
167
- }),
168
- ).describe('List of retrieval test cases'),
169
- }),
170
- },
171
- async ({ project_id, limit, tests }) => {
172
- const results: any[] = []
173
- let passed = 0
174
- let failed = 0
175
-
176
- for (const test of tests) {
177
- let searchResults: SearchResult[] = []
178
- if (test.mode === 'text') {
179
- searchResults = await titleSearch({ q: test.q, project_id, limit })
180
- } else if (test.mode === 'semantic') {
181
- searchResults = await semanticSearch({ q: test.q, project_id, limit })
182
- } else {
183
- const [content, semantic] = await Promise.all([
184
- contentSearch({ q: test.q, project_id, limit }),
185
- semanticSearch({ q: test.q, project_id, limit }),
186
- ])
187
- searchResults = mergeResults(content, semantic).slice(0, limit ?? 10)
188
- }
189
-
190
- const top = searchResults.slice(0, 3)
191
- const ok = searchResults.some((r) =>
192
- matchesExpectations(r, test.expected_chunk_names, test.expected_files),
193
- )
194
-
195
- if (ok) passed++
196
- else failed++
197
-
198
- results.push({
199
- q: test.q,
200
- mode: test.mode ?? 'hybrid',
201
- ok,
202
- top_results: top.map((r) => ({
203
- chunk_name: r.chunk_name,
204
- file_path: r.file_path,
205
- macro: r.macro,
206
- match_type: r.match_type,
207
- similarity: r.similarity,
208
- })),
209
- })
210
- }
211
-
212
- return {
213
- content: [{
214
- type: 'text',
215
- text: JSON.stringify({
216
- project_id: project_id || null,
217
- limit: limit ?? 10,
218
- summary: { total: tests.length, passed, failed },
219
- results,
220
- }, null, 2),
221
- }],
222
- }
223
- },
224
- )
225
-
226
- server.registerTool(
227
- 'spine_cil_find_examples',
228
- {
229
- description: 'Find code examples matching a query. Searches chunk code_content and returns the most relevant full code snippets.',
230
- inputSchema: z.object({
231
- q: z.string().describe('Describe the API, function, or pattern you want examples of'),
232
- project_id: z.string().optional().describe('Limit to a project UUID'),
233
- limit: z.number().int().min(1).max(20).default(5).optional().describe('Max examples to return'),
234
- }),
235
- },
236
- async ({ q, project_id, limit }) => {
237
- const results = await contentSearch({ q, project_id, limit })
238
- const examples = results
239
- .filter((r) => r.code_content.trim().length > 0)
240
- .map((r) => ({
241
- chunk_name: r.chunk_name,
242
- file_path: r.file_path,
243
- chunk_type: r.chunk_type,
244
- macro: r.macro,
245
- code_content: r.code_content,
246
- match_type: r.match_type,
247
- similarity: r.similarity,
248
- }))
249
- return {
250
- content: [{
251
- type: 'text',
252
- text: JSON.stringify({ query: q, count: examples.length, examples }, null, 2),
253
- }],
254
- }
255
- },
256
- )
257
-
258
- server.registerTool(
259
- 'spine_cil_find_pattern',
260
- {
261
- description: 'Find chunks that reference a pattern, convention, or topic. Searches chunk tags, macro, micro, and code_content for the term.',
262
- inputSchema: z.object({
263
- q: z.string().describe('Pattern or topic, e.g. "design_schema", "error handling", "zod schema"'),
264
- project_id: z.string().optional().describe('Limit to a project UUID'),
265
- limit: z.number().int().min(1).max(50).default(10).optional().describe('Max results to return'),
266
- }),
267
- },
268
- async ({ q, project_id, limit }) => {
269
- const pageLimit = 5000
270
- let qb = adminDb
271
- .from('items')
272
- .select('id, title, data')
273
- .filter('data->>kb_type', 'eq', 'cil_chunk')
274
- .eq('is_active', true)
275
- .order('updated_at', { ascending: false })
276
- .limit(pageLimit)
277
- if (project_id) qb = (qb as any).filter('data->>project_id', 'eq', project_id)
278
-
279
- const { data: allChunks } = await qb
280
- const phrase = q.toLowerCase()
281
- const normPhrase = normalizeIdentifier(phrase)
282
-
283
- const scored = (allChunks || [])
284
- .map((c: any) => {
285
- const d = c.data || {}
286
- const haystacks = [
287
- { text: (c.title || '').toLowerCase(), weight: 3 },
288
- { text: (d.macro || '').toLowerCase(), weight: 3 },
289
- { text: (d.micro || '').toLowerCase(), weight: 2 },
290
- { text: (d.tags || '').toLowerCase(), weight: 2 },
291
- { text: (d.vector_content ? JSON.stringify(d.vector_content) : '').toLowerCase(), weight: 1 },
292
- { text: (d.code_content || '').toLowerCase(), weight: 1 },
293
- ]
294
- let score = 0
295
- for (const { text, weight } of haystacks) {
296
- if (text.includes(phrase)) score += weight * 2
297
- if (normalizeIdentifier(text).includes(normPhrase)) score += weight
298
- }
299
- return { chunk: c, score }
300
- })
301
- .filter(({ score }) => score > 0)
302
- .sort((a, b) => b.score - a.score)
303
- .slice(0, limit ?? 10)
304
-
305
- const maxScore = scored[0]?.score || 1
306
- const results = scored.map(({ chunk, score }) => {
307
- const r = buildSearchResult(chunk, 'content', score / maxScore)
308
- return {
309
- id: r.id,
310
- chunk_name: r.chunk_name,
311
- file_path: r.file_path,
312
- chunk_type: r.chunk_type,
313
- macro: r.macro,
314
- micro: r.micro,
315
- tags: r.tags,
316
- code_content: r.code_content,
317
- similarity: r.similarity,
318
- }
319
- })
320
-
321
- return {
322
- content: [{
323
- type: 'text',
324
- text: JSON.stringify({ query: q, count: results.length, results }, null, 2),
325
- }],
326
- }
327
- },
328
- )
329
- }
330
- // CIL[DOC-VECTOR type="context" content="purpose='Register MCP tools for retrieval testing and code example lookup'; No verified external callers; imports: .framework/mcp/tools/cil/search-core.ts,.framework/mcp/shared/db.ts"]
331
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
332
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
333
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
334
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
335
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
336
- // CIL[END stable_id="~/.framework/mcp/tools/cil/retrieval.ts:register:function"]