@kaelio/ktx 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (872) hide show
  1. package/assets/python/{kaelio_ktx-0.5.0-py3-none-any.whl → kaelio_ktx-0.6.0-py3-none-any.whl} +0 -0
  2. package/assets/python/manifest.json +4 -4
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/clack.d.ts +8 -0
  5. package/dist/clack.js +14 -0
  6. package/dist/connection.js +2 -9
  7. package/dist/connectors/bigquery/connector.d.ts +6 -1
  8. package/dist/connectors/bigquery/connector.js +38 -9
  9. package/dist/connectors/bigquery/dialect.d.ts +11 -9
  10. package/dist/connectors/bigquery/dialect.js +25 -45
  11. package/dist/connectors/clickhouse/connector.d.ts +5 -0
  12. package/dist/connectors/clickhouse/connector.js +36 -3
  13. package/dist/connectors/clickhouse/dialect.d.ts +11 -12
  14. package/dist/connectors/clickhouse/dialect.js +25 -100
  15. package/dist/connectors/mysql/connector.d.ts +7 -1
  16. package/dist/connectors/mysql/connector.js +67 -9
  17. package/dist/connectors/mysql/dialect.d.ts +11 -9
  18. package/dist/connectors/mysql/dialect.js +25 -43
  19. package/dist/connectors/postgres/connector.d.ts +6 -0
  20. package/dist/connectors/postgres/connector.js +67 -12
  21. package/dist/connectors/postgres/dialect.d.ts +11 -9
  22. package/dist/connectors/postgres/dialect.js +26 -35
  23. package/dist/connectors/snowflake/connector.d.ts +8 -3
  24. package/dist/connectors/snowflake/connector.js +39 -20
  25. package/dist/connectors/snowflake/dialect.d.ts +11 -9
  26. package/dist/connectors/snowflake/dialect.js +25 -24
  27. package/dist/connectors/sqlite/connector.d.ts +3 -1
  28. package/dist/connectors/sqlite/connector.js +23 -3
  29. package/dist/connectors/sqlite/dialect.d.ts +11 -9
  30. package/dist/connectors/sqlite/dialect.js +25 -29
  31. package/dist/connectors/sqlserver/connector.d.ts +6 -0
  32. package/dist/connectors/sqlserver/connector.js +56 -9
  33. package/dist/connectors/sqlserver/dialect.d.ts +11 -10
  34. package/dist/connectors/sqlserver/dialect.js +24 -40
  35. package/dist/context/connections/connection-type.d.ts +1 -1
  36. package/dist/context/connections/dialect-helpers.d.ts +9 -0
  37. package/dist/context/connections/dialect-helpers.js +67 -0
  38. package/dist/context/connections/dialects.d.ts +23 -5
  39. package/dist/context/connections/dialects.js +18 -56
  40. package/dist/context/connections/drivers.d.ts +23 -0
  41. package/dist/context/connections/drivers.js +171 -0
  42. package/dist/context/connections/local-query-executor.js +25 -7
  43. package/dist/context/connections/local-warehouse-descriptor.js +0 -2
  44. package/dist/context/connections/postgres-query-executor.js +1 -1
  45. package/dist/context/connections/sqlite-query-executor.js +1 -1
  46. package/dist/context/ingest/adapters/historic-sql/chunk-unified.js +1 -1
  47. package/dist/context/ingest/adapters/historic-sql/connection-dialect.js +11 -7
  48. package/dist/context/ingest/adapters/historic-sql/evidence-tool.d.ts +1 -1
  49. package/dist/context/ingest/adapters/historic-sql/evidence-tool.js +8 -5
  50. package/dist/context/ingest/adapters/historic-sql/evidence.d.ts +4 -4
  51. package/dist/context/ingest/adapters/historic-sql/evidence.js +2 -2
  52. package/dist/context/ingest/adapters/historic-sql/projection.js +5 -2
  53. package/dist/context/ingest/adapters/live-database/daemon-introspection.js +1 -1
  54. package/dist/context/ingest/adapters/live-database/stage.d.ts +2 -0
  55. package/dist/context/ingest/adapters/live-database/stage.js +9 -0
  56. package/dist/context/ingest/adapters/looker/mapping.d.ts +0 -3
  57. package/dist/context/ingest/adapters/looker/mapping.js +0 -3
  58. package/dist/context/ingest/adapters/looker/types.d.ts +1 -1
  59. package/dist/context/ingest/historic-sql-probes/bigquery-runner.d.ts +34 -0
  60. package/dist/context/ingest/historic-sql-probes/bigquery-runner.js +99 -0
  61. package/dist/context/ingest/historic-sql-probes/postgres-runner.d.ts +26 -0
  62. package/dist/context/ingest/historic-sql-probes/postgres-runner.js +76 -0
  63. package/dist/context/ingest/historic-sql-probes/snowflake-runner.d.ts +29 -0
  64. package/dist/context/ingest/historic-sql-probes/snowflake-runner.js +62 -0
  65. package/dist/context/ingest/historic-sql-probes.d.ts +46 -0
  66. package/dist/context/ingest/historic-sql-probes.js +62 -0
  67. package/dist/context/ingest/local-adapters.js +0 -1
  68. package/dist/context/ingest/local-ingest.js +1 -1
  69. package/dist/context/mcp/context-tools.js +11 -48
  70. package/dist/context/mcp/local-project-ports.js +0 -3
  71. package/dist/context/project/config.d.ts +0 -8
  72. package/dist/context/project/driver-schemas.d.ts +0 -4
  73. package/dist/context/project/driver-schemas.js +0 -2
  74. package/dist/context/scan/constraint-discovery.d.ts +19 -0
  75. package/dist/context/scan/constraint-discovery.js +23 -0
  76. package/dist/context/scan/enabled-tables.d.ts +4 -5
  77. package/dist/context/scan/enabled-tables.js +4 -18
  78. package/dist/context/scan/entity-details.js +14 -44
  79. package/dist/context/scan/local-enrichment.js +13 -1
  80. package/dist/context/scan/local-scan.js +5 -4
  81. package/dist/context/scan/local-structural-artifacts.js +51 -0
  82. package/dist/context/scan/relationship-benchmarks.js +9 -6
  83. package/dist/context/scan/relationship-composite-candidates.d.ts +3 -2
  84. package/dist/context/scan/relationship-composite-candidates.js +21 -33
  85. package/dist/context/scan/relationship-discovery.d.ts +3 -2
  86. package/dist/context/scan/relationship-discovery.js +4 -4
  87. package/dist/context/scan/relationship-profiling.d.ts +2 -3
  88. package/dist/context/scan/relationship-profiling.js +25 -94
  89. package/dist/context/scan/relationship-validation.d.ts +3 -2
  90. package/dist/context/scan/relationship-validation.js +12 -22
  91. package/dist/context/scan/table-ref.d.ts +1 -2
  92. package/dist/context/scan/table-ref.js +3 -4
  93. package/dist/context/scan/types.d.ts +6 -2
  94. package/dist/context/scan/warehouse-catalog.js +31 -48
  95. package/dist/context/sl/local-query.js +0 -3
  96. package/dist/context/sl/local-sl.js +0 -13
  97. package/dist/context/sl/semantic-layer.service.js +1 -4
  98. package/dist/context/tools/context-candidate-write.tool.d.ts +2 -2
  99. package/dist/context-build-view.js +1 -1
  100. package/dist/database-tree-picker.js +14 -7
  101. package/dist/error-message.d.ts +1 -0
  102. package/dist/error-message.js +29 -0
  103. package/dist/ingest-depth.js +0 -1
  104. package/dist/ingest.js +2 -2
  105. package/dist/llm/embedding-health.js +2 -2
  106. package/dist/local-scan-connectors.js +13 -56
  107. package/dist/managed-local-embeddings.js +2 -1
  108. package/dist/managed-python-daemon.d.ts +5 -0
  109. package/dist/managed-python-daemon.js +29 -9
  110. package/dist/managed-python-http.js +2 -1
  111. package/dist/public-ingest.js +1 -6
  112. package/dist/runtime-requirements.js +2 -2
  113. package/dist/setup-agents.d.ts +1 -1
  114. package/dist/setup-agents.js +16 -74
  115. package/dist/setup-context.js +2 -1
  116. package/dist/setup-databases.d.ts +3 -13
  117. package/dist/setup-databases.js +141 -313
  118. package/dist/setup-embeddings.js +10 -2
  119. package/dist/setup-runtime.js +2 -1
  120. package/dist/setup-sources.js +2 -1
  121. package/dist/setup.js +10 -4
  122. package/dist/skills/historic_sql_patterns/SKILL.md +1 -3
  123. package/dist/skills/historic_sql_table_digest/SKILL.md +0 -1
  124. package/dist/skills/sl/SKILL.md +2 -2
  125. package/dist/sql.js +0 -4
  126. package/dist/status-project.d.ts +3 -18
  127. package/dist/status-project.js +42 -216
  128. package/dist/telemetry/events.d.ts +1 -1
  129. package/dist/telemetry/index.js +8 -3
  130. package/dist/tree-picker-state.d.ts +2 -2
  131. package/dist/tree-picker-state.js +29 -13
  132. package/dist/tree-picker-tui.d.ts +3 -1
  133. package/dist/tree-picker-tui.js +20 -32
  134. package/package.json +6 -6
  135. package/dist/admin-reindex.test.d.ts +0 -1
  136. package/dist/admin-reindex.test.js +0 -119
  137. package/dist/admin.test.d.ts +0 -1
  138. package/dist/admin.test.js +0 -201
  139. package/dist/cli-program-telemetry.test.d.ts +0 -1
  140. package/dist/cli-program-telemetry.test.js +0 -89
  141. package/dist/cli-program.test.d.ts +0 -1
  142. package/dist/cli-program.test.js +0 -71
  143. package/dist/command-tree.test.d.ts +0 -1
  144. package/dist/command-tree.test.js +0 -126
  145. package/dist/commands/mcp-commands.test.d.ts +0 -1
  146. package/dist/commands/mcp-commands.test.js +0 -111
  147. package/dist/commands/sql-commands.test.d.ts +0 -1
  148. package/dist/commands/sql-commands.test.js +0 -68
  149. package/dist/connection.test.d.ts +0 -1
  150. package/dist/connection.test.js +0 -426
  151. package/dist/connectors/bigquery/connector.test.d.ts +0 -1
  152. package/dist/connectors/bigquery/connector.test.js +0 -363
  153. package/dist/connectors/bigquery/dialect.test.d.ts +0 -1
  154. package/dist/connectors/bigquery/dialect.test.js +0 -36
  155. package/dist/connectors/clickhouse/connector.test.d.ts +0 -1
  156. package/dist/connectors/clickhouse/connector.test.js +0 -342
  157. package/dist/connectors/clickhouse/dialect.test.d.ts +0 -1
  158. package/dist/connectors/clickhouse/dialect.test.js +0 -36
  159. package/dist/connectors/mysql/connector.test.d.ts +0 -1
  160. package/dist/connectors/mysql/connector.test.js +0 -365
  161. package/dist/connectors/mysql/dialect.test.d.ts +0 -1
  162. package/dist/connectors/mysql/dialect.test.js +0 -36
  163. package/dist/connectors/postgres/connector.test.d.ts +0 -1
  164. package/dist/connectors/postgres/connector.test.js +0 -391
  165. package/dist/connectors/postgres/dialect.test.d.ts +0 -1
  166. package/dist/connectors/postgres/dialect.test.js +0 -37
  167. package/dist/connectors/postgres/historic-sql-query-client.test.d.ts +0 -1
  168. package/dist/connectors/postgres/historic-sql-query-client.test.js +0 -45
  169. package/dist/connectors/snowflake/connector.test.d.ts +0 -1
  170. package/dist/connectors/snowflake/connector.test.js +0 -462
  171. package/dist/connectors/snowflake/dialect.test.d.ts +0 -1
  172. package/dist/connectors/snowflake/dialect.test.js +0 -34
  173. package/dist/connectors/snowflake/identifiers.test.d.ts +0 -1
  174. package/dist/connectors/snowflake/identifiers.test.js +0 -12
  175. package/dist/connectors/snowflake/sdk-logger.test.d.ts +0 -1
  176. package/dist/connectors/snowflake/sdk-logger.test.js +0 -47
  177. package/dist/connectors/sqlite/connector.test.d.ts +0 -1
  178. package/dist/connectors/sqlite/connector.test.js +0 -207
  179. package/dist/connectors/sqlite/dialect.test.d.ts +0 -1
  180. package/dist/connectors/sqlite/dialect.test.js +0 -23
  181. package/dist/connectors/sqlserver/connector.test.d.ts +0 -1
  182. package/dist/connectors/sqlserver/connector.test.js +0 -313
  183. package/dist/connectors/sqlserver/dialect.test.d.ts +0 -1
  184. package/dist/connectors/sqlserver/dialect.test.js +0 -36
  185. package/dist/context/connections/bigquery-identifiers.test.d.ts +0 -1
  186. package/dist/context/connections/bigquery-identifiers.test.js +0 -13
  187. package/dist/context/connections/dialects.test.d.ts +0 -1
  188. package/dist/context/connections/dialects.test.js +0 -24
  189. package/dist/context/connections/local-query-executor.test.d.ts +0 -1
  190. package/dist/context/connections/local-query-executor.test.js +0 -48
  191. package/dist/context/connections/local-warehouse-descriptor.test.d.ts +0 -1
  192. package/dist/context/connections/local-warehouse-descriptor.test.js +0 -53
  193. package/dist/context/connections/notion-config.test.d.ts +0 -1
  194. package/dist/context/connections/notion-config.test.js +0 -121
  195. package/dist/context/connections/postgres-query-executor.test.d.ts +0 -1
  196. package/dist/context/connections/postgres-query-executor.test.js +0 -91
  197. package/dist/context/connections/read-only-sql.test.d.ts +0 -1
  198. package/dist/context/connections/read-only-sql.test.js +0 -20
  199. package/dist/context/connections/sqlite-query-executor.test.d.ts +0 -1
  200. package/dist/context/connections/sqlite-query-executor.test.js +0 -113
  201. package/dist/context/core/config-reference.test.d.ts +0 -1
  202. package/dist/context/core/config-reference.test.js +0 -27
  203. package/dist/context/core/git.service.assert-worktree-clean.test.d.ts +0 -1
  204. package/dist/context/core/git.service.assert-worktree-clean.test.js +0 -62
  205. package/dist/context/core/git.service.delete-directories.test.d.ts +0 -1
  206. package/dist/context/core/git.service.delete-directories.test.js +0 -61
  207. package/dist/context/core/git.service.patch.test.d.ts +0 -1
  208. package/dist/context/core/git.service.patch.test.js +0 -40
  209. package/dist/context/core/git.service.reset-hard.test.d.ts +0 -1
  210. package/dist/context/core/git.service.reset-hard.test.js +0 -47
  211. package/dist/context/core/git.service.test.d.ts +0 -1
  212. package/dist/context/core/git.service.test.js +0 -357
  213. package/dist/context/core/session-worktree.service.test.d.ts +0 -1
  214. package/dist/context/core/session-worktree.service.test.js +0 -97
  215. package/dist/context/daemon/semantic-layer-compute.test.d.ts +0 -1
  216. package/dist/context/daemon/semantic-layer-compute.test.js +0 -305
  217. package/dist/context/index-sync/reindex.test.d.ts +0 -1
  218. package/dist/context/index-sync/reindex.test.js +0 -139
  219. package/dist/context/ingest/action-identity.test.d.ts +0 -1
  220. package/dist/context/ingest/action-identity.test.js +0 -19
  221. package/dist/context/ingest/adapters/dbt/chunk.test.d.ts +0 -1
  222. package/dist/context/ingest/adapters/dbt/chunk.test.js +0 -30
  223. package/dist/context/ingest/adapters/dbt/dbt.adapter.test.d.ts +0 -1
  224. package/dist/context/ingest/adapters/dbt/dbt.adapter.test.js +0 -43
  225. package/dist/context/ingest/adapters/dbt/fetch.test.d.ts +0 -1
  226. package/dist/context/ingest/adapters/dbt/fetch.test.js +0 -30
  227. package/dist/context/ingest/adapters/dbt/parse.test.d.ts +0 -1
  228. package/dist/context/ingest/adapters/dbt/parse.test.js +0 -7
  229. package/dist/context/ingest/adapters/dbt-descriptions/parse-schema.test.d.ts +0 -1
  230. package/dist/context/ingest/adapters/dbt-descriptions/parse-schema.test.js +0 -195
  231. package/dist/context/ingest/adapters/historic-sql/bigquery-query-history-reader.test.d.ts +0 -1
  232. package/dist/context/ingest/adapters/historic-sql/bigquery-query-history-reader.test.js +0 -121
  233. package/dist/context/ingest/adapters/historic-sql/buckets.test.d.ts +0 -1
  234. package/dist/context/ingest/adapters/historic-sql/buckets.test.js +0 -49
  235. package/dist/context/ingest/adapters/historic-sql/chunk-unified.test.d.ts +0 -1
  236. package/dist/context/ingest/adapters/historic-sql/chunk-unified.test.js +0 -160
  237. package/dist/context/ingest/adapters/historic-sql/detect.test.d.ts +0 -1
  238. package/dist/context/ingest/adapters/historic-sql/detect.test.js +0 -48
  239. package/dist/context/ingest/adapters/historic-sql/evidence-tool.test.d.ts +0 -1
  240. package/dist/context/ingest/adapters/historic-sql/evidence-tool.test.js +0 -67
  241. package/dist/context/ingest/adapters/historic-sql/evidence.test.d.ts +0 -1
  242. package/dist/context/ingest/adapters/historic-sql/evidence.test.js +0 -43
  243. package/dist/context/ingest/adapters/historic-sql/historic-sql.adapter.test.d.ts +0 -1
  244. package/dist/context/ingest/adapters/historic-sql/historic-sql.adapter.test.js +0 -98
  245. package/dist/context/ingest/adapters/historic-sql/local-ingest-acceptance.test.d.ts +0 -1
  246. package/dist/context/ingest/adapters/historic-sql/local-ingest-acceptance.test.js +0 -235
  247. package/dist/context/ingest/adapters/historic-sql/pattern-inputs.test.d.ts +0 -1
  248. package/dist/context/ingest/adapters/historic-sql/pattern-inputs.test.js +0 -68
  249. package/dist/context/ingest/adapters/historic-sql/postgres-pgss-reader.test.d.ts +0 -1
  250. package/dist/context/ingest/adapters/historic-sql/postgres-pgss-reader.test.js +0 -205
  251. package/dist/context/ingest/adapters/historic-sql/projection.test.d.ts +0 -1
  252. package/dist/context/ingest/adapters/historic-sql/projection.test.js +0 -392
  253. package/dist/context/ingest/adapters/historic-sql/redaction.test.d.ts +0 -1
  254. package/dist/context/ingest/adapters/historic-sql/redaction.test.js +0 -22
  255. package/dist/context/ingest/adapters/historic-sql/skill-schemas.test.d.ts +0 -1
  256. package/dist/context/ingest/adapters/historic-sql/skill-schemas.test.js +0 -62
  257. package/dist/context/ingest/adapters/historic-sql/snowflake-query-history-reader.test.d.ts +0 -1
  258. package/dist/context/ingest/adapters/historic-sql/snowflake-query-history-reader.test.js +0 -117
  259. package/dist/context/ingest/adapters/historic-sql/stage-unified.test.d.ts +0 -1
  260. package/dist/context/ingest/adapters/historic-sql/stage-unified.test.js +0 -405
  261. package/dist/context/ingest/adapters/historic-sql/types.test.d.ts +0 -1
  262. package/dist/context/ingest/adapters/historic-sql/types.test.js +0 -87
  263. package/dist/context/ingest/adapters/live-database/chunk.test.d.ts +0 -1
  264. package/dist/context/ingest/adapters/live-database/chunk.test.js +0 -95
  265. package/dist/context/ingest/adapters/live-database/daemon-introspection.test.d.ts +0 -1
  266. package/dist/context/ingest/adapters/live-database/daemon-introspection.test.js +0 -241
  267. package/dist/context/ingest/adapters/live-database/live-database.adapter.test.d.ts +0 -1
  268. package/dist/context/ingest/adapters/live-database/live-database.adapter.test.js +0 -105
  269. package/dist/context/ingest/adapters/live-database/manifest.test.d.ts +0 -1
  270. package/dist/context/ingest/adapters/live-database/manifest.test.js +0 -291
  271. package/dist/context/ingest/adapters/live-database/stage.test.d.ts +0 -1
  272. package/dist/context/ingest/adapters/live-database/stage.test.js +0 -133
  273. package/dist/context/ingest/adapters/looker/chunk.test.d.ts +0 -1
  274. package/dist/context/ingest/adapters/looker/chunk.test.js +0 -142
  275. package/dist/context/ingest/adapters/looker/client-boundary.test.d.ts +0 -1
  276. package/dist/context/ingest/adapters/looker/client-boundary.test.js +0 -12
  277. package/dist/context/ingest/adapters/looker/client.test.d.ts +0 -1
  278. package/dist/context/ingest/adapters/looker/client.test.js +0 -407
  279. package/dist/context/ingest/adapters/looker/daemon-table-identifier-parser.test.d.ts +0 -1
  280. package/dist/context/ingest/adapters/looker/daemon-table-identifier-parser.test.js +0 -40
  281. package/dist/context/ingest/adapters/looker/detect.test.d.ts +0 -1
  282. package/dist/context/ingest/adapters/looker/detect.test.js +0 -39
  283. package/dist/context/ingest/adapters/looker/evidence-documents.test.d.ts +0 -1
  284. package/dist/context/ingest/adapters/looker/evidence-documents.test.js +0 -178
  285. package/dist/context/ingest/adapters/looker/factory.test.d.ts +0 -1
  286. package/dist/context/ingest/adapters/looker/factory.test.js +0 -55
  287. package/dist/context/ingest/adapters/looker/fetch-report.test.d.ts +0 -1
  288. package/dist/context/ingest/adapters/looker/fetch-report.test.js +0 -71
  289. package/dist/context/ingest/adapters/looker/fetch.test.d.ts +0 -1
  290. package/dist/context/ingest/adapters/looker/fetch.test.js +0 -592
  291. package/dist/context/ingest/adapters/looker/local-runtime-store.test.d.ts +0 -1
  292. package/dist/context/ingest/adapters/looker/local-runtime-store.test.js +0 -106
  293. package/dist/context/ingest/adapters/looker/looker.adapter.test.d.ts +0 -1
  294. package/dist/context/ingest/adapters/looker/looker.adapter.test.js +0 -99
  295. package/dist/context/ingest/adapters/looker/mapping.test.d.ts +0 -1
  296. package/dist/context/ingest/adapters/looker/mapping.test.js +0 -334
  297. package/dist/context/ingest/adapters/looker/reconcile.test.d.ts +0 -1
  298. package/dist/context/ingest/adapters/looker/reconcile.test.js +0 -12
  299. package/dist/context/ingest/adapters/looker/scope.test.d.ts +0 -1
  300. package/dist/context/ingest/adapters/looker/scope.test.js +0 -84
  301. package/dist/context/ingest/adapters/looker/target-connections.test.d.ts +0 -1
  302. package/dist/context/ingest/adapters/looker/target-connections.test.js +0 -71
  303. package/dist/context/ingest/adapters/looker/tools/looker-query-to-sl.tool.test.d.ts +0 -1
  304. package/dist/context/ingest/adapters/looker/tools/looker-query-to-sl.tool.test.js +0 -211
  305. package/dist/context/ingest/adapters/looker/types.test.d.ts +0 -1
  306. package/dist/context/ingest/adapters/looker/types.test.js +0 -261
  307. package/dist/context/ingest/adapters/lookml/chunk.test.d.ts +0 -1
  308. package/dist/context/ingest/adapters/lookml/chunk.test.js +0 -213
  309. package/dist/context/ingest/adapters/lookml/detect.test.d.ts +0 -1
  310. package/dist/context/ingest/adapters/lookml/detect.test.js +0 -37
  311. package/dist/context/ingest/adapters/lookml/fetch-report.test.d.ts +0 -1
  312. package/dist/context/ingest/adapters/lookml/fetch-report.test.js +0 -82
  313. package/dist/context/ingest/adapters/lookml/fetch.test.d.ts +0 -1
  314. package/dist/context/ingest/adapters/lookml/fetch.test.js +0 -121
  315. package/dist/context/ingest/adapters/lookml/graph.test.d.ts +0 -1
  316. package/dist/context/ingest/adapters/lookml/graph.test.js +0 -105
  317. package/dist/context/ingest/adapters/lookml/lookml.adapter.test.d.ts +0 -1
  318. package/dist/context/ingest/adapters/lookml/lookml.adapter.test.js +0 -49
  319. package/dist/context/ingest/adapters/lookml/parse.test.d.ts +0 -1
  320. package/dist/context/ingest/adapters/lookml/parse.test.js +0 -118
  321. package/dist/context/ingest/adapters/lookml/pull-config.test.d.ts +0 -1
  322. package/dist/context/ingest/adapters/lookml/pull-config.test.js +0 -128
  323. package/dist/context/ingest/adapters/metabase/card-references.test.d.ts +0 -1
  324. package/dist/context/ingest/adapters/metabase/card-references.test.js +0 -36
  325. package/dist/context/ingest/adapters/metabase/chunk.test.d.ts +0 -1
  326. package/dist/context/ingest/adapters/metabase/chunk.test.js +0 -299
  327. package/dist/context/ingest/adapters/metabase/client-boundary.test.d.ts +0 -1
  328. package/dist/context/ingest/adapters/metabase/client-boundary.test.js +0 -38
  329. package/dist/context/ingest/adapters/metabase/client-port.test.d.ts +0 -1
  330. package/dist/context/ingest/adapters/metabase/client-port.test.js +0 -86
  331. package/dist/context/ingest/adapters/metabase/client.test.d.ts +0 -1
  332. package/dist/context/ingest/adapters/metabase/client.test.js +0 -377
  333. package/dist/context/ingest/adapters/metabase/detect.test.d.ts +0 -1
  334. package/dist/context/ingest/adapters/metabase/detect.test.js +0 -42
  335. package/dist/context/ingest/adapters/metabase/fanout-planner.test.d.ts +0 -1
  336. package/dist/context/ingest/adapters/metabase/fanout-planner.test.js +0 -44
  337. package/dist/context/ingest/adapters/metabase/fetch-scope.test.d.ts +0 -1
  338. package/dist/context/ingest/adapters/metabase/fetch-scope.test.js +0 -124
  339. package/dist/context/ingest/adapters/metabase/fetch.test.d.ts +0 -1
  340. package/dist/context/ingest/adapters/metabase/fetch.test.js +0 -557
  341. package/dist/context/ingest/adapters/metabase/local-metabase.adapter.test.d.ts +0 -1
  342. package/dist/context/ingest/adapters/metabase/local-metabase.adapter.test.js +0 -56
  343. package/dist/context/ingest/adapters/metabase/local-source-state-store.test.d.ts +0 -1
  344. package/dist/context/ingest/adapters/metabase/local-source-state-store.test.js +0 -99
  345. package/dist/context/ingest/adapters/metabase/mapping.test.d.ts +0 -1
  346. package/dist/context/ingest/adapters/metabase/mapping.test.js +0 -215
  347. package/dist/context/ingest/adapters/metabase/metabase.adapter.test.d.ts +0 -1
  348. package/dist/context/ingest/adapters/metabase/metabase.adapter.test.js +0 -129
  349. package/dist/context/ingest/adapters/metabase/serialize-card.test.d.ts +0 -1
  350. package/dist/context/ingest/adapters/metabase/serialize-card.test.js +0 -205
  351. package/dist/context/ingest/adapters/metabase/types.test.d.ts +0 -1
  352. package/dist/context/ingest/adapters/metabase/types.test.js +0 -75
  353. package/dist/context/ingest/adapters/metricflow/chunk.test.d.ts +0 -1
  354. package/dist/context/ingest/adapters/metricflow/chunk.test.js +0 -114
  355. package/dist/context/ingest/adapters/metricflow/deep-parse.test.d.ts +0 -1
  356. package/dist/context/ingest/adapters/metricflow/deep-parse.test.js +0 -1139
  357. package/dist/context/ingest/adapters/metricflow/detect.test.d.ts +0 -1
  358. package/dist/context/ingest/adapters/metricflow/detect.test.js +0 -43
  359. package/dist/context/ingest/adapters/metricflow/fetch.test.d.ts +0 -1
  360. package/dist/context/ingest/adapters/metricflow/fetch.test.js +0 -97
  361. package/dist/context/ingest/adapters/metricflow/graph.test.d.ts +0 -1
  362. package/dist/context/ingest/adapters/metricflow/graph.test.js +0 -245
  363. package/dist/context/ingest/adapters/metricflow/import-semantic-models.test.d.ts +0 -1
  364. package/dist/context/ingest/adapters/metricflow/import-semantic-models.test.js +0 -318
  365. package/dist/context/ingest/adapters/metricflow/metricflow.adapter.test.d.ts +0 -1
  366. package/dist/context/ingest/adapters/metricflow/metricflow.adapter.test.js +0 -212
  367. package/dist/context/ingest/adapters/metricflow/parse.test.d.ts +0 -1
  368. package/dist/context/ingest/adapters/metricflow/parse.test.js +0 -171
  369. package/dist/context/ingest/adapters/metricflow/pull-config.test.d.ts +0 -1
  370. package/dist/context/ingest/adapters/metricflow/pull-config.test.js +0 -57
  371. package/dist/context/ingest/adapters/metricflow/semantic-models.test.d.ts +0 -1
  372. package/dist/context/ingest/adapters/metricflow/semantic-models.test.js +0 -204
  373. package/dist/context/ingest/adapters/notion/cluster.test.d.ts +0 -1
  374. package/dist/context/ingest/adapters/notion/cluster.test.js +0 -123
  375. package/dist/context/ingest/adapters/notion/fetch.test.d.ts +0 -1
  376. package/dist/context/ingest/adapters/notion/fetch.test.js +0 -358
  377. package/dist/context/ingest/adapters/notion/local-state-store.test.d.ts +0 -1
  378. package/dist/context/ingest/adapters/notion/local-state-store.test.js +0 -29
  379. package/dist/context/ingest/adapters/notion/normalize.test.d.ts +0 -1
  380. package/dist/context/ingest/adapters/notion/normalize.test.js +0 -64
  381. package/dist/context/ingest/adapters/notion/notion-client.test.d.ts +0 -1
  382. package/dist/context/ingest/adapters/notion/notion-client.test.js +0 -49
  383. package/dist/context/ingest/adapters/notion/notion.adapter.test.d.ts +0 -1
  384. package/dist/context/ingest/adapters/notion/notion.adapter.test.js +0 -315
  385. package/dist/context/ingest/artifact-gates.test.d.ts +0 -1
  386. package/dist/context/ingest/artifact-gates.test.js +0 -167
  387. package/dist/context/ingest/canonical-pins.test.d.ts +0 -1
  388. package/dist/context/ingest/canonical-pins.test.js +0 -66
  389. package/dist/context/ingest/clustering/kmeans.test.d.ts +0 -1
  390. package/dist/context/ingest/clustering/kmeans.test.js +0 -61
  391. package/dist/context/ingest/context-candidates/candidate-dedup.service.test.d.ts +0 -1
  392. package/dist/context/ingest/context-candidates/candidate-dedup.service.test.js +0 -216
  393. package/dist/context/ingest/context-candidates/context-candidate-carryforward.service.test.d.ts +0 -1
  394. package/dist/context/ingest/context-candidates/context-candidate-carryforward.service.test.js +0 -161
  395. package/dist/context/ingest/context-candidates/curator-pagination.service.test.d.ts +0 -1
  396. package/dist/context/ingest/context-candidates/curator-pagination.service.test.js +0 -168
  397. package/dist/context/ingest/context-candidates/embedding-text.test.d.ts +0 -1
  398. package/dist/context/ingest/context-candidates/embedding-text.test.js +0 -10
  399. package/dist/context/ingest/context-candidates/store.test.d.ts +0 -1
  400. package/dist/context/ingest/context-candidates/store.test.js +0 -67
  401. package/dist/context/ingest/context-evidence/context-evidence-index.service.test.d.ts +0 -1
  402. package/dist/context/ingest/context-evidence/context-evidence-index.service.test.js +0 -374
  403. package/dist/context/ingest/context-evidence/sqlite-context-evidence-store.test.d.ts +0 -1
  404. package/dist/context/ingest/context-evidence/sqlite-context-evidence-store.test.js +0 -416
  405. package/dist/context/ingest/context-evidence/store.test.d.ts +0 -1
  406. package/dist/context/ingest/context-evidence/store.test.js +0 -55
  407. package/dist/context/ingest/dbt-shared/project-vars.test.d.ts +0 -1
  408. package/dist/context/ingest/dbt-shared/project-vars.test.js +0 -90
  409. package/dist/context/ingest/dbt-shared/schema-files.test.d.ts +0 -1
  410. package/dist/context/ingest/dbt-shared/schema-files.test.js +0 -35
  411. package/dist/context/ingest/diff-set.service.test.d.ts +0 -1
  412. package/dist/context/ingest/diff-set.service.test.js +0 -132
  413. package/dist/context/ingest/final-gate-repair.test.d.ts +0 -1
  414. package/dist/context/ingest/final-gate-repair.test.js +0 -109
  415. package/dist/context/ingest/finalization-scope.test.d.ts +0 -1
  416. package/dist/context/ingest/finalization-scope.test.js +0 -114
  417. package/dist/context/ingest/ingest-bundle.runner.isolated-diff.test.d.ts +0 -1
  418. package/dist/context/ingest/ingest-bundle.runner.isolated-diff.test.js +0 -1928
  419. package/dist/context/ingest/ingest-bundle.runner.test.d.ts +0 -1
  420. package/dist/context/ingest/ingest-bundle.runner.test.js +0 -1899
  421. package/dist/context/ingest/ingest-prompts.test.d.ts +0 -1
  422. package/dist/context/ingest/ingest-prompts.test.js +0 -32
  423. package/dist/context/ingest/ingest-runtime-assets.test.d.ts +0 -1
  424. package/dist/context/ingest/ingest-runtime-assets.test.js +0 -89
  425. package/dist/context/ingest/ingest-trace.test.d.ts +0 -1
  426. package/dist/context/ingest/ingest-trace.test.js +0 -76
  427. package/dist/context/ingest/isolated-diff/git-patch.test.d.ts +0 -1
  428. package/dist/context/ingest/isolated-diff/git-patch.test.js +0 -76
  429. package/dist/context/ingest/isolated-diff/patch-integrator.test.d.ts +0 -1
  430. package/dist/context/ingest/isolated-diff/patch-integrator.test.js +0 -369
  431. package/dist/context/ingest/isolated-diff/textual-conflict-resolver.test.d.ts +0 -1
  432. package/dist/context/ingest/isolated-diff/textual-conflict-resolver.test.js +0 -101
  433. package/dist/context/ingest/isolated-diff/work-unit-executor.test.d.ts +0 -1
  434. package/dist/context/ingest/isolated-diff/work-unit-executor.test.js +0 -137
  435. package/dist/context/ingest/local-adapters.test.d.ts +0 -1
  436. package/dist/context/ingest/local-adapters.test.js +0 -612
  437. package/dist/context/ingest/local-bundle-ingest.test.d.ts +0 -1
  438. package/dist/context/ingest/local-bundle-ingest.test.js +0 -794
  439. package/dist/context/ingest/local-bundle-runtime.test.d.ts +0 -1
  440. package/dist/context/ingest/local-bundle-runtime.test.js +0 -240
  441. package/dist/context/ingest/local-embedding-provider.integration.test.d.ts +0 -1
  442. package/dist/context/ingest/local-embedding-provider.integration.test.js +0 -139
  443. package/dist/context/ingest/local-mapping-reconcile.test.d.ts +0 -1
  444. package/dist/context/ingest/local-mapping-reconcile.test.js +0 -61
  445. package/dist/context/ingest/local-metabase-ingest.test.d.ts +0 -1
  446. package/dist/context/ingest/local-metabase-ingest.test.js +0 -227
  447. package/dist/context/ingest/local-stage-ingest.test.d.ts +0 -1
  448. package/dist/context/ingest/local-stage-ingest.test.js +0 -581
  449. package/dist/context/ingest/memory-flow/acceptance-fixtures.d.ts +0 -6
  450. package/dist/context/ingest/memory-flow/acceptance-fixtures.js +0 -155
  451. package/dist/context/ingest/memory-flow/acceptance.test.d.ts +0 -1
  452. package/dist/context/ingest/memory-flow/acceptance.test.js +0 -43
  453. package/dist/context/ingest/memory-flow/events.test.d.ts +0 -1
  454. package/dist/context/ingest/memory-flow/events.test.js +0 -319
  455. package/dist/context/ingest/memory-flow/interaction.test.d.ts +0 -1
  456. package/dist/context/ingest/memory-flow/interaction.test.js +0 -264
  457. package/dist/context/ingest/memory-flow/interactive-render.test.d.ts +0 -1
  458. package/dist/context/ingest/memory-flow/interactive-render.test.js +0 -160
  459. package/dist/context/ingest/memory-flow/live-buffer.test.d.ts +0 -1
  460. package/dist/context/ingest/memory-flow/live-buffer.test.js +0 -77
  461. package/dist/context/ingest/memory-flow/render.test.d.ts +0 -1
  462. package/dist/context/ingest/memory-flow/render.test.js +0 -105
  463. package/dist/context/ingest/memory-flow/schema.test.d.ts +0 -1
  464. package/dist/context/ingest/memory-flow/schema.test.js +0 -147
  465. package/dist/context/ingest/memory-flow/summary.test.d.ts +0 -1
  466. package/dist/context/ingest/memory-flow/summary.test.js +0 -130
  467. package/dist/context/ingest/memory-flow/view-model.test.d.ts +0 -1
  468. package/dist/context/ingest/memory-flow/view-model.test.js +0 -397
  469. package/dist/context/ingest/memory-flow/visuals.test.d.ts +0 -1
  470. package/dist/context/ingest/memory-flow/visuals.test.js +0 -49
  471. package/dist/context/ingest/page-triage/page-triage.service.test.d.ts +0 -1
  472. package/dist/context/ingest/page-triage/page-triage.service.test.js +0 -311
  473. package/dist/context/ingest/raw-sources-paths.test.d.ts +0 -1
  474. package/dist/context/ingest/raw-sources-paths.test.js +0 -18
  475. package/dist/context/ingest/repo-fetch.test.d.ts +0 -1
  476. package/dist/context/ingest/repo-fetch.test.js +0 -168
  477. package/dist/context/ingest/report-snapshot.test.d.ts +0 -1
  478. package/dist/context/ingest/report-snapshot.test.js +0 -329
  479. package/dist/context/ingest/semantic-layer-target-policy.test.d.ts +0 -1
  480. package/dist/context/ingest/semantic-layer-target-policy.test.js +0 -25
  481. package/dist/context/ingest/source-adapter-registry.test.d.ts +0 -1
  482. package/dist/context/ingest/source-adapter-registry.test.js +0 -35
  483. package/dist/context/ingest/sqlite-bundle-ingest-store.test.d.ts +0 -1
  484. package/dist/context/ingest/sqlite-bundle-ingest-store.test.js +0 -517
  485. package/dist/context/ingest/sqlite-local-ingest-store.test.d.ts +0 -1
  486. package/dist/context/ingest/sqlite-local-ingest-store.test.js +0 -143
  487. package/dist/context/ingest/stages/build-reconcile-context.context-candidates.test.d.ts +0 -1
  488. package/dist/context/ingest/stages/build-reconcile-context.context-candidates.test.js +0 -102
  489. package/dist/context/ingest/stages/build-reconcile-context.test.d.ts +0 -1
  490. package/dist/context/ingest/stages/build-reconcile-context.test.js +0 -141
  491. package/dist/context/ingest/stages/build-wu-context.test.d.ts +0 -1
  492. package/dist/context/ingest/stages/build-wu-context.test.js +0 -196
  493. package/dist/context/ingest/stages/stage-1-stage-raw-files.test.d.ts +0 -1
  494. package/dist/context/ingest/stages/stage-1-stage-raw-files.test.js +0 -54
  495. package/dist/context/ingest/stages/stage-3-work-units.test.d.ts +0 -1
  496. package/dist/context/ingest/stages/stage-3-work-units.test.js +0 -175
  497. package/dist/context/ingest/stages/stage-4-reconciliation.test.d.ts +0 -1
  498. package/dist/context/ingest/stages/stage-4-reconciliation.test.js +0 -144
  499. package/dist/context/ingest/stages/validate-wu-sources.test.d.ts +0 -1
  500. package/dist/context/ingest/stages/validate-wu-sources.test.js +0 -27
  501. package/dist/context/ingest/tools/emit-reconciliation-records.tool.test.d.ts +0 -1
  502. package/dist/context/ingest/tools/emit-reconciliation-records.tool.test.js +0 -237
  503. package/dist/context/ingest/tools/eviction-list.tool.test.d.ts +0 -1
  504. package/dist/context/ingest/tools/eviction-list.tool.test.js +0 -44
  505. package/dist/context/ingest/tools/read-raw-file.tool.test.d.ts +0 -1
  506. package/dist/context/ingest/tools/read-raw-file.tool.test.js +0 -45
  507. package/dist/context/ingest/tools/read-raw-span.tool.test.d.ts +0 -1
  508. package/dist/context/ingest/tools/read-raw-span.tool.test.js +0 -34
  509. package/dist/context/ingest/tools/stage-diff.tool.test.d.ts +0 -1
  510. package/dist/context/ingest/tools/stage-diff.tool.test.js +0 -112
  511. package/dist/context/ingest/tools/stage-list.tool.test.d.ts +0 -1
  512. package/dist/context/ingest/tools/stage-list.tool.test.js +0 -58
  513. package/dist/context/ingest/tools/tool-transcript-summary.test.d.ts +0 -1
  514. package/dist/context/ingest/tools/tool-transcript-summary.test.js +0 -141
  515. package/dist/context/ingest/tools/warehouse-verification/discover-data.tool.test.d.ts +0 -1
  516. package/dist/context/ingest/tools/warehouse-verification/discover-data.tool.test.js +0 -107
  517. package/dist/context/ingest/tools/warehouse-verification/entity-details.tool.test.d.ts +0 -1
  518. package/dist/context/ingest/tools/warehouse-verification/entity-details.tool.test.js +0 -146
  519. package/dist/context/ingest/tools/warehouse-verification/sql-execution.tool.test.d.ts +0 -1
  520. package/dist/context/ingest/tools/warehouse-verification/sql-execution.tool.test.js +0 -50
  521. package/dist/context/ingest/wiki-body-refs.test.d.ts +0 -1
  522. package/dist/context/ingest/wiki-body-refs.test.js +0 -138
  523. package/dist/context/ingest/wiki-sl-ref-repair.test.d.ts +0 -1
  524. package/dist/context/ingest/wiki-sl-ref-repair.test.js +0 -81
  525. package/dist/context/llm/ai-sdk-runtime.test.d.ts +0 -1
  526. package/dist/context/llm/ai-sdk-runtime.test.js +0 -308
  527. package/dist/context/llm/claude-code-env.test.d.ts +0 -1
  528. package/dist/context/llm/claude-code-env.test.js +0 -17
  529. package/dist/context/llm/claude-code-models.test.d.ts +0 -1
  530. package/dist/context/llm/claude-code-models.test.js +0 -15
  531. package/dist/context/llm/claude-code-runtime.test.d.ts +0 -1
  532. package/dist/context/llm/claude-code-runtime.test.js +0 -434
  533. package/dist/context/llm/debug-request-recorder.test.d.ts +0 -1
  534. package/dist/context/llm/debug-request-recorder.test.js +0 -112
  535. package/dist/context/llm/embedding-port.test.d.ts +0 -1
  536. package/dist/context/llm/embedding-port.test.js +0 -34
  537. package/dist/context/llm/local-config.test.d.ts +0 -1
  538. package/dist/context/llm/local-config.test.js +0 -164
  539. package/dist/context/llm/runtime-local-config.test.d.ts +0 -1
  540. package/dist/context/llm/runtime-local-config.test.js +0 -17
  541. package/dist/context/llm/runtime-tools.test.d.ts +0 -1
  542. package/dist/context/llm/runtime-tools.test.js +0 -36
  543. package/dist/context/mcp/local-project-ports.test.d.ts +0 -1
  544. package/dist/context/mcp/local-project-ports.test.js +0 -689
  545. package/dist/context/mcp/server.test.d.ts +0 -1
  546. package/dist/context/mcp/server.test.js +0 -902
  547. package/dist/context/memory/local-memory.test.d.ts +0 -1
  548. package/dist/context/memory/local-memory.test.js +0 -173
  549. package/dist/context/memory/memory-agent.service.ingest.test.d.ts +0 -1
  550. package/dist/context/memory/memory-agent.service.ingest.test.js +0 -355
  551. package/dist/context/memory/memory-agent.service.test.d.ts +0 -1
  552. package/dist/context/memory/memory-agent.service.test.js +0 -413
  553. package/dist/context/memory/memory-runs.test.d.ts +0 -1
  554. package/dist/context/memory/memory-runs.test.js +0 -158
  555. package/dist/context/memory/memory-runtime-assets.test.d.ts +0 -1
  556. package/dist/context/memory/memory-runtime-assets.test.js +0 -162
  557. package/dist/context/project/config.test.d.ts +0 -1
  558. package/dist/context/project/config.test.js +0 -467
  559. package/dist/context/project/driver-schemas.test.d.ts +0 -1
  560. package/dist/context/project/driver-schemas.test.js +0 -125
  561. package/dist/context/project/local-git-file-store.test.d.ts +0 -1
  562. package/dist/context/project/local-git-file-store.test.js +0 -71
  563. package/dist/context/project/mappings-yaml-schema.test.d.ts +0 -1
  564. package/dist/context/project/mappings-yaml-schema.test.js +0 -79
  565. package/dist/context/project/project.test.d.ts +0 -1
  566. package/dist/context/project/project.test.js +0 -55
  567. package/dist/context/project/setup-config.test.d.ts +0 -1
  568. package/dist/context/project/setup-config.test.js +0 -38
  569. package/dist/context/prompts/prompt.service.test.d.ts +0 -1
  570. package/dist/context/prompts/prompt.service.test.js +0 -43
  571. package/dist/context/scan/credentials.test.d.ts +0 -1
  572. package/dist/context/scan/credentials.test.js +0 -162
  573. package/dist/context/scan/data-dictionary.test.d.ts +0 -1
  574. package/dist/context/scan/data-dictionary.test.js +0 -92
  575. package/dist/context/scan/description-generation.test.d.ts +0 -1
  576. package/dist/context/scan/description-generation.test.js +0 -693
  577. package/dist/context/scan/embedding-text.test.d.ts +0 -1
  578. package/dist/context/scan/embedding-text.test.js +0 -36
  579. package/dist/context/scan/enrichment-state.test.d.ts +0 -1
  580. package/dist/context/scan/enrichment-state.test.js +0 -147
  581. package/dist/context/scan/enrichment-summary.test.d.ts +0 -1
  582. package/dist/context/scan/enrichment-summary.test.js +0 -34
  583. package/dist/context/scan/enrichment-types.test.d.ts +0 -1
  584. package/dist/context/scan/enrichment-types.test.js +0 -141
  585. package/dist/context/scan/entity-details.test.d.ts +0 -1
  586. package/dist/context/scan/entity-details.test.js +0 -234
  587. package/dist/context/scan/local-enrichment-artifacts.test.d.ts +0 -1
  588. package/dist/context/scan/local-enrichment-artifacts.test.js +0 -771
  589. package/dist/context/scan/local-enrichment.test.d.ts +0 -1
  590. package/dist/context/scan/local-enrichment.test.js +0 -765
  591. package/dist/context/scan/local-scan.test.d.ts +0 -1
  592. package/dist/context/scan/local-scan.test.js +0 -1663
  593. package/dist/context/scan/local-structural-artifacts.test.d.ts +0 -1
  594. package/dist/context/scan/local-structural-artifacts.test.js +0 -144
  595. package/dist/context/scan/relationship-benchmark-report.test.d.ts +0 -1
  596. package/dist/context/scan/relationship-benchmark-report.test.js +0 -389
  597. package/dist/context/scan/relationship-benchmarks.test.d.ts +0 -1
  598. package/dist/context/scan/relationship-benchmarks.test.js +0 -1072
  599. package/dist/context/scan/relationship-budget.test.d.ts +0 -1
  600. package/dist/context/scan/relationship-budget.test.js +0 -71
  601. package/dist/context/scan/relationship-candidates.test.d.ts +0 -1
  602. package/dist/context/scan/relationship-candidates.test.js +0 -747
  603. package/dist/context/scan/relationship-composite-candidates.test.d.ts +0 -1
  604. package/dist/context/scan/relationship-composite-candidates.test.js +0 -69
  605. package/dist/context/scan/relationship-diagnostics.test.d.ts +0 -1
  606. package/dist/context/scan/relationship-diagnostics.test.js +0 -333
  607. package/dist/context/scan/relationship-discovery.test.d.ts +0 -1
  608. package/dist/context/scan/relationship-discovery.test.js +0 -618
  609. package/dist/context/scan/relationship-formal-metadata.test.d.ts +0 -1
  610. package/dist/context/scan/relationship-formal-metadata.test.js +0 -125
  611. package/dist/context/scan/relationship-graph-resolver.test.d.ts +0 -1
  612. package/dist/context/scan/relationship-graph-resolver.test.js +0 -604
  613. package/dist/context/scan/relationship-llm-proposal.test.d.ts +0 -1
  614. package/dist/context/scan/relationship-llm-proposal.test.js +0 -197
  615. package/dist/context/scan/relationship-locality.test.d.ts +0 -1
  616. package/dist/context/scan/relationship-locality.test.js +0 -128
  617. package/dist/context/scan/relationship-name-similarity.test.d.ts +0 -1
  618. package/dist/context/scan/relationship-name-similarity.test.js +0 -68
  619. package/dist/context/scan/relationship-profiling.test.d.ts +0 -1
  620. package/dist/context/scan/relationship-profiling.test.js +0 -392
  621. package/dist/context/scan/relationship-scoring.test.d.ts +0 -1
  622. package/dist/context/scan/relationship-scoring.test.js +0 -86
  623. package/dist/context/scan/relationship-validation.test.d.ts +0 -1
  624. package/dist/context/scan/relationship-validation.test.js +0 -455
  625. package/dist/context/scan/table-ref.test.d.ts +0 -1
  626. package/dist/context/scan/table-ref.test.js +0 -53
  627. package/dist/context/scan/type-normalization.test.d.ts +0 -1
  628. package/dist/context/scan/type-normalization.test.js +0 -21
  629. package/dist/context/scan/types.test.d.ts +0 -1
  630. package/dist/context/scan/types.test.js +0 -206
  631. package/dist/context/scan/warehouse-catalog.test.d.ts +0 -1
  632. package/dist/context/scan/warehouse-catalog.test.js +0 -158
  633. package/dist/context/search/backend-conformance.test-utils.d.ts +0 -39
  634. package/dist/context/search/backend-conformance.test-utils.js +0 -88
  635. package/dist/context/search/backend-conformance.test-utils.test.d.ts +0 -1
  636. package/dist/context/search/backend-conformance.test-utils.test.js +0 -408
  637. package/dist/context/search/discover.test.d.ts +0 -1
  638. package/dist/context/search/discover.test.js +0 -197
  639. package/dist/context/search/hybrid-search-core.test.d.ts +0 -1
  640. package/dist/context/search/hybrid-search-core.test.js +0 -113
  641. package/dist/context/search/pglite-owner-process.test.d.ts +0 -1
  642. package/dist/context/search/pglite-owner-process.test.js +0 -273
  643. package/dist/context/search/pglite-runtime-boundary.test.d.ts +0 -1
  644. package/dist/context/search/pglite-runtime-boundary.test.js +0 -40
  645. package/dist/context/search/pglite-spike.test.d.ts +0 -1
  646. package/dist/context/search/pglite-spike.test.js +0 -249
  647. package/dist/context/search/query.test.d.ts +0 -1
  648. package/dist/context/search/query.test.js +0 -23
  649. package/dist/context/search/rrf.test.d.ts +0 -1
  650. package/dist/context/search/rrf.test.js +0 -47
  651. package/dist/context/skills/skills-registry.service.test.d.ts +0 -1
  652. package/dist/context/skills/skills-registry.service.test.js +0 -161
  653. package/dist/context/sl/dictionary-search.test.d.ts +0 -1
  654. package/dist/context/sl/dictionary-search.test.js +0 -204
  655. package/dist/context/sl/local-query.test.d.ts +0 -1
  656. package/dist/context/sl/local-query.test.js +0 -283
  657. package/dist/context/sl/local-sl.test.d.ts +0 -1
  658. package/dist/context/sl/local-sl.test.js +0 -334
  659. package/dist/context/sl/pglite-sl-search-prototype.test.d.ts +0 -1
  660. package/dist/context/sl/pglite-sl-search-prototype.test.js +0 -240
  661. package/dist/context/sl/schemas.contract.test.d.ts +0 -1
  662. package/dist/context/sl/schemas.contract.test.js +0 -62
  663. package/dist/context/sl/semantic-layer.service.test.d.ts +0 -1
  664. package/dist/context/sl/semantic-layer.service.test.js +0 -1107
  665. package/dist/context/sl/sl-dictionary-profile.test.d.ts +0 -1
  666. package/dist/context/sl/sl-dictionary-profile.test.js +0 -88
  667. package/dist/context/sl/sl-search.service.test.d.ts +0 -1
  668. package/dist/context/sl/sl-search.service.test.js +0 -256
  669. package/dist/context/sl/sqlite-sl-sources-index.test.d.ts +0 -1
  670. package/dist/context/sl/sqlite-sl-sources-index.test.js +0 -175
  671. package/dist/context/sl/tools/connection-id-schema.test.d.ts +0 -1
  672. package/dist/context/sl/tools/connection-id-schema.test.js +0 -14
  673. package/dist/context/sl/tools/sl-discover.tool.test.d.ts +0 -1
  674. package/dist/context/sl/tools/sl-discover.tool.test.js +0 -72
  675. package/dist/context/sl/tools/sl-edit-source.tool.test.d.ts +0 -1
  676. package/dist/context/sl/tools/sl-edit-source.tool.test.js +0 -184
  677. package/dist/context/sl/tools/sl-read-source.tool.session.test.d.ts +0 -1
  678. package/dist/context/sl/tools/sl-read-source.tool.session.test.js +0 -55
  679. package/dist/context/sl/tools/sl-rollback.tool.test.d.ts +0 -1
  680. package/dist/context/sl/tools/sl-rollback.tool.test.js +0 -57
  681. package/dist/context/sl/tools/sl-validate.tool.test.d.ts +0 -1
  682. package/dist/context/sl/tools/sl-validate.tool.test.js +0 -54
  683. package/dist/context/sl/tools/sl-warehouse-validation.test.d.ts +0 -1
  684. package/dist/context/sl/tools/sl-warehouse-validation.test.js +0 -136
  685. package/dist/context/sl/tools/sl-write-source.tool.test.d.ts +0 -1
  686. package/dist/context/sl/tools/sl-write-source.tool.test.js +0 -307
  687. package/dist/context/sql-analysis/http-sql-analysis-port.test.d.ts +0 -1
  688. package/dist/context/sql-analysis/http-sql-analysis-port.test.js +0 -147
  689. package/dist/context/test/make-local-git-repo.d.ts +0 -10
  690. package/dist/context/test/make-local-git-repo.js +0 -34
  691. package/dist/context/tools/context-evidence-tools.test.d.ts +0 -1
  692. package/dist/context/tools/context-evidence-tools.test.js +0 -486
  693. package/dist/context/tools/touched-sl-sources.test.d.ts +0 -1
  694. package/dist/context/tools/touched-sl-sources.test.js +0 -31
  695. package/dist/context/wiki/knowledge-wiki.service.test.d.ts +0 -1
  696. package/dist/context/wiki/knowledge-wiki.service.test.js +0 -205
  697. package/dist/context/wiki/local-knowledge.test.d.ts +0 -1
  698. package/dist/context/wiki/local-knowledge.test.js +0 -270
  699. package/dist/context/wiki/sqlite-knowledge-index.test.d.ts +0 -1
  700. package/dist/context/wiki/sqlite-knowledge-index.test.js +0 -129
  701. package/dist/context/wiki/tools/wiki-list-tags.tool.test.d.ts +0 -1
  702. package/dist/context/wiki/tools/wiki-list-tags.tool.test.js +0 -35
  703. package/dist/context/wiki/tools/wiki-read.tool.test.d.ts +0 -1
  704. package/dist/context/wiki/tools/wiki-read.tool.test.js +0 -66
  705. package/dist/context/wiki/tools/wiki-remove.tool.test.d.ts +0 -1
  706. package/dist/context/wiki/tools/wiki-remove.tool.test.js +0 -95
  707. package/dist/context/wiki/tools/wiki-search.tool.test.d.ts +0 -1
  708. package/dist/context/wiki/tools/wiki-search.tool.test.js +0 -35
  709. package/dist/context/wiki/tools/wiki-write.tool.test.d.ts +0 -1
  710. package/dist/context/wiki/tools/wiki-write.tool.test.js +0 -264
  711. package/dist/context/wiki/wiki-ref-validation.test.d.ts +0 -1
  712. package/dist/context/wiki/wiki-ref-validation.test.js +0 -64
  713. package/dist/context-build-view.test.d.ts +0 -1
  714. package/dist/context-build-view.test.js +0 -942
  715. package/dist/database-tree-picker.test.d.ts +0 -1
  716. package/dist/database-tree-picker.test.js +0 -188
  717. package/dist/demo-assets.test.d.ts +0 -1
  718. package/dist/demo-assets.test.js +0 -121
  719. package/dist/demo-metrics.test.d.ts +0 -1
  720. package/dist/demo-metrics.test.js +0 -108
  721. package/dist/doctor.test.d.ts +0 -1
  722. package/dist/doctor.test.js +0 -596
  723. package/dist/embedding-resolution.test.d.ts +0 -1
  724. package/dist/embedding-resolution.test.js +0 -132
  725. package/dist/example-smoke.test.d.ts +0 -1
  726. package/dist/example-smoke.test.js +0 -83
  727. package/dist/index.test.d.ts +0 -1
  728. package/dist/index.test.js +0 -1300
  729. package/dist/ingest-query-executor.test.d.ts +0 -1
  730. package/dist/ingest-query-executor.test.js +0 -71
  731. package/dist/ingest-report-file.test.d.ts +0 -1
  732. package/dist/ingest-report-file.test.js +0 -63
  733. package/dist/ingest-viz.test.d.ts +0 -1
  734. package/dist/ingest-viz.test.js +0 -691
  735. package/dist/ingest.test-utils.d.ts +0 -126
  736. package/dist/ingest.test-utils.js +0 -629
  737. package/dist/ingest.test.d.ts +0 -1
  738. package/dist/ingest.test.js +0 -1568
  739. package/dist/io/logger.test.d.ts +0 -1
  740. package/dist/io/logger.test.js +0 -55
  741. package/dist/io/mode.test.d.ts +0 -1
  742. package/dist/io/mode.test.js +0 -48
  743. package/dist/io/print-list.test.d.ts +0 -1
  744. package/dist/io/print-list.test.js +0 -277
  745. package/dist/knowledge.test.d.ts +0 -1
  746. package/dist/knowledge.test.js +0 -198
  747. package/dist/llm/embedding-health.test.d.ts +0 -1
  748. package/dist/llm/embedding-health.test.js +0 -72
  749. package/dist/llm/embedding-provider.test.d.ts +0 -1
  750. package/dist/llm/embedding-provider.test.js +0 -84
  751. package/dist/llm/message-builder.test.d.ts +0 -1
  752. package/dist/llm/message-builder.test.js +0 -127
  753. package/dist/llm/model-health.test.d.ts +0 -1
  754. package/dist/llm/model-health.test.js +0 -55
  755. package/dist/llm/model-provider.test.d.ts +0 -1
  756. package/dist/llm/model-provider.test.js +0 -246
  757. package/dist/llm/repair.test.d.ts +0 -1
  758. package/dist/llm/repair.test.js +0 -78
  759. package/dist/local-adapters.test.d.ts +0 -1
  760. package/dist/local-adapters.test.js +0 -166
  761. package/dist/local-scan-connectors.test.d.ts +0 -1
  762. package/dist/local-scan-connectors.test.js +0 -92
  763. package/dist/managed-local-embeddings.test.d.ts +0 -1
  764. package/dist/managed-local-embeddings.test.js +0 -229
  765. package/dist/managed-mcp-daemon.test.d.ts +0 -1
  766. package/dist/managed-mcp-daemon.test.js +0 -187
  767. package/dist/managed-python-command.test.d.ts +0 -1
  768. package/dist/managed-python-command.test.js +0 -262
  769. package/dist/managed-python-daemon.test.d.ts +0 -1
  770. package/dist/managed-python-daemon.test.js +0 -360
  771. package/dist/managed-python-http.test.d.ts +0 -1
  772. package/dist/managed-python-http.test.js +0 -177
  773. package/dist/managed-python-runtime.test.d.ts +0 -1
  774. package/dist/managed-python-runtime.test.js +0 -426
  775. package/dist/mcp-http-server.test.d.ts +0 -1
  776. package/dist/mcp-http-server.test.js +0 -209
  777. package/dist/mcp-server-factory.test.d.ts +0 -1
  778. package/dist/mcp-server-factory.test.js +0 -142
  779. package/dist/memory-flow-interactive.test.d.ts +0 -1
  780. package/dist/memory-flow-interactive.test.js +0 -109
  781. package/dist/memory-flow-tui.test.d.ts +0 -1
  782. package/dist/memory-flow-tui.test.js +0 -247
  783. package/dist/next-steps.test.d.ts +0 -1
  784. package/dist/next-steps.test.js +0 -77
  785. package/dist/notion-page-picker.test.d.ts +0 -1
  786. package/dist/notion-page-picker.test.js +0 -244
  787. package/dist/print-command-tree.test.d.ts +0 -1
  788. package/dist/print-command-tree.test.js +0 -37
  789. package/dist/project-dir.test.d.ts +0 -1
  790. package/dist/project-dir.test.js +0 -124
  791. package/dist/project-resolver.test.d.ts +0 -1
  792. package/dist/project-resolver.test.js +0 -49
  793. package/dist/prompt-navigation.test.d.ts +0 -1
  794. package/dist/prompt-navigation.test.js +0 -33
  795. package/dist/proxy-env.test.d.ts +0 -1
  796. package/dist/proxy-env.test.js +0 -17
  797. package/dist/public-ingest-copy.test.d.ts +0 -1
  798. package/dist/public-ingest-copy.test.js +0 -24
  799. package/dist/public-ingest.test.d.ts +0 -1
  800. package/dist/public-ingest.test.js +0 -891
  801. package/dist/runtime-requirements.test.d.ts +0 -1
  802. package/dist/runtime-requirements.test.js +0 -73
  803. package/dist/runtime.test.d.ts +0 -1
  804. package/dist/runtime.test.js +0 -381
  805. package/dist/scan.test.d.ts +0 -1
  806. package/dist/scan.test.js +0 -1123
  807. package/dist/setup-agents.test.d.ts +0 -1
  808. package/dist/setup-agents.test.js +0 -1028
  809. package/dist/setup-context.test.d.ts +0 -1
  810. package/dist/setup-context.test.js +0 -491
  811. package/dist/setup-databases.test.d.ts +0 -1
  812. package/dist/setup-databases.test.js +0 -2101
  813. package/dist/setup-demo-tour.test.d.ts +0 -1
  814. package/dist/setup-demo-tour.test.js +0 -221
  815. package/dist/setup-embeddings.test.d.ts +0 -1
  816. package/dist/setup-embeddings.test.js +0 -436
  817. package/dist/setup-interrupt.test.d.ts +0 -1
  818. package/dist/setup-interrupt.test.js +0 -77
  819. package/dist/setup-models.test.d.ts +0 -1
  820. package/dist/setup-models.test.js +0 -885
  821. package/dist/setup-project.test.d.ts +0 -1
  822. package/dist/setup-project.test.js +0 -209
  823. package/dist/setup-prompts.test.d.ts +0 -1
  824. package/dist/setup-prompts.test.js +0 -208
  825. package/dist/setup-ready-menu.test.d.ts +0 -1
  826. package/dist/setup-ready-menu.test.js +0 -44
  827. package/dist/setup-runtime.test.d.ts +0 -1
  828. package/dist/setup-runtime.test.js +0 -111
  829. package/dist/setup-secrets.test.d.ts +0 -1
  830. package/dist/setup-secrets.test.js +0 -30
  831. package/dist/setup-sources-notion.test.d.ts +0 -1
  832. package/dist/setup-sources-notion.test.js +0 -109
  833. package/dist/setup-sources.test.d.ts +0 -1
  834. package/dist/setup-sources.test.js +0 -1303
  835. package/dist/setup.test.d.ts +0 -1
  836. package/dist/setup.test.js +0 -1825
  837. package/dist/sl.test.d.ts +0 -1
  838. package/dist/sl.test.js +0 -567
  839. package/dist/source-mapping.test.d.ts +0 -1
  840. package/dist/source-mapping.test.js +0 -65
  841. package/dist/sql.test.d.ts +0 -1
  842. package/dist/sql.test.js +0 -253
  843. package/dist/standalone-smoke.test.d.ts +0 -1
  844. package/dist/standalone-smoke.test.js +0 -250
  845. package/dist/status-project.test.d.ts +0 -1
  846. package/dist/status-project.test.js +0 -502
  847. package/dist/telemetry/command-hook.test.d.ts +0 -1
  848. package/dist/telemetry/command-hook.test.js +0 -31
  849. package/dist/telemetry/demo-detect.test.d.ts +0 -1
  850. package/dist/telemetry/demo-detect.test.js +0 -22
  851. package/dist/telemetry/emitter.test.d.ts +0 -1
  852. package/dist/telemetry/emitter.test.js +0 -103
  853. package/dist/telemetry/events.snapshot.test.d.ts +0 -1
  854. package/dist/telemetry/events.snapshot.test.js +0 -135
  855. package/dist/telemetry/events.test.d.ts +0 -1
  856. package/dist/telemetry/events.test.js +0 -136
  857. package/dist/telemetry/identity.test.d.ts +0 -1
  858. package/dist/telemetry/identity.test.js +0 -148
  859. package/dist/telemetry/project-snapshot.test.d.ts +0 -1
  860. package/dist/telemetry/project-snapshot.test.js +0 -71
  861. package/dist/telemetry/schema-writer.test.d.ts +0 -1
  862. package/dist/telemetry/schema-writer.test.js +0 -23
  863. package/dist/telemetry/scrubber.test.d.ts +0 -1
  864. package/dist/telemetry/scrubber.test.js +0 -21
  865. package/dist/text-ingest.test.d.ts +0 -1
  866. package/dist/text-ingest.test.js +0 -247
  867. package/dist/tree-picker-state.test.d.ts +0 -1
  868. package/dist/tree-picker-state.test.js +0 -303
  869. package/dist/tree-picker-tui.test.d.ts +0 -1
  870. package/dist/tree-picker-tui.test.js +0 -248
  871. package/dist/viz-fallback.test.d.ts +0 -1
  872. package/dist/viz-fallback.test.js +0 -77
@@ -1,1028 +0,0 @@
1
- import { mkdir, mkdtemp, readFile, rm, stat, writeFile } from 'node:fs/promises';
2
- import { tmpdir } from 'node:os';
3
- import { join } from 'node:path';
4
- import { readKtxSetupState } from './context/project/setup-config.js';
5
- import { strFromU8, unzipSync } from 'fflate';
6
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
7
- import { createAgentNextActionsLineFormatter, formatInstallSummaryLines, plannedKtxAgentFiles, readKtxAgentInstallManifest, removeKtxAgentInstall, runKtxSetupAgentsStep, } from './setup-agents.js';
8
- function makeIo() {
9
- let stdout = '';
10
- let stderr = '';
11
- return {
12
- io: {
13
- stdout: { write: (chunk) => (stdout += chunk) },
14
- stderr: { write: (chunk) => (stderr += chunk) },
15
- },
16
- stdout: () => stdout,
17
- stderr: () => stderr,
18
- };
19
- }
20
- async function readZipText(path, entry) {
21
- const archive = unzipSync(new Uint8Array(await readFile(path)));
22
- const content = archive[entry];
23
- if (!content)
24
- throw new Error(`Missing zip entry: ${entry}`);
25
- return strFromU8(content);
26
- }
27
- function captureEnvKeys(env, keys) {
28
- const snapshot = {};
29
- for (const key of keys)
30
- snapshot[key] = env[key];
31
- return snapshot;
32
- }
33
- function clearEnvKeys(env, keys) {
34
- for (const key of keys)
35
- delete env[key];
36
- }
37
- function captureKtxEnv(env) {
38
- const snapshot = {};
39
- for (const key of Object.keys(env)) {
40
- if (key.startsWith('KTX_'))
41
- snapshot[key] = env[key];
42
- }
43
- return snapshot;
44
- }
45
- function clearKtxEnv(env) {
46
- for (const key of Object.keys(env)) {
47
- if (key.startsWith('KTX_'))
48
- delete env[key];
49
- }
50
- }
51
- function restoreEnvKeys(env, snapshot) {
52
- for (const [key, value] of Object.entries(snapshot)) {
53
- if (value === undefined)
54
- delete env[key];
55
- else
56
- env[key] = value;
57
- }
58
- }
59
- describe('setup agents', () => {
60
- let tempDir;
61
- beforeEach(async () => {
62
- tempDir = await mkdtemp(join(tmpdir(), 'ktx-setup-agents-'));
63
- await mkdir(join(tempDir, '.ktx', 'agents'), { recursive: true });
64
- await writeFile(join(tempDir, 'ktx.yaml'), 'connections: {}\n', 'utf-8');
65
- });
66
- afterEach(async () => {
67
- await rm(tempDir, { recursive: true, force: true });
68
- });
69
- it('plans project-scoped MCP analytics files for every target', () => {
70
- expect(plannedKtxAgentFiles({ projectDir: tempDir, target: 'claude-code', scope: 'project', mode: 'mcp' })).toEqual([
71
- { kind: 'file', path: join(tempDir, '.claude/skills/ktx-analytics/SKILL.md'), role: 'analytics-skill' },
72
- ]);
73
- expect(plannedKtxAgentFiles({ projectDir: tempDir, target: 'claude-desktop', scope: 'global', mode: 'mcp' })).toEqual([
74
- { kind: 'file', path: join(tempDir, '.ktx/agents/claude/ktx-plugin-runner.sh'), role: 'launcher' },
75
- {
76
- kind: 'file',
77
- path: join(tempDir, '.ktx/agents/claude/ktx-analytics.zip'),
78
- role: 'claude-desktop-skill-bundle',
79
- },
80
- ]);
81
- expect(plannedKtxAgentFiles({ projectDir: tempDir, target: 'codex', scope: 'project', mode: 'mcp' })).toEqual([
82
- { kind: 'file', path: join(tempDir, '.agents/skills/ktx-analytics/SKILL.md'), role: 'analytics-skill' },
83
- ]);
84
- expect(plannedKtxAgentFiles({ projectDir: tempDir, target: 'cursor', scope: 'project', mode: 'mcp' })).toEqual([
85
- { kind: 'file', path: join(tempDir, '.cursor/rules/ktx-analytics.mdc'), role: 'analytics-skill' },
86
- ]);
87
- expect(plannedKtxAgentFiles({ projectDir: tempDir, target: 'opencode', scope: 'project', mode: 'mcp' })).toEqual([
88
- { kind: 'file', path: join(tempDir, '.opencode/commands/ktx-analytics.md'), role: 'analytics-skill' },
89
- ]);
90
- expect(plannedKtxAgentFiles({ projectDir: tempDir, target: 'universal', scope: 'project', mode: 'mcp' })).toEqual([
91
- { kind: 'file', path: join(tempDir, '.agents/skills/ktx-analytics/SKILL.md'), role: 'analytics-skill' },
92
- ]);
93
- });
94
- it('plans project-scoped admin CLI files for every target when requested', () => {
95
- expect(plannedKtxAgentFiles({ projectDir: tempDir, target: 'claude-code', scope: 'project', mode: 'mcp-cli' })).toEqual([
96
- { kind: 'file', path: join(tempDir, '.claude/skills/ktx-analytics/SKILL.md'), role: 'analytics-skill' },
97
- { kind: 'file', path: join(tempDir, '.claude/skills/ktx/SKILL.md'), role: 'skill' },
98
- { kind: 'file', path: join(tempDir, '.claude/rules/ktx.md'), role: 'rule' },
99
- ]);
100
- expect(plannedKtxAgentFiles({ projectDir: tempDir, target: 'codex', scope: 'project', mode: 'mcp-cli' })).toEqual([
101
- { kind: 'file', path: join(tempDir, '.agents/skills/ktx-analytics/SKILL.md'), role: 'analytics-skill' },
102
- { kind: 'file', path: join(tempDir, '.agents/skills/ktx/SKILL.md'), role: 'skill' },
103
- { kind: 'file', path: join(tempDir, '.codex/instructions/ktx.md'), role: 'rule' },
104
- ]);
105
- expect(plannedKtxAgentFiles({ projectDir: tempDir, target: 'cursor', scope: 'project', mode: 'mcp-cli' })).toEqual([
106
- { kind: 'file', path: join(tempDir, '.cursor/rules/ktx-analytics.mdc'), role: 'analytics-skill' },
107
- { kind: 'file', path: join(tempDir, '.cursor/rules/ktx.mdc') },
108
- ]);
109
- expect(plannedKtxAgentFiles({ projectDir: tempDir, target: 'opencode', scope: 'project', mode: 'mcp-cli' })).toEqual([
110
- { kind: 'file', path: join(tempDir, '.opencode/commands/ktx-analytics.md'), role: 'analytics-skill' },
111
- { kind: 'file', path: join(tempDir, '.opencode/commands/ktx.md') },
112
- ]);
113
- expect(plannedKtxAgentFiles({ projectDir: tempDir, target: 'universal', scope: 'project', mode: 'mcp-cli' })).toEqual([
114
- { kind: 'file', path: join(tempDir, '.agents/skills/ktx-analytics/SKILL.md'), role: 'analytics-skill' },
115
- { kind: 'file', path: join(tempDir, '.agents/skills/ktx/SKILL.md') },
116
- ]);
117
- expect(plannedKtxAgentFiles({ projectDir: tempDir, target: 'claude-desktop', scope: 'global', mode: 'mcp-cli' })).toEqual([
118
- { kind: 'file', path: join(tempDir, '.ktx/agents/claude/ktx-plugin-runner.sh'), role: 'launcher' },
119
- {
120
- kind: 'file',
121
- path: join(tempDir, '.ktx/agents/claude/ktx-analytics.zip'),
122
- role: 'claude-desktop-skill-bundle',
123
- },
124
- {
125
- kind: 'file',
126
- path: join(tempDir, '.ktx/agents/claude/ktx.zip'),
127
- role: 'claude-desktop-skill-bundle',
128
- },
129
- ]);
130
- });
131
- it('installs target files, writes a manifest, and marks agents complete', async () => {
132
- const io = makeIo();
133
- await expect(runKtxSetupAgentsStep({
134
- projectDir: tempDir,
135
- inputMode: 'disabled',
136
- yes: true,
137
- agents: true,
138
- target: 'universal',
139
- scope: 'project',
140
- mode: 'mcp-cli',
141
- skipAgents: false,
142
- }, io.io)).resolves.toMatchObject({
143
- status: 'ready',
144
- projectDir: tempDir,
145
- installs: [{ target: 'universal', scope: 'project', mode: 'mcp-cli' }],
146
- });
147
- await expect(stat(join(tempDir, '.agents/skills/ktx/SKILL.md'))).resolves.toBeDefined();
148
- const skill = await readFile(join(tempDir, '.agents/skills/ktx/SKILL.md'), 'utf-8');
149
- expect(skill).toContain(`--project-dir ${tempDir}`);
150
- expect(skill).toContain('must not print secrets');
151
- expect(skill).toContain('status --json');
152
- expect(skill).toContain('sl --json');
153
- expect(skill).toContain('sl query');
154
- expect(skill).toContain('--format json');
155
- expect(skill).not.toContain('sl query --json');
156
- expect(skill).not.toContain('agent ');
157
- expect(skill).not.toContain('sql execute');
158
- expect(await readKtxAgentInstallManifest(tempDir)).toMatchObject({
159
- version: 1,
160
- projectDir: tempDir,
161
- installs: [{ target: 'universal', scope: 'project', mode: 'mcp-cli' }],
162
- });
163
- expect(await readKtxSetupState(tempDir)).toEqual({ completed_steps: ['agents'] });
164
- expect(io.stderr()).toBe('');
165
- });
166
- it('installs a specified target in non-interactive mode without --yes', async () => {
167
- const io = makeIo();
168
- await expect(runKtxSetupAgentsStep({
169
- projectDir: tempDir,
170
- inputMode: 'disabled',
171
- yes: false,
172
- agents: true,
173
- target: 'claude-code',
174
- scope: 'project',
175
- mode: 'mcp',
176
- skipAgents: false,
177
- }, io.io)).resolves.toMatchObject({
178
- status: 'ready',
179
- projectDir: tempDir,
180
- installs: [{ target: 'claude-code', scope: 'project', mode: 'mcp' }],
181
- });
182
- await expect(stat(join(tempDir, '.claude/skills/ktx-analytics/SKILL.md'))).resolves.toBeDefined();
183
- const mcpConfig = JSON.parse(await readFile(join(tempDir, '.mcp.json'), 'utf-8'));
184
- expect(mcpConfig.mcpServers).toHaveProperty('ktx');
185
- expect(io.stderr()).toBe('');
186
- });
187
- it('prints concrete target guidance when non-interactive agent setup has no target', async () => {
188
- const io = makeIo();
189
- await expect(runKtxSetupAgentsStep({
190
- projectDir: tempDir,
191
- inputMode: 'disabled',
192
- yes: false,
193
- agents: true,
194
- scope: 'project',
195
- mode: 'mcp',
196
- skipAgents: false,
197
- }, io.io)).resolves.toEqual({ status: 'missing-input', projectDir: tempDir });
198
- expect(io.stderr()).toBe('Run in a TTY, or pass --target <target>.\n');
199
- });
200
- it('prints standalone agent next actions after successful installation', async () => {
201
- const io = makeIo();
202
- const result = await runKtxSetupAgentsStep({
203
- projectDir: tempDir,
204
- inputMode: 'disabled',
205
- yes: true,
206
- agents: true,
207
- target: 'claude-code',
208
- scope: 'project',
209
- mode: 'mcp-cli',
210
- skipAgents: false,
211
- }, io.io);
212
- expect(result).toMatchObject({
213
- status: 'ready',
214
- nextActions: expect.stringContaining('Run this command before using Claude Code:'),
215
- });
216
- expect(io.stdout()).toContain('Required before using agents');
217
- expect(io.stdout()).toContain('Run this command before using Claude Code:');
218
- expect(io.stdout()).toContain('RUN:');
219
- expect(io.stdout()).toContain(`ktx mcp start --project-dir ${tempDir}`);
220
- expect(io.stdout()).toContain('If you need to stop MCP later:');
221
- expect(io.stdout()).toContain(`ktx mcp stop --project-dir ${tempDir}`);
222
- expect(io.stdout()).toContain('All set.');
223
- expect(io.stdout()).not.toContain('Finish agent setup');
224
- expect(io.stdout()).not.toContain('Next actions');
225
- });
226
- it('can return agent next actions without printing them', async () => {
227
- const io = makeIo();
228
- const result = await runKtxSetupAgentsStep({
229
- projectDir: tempDir,
230
- inputMode: 'disabled',
231
- yes: true,
232
- agents: true,
233
- target: 'claude-code',
234
- scope: 'project',
235
- mode: 'mcp-cli',
236
- skipAgents: false,
237
- showNextActions: false,
238
- }, io.io);
239
- expect(result).toMatchObject({
240
- status: 'ready',
241
- nextActions: expect.stringContaining(`ktx mcp start --project-dir ${tempDir}`),
242
- });
243
- expect(io.stdout()).toContain('Claude Code · Project scope');
244
- expect(io.stdout()).not.toContain('Agent integration complete');
245
- expect(io.stdout()).not.toContain('Required before using agents');
246
- expect(io.stdout()).not.toContain('All set.');
247
- });
248
- it('installs the analytics skill from the runtime asset', async () => {
249
- const io = makeIo();
250
- await expect(runKtxSetupAgentsStep({
251
- projectDir: tempDir,
252
- inputMode: 'disabled',
253
- yes: true,
254
- agents: true,
255
- target: 'universal',
256
- scope: 'project',
257
- mode: 'mcp-cli',
258
- skipAgents: false,
259
- }, io.io)).resolves.toMatchObject({ status: 'ready' });
260
- const analyticsSkill = await readFile(join(tempDir, '.agents/skills/ktx-analytics/SKILL.md'), 'utf-8');
261
- expect(analyticsSkill).toContain('name: ktx-analytics');
262
- expect(analyticsSkill).toContain('Always run `discover_data` before writing SQL.');
263
- expect(analyticsSkill).toContain('Treat a `dictionary_search` miss as non-authoritative.');
264
- expect(analyticsSkill).toContain('memory_ingest');
265
- expect(analyticsSkill).toContain('ARR is reported in cents');
266
- expect(analyticsSkill).not.toContain(`memory_${'capture'}`);
267
- });
268
- it('writes PATH-independent launcher commands for skills', async () => {
269
- const io = makeIo();
270
- await expect(runKtxSetupAgentsStep({
271
- projectDir: tempDir,
272
- inputMode: 'disabled',
273
- yes: true,
274
- agents: true,
275
- target: 'universal',
276
- scope: 'project',
277
- mode: 'mcp-cli',
278
- skipAgents: false,
279
- }, io.io)).resolves.toMatchObject({ status: 'ready' });
280
- const skill = await readFile(join(tempDir, '.agents/skills/ktx/SKILL.md'), 'utf-8');
281
- expect(skill).not.toContain('`ktx agent');
282
- expect(skill).toContain('status --json');
283
- expect(skill).toContain('sl query');
284
- expect(skill).toContain('--format json');
285
- expect(skill).not.toContain('sl query --json');
286
- expect(skill).not.toContain('sql execute');
287
- });
288
- it('writes Claude Code project MCP config and tracks the json key', async () => {
289
- const io = makeIo();
290
- await expect(runKtxSetupAgentsStep({
291
- projectDir: tempDir,
292
- inputMode: 'disabled',
293
- yes: true,
294
- agents: true,
295
- target: 'claude-code',
296
- scope: 'project',
297
- mode: 'mcp-cli',
298
- skipAgents: false,
299
- }, io.io)).resolves.toMatchObject({ status: 'ready' });
300
- const mcpJson = JSON.parse(await readFile(join(tempDir, '.mcp.json'), 'utf-8'));
301
- expect(mcpJson.mcpServers.ktx).toEqual({ type: 'http', url: 'http://localhost:7878/mcp' });
302
- expect(await readKtxAgentInstallManifest(tempDir)).toMatchObject({
303
- entries: expect.arrayContaining([{ kind: 'json-key', path: join(tempDir, '.mcp.json'), jsonPath: ['mcpServers', 'ktx'] }]),
304
- });
305
- });
306
- it('prompts for MCP-first agent client connection mode in interactive setup', async () => {
307
- const io = makeIo();
308
- const prompts = {
309
- select: vi.fn(async ({ message }) => (message.startsWith('Where') ? 'project' : 'mcp')),
310
- multiselect: vi.fn(async () => ['claude-code']),
311
- cancel: vi.fn(),
312
- };
313
- await expect(runKtxSetupAgentsStep({
314
- projectDir: tempDir,
315
- inputMode: 'auto',
316
- yes: false,
317
- agents: true,
318
- scope: 'project',
319
- mode: 'mcp',
320
- skipAgents: false,
321
- }, io.io, { prompts })).resolves.toMatchObject({
322
- status: 'ready',
323
- installs: [{ target: 'claude-code', scope: 'project', mode: 'mcp' }],
324
- });
325
- expect(prompts.select).toHaveBeenCalledWith({
326
- message: 'What should agents be allowed to do with this KTX project?',
327
- options: [
328
- {
329
- value: 'mcp',
330
- label: 'Ask data questions with KTX MCP',
331
- hint: 'Installs the MCP connection and analytics workflow skill. Best for normal use.',
332
- },
333
- {
334
- value: 'mcp-cli',
335
- label: 'Ask data questions + manage KTX with CLI commands',
336
- hint: 'Adds an admin CLI skill so agents can run ktx status, sl, wiki, and setup commands.',
337
- },
338
- ],
339
- });
340
- expect(prompts.multiselect).toHaveBeenCalledWith(expect.objectContaining({
341
- options: expect.arrayContaining([{ value: 'claude-desktop', label: 'Claude Desktop' }]),
342
- }));
343
- });
344
- it('prompts for global scope when every selected target supports it', async () => {
345
- const home = await mkdtemp(join(tmpdir(), 'ktx-setup-agents-home-'));
346
- const previousHome = process.env.HOME;
347
- process.env.HOME = home;
348
- try {
349
- const io = makeIo();
350
- const prompts = {
351
- select: vi.fn(async ({ message }) => message.startsWith('Where should') ? 'global' : 'mcp'),
352
- multiselect: vi.fn(async () => ['claude-code']),
353
- cancel: vi.fn(),
354
- };
355
- await expect(runKtxSetupAgentsStep({
356
- projectDir: tempDir,
357
- inputMode: 'auto',
358
- yes: false,
359
- agents: true,
360
- scope: 'project',
361
- mode: 'mcp',
362
- skipAgents: false,
363
- }, io.io, { prompts })).resolves.toMatchObject({
364
- status: 'ready',
365
- installs: [{ target: 'claude-code', scope: 'global', mode: 'mcp' }],
366
- });
367
- expect(prompts.select).toHaveBeenCalledWith({
368
- message: `Where should KTX install supported agent config?\n\nKTX project: ${tempDir}`,
369
- options: [
370
- {
371
- value: 'project',
372
- label: 'Project scope (KTX project directory)',
373
- hint: 'Only agents opened from this KTX project path load the project-scoped config.',
374
- },
375
- {
376
- value: 'global',
377
- label: 'Global scope (user config)',
378
- hint: 'Agents can load this KTX project from any working directory.',
379
- },
380
- ],
381
- });
382
- }
383
- finally {
384
- process.env.HOME = previousHome;
385
- await rm(home, { recursive: true, force: true });
386
- }
387
- });
388
- it('registers Claude Desktop MCP and ships an uploadable analytics skill zip', async () => {
389
- const home = await mkdtemp(join(tmpdir(), 'ktx-setup-agents-home-'));
390
- const previousHome = process.env.HOME;
391
- const envSnapshot = captureEnvKeys(process.env, ['OPENAI_API_KEY', 'ANTHROPIC_API_KEY']);
392
- const ktxEnvSnapshot = captureKtxEnv(process.env);
393
- process.env.HOME = home;
394
- clearEnvKeys(process.env, ['OPENAI_API_KEY', 'ANTHROPIC_API_KEY']);
395
- clearKtxEnv(process.env);
396
- try {
397
- const io = makeIo();
398
- await expect(runKtxSetupAgentsStep({
399
- projectDir: tempDir,
400
- inputMode: 'disabled',
401
- yes: true,
402
- agents: true,
403
- target: 'claude-desktop',
404
- scope: 'project',
405
- mode: 'mcp',
406
- skipAgents: false,
407
- }, io.io)).resolves.toMatchObject({
408
- status: 'ready',
409
- installs: [{ target: 'claude-desktop', scope: 'global', mode: 'mcp' }],
410
- });
411
- const analyticsSkillPath = join(tempDir, '.ktx/agents/claude/ktx-analytics.zip');
412
- const adminSkillPath = join(tempDir, '.ktx/agents/claude/ktx.zip');
413
- const launcherPath = join(tempDir, '.ktx/agents/claude/ktx-plugin-runner.sh');
414
- await expect(stat(analyticsSkillPath)).resolves.toBeDefined();
415
- await expect(stat(adminSkillPath)).rejects.toThrow();
416
- const launcherStat = await stat(launcherPath);
417
- expect(launcherStat.mode & 0o111).not.toBe(0);
418
- const launcher = await readFile(launcherPath, 'utf-8');
419
- expect(launcher).toContain('KTX_CLI_BIN=');
420
- expect(launcher).toContain('.nvm/versions/node');
421
- const configPath = join(home, 'Library/Application Support/Claude/claude_desktop_config.json');
422
- const config = JSON.parse(await readFile(configPath, 'utf-8'));
423
- expect(config.mcpServers.ktx).toEqual({
424
- command: launcherPath,
425
- args: ['--project-dir', tempDir, 'mcp', 'stdio'],
426
- });
427
- expect(await readZipText(analyticsSkillPath, 'ktx-analytics/SKILL.md')).toContain('KTX Analytics Workflow');
428
- await expect(readZipText(analyticsSkillPath, 'ktx/SKILL.md')).rejects.toThrow('Missing zip entry');
429
- await expect(readZipText(analyticsSkillPath, '.claude-plugin/plugin.json')).rejects.toThrow('Missing zip entry');
430
- await expect(readZipText(analyticsSkillPath, 'skills/ktx-analytics/SKILL.md')).rejects.toThrow('Missing zip entry');
431
- expect(io.stdout()).toContain('Claude Desktop');
432
- expect(io.stdout()).toContain(analyticsSkillPath);
433
- expect(io.stdout()).not.toContain(adminSkillPath);
434
- expect(io.stdout()).toContain('claude_desktop_config.json');
435
- expect(io.stdout()).toContain('Required before using agents');
436
- expect(io.stdout()).toContain('1. Restart Claude Desktop');
437
- expect(io.stdout()).toContain('Claude Desktop loads KTX MCP after restart.');
438
- expect(io.stdout()).toContain('2. Upload Claude Desktop skills');
439
- expect(io.stdout()).toContain('Customize > Skills > + > Create skill > Upload a skill');
440
- expect(io.stdout()).toContain('Upload this file:');
441
- expect(io.stdout()).toContain('Toggle the uploaded KTX skills on.');
442
- expect(io.stdout()).not.toContain('Run `ktx mcp start`');
443
- }
444
- finally {
445
- process.env.HOME = previousHome;
446
- restoreEnvKeys(process.env, envSnapshot);
447
- restoreEnvKeys(process.env, ktxEnvSnapshot);
448
- await rm(home, { recursive: true, force: true });
449
- }
450
- });
451
- it('captures KTX_*, OPENAI_API_KEY, and ANTHROPIC_API_KEY into the Claude Desktop MCP env block', async () => {
452
- const home = await mkdtemp(join(tmpdir(), 'ktx-setup-agents-home-'));
453
- const previousHome = process.env.HOME;
454
- const envSnapshot = captureEnvKeys(process.env, [
455
- 'OPENAI_API_KEY',
456
- 'ANTHROPIC_API_KEY',
457
- 'KTX_LOG_LEVEL',
458
- ]);
459
- const ktxEnvSnapshot = captureKtxEnv(process.env);
460
- process.env.HOME = home;
461
- clearKtxEnv(process.env);
462
- process.env.OPENAI_API_KEY = 'sk-test-openai'; // pragma: allowlist secret
463
- process.env.ANTHROPIC_API_KEY = 'sk-ant-test'; // pragma: allowlist secret
464
- process.env.KTX_LOG_LEVEL = 'debug';
465
- try {
466
- const io = makeIo();
467
- await runKtxSetupAgentsStep({
468
- projectDir: tempDir,
469
- inputMode: 'disabled',
470
- yes: true,
471
- agents: true,
472
- target: 'claude-desktop',
473
- scope: 'project',
474
- mode: 'mcp',
475
- skipAgents: false,
476
- }, io.io);
477
- const configPath = join(home, 'Library/Application Support/Claude/claude_desktop_config.json');
478
- const config = JSON.parse(await readFile(configPath, 'utf-8'));
479
- expect(config.mcpServers.ktx.env).toEqual({
480
- OPENAI_API_KEY: 'sk-test-openai', // pragma: allowlist secret
481
- ANTHROPIC_API_KEY: 'sk-ant-test', // pragma: allowlist secret
482
- KTX_LOG_LEVEL: 'debug',
483
- });
484
- }
485
- finally {
486
- process.env.HOME = previousHome;
487
- restoreEnvKeys(process.env, envSnapshot);
488
- restoreEnvKeys(process.env, ktxEnvSnapshot);
489
- await rm(home, { recursive: true, force: true });
490
- }
491
- });
492
- it('includes an uploadable admin CLI skill zip for Claude Desktop when requested', async () => {
493
- const home = await mkdtemp(join(tmpdir(), 'ktx-setup-agents-home-'));
494
- const previousHome = process.env.HOME;
495
- process.env.HOME = home;
496
- try {
497
- const io = makeIo();
498
- await expect(runKtxSetupAgentsStep({
499
- projectDir: tempDir,
500
- inputMode: 'disabled',
501
- yes: true,
502
- agents: true,
503
- target: 'claude-desktop',
504
- scope: 'project',
505
- mode: 'mcp-cli',
506
- skipAgents: false,
507
- }, io.io)).resolves.toMatchObject({
508
- status: 'ready',
509
- installs: [{ target: 'claude-desktop', scope: 'global', mode: 'mcp-cli' }],
510
- });
511
- const analyticsSkillPath = join(tempDir, '.ktx/agents/claude/ktx-analytics.zip');
512
- const adminSkillPath = join(tempDir, '.ktx/agents/claude/ktx.zip');
513
- expect(await readZipText(analyticsSkillPath, 'ktx-analytics/SKILL.md')).toContain('KTX Analytics Workflow');
514
- await expect(readZipText(analyticsSkillPath, 'ktx/SKILL.md')).rejects.toThrow('Missing zip entry');
515
- const adminSkill = await readZipText(adminSkillPath, 'ktx/SKILL.md');
516
- expect(adminSkill).toContain(`--project-dir ${tempDir}`);
517
- expect(adminSkill).toContain('status --json');
518
- await expect(readZipText(adminSkillPath, '.mcp.json')).rejects.toThrow('Missing zip entry');
519
- await expect(readZipText(adminSkillPath, 'ktx-analytics/SKILL.md')).rejects.toThrow('Missing zip entry');
520
- expect(io.stdout()).toContain(analyticsSkillPath);
521
- expect(io.stdout()).toContain(adminSkillPath);
522
- expect(io.stdout()).toContain('Upload each file separately:');
523
- }
524
- finally {
525
- process.env.HOME = previousHome;
526
- await rm(home, { recursive: true, force: true });
527
- }
528
- });
529
- it('installs MCP client config and analytics skill without admin CLI files', async () => {
530
- const io = makeIo();
531
- await expect(runKtxSetupAgentsStep({
532
- projectDir: tempDir,
533
- inputMode: 'disabled',
534
- yes: true,
535
- agents: true,
536
- target: 'claude-code',
537
- scope: 'project',
538
- mode: 'mcp',
539
- skipAgents: false,
540
- }, io.io)).resolves.toMatchObject({
541
- status: 'ready',
542
- installs: [{ target: 'claude-code', scope: 'project', mode: 'mcp' }],
543
- });
544
- const mcpJson = JSON.parse(await readFile(join(tempDir, '.mcp.json'), 'utf-8'));
545
- expect(mcpJson.mcpServers.ktx).toEqual({ type: 'http', url: 'http://localhost:7878/mcp' });
546
- await expect(stat(join(tempDir, '.claude/skills/ktx-analytics/SKILL.md'))).resolves.toBeDefined();
547
- await expect(stat(join(tempDir, '.claude/skills/ktx/SKILL.md'))).rejects.toThrow();
548
- await expect(stat(join(tempDir, '.claude/rules/ktx.md'))).rejects.toThrow();
549
- });
550
- it('writes Cursor project MCP config', async () => {
551
- const io = makeIo();
552
- await runKtxSetupAgentsStep({
553
- projectDir: tempDir,
554
- inputMode: 'disabled',
555
- yes: true,
556
- agents: true,
557
- target: 'cursor',
558
- scope: 'project',
559
- mode: 'mcp-cli',
560
- skipAgents: false,
561
- }, io.io);
562
- const cursorJson = JSON.parse(await readFile(join(tempDir, '.cursor/mcp.json'), 'utf-8'));
563
- expect(cursorJson.mcpServers.ktx).toEqual({ url: 'http://localhost:7878/mcp' });
564
- });
565
- it('prints Codex, opencode, and universal snippets without mutating printed-only config files', async () => {
566
- const codexIo = makeIo();
567
- await runKtxSetupAgentsStep({
568
- projectDir: tempDir,
569
- inputMode: 'disabled',
570
- yes: true,
571
- agents: true,
572
- target: 'codex',
573
- scope: 'project',
574
- mode: 'mcp-cli',
575
- skipAgents: false,
576
- }, codexIo.io);
577
- expect(codexIo.stdout()).toContain('[mcp_servers.ktx]');
578
- expect(codexIo.stdout()).toContain('url = "http://localhost:7878/mcp"');
579
- expect(codexIo.stdout()).toContain('1. Configure Codex');
580
- expect(codexIo.stdout()).toContain('Open ~/.codex/config.toml, then paste this block:');
581
- expect(codexIo.stdout()).toContain('PASTE:');
582
- const opencodeIo = makeIo();
583
- await runKtxSetupAgentsStep({
584
- projectDir: tempDir,
585
- inputMode: 'disabled',
586
- yes: true,
587
- agents: true,
588
- target: 'opencode',
589
- scope: 'project',
590
- mode: 'mcp-cli',
591
- skipAgents: false,
592
- }, opencodeIo.io);
593
- expect(opencodeIo.stdout()).toContain('"mcp"');
594
- expect(opencodeIo.stdout()).toContain('"type": "remote"');
595
- expect(opencodeIo.stdout()).toContain('1. Configure OpenCode');
596
- expect(opencodeIo.stdout()).toContain('Open opencode.json, then paste this block:');
597
- await expect(readFile(join(tempDir, 'opencode.json'), 'utf-8')).rejects.toThrow();
598
- const universalIo = makeIo();
599
- await runKtxSetupAgentsStep({
600
- projectDir: tempDir,
601
- inputMode: 'disabled',
602
- yes: true,
603
- agents: true,
604
- target: 'universal',
605
- scope: 'project',
606
- mode: 'mcp',
607
- skipAgents: false,
608
- }, universalIo.io);
609
- expect(universalIo.stdout()).toContain('Universal MCP endpoint:');
610
- expect(universalIo.stdout()).toContain('http://localhost:7878/mcp');
611
- expect(universalIo.stdout()).toContain('1. Configure unsupported MCP clients');
612
- expect(universalIo.stdout()).toContain('Use this endpoint when setting up unsupported MCP clients:');
613
- });
614
- it('uses MCP daemon state for port and token metadata without rendering literal tokens', async () => {
615
- await mkdir(join(tempDir, '.ktx'), { recursive: true });
616
- await writeFile(join(tempDir, '.ktx/mcp.json'), `${JSON.stringify({
617
- schemaVersion: 1,
618
- pid: 999999,
619
- host: '127.0.0.1',
620
- port: 8787,
621
- tokenAuth: true,
622
- projectDir: tempDir,
623
- startedAt: '2026-05-14T00:00:00.000Z',
624
- logPath: join(tempDir, '.ktx/logs/mcp.log'),
625
- }, null, 2)}\n`, 'utf-8');
626
- const io = makeIo();
627
- const previousToken = process.env.KTX_MCP_TOKEN;
628
- process.env.KTX_MCP_TOKEN = 'secret-token';
629
- try {
630
- await runKtxSetupAgentsStep({
631
- projectDir: tempDir,
632
- inputMode: 'disabled',
633
- yes: true,
634
- agents: true,
635
- target: 'claude-code',
636
- scope: 'project',
637
- mode: 'mcp-cli',
638
- skipAgents: false,
639
- }, io.io);
640
- const rendered = JSON.stringify(JSON.parse(await readFile(join(tempDir, '.mcp.json'), 'utf-8')));
641
- expect(rendered).toContain('http://127.0.0.1:8787/mcp');
642
- expect(rendered).toContain('Bearer ${KTX_MCP_TOKEN}');
643
- expect(rendered).not.toContain('secret-token');
644
- expect(io.stdout()).toContain('Run this command before using Claude Code:');
645
- expect(io.stdout()).toContain('RUN:');
646
- expect(io.stdout()).toContain(`ktx mcp start --project-dir ${tempDir}`);
647
- }
648
- finally {
649
- if (previousToken === undefined) {
650
- delete process.env.KTX_MCP_TOKEN;
651
- }
652
- else {
653
- process.env.KTX_MCP_TOKEN = previousToken;
654
- }
655
- }
656
- });
657
- it('writes Claude Code local MCP config under the project key in ~/.claude.json', async () => {
658
- const home = await mkdtemp(join(tmpdir(), 'ktx-setup-agents-home-'));
659
- const previousHome = process.env.HOME;
660
- process.env.HOME = home;
661
- try {
662
- const io = makeIo();
663
- await runKtxSetupAgentsStep({
664
- projectDir: tempDir,
665
- inputMode: 'disabled',
666
- yes: true,
667
- agents: true,
668
- target: 'claude-code',
669
- scope: 'local',
670
- mode: 'mcp-cli',
671
- skipAgents: false,
672
- }, io.io);
673
- const config = JSON.parse(await readFile(join(home, '.claude.json'), 'utf-8'));
674
- expect(config.projects[tempDir].mcpServers.ktx).toEqual({ type: 'http', url: 'http://localhost:7878/mcp' });
675
- }
676
- finally {
677
- process.env.HOME = previousHome;
678
- await rm(home, { recursive: true, force: true });
679
- }
680
- });
681
- it('removes only manifest-listed files', async () => {
682
- const io = makeIo();
683
- await runKtxSetupAgentsStep({
684
- projectDir: tempDir,
685
- inputMode: 'disabled',
686
- yes: true,
687
- agents: true,
688
- target: 'claude-code',
689
- scope: 'project',
690
- mode: 'mcp-cli',
691
- skipAgents: false,
692
- }, io.io);
693
- await writeFile(join(tempDir, '.claude/skills/ktx/keep.txt'), 'user file', 'utf-8');
694
- await expect(removeKtxAgentInstall(tempDir, io.io)).resolves.toBe(0);
695
- await expect(stat(join(tempDir, '.claude/skills/ktx/SKILL.md'))).rejects.toThrow();
696
- await expect(stat(join(tempDir, '.claude/rules/ktx.md'))).rejects.toThrow();
697
- await expect(stat(join(tempDir, '.claude/skills/ktx/keep.txt'))).resolves.toBeDefined();
698
- await expect(readKtxAgentInstallManifest(tempDir)).resolves.toEqual(null);
699
- });
700
- it('removes generated Claude Desktop skill zips from the manifest', async () => {
701
- const home = await mkdtemp(join(tmpdir(), 'ktx-setup-agents-home-'));
702
- const previousHome = process.env.HOME;
703
- process.env.HOME = home;
704
- try {
705
- const io = makeIo();
706
- await runKtxSetupAgentsStep({
707
- projectDir: tempDir,
708
- inputMode: 'disabled',
709
- yes: true,
710
- agents: true,
711
- target: 'claude-desktop',
712
- scope: 'project',
713
- mode: 'mcp-cli',
714
- skipAgents: false,
715
- }, io.io);
716
- const analyticsSkillPath = join(tempDir, '.ktx/agents/claude/ktx-analytics.zip');
717
- const adminSkillPath = join(tempDir, '.ktx/agents/claude/ktx.zip');
718
- const launcherPath = join(tempDir, '.ktx/agents/claude/ktx-plugin-runner.sh');
719
- const configPath = join(home, 'Library/Application Support/Claude/claude_desktop_config.json');
720
- await expect(stat(analyticsSkillPath)).resolves.toBeDefined();
721
- await expect(stat(adminSkillPath)).resolves.toBeDefined();
722
- await expect(stat(launcherPath)).resolves.toBeDefined();
723
- const beforeConfig = JSON.parse(await readFile(configPath, 'utf-8'));
724
- expect(beforeConfig.mcpServers.ktx).toBeDefined();
725
- await expect(removeKtxAgentInstall(tempDir, io.io)).resolves.toBe(0);
726
- await expect(stat(analyticsSkillPath)).rejects.toThrow();
727
- await expect(stat(adminSkillPath)).rejects.toThrow();
728
- await expect(stat(launcherPath)).rejects.toThrow();
729
- const afterConfig = JSON.parse(await readFile(configPath, 'utf-8'));
730
- expect(afterConfig.mcpServers.ktx).toBeUndefined();
731
- await expect(readKtxAgentInstallManifest(tempDir)).resolves.toEqual(null);
732
- }
733
- finally {
734
- process.env.HOME = previousHome;
735
- await rm(home, { recursive: true, force: true });
736
- }
737
- });
738
- it('treats cancel as skip in interactive mode', async () => {
739
- const io = makeIo();
740
- const prompts = {
741
- select: vi.fn(async () => 'back'),
742
- multiselect: vi.fn(async () => ['codex']),
743
- cancel: vi.fn(),
744
- };
745
- await expect(runKtxSetupAgentsStep({
746
- projectDir: tempDir,
747
- inputMode: 'auto',
748
- yes: false,
749
- agents: true,
750
- scope: 'project',
751
- mode: 'mcp-cli',
752
- skipAgents: false,
753
- }, io.io, { prompts })).resolves.toEqual({ status: 'skipped', projectDir: tempDir });
754
- });
755
- it('prints one navigation hint before interactive agent target prompts', async () => {
756
- const io = makeIo();
757
- const prompts = {
758
- select: vi.fn(async () => 'mcp-cli'),
759
- multiselect: vi.fn(async () => ['back']),
760
- cancel: vi.fn(),
761
- };
762
- await expect(runKtxSetupAgentsStep({
763
- projectDir: tempDir,
764
- inputMode: 'auto',
765
- yes: false,
766
- agents: true,
767
- scope: 'project',
768
- mode: 'mcp-cli',
769
- skipAgents: false,
770
- }, io.io, { prompts })).resolves.toEqual({ status: 'back', projectDir: tempDir });
771
- expect(io.stdout()).toContain('Space to select, Enter to confirm, Esc to go back.');
772
- expect(io.stdout().match(/Space to select/g)).toHaveLength(1);
773
- expect(prompts.multiselect).toHaveBeenCalledWith(expect.objectContaining({
774
- message: 'Which agent targets should KTX install?',
775
- }));
776
- });
777
- it('prints per-agent install summary after successful installation', async () => {
778
- const io = makeIo();
779
- await runKtxSetupAgentsStep({
780
- projectDir: tempDir,
781
- inputMode: 'disabled',
782
- yes: true,
783
- agents: true,
784
- target: 'claude-code',
785
- scope: 'project',
786
- mode: 'mcp-cli',
787
- skipAgents: false,
788
- }, io.io);
789
- const output = io.stdout();
790
- expect(output).toContain('Claude Code · Project scope');
791
- expect(output).toContain(join(tempDir, '.mcp.json'));
792
- expect(output).toContain('Requires MCP to be started.');
793
- expect(output).toContain('Analytics skill installed.');
794
- expect(output).toContain('Admin CLI skill installed.');
795
- expect(output).not.toContain('Agent integration complete');
796
- expect(output).not.toContain(`KTX project\n ${tempDir}`);
797
- expect(output).not.toContain('Installed agents');
798
- expect(output).not.toContain('.claude/skills/ktx-analytics/SKILL.md');
799
- expect(output).not.toContain('.claude/skills/ktx/SKILL.md');
800
- expect(output).not.toContain('.claude/rules/ktx.md');
801
- });
802
- it('formats summary with explicit project-scoped config paths', () => {
803
- const summary = formatInstallSummaryLines([{ target: 'cursor', scope: 'project', mode: 'mcp-cli' }], [
804
- { kind: 'file', path: join(tempDir, '.cursor/rules/ktx-analytics.mdc'), role: 'analytics-skill' },
805
- { kind: 'file', path: join(tempDir, '.cursor/rules/ktx.mdc') },
806
- { kind: 'json-key', path: join(tempDir, '.cursor/mcp.json'), jsonPath: ['mcpServers', 'ktx'] },
807
- ], tempDir);
808
- expect(summary).toEqual([
809
- {
810
- title: 'Cursor · Project scope',
811
- lines: [
812
- join(tempDir, '.cursor/mcp.json'),
813
- 'Requires MCP to be started.',
814
- 'Cursor rules installed.',
815
- ],
816
- },
817
- ]);
818
- });
819
- it('formats summary with multiple agent targets', () => {
820
- const summary = formatInstallSummaryLines([
821
- { target: 'claude-code', scope: 'project', mode: 'mcp-cli' },
822
- { target: 'codex', scope: 'project', mode: 'mcp-cli' },
823
- ], [
824
- { kind: 'file', path: join(tempDir, '.claude/skills/ktx-analytics/SKILL.md'), role: 'analytics-skill' },
825
- { kind: 'file', path: join(tempDir, '.claude/skills/ktx/SKILL.md'), role: 'skill' },
826
- { kind: 'file', path: join(tempDir, '.claude/rules/ktx.md'), role: 'rule' },
827
- { kind: 'json-key', path: join(tempDir, '.mcp.json'), jsonPath: ['mcpServers', 'ktx'] },
828
- { kind: 'file', path: join(tempDir, '.agents/skills/ktx-analytics/SKILL.md'), role: 'analytics-skill' },
829
- { kind: 'file', path: join(tempDir, '.agents/skills/ktx/SKILL.md'), role: 'skill' },
830
- { kind: 'file', path: join(tempDir, '.codex/instructions/ktx.md'), role: 'rule' },
831
- ], tempDir);
832
- expect(summary).toEqual([
833
- {
834
- title: 'Claude Code · Project scope',
835
- lines: [
836
- join(tempDir, '.mcp.json'),
837
- 'Requires MCP to be started.',
838
- 'Analytics skill installed.',
839
- 'Admin CLI skill installed.',
840
- ],
841
- },
842
- {
843
- title: 'Codex · Project scope',
844
- lines: [
845
- 'Add the snippet shown below to ~/.codex/config.toml.',
846
- 'Requires MCP to be started.',
847
- 'Codex guidance installed.',
848
- ],
849
- },
850
- ]);
851
- });
852
- it('prints one target-aware next actions block for mixed agent targets', async () => {
853
- const home = await mkdtemp(join(tmpdir(), 'ktx-setup-agents-home-'));
854
- const previousHome = process.env.HOME;
855
- process.env.HOME = home;
856
- try {
857
- const io = makeIo();
858
- const prompts = {
859
- select: vi.fn(async ({ message }) => message.startsWith('Where should') ? 'project' : 'mcp'),
860
- multiselect: vi.fn(async () => ['claude-code', 'claude-desktop']),
861
- cancel: vi.fn(),
862
- };
863
- await expect(runKtxSetupAgentsStep({
864
- projectDir: tempDir,
865
- inputMode: 'auto',
866
- yes: false,
867
- agents: true,
868
- scope: 'project',
869
- mode: 'mcp',
870
- skipAgents: false,
871
- }, io.io, { prompts })).resolves.toMatchObject({
872
- status: 'ready',
873
- installs: [
874
- { target: 'claude-code', scope: 'project', mode: 'mcp' },
875
- { target: 'claude-desktop', scope: 'global', mode: 'mcp' },
876
- ],
877
- });
878
- const output = io.stdout();
879
- expect(output).toContain('Required before using agents');
880
- expect(output).not.toContain('Next actions');
881
- expect(output).toContain('1. Start MCP');
882
- expect(output).toContain('Run this command before using Claude Code:');
883
- expect(output).toContain(`ktx mcp start --project-dir ${tempDir}`);
884
- expect(output).toContain(`ktx mcp stop --project-dir ${tempDir}\n\n2. Open Claude Code`);
885
- expect(output).toContain('Open Claude Code from the KTX project directory');
886
- expect(output).toContain('RUN:');
887
- expect(output).toContain(`cd '${tempDir}'`);
888
- expect(output).toContain('3. Restart Claude Desktop');
889
- expect(output).toContain('Claude Desktop loads KTX MCP after restart.');
890
- expect(output).toContain('4. Upload Claude Desktop skills');
891
- expect(output).toContain('Customize > Skills > + > Create skill > Upload a skill');
892
- expect(output).toContain(join(tempDir, '.ktx/agents/claude/ktx-analytics.zip'));
893
- expect(output).not.toContain(join(tempDir, '.ktx/agents/claude/ktx.zip'));
894
- expect(output).toContain('Upload this file:');
895
- expect(output).toContain('All set.');
896
- expect(output).not.toContain('Finish Claude Desktop setup');
897
- expect(output).not.toContain('Run `ktx mcp start` to enable the configured KTX MCP server.');
898
- }
899
- finally {
900
- process.env.HOME = previousHome;
901
- await rm(home, { recursive: true, force: true });
902
- }
903
- });
904
- it('does not tell global Claude Code installs to open from the project directory', async () => {
905
- const home = await mkdtemp(join(tmpdir(), 'ktx-setup-agents-home-'));
906
- const previousHome = process.env.HOME;
907
- process.env.HOME = home;
908
- try {
909
- const io = makeIo();
910
- await expect(runKtxSetupAgentsStep({
911
- projectDir: tempDir,
912
- inputMode: 'disabled',
913
- yes: true,
914
- agents: true,
915
- target: 'claude-code',
916
- scope: 'global',
917
- mode: 'mcp',
918
- skipAgents: false,
919
- }, io.io)).resolves.toMatchObject({
920
- status: 'ready',
921
- installs: [{ target: 'claude-code', scope: 'global', mode: 'mcp' }],
922
- });
923
- const output = io.stdout();
924
- expect(output).toContain('2. Open Claude Code');
925
- expect(output).toContain('RUN:');
926
- expect(output).toContain('claude');
927
- expect(output).not.toContain('Open Claude Code from the KTX project directory');
928
- expect(output).not.toContain(`cd '${tempDir}'`);
929
- }
930
- finally {
931
- process.env.HOME = previousHome;
932
- await rm(home, { recursive: true, force: true });
933
- }
934
- });
935
- it('explains next actions for Codex, Cursor, OpenCode, and universal MCP targets', async () => {
936
- const io = makeIo();
937
- const prompts = {
938
- select: vi.fn(async () => 'mcp-cli'),
939
- multiselect: vi.fn(async () => ['codex', 'cursor', 'opencode', 'universal']),
940
- cancel: vi.fn(),
941
- };
942
- await expect(runKtxSetupAgentsStep({
943
- projectDir: tempDir,
944
- inputMode: 'auto',
945
- yes: false,
946
- agents: true,
947
- scope: 'project',
948
- mode: 'mcp-cli',
949
- skipAgents: false,
950
- }, io.io, { prompts })).resolves.toMatchObject({
951
- status: 'ready',
952
- installs: [
953
- { target: 'codex', scope: 'project', mode: 'mcp-cli' },
954
- { target: 'cursor', scope: 'project', mode: 'mcp-cli' },
955
- { target: 'opencode', scope: 'project', mode: 'mcp-cli' },
956
- { target: 'universal', scope: 'project', mode: 'mcp-cli' },
957
- ],
958
- });
959
- const output = io.stdout();
960
- expect(output).toContain('Required before using agents');
961
- expect(output).toContain('1. Configure Codex');
962
- expect(output).toContain('2. Configure OpenCode');
963
- expect(output).toContain('3. Configure unsupported MCP clients');
964
- expect(output).toContain('4. Start MCP');
965
- expect(output).toContain('Run this command before using Codex, Cursor, OpenCode, and Universal .agents:');
966
- expect(output).toContain('Open Cursor from the KTX project directory');
967
- expect(output).toContain('Open ~/.codex/config.toml, then paste this block:\n\n PASTE:\n [mcp_servers.ktx]');
968
- expect(output).toContain('Open opencode.json, then paste this block:');
969
- expect(output).toContain('Use this endpoint when setting up unsupported MCP clients:');
970
- expect(output).toContain('Codex guidance installed');
971
- expect(output).toContain('Cursor rules installed');
972
- expect(output).toContain('OpenCode commands installed');
973
- expect(output).toContain('.agents guidance installed');
974
- });
975
- describe('createAgentNextActionsLineFormatter', () => {
976
- function makeColorStdout() {
977
- return { write: () => true, hasColors: () => true };
978
- }
979
- function makePlainStdout() {
980
- return { write: () => true, hasColors: () => false };
981
- }
982
- const ESC = String.fromCharCode(27);
983
- it('returns the line untouched when the stream cannot render colors', () => {
984
- const format = createAgentNextActionsLineFormatter(makePlainStdout());
985
- expect(format('2. Upload Claude Desktop skills')).toBe('2. Upload Claude Desktop skills');
986
- expect(format(' /tmp/ktx/.ktx/agents/claude/ktx.zip')).toBe(' /tmp/ktx/.ktx/agents/claude/ktx.zip');
987
- });
988
- it('styles step headings and aligns sub-prose under the title', () => {
989
- const format = createAgentNextActionsLineFormatter(makeColorStdout());
990
- const heading = format('2. Upload Claude Desktop skills');
991
- expect(heading).toContain(ESC);
992
- expect(heading).toContain('2');
993
- expect(heading).toContain('Upload Claude Desktop skills');
994
- expect(heading).not.toMatch(/^2\. /);
995
- const sub = format(' Toggle the uploaded KTX skills on.');
996
- expect(sub).toMatch(/^ {3}/);
997
- expect(sub).toContain('Toggle the uploaded KTX skills on.');
998
- });
999
- it('renders skill bundle .zip paths as bullets and shortens HOME to ~', () => {
1000
- const previousHome = process.env.HOME;
1001
- process.env.HOME = '/tmp/test-home';
1002
- try {
1003
- const format = createAgentNextActionsLineFormatter(makeColorStdout());
1004
- const line = format(' /tmp/test-home/.ktx/agents/claude/ktx-analytics.zip');
1005
- expect(line).toContain('•');
1006
- expect(line).toContain('~/.ktx/agents/claude/ktx-analytics.zip');
1007
- expect(line).not.toContain('/tmp/test-home/');
1008
- }
1009
- finally {
1010
- if (previousHome === undefined)
1011
- delete process.env.HOME;
1012
- else
1013
- process.env.HOME = previousHome;
1014
- }
1015
- });
1016
- it('replaces breadcrumb separators with a typographic chevron', () => {
1017
- const format = createAgentNextActionsLineFormatter(makeColorStdout());
1018
- const line = format(' Open Claude Desktop: Customize > Skills > + > Create skill > Upload a skill.');
1019
- expect(line).toContain('›');
1020
- expect(line).not.toContain(' > ');
1021
- });
1022
- it('leaves already-styled lines untouched to avoid double-wrapping', () => {
1023
- const format = createAgentNextActionsLineFormatter(makeColorStdout());
1024
- const preStyled = `${ESC}[1m2. Already styled${ESC}[22m`;
1025
- expect(format(preStyled)).toBe(preStyled);
1026
- });
1027
- });
1028
- });