@kaelio/ktx 0.5.0 → 0.7.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 (875) hide show
  1. package/assets/python/{kaelio_ktx-0.5.0-py3-none-any.whl → kaelio_ktx-0.7.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/llm/claude-code-runtime.js +16 -1
  70. package/dist/context/mcp/context-tools.js +11 -48
  71. package/dist/context/mcp/local-project-ports.js +0 -3
  72. package/dist/context/project/config.d.ts +0 -8
  73. package/dist/context/project/driver-schemas.d.ts +0 -4
  74. package/dist/context/project/driver-schemas.js +0 -2
  75. package/dist/context/scan/constraint-discovery.d.ts +19 -0
  76. package/dist/context/scan/constraint-discovery.js +23 -0
  77. package/dist/context/scan/enabled-tables.d.ts +4 -5
  78. package/dist/context/scan/enabled-tables.js +4 -18
  79. package/dist/context/scan/entity-details.js +14 -44
  80. package/dist/context/scan/local-enrichment.js +13 -1
  81. package/dist/context/scan/local-scan.js +5 -4
  82. package/dist/context/scan/local-structural-artifacts.js +51 -0
  83. package/dist/context/scan/relationship-benchmarks.js +9 -6
  84. package/dist/context/scan/relationship-composite-candidates.d.ts +3 -2
  85. package/dist/context/scan/relationship-composite-candidates.js +21 -33
  86. package/dist/context/scan/relationship-discovery.d.ts +3 -2
  87. package/dist/context/scan/relationship-discovery.js +4 -4
  88. package/dist/context/scan/relationship-profiling.d.ts +2 -3
  89. package/dist/context/scan/relationship-profiling.js +25 -94
  90. package/dist/context/scan/relationship-validation.d.ts +3 -2
  91. package/dist/context/scan/relationship-validation.js +12 -22
  92. package/dist/context/scan/table-ref.d.ts +1 -2
  93. package/dist/context/scan/table-ref.js +3 -4
  94. package/dist/context/scan/types.d.ts +6 -2
  95. package/dist/context/scan/warehouse-catalog.js +31 -48
  96. package/dist/context/sl/local-query.js +0 -3
  97. package/dist/context/sl/local-sl.js +0 -13
  98. package/dist/context/sl/semantic-layer.service.js +1 -4
  99. package/dist/context/tools/context-candidate-write.tool.d.ts +2 -2
  100. package/dist/context-build-view.js +1 -1
  101. package/dist/database-tree-picker.js +14 -7
  102. package/dist/error-message.d.ts +1 -0
  103. package/dist/error-message.js +29 -0
  104. package/dist/ingest-depth.js +0 -1
  105. package/dist/ingest.js +2 -2
  106. package/dist/llm/embedding-health.js +2 -2
  107. package/dist/local-scan-connectors.js +13 -56
  108. package/dist/managed-local-embeddings.js +2 -1
  109. package/dist/managed-python-daemon.d.ts +5 -0
  110. package/dist/managed-python-daemon.js +29 -9
  111. package/dist/managed-python-http.js +2 -1
  112. package/dist/public-ingest.js +1 -6
  113. package/dist/runtime-requirements.js +2 -2
  114. package/dist/setup-agents.d.ts +1 -1
  115. package/dist/setup-agents.js +16 -74
  116. package/dist/setup-context.js +2 -1
  117. package/dist/setup-databases.d.ts +3 -13
  118. package/dist/setup-databases.js +141 -313
  119. package/dist/setup-embeddings.js +10 -2
  120. package/dist/setup-project.d.ts +0 -8
  121. package/dist/setup-project.js +3 -27
  122. package/dist/setup-runtime.js +2 -1
  123. package/dist/setup-sources.js +2 -1
  124. package/dist/setup.js +11 -18
  125. package/dist/skills/historic_sql_patterns/SKILL.md +1 -3
  126. package/dist/skills/historic_sql_table_digest/SKILL.md +0 -1
  127. package/dist/skills/sl/SKILL.md +2 -2
  128. package/dist/sql.js +0 -4
  129. package/dist/status-project.d.ts +3 -18
  130. package/dist/status-project.js +42 -216
  131. package/dist/telemetry/events.d.ts +1 -1
  132. package/dist/telemetry/index.js +8 -3
  133. package/dist/tree-picker-state.d.ts +2 -2
  134. package/dist/tree-picker-state.js +29 -13
  135. package/dist/tree-picker-tui.d.ts +3 -1
  136. package/dist/tree-picker-tui.js +20 -32
  137. package/package.json +6 -6
  138. package/dist/admin-reindex.test.d.ts +0 -1
  139. package/dist/admin-reindex.test.js +0 -119
  140. package/dist/admin.test.d.ts +0 -1
  141. package/dist/admin.test.js +0 -201
  142. package/dist/cli-program-telemetry.test.d.ts +0 -1
  143. package/dist/cli-program-telemetry.test.js +0 -89
  144. package/dist/cli-program.test.d.ts +0 -1
  145. package/dist/cli-program.test.js +0 -71
  146. package/dist/command-tree.test.d.ts +0 -1
  147. package/dist/command-tree.test.js +0 -126
  148. package/dist/commands/mcp-commands.test.d.ts +0 -1
  149. package/dist/commands/mcp-commands.test.js +0 -111
  150. package/dist/commands/sql-commands.test.d.ts +0 -1
  151. package/dist/commands/sql-commands.test.js +0 -68
  152. package/dist/connection.test.d.ts +0 -1
  153. package/dist/connection.test.js +0 -426
  154. package/dist/connectors/bigquery/connector.test.d.ts +0 -1
  155. package/dist/connectors/bigquery/connector.test.js +0 -363
  156. package/dist/connectors/bigquery/dialect.test.d.ts +0 -1
  157. package/dist/connectors/bigquery/dialect.test.js +0 -36
  158. package/dist/connectors/clickhouse/connector.test.d.ts +0 -1
  159. package/dist/connectors/clickhouse/connector.test.js +0 -342
  160. package/dist/connectors/clickhouse/dialect.test.d.ts +0 -1
  161. package/dist/connectors/clickhouse/dialect.test.js +0 -36
  162. package/dist/connectors/mysql/connector.test.d.ts +0 -1
  163. package/dist/connectors/mysql/connector.test.js +0 -365
  164. package/dist/connectors/mysql/dialect.test.d.ts +0 -1
  165. package/dist/connectors/mysql/dialect.test.js +0 -36
  166. package/dist/connectors/postgres/connector.test.d.ts +0 -1
  167. package/dist/connectors/postgres/connector.test.js +0 -391
  168. package/dist/connectors/postgres/dialect.test.d.ts +0 -1
  169. package/dist/connectors/postgres/dialect.test.js +0 -37
  170. package/dist/connectors/postgres/historic-sql-query-client.test.d.ts +0 -1
  171. package/dist/connectors/postgres/historic-sql-query-client.test.js +0 -45
  172. package/dist/connectors/snowflake/connector.test.d.ts +0 -1
  173. package/dist/connectors/snowflake/connector.test.js +0 -462
  174. package/dist/connectors/snowflake/dialect.test.d.ts +0 -1
  175. package/dist/connectors/snowflake/dialect.test.js +0 -34
  176. package/dist/connectors/snowflake/identifiers.test.d.ts +0 -1
  177. package/dist/connectors/snowflake/identifiers.test.js +0 -12
  178. package/dist/connectors/snowflake/sdk-logger.test.d.ts +0 -1
  179. package/dist/connectors/snowflake/sdk-logger.test.js +0 -47
  180. package/dist/connectors/sqlite/connector.test.d.ts +0 -1
  181. package/dist/connectors/sqlite/connector.test.js +0 -207
  182. package/dist/connectors/sqlite/dialect.test.d.ts +0 -1
  183. package/dist/connectors/sqlite/dialect.test.js +0 -23
  184. package/dist/connectors/sqlserver/connector.test.d.ts +0 -1
  185. package/dist/connectors/sqlserver/connector.test.js +0 -313
  186. package/dist/connectors/sqlserver/dialect.test.d.ts +0 -1
  187. package/dist/connectors/sqlserver/dialect.test.js +0 -36
  188. package/dist/context/connections/bigquery-identifiers.test.d.ts +0 -1
  189. package/dist/context/connections/bigquery-identifiers.test.js +0 -13
  190. package/dist/context/connections/dialects.test.d.ts +0 -1
  191. package/dist/context/connections/dialects.test.js +0 -24
  192. package/dist/context/connections/local-query-executor.test.d.ts +0 -1
  193. package/dist/context/connections/local-query-executor.test.js +0 -48
  194. package/dist/context/connections/local-warehouse-descriptor.test.d.ts +0 -1
  195. package/dist/context/connections/local-warehouse-descriptor.test.js +0 -53
  196. package/dist/context/connections/notion-config.test.d.ts +0 -1
  197. package/dist/context/connections/notion-config.test.js +0 -121
  198. package/dist/context/connections/postgres-query-executor.test.d.ts +0 -1
  199. package/dist/context/connections/postgres-query-executor.test.js +0 -91
  200. package/dist/context/connections/read-only-sql.test.d.ts +0 -1
  201. package/dist/context/connections/read-only-sql.test.js +0 -20
  202. package/dist/context/connections/sqlite-query-executor.test.d.ts +0 -1
  203. package/dist/context/connections/sqlite-query-executor.test.js +0 -113
  204. package/dist/context/core/config-reference.test.d.ts +0 -1
  205. package/dist/context/core/config-reference.test.js +0 -27
  206. package/dist/context/core/git.service.assert-worktree-clean.test.d.ts +0 -1
  207. package/dist/context/core/git.service.assert-worktree-clean.test.js +0 -62
  208. package/dist/context/core/git.service.delete-directories.test.d.ts +0 -1
  209. package/dist/context/core/git.service.delete-directories.test.js +0 -61
  210. package/dist/context/core/git.service.patch.test.d.ts +0 -1
  211. package/dist/context/core/git.service.patch.test.js +0 -40
  212. package/dist/context/core/git.service.reset-hard.test.d.ts +0 -1
  213. package/dist/context/core/git.service.reset-hard.test.js +0 -47
  214. package/dist/context/core/git.service.test.d.ts +0 -1
  215. package/dist/context/core/git.service.test.js +0 -357
  216. package/dist/context/core/session-worktree.service.test.d.ts +0 -1
  217. package/dist/context/core/session-worktree.service.test.js +0 -97
  218. package/dist/context/daemon/semantic-layer-compute.test.d.ts +0 -1
  219. package/dist/context/daemon/semantic-layer-compute.test.js +0 -305
  220. package/dist/context/index-sync/reindex.test.d.ts +0 -1
  221. package/dist/context/index-sync/reindex.test.js +0 -139
  222. package/dist/context/ingest/action-identity.test.d.ts +0 -1
  223. package/dist/context/ingest/action-identity.test.js +0 -19
  224. package/dist/context/ingest/adapters/dbt/chunk.test.d.ts +0 -1
  225. package/dist/context/ingest/adapters/dbt/chunk.test.js +0 -30
  226. package/dist/context/ingest/adapters/dbt/dbt.adapter.test.d.ts +0 -1
  227. package/dist/context/ingest/adapters/dbt/dbt.adapter.test.js +0 -43
  228. package/dist/context/ingest/adapters/dbt/fetch.test.d.ts +0 -1
  229. package/dist/context/ingest/adapters/dbt/fetch.test.js +0 -30
  230. package/dist/context/ingest/adapters/dbt/parse.test.d.ts +0 -1
  231. package/dist/context/ingest/adapters/dbt/parse.test.js +0 -7
  232. package/dist/context/ingest/adapters/dbt-descriptions/parse-schema.test.d.ts +0 -1
  233. package/dist/context/ingest/adapters/dbt-descriptions/parse-schema.test.js +0 -195
  234. package/dist/context/ingest/adapters/historic-sql/bigquery-query-history-reader.test.d.ts +0 -1
  235. package/dist/context/ingest/adapters/historic-sql/bigquery-query-history-reader.test.js +0 -121
  236. package/dist/context/ingest/adapters/historic-sql/buckets.test.d.ts +0 -1
  237. package/dist/context/ingest/adapters/historic-sql/buckets.test.js +0 -49
  238. package/dist/context/ingest/adapters/historic-sql/chunk-unified.test.d.ts +0 -1
  239. package/dist/context/ingest/adapters/historic-sql/chunk-unified.test.js +0 -160
  240. package/dist/context/ingest/adapters/historic-sql/detect.test.d.ts +0 -1
  241. package/dist/context/ingest/adapters/historic-sql/detect.test.js +0 -48
  242. package/dist/context/ingest/adapters/historic-sql/evidence-tool.test.d.ts +0 -1
  243. package/dist/context/ingest/adapters/historic-sql/evidence-tool.test.js +0 -67
  244. package/dist/context/ingest/adapters/historic-sql/evidence.test.d.ts +0 -1
  245. package/dist/context/ingest/adapters/historic-sql/evidence.test.js +0 -43
  246. package/dist/context/ingest/adapters/historic-sql/historic-sql.adapter.test.d.ts +0 -1
  247. package/dist/context/ingest/adapters/historic-sql/historic-sql.adapter.test.js +0 -98
  248. package/dist/context/ingest/adapters/historic-sql/local-ingest-acceptance.test.d.ts +0 -1
  249. package/dist/context/ingest/adapters/historic-sql/local-ingest-acceptance.test.js +0 -235
  250. package/dist/context/ingest/adapters/historic-sql/pattern-inputs.test.d.ts +0 -1
  251. package/dist/context/ingest/adapters/historic-sql/pattern-inputs.test.js +0 -68
  252. package/dist/context/ingest/adapters/historic-sql/postgres-pgss-reader.test.d.ts +0 -1
  253. package/dist/context/ingest/adapters/historic-sql/postgres-pgss-reader.test.js +0 -205
  254. package/dist/context/ingest/adapters/historic-sql/projection.test.d.ts +0 -1
  255. package/dist/context/ingest/adapters/historic-sql/projection.test.js +0 -392
  256. package/dist/context/ingest/adapters/historic-sql/redaction.test.d.ts +0 -1
  257. package/dist/context/ingest/adapters/historic-sql/redaction.test.js +0 -22
  258. package/dist/context/ingest/adapters/historic-sql/skill-schemas.test.d.ts +0 -1
  259. package/dist/context/ingest/adapters/historic-sql/skill-schemas.test.js +0 -62
  260. package/dist/context/ingest/adapters/historic-sql/snowflake-query-history-reader.test.d.ts +0 -1
  261. package/dist/context/ingest/adapters/historic-sql/snowflake-query-history-reader.test.js +0 -117
  262. package/dist/context/ingest/adapters/historic-sql/stage-unified.test.d.ts +0 -1
  263. package/dist/context/ingest/adapters/historic-sql/stage-unified.test.js +0 -405
  264. package/dist/context/ingest/adapters/historic-sql/types.test.d.ts +0 -1
  265. package/dist/context/ingest/adapters/historic-sql/types.test.js +0 -87
  266. package/dist/context/ingest/adapters/live-database/chunk.test.d.ts +0 -1
  267. package/dist/context/ingest/adapters/live-database/chunk.test.js +0 -95
  268. package/dist/context/ingest/adapters/live-database/daemon-introspection.test.d.ts +0 -1
  269. package/dist/context/ingest/adapters/live-database/daemon-introspection.test.js +0 -241
  270. package/dist/context/ingest/adapters/live-database/live-database.adapter.test.d.ts +0 -1
  271. package/dist/context/ingest/adapters/live-database/live-database.adapter.test.js +0 -105
  272. package/dist/context/ingest/adapters/live-database/manifest.test.d.ts +0 -1
  273. package/dist/context/ingest/adapters/live-database/manifest.test.js +0 -291
  274. package/dist/context/ingest/adapters/live-database/stage.test.d.ts +0 -1
  275. package/dist/context/ingest/adapters/live-database/stage.test.js +0 -133
  276. package/dist/context/ingest/adapters/looker/chunk.test.d.ts +0 -1
  277. package/dist/context/ingest/adapters/looker/chunk.test.js +0 -142
  278. package/dist/context/ingest/adapters/looker/client-boundary.test.d.ts +0 -1
  279. package/dist/context/ingest/adapters/looker/client-boundary.test.js +0 -12
  280. package/dist/context/ingest/adapters/looker/client.test.d.ts +0 -1
  281. package/dist/context/ingest/adapters/looker/client.test.js +0 -407
  282. package/dist/context/ingest/adapters/looker/daemon-table-identifier-parser.test.d.ts +0 -1
  283. package/dist/context/ingest/adapters/looker/daemon-table-identifier-parser.test.js +0 -40
  284. package/dist/context/ingest/adapters/looker/detect.test.d.ts +0 -1
  285. package/dist/context/ingest/adapters/looker/detect.test.js +0 -39
  286. package/dist/context/ingest/adapters/looker/evidence-documents.test.d.ts +0 -1
  287. package/dist/context/ingest/adapters/looker/evidence-documents.test.js +0 -178
  288. package/dist/context/ingest/adapters/looker/factory.test.d.ts +0 -1
  289. package/dist/context/ingest/adapters/looker/factory.test.js +0 -55
  290. package/dist/context/ingest/adapters/looker/fetch-report.test.d.ts +0 -1
  291. package/dist/context/ingest/adapters/looker/fetch-report.test.js +0 -71
  292. package/dist/context/ingest/adapters/looker/fetch.test.d.ts +0 -1
  293. package/dist/context/ingest/adapters/looker/fetch.test.js +0 -592
  294. package/dist/context/ingest/adapters/looker/local-runtime-store.test.d.ts +0 -1
  295. package/dist/context/ingest/adapters/looker/local-runtime-store.test.js +0 -106
  296. package/dist/context/ingest/adapters/looker/looker.adapter.test.d.ts +0 -1
  297. package/dist/context/ingest/adapters/looker/looker.adapter.test.js +0 -99
  298. package/dist/context/ingest/adapters/looker/mapping.test.d.ts +0 -1
  299. package/dist/context/ingest/adapters/looker/mapping.test.js +0 -334
  300. package/dist/context/ingest/adapters/looker/reconcile.test.d.ts +0 -1
  301. package/dist/context/ingest/adapters/looker/reconcile.test.js +0 -12
  302. package/dist/context/ingest/adapters/looker/scope.test.d.ts +0 -1
  303. package/dist/context/ingest/adapters/looker/scope.test.js +0 -84
  304. package/dist/context/ingest/adapters/looker/target-connections.test.d.ts +0 -1
  305. package/dist/context/ingest/adapters/looker/target-connections.test.js +0 -71
  306. package/dist/context/ingest/adapters/looker/tools/looker-query-to-sl.tool.test.d.ts +0 -1
  307. package/dist/context/ingest/adapters/looker/tools/looker-query-to-sl.tool.test.js +0 -211
  308. package/dist/context/ingest/adapters/looker/types.test.d.ts +0 -1
  309. package/dist/context/ingest/adapters/looker/types.test.js +0 -261
  310. package/dist/context/ingest/adapters/lookml/chunk.test.d.ts +0 -1
  311. package/dist/context/ingest/adapters/lookml/chunk.test.js +0 -213
  312. package/dist/context/ingest/adapters/lookml/detect.test.d.ts +0 -1
  313. package/dist/context/ingest/adapters/lookml/detect.test.js +0 -37
  314. package/dist/context/ingest/adapters/lookml/fetch-report.test.d.ts +0 -1
  315. package/dist/context/ingest/adapters/lookml/fetch-report.test.js +0 -82
  316. package/dist/context/ingest/adapters/lookml/fetch.test.d.ts +0 -1
  317. package/dist/context/ingest/adapters/lookml/fetch.test.js +0 -121
  318. package/dist/context/ingest/adapters/lookml/graph.test.d.ts +0 -1
  319. package/dist/context/ingest/adapters/lookml/graph.test.js +0 -105
  320. package/dist/context/ingest/adapters/lookml/lookml.adapter.test.d.ts +0 -1
  321. package/dist/context/ingest/adapters/lookml/lookml.adapter.test.js +0 -49
  322. package/dist/context/ingest/adapters/lookml/parse.test.d.ts +0 -1
  323. package/dist/context/ingest/adapters/lookml/parse.test.js +0 -118
  324. package/dist/context/ingest/adapters/lookml/pull-config.test.d.ts +0 -1
  325. package/dist/context/ingest/adapters/lookml/pull-config.test.js +0 -128
  326. package/dist/context/ingest/adapters/metabase/card-references.test.d.ts +0 -1
  327. package/dist/context/ingest/adapters/metabase/card-references.test.js +0 -36
  328. package/dist/context/ingest/adapters/metabase/chunk.test.d.ts +0 -1
  329. package/dist/context/ingest/adapters/metabase/chunk.test.js +0 -299
  330. package/dist/context/ingest/adapters/metabase/client-boundary.test.d.ts +0 -1
  331. package/dist/context/ingest/adapters/metabase/client-boundary.test.js +0 -38
  332. package/dist/context/ingest/adapters/metabase/client-port.test.d.ts +0 -1
  333. package/dist/context/ingest/adapters/metabase/client-port.test.js +0 -86
  334. package/dist/context/ingest/adapters/metabase/client.test.d.ts +0 -1
  335. package/dist/context/ingest/adapters/metabase/client.test.js +0 -377
  336. package/dist/context/ingest/adapters/metabase/detect.test.d.ts +0 -1
  337. package/dist/context/ingest/adapters/metabase/detect.test.js +0 -42
  338. package/dist/context/ingest/adapters/metabase/fanout-planner.test.d.ts +0 -1
  339. package/dist/context/ingest/adapters/metabase/fanout-planner.test.js +0 -44
  340. package/dist/context/ingest/adapters/metabase/fetch-scope.test.d.ts +0 -1
  341. package/dist/context/ingest/adapters/metabase/fetch-scope.test.js +0 -124
  342. package/dist/context/ingest/adapters/metabase/fetch.test.d.ts +0 -1
  343. package/dist/context/ingest/adapters/metabase/fetch.test.js +0 -557
  344. package/dist/context/ingest/adapters/metabase/local-metabase.adapter.test.d.ts +0 -1
  345. package/dist/context/ingest/adapters/metabase/local-metabase.adapter.test.js +0 -56
  346. package/dist/context/ingest/adapters/metabase/local-source-state-store.test.d.ts +0 -1
  347. package/dist/context/ingest/adapters/metabase/local-source-state-store.test.js +0 -99
  348. package/dist/context/ingest/adapters/metabase/mapping.test.d.ts +0 -1
  349. package/dist/context/ingest/adapters/metabase/mapping.test.js +0 -215
  350. package/dist/context/ingest/adapters/metabase/metabase.adapter.test.d.ts +0 -1
  351. package/dist/context/ingest/adapters/metabase/metabase.adapter.test.js +0 -129
  352. package/dist/context/ingest/adapters/metabase/serialize-card.test.d.ts +0 -1
  353. package/dist/context/ingest/adapters/metabase/serialize-card.test.js +0 -205
  354. package/dist/context/ingest/adapters/metabase/types.test.d.ts +0 -1
  355. package/dist/context/ingest/adapters/metabase/types.test.js +0 -75
  356. package/dist/context/ingest/adapters/metricflow/chunk.test.d.ts +0 -1
  357. package/dist/context/ingest/adapters/metricflow/chunk.test.js +0 -114
  358. package/dist/context/ingest/adapters/metricflow/deep-parse.test.d.ts +0 -1
  359. package/dist/context/ingest/adapters/metricflow/deep-parse.test.js +0 -1139
  360. package/dist/context/ingest/adapters/metricflow/detect.test.d.ts +0 -1
  361. package/dist/context/ingest/adapters/metricflow/detect.test.js +0 -43
  362. package/dist/context/ingest/adapters/metricflow/fetch.test.d.ts +0 -1
  363. package/dist/context/ingest/adapters/metricflow/fetch.test.js +0 -97
  364. package/dist/context/ingest/adapters/metricflow/graph.test.d.ts +0 -1
  365. package/dist/context/ingest/adapters/metricflow/graph.test.js +0 -245
  366. package/dist/context/ingest/adapters/metricflow/import-semantic-models.test.d.ts +0 -1
  367. package/dist/context/ingest/adapters/metricflow/import-semantic-models.test.js +0 -318
  368. package/dist/context/ingest/adapters/metricflow/metricflow.adapter.test.d.ts +0 -1
  369. package/dist/context/ingest/adapters/metricflow/metricflow.adapter.test.js +0 -212
  370. package/dist/context/ingest/adapters/metricflow/parse.test.d.ts +0 -1
  371. package/dist/context/ingest/adapters/metricflow/parse.test.js +0 -171
  372. package/dist/context/ingest/adapters/metricflow/pull-config.test.d.ts +0 -1
  373. package/dist/context/ingest/adapters/metricflow/pull-config.test.js +0 -57
  374. package/dist/context/ingest/adapters/metricflow/semantic-models.test.d.ts +0 -1
  375. package/dist/context/ingest/adapters/metricflow/semantic-models.test.js +0 -204
  376. package/dist/context/ingest/adapters/notion/cluster.test.d.ts +0 -1
  377. package/dist/context/ingest/adapters/notion/cluster.test.js +0 -123
  378. package/dist/context/ingest/adapters/notion/fetch.test.d.ts +0 -1
  379. package/dist/context/ingest/adapters/notion/fetch.test.js +0 -358
  380. package/dist/context/ingest/adapters/notion/local-state-store.test.d.ts +0 -1
  381. package/dist/context/ingest/adapters/notion/local-state-store.test.js +0 -29
  382. package/dist/context/ingest/adapters/notion/normalize.test.d.ts +0 -1
  383. package/dist/context/ingest/adapters/notion/normalize.test.js +0 -64
  384. package/dist/context/ingest/adapters/notion/notion-client.test.d.ts +0 -1
  385. package/dist/context/ingest/adapters/notion/notion-client.test.js +0 -49
  386. package/dist/context/ingest/adapters/notion/notion.adapter.test.d.ts +0 -1
  387. package/dist/context/ingest/adapters/notion/notion.adapter.test.js +0 -315
  388. package/dist/context/ingest/artifact-gates.test.d.ts +0 -1
  389. package/dist/context/ingest/artifact-gates.test.js +0 -167
  390. package/dist/context/ingest/canonical-pins.test.d.ts +0 -1
  391. package/dist/context/ingest/canonical-pins.test.js +0 -66
  392. package/dist/context/ingest/clustering/kmeans.test.d.ts +0 -1
  393. package/dist/context/ingest/clustering/kmeans.test.js +0 -61
  394. package/dist/context/ingest/context-candidates/candidate-dedup.service.test.d.ts +0 -1
  395. package/dist/context/ingest/context-candidates/candidate-dedup.service.test.js +0 -216
  396. package/dist/context/ingest/context-candidates/context-candidate-carryforward.service.test.d.ts +0 -1
  397. package/dist/context/ingest/context-candidates/context-candidate-carryforward.service.test.js +0 -161
  398. package/dist/context/ingest/context-candidates/curator-pagination.service.test.d.ts +0 -1
  399. package/dist/context/ingest/context-candidates/curator-pagination.service.test.js +0 -168
  400. package/dist/context/ingest/context-candidates/embedding-text.test.d.ts +0 -1
  401. package/dist/context/ingest/context-candidates/embedding-text.test.js +0 -10
  402. package/dist/context/ingest/context-candidates/store.test.d.ts +0 -1
  403. package/dist/context/ingest/context-candidates/store.test.js +0 -67
  404. package/dist/context/ingest/context-evidence/context-evidence-index.service.test.d.ts +0 -1
  405. package/dist/context/ingest/context-evidence/context-evidence-index.service.test.js +0 -374
  406. package/dist/context/ingest/context-evidence/sqlite-context-evidence-store.test.d.ts +0 -1
  407. package/dist/context/ingest/context-evidence/sqlite-context-evidence-store.test.js +0 -416
  408. package/dist/context/ingest/context-evidence/store.test.d.ts +0 -1
  409. package/dist/context/ingest/context-evidence/store.test.js +0 -55
  410. package/dist/context/ingest/dbt-shared/project-vars.test.d.ts +0 -1
  411. package/dist/context/ingest/dbt-shared/project-vars.test.js +0 -90
  412. package/dist/context/ingest/dbt-shared/schema-files.test.d.ts +0 -1
  413. package/dist/context/ingest/dbt-shared/schema-files.test.js +0 -35
  414. package/dist/context/ingest/diff-set.service.test.d.ts +0 -1
  415. package/dist/context/ingest/diff-set.service.test.js +0 -132
  416. package/dist/context/ingest/final-gate-repair.test.d.ts +0 -1
  417. package/dist/context/ingest/final-gate-repair.test.js +0 -109
  418. package/dist/context/ingest/finalization-scope.test.d.ts +0 -1
  419. package/dist/context/ingest/finalization-scope.test.js +0 -114
  420. package/dist/context/ingest/ingest-bundle.runner.isolated-diff.test.d.ts +0 -1
  421. package/dist/context/ingest/ingest-bundle.runner.isolated-diff.test.js +0 -1928
  422. package/dist/context/ingest/ingest-bundle.runner.test.d.ts +0 -1
  423. package/dist/context/ingest/ingest-bundle.runner.test.js +0 -1899
  424. package/dist/context/ingest/ingest-prompts.test.d.ts +0 -1
  425. package/dist/context/ingest/ingest-prompts.test.js +0 -32
  426. package/dist/context/ingest/ingest-runtime-assets.test.d.ts +0 -1
  427. package/dist/context/ingest/ingest-runtime-assets.test.js +0 -89
  428. package/dist/context/ingest/ingest-trace.test.d.ts +0 -1
  429. package/dist/context/ingest/ingest-trace.test.js +0 -76
  430. package/dist/context/ingest/isolated-diff/git-patch.test.d.ts +0 -1
  431. package/dist/context/ingest/isolated-diff/git-patch.test.js +0 -76
  432. package/dist/context/ingest/isolated-diff/patch-integrator.test.d.ts +0 -1
  433. package/dist/context/ingest/isolated-diff/patch-integrator.test.js +0 -369
  434. package/dist/context/ingest/isolated-diff/textual-conflict-resolver.test.d.ts +0 -1
  435. package/dist/context/ingest/isolated-diff/textual-conflict-resolver.test.js +0 -101
  436. package/dist/context/ingest/isolated-diff/work-unit-executor.test.d.ts +0 -1
  437. package/dist/context/ingest/isolated-diff/work-unit-executor.test.js +0 -137
  438. package/dist/context/ingest/local-adapters.test.d.ts +0 -1
  439. package/dist/context/ingest/local-adapters.test.js +0 -612
  440. package/dist/context/ingest/local-bundle-ingest.test.d.ts +0 -1
  441. package/dist/context/ingest/local-bundle-ingest.test.js +0 -794
  442. package/dist/context/ingest/local-bundle-runtime.test.d.ts +0 -1
  443. package/dist/context/ingest/local-bundle-runtime.test.js +0 -240
  444. package/dist/context/ingest/local-embedding-provider.integration.test.d.ts +0 -1
  445. package/dist/context/ingest/local-embedding-provider.integration.test.js +0 -139
  446. package/dist/context/ingest/local-mapping-reconcile.test.d.ts +0 -1
  447. package/dist/context/ingest/local-mapping-reconcile.test.js +0 -61
  448. package/dist/context/ingest/local-metabase-ingest.test.d.ts +0 -1
  449. package/dist/context/ingest/local-metabase-ingest.test.js +0 -227
  450. package/dist/context/ingest/local-stage-ingest.test.d.ts +0 -1
  451. package/dist/context/ingest/local-stage-ingest.test.js +0 -581
  452. package/dist/context/ingest/memory-flow/acceptance-fixtures.d.ts +0 -6
  453. package/dist/context/ingest/memory-flow/acceptance-fixtures.js +0 -155
  454. package/dist/context/ingest/memory-flow/acceptance.test.d.ts +0 -1
  455. package/dist/context/ingest/memory-flow/acceptance.test.js +0 -43
  456. package/dist/context/ingest/memory-flow/events.test.d.ts +0 -1
  457. package/dist/context/ingest/memory-flow/events.test.js +0 -319
  458. package/dist/context/ingest/memory-flow/interaction.test.d.ts +0 -1
  459. package/dist/context/ingest/memory-flow/interaction.test.js +0 -264
  460. package/dist/context/ingest/memory-flow/interactive-render.test.d.ts +0 -1
  461. package/dist/context/ingest/memory-flow/interactive-render.test.js +0 -160
  462. package/dist/context/ingest/memory-flow/live-buffer.test.d.ts +0 -1
  463. package/dist/context/ingest/memory-flow/live-buffer.test.js +0 -77
  464. package/dist/context/ingest/memory-flow/render.test.d.ts +0 -1
  465. package/dist/context/ingest/memory-flow/render.test.js +0 -105
  466. package/dist/context/ingest/memory-flow/schema.test.d.ts +0 -1
  467. package/dist/context/ingest/memory-flow/schema.test.js +0 -147
  468. package/dist/context/ingest/memory-flow/summary.test.d.ts +0 -1
  469. package/dist/context/ingest/memory-flow/summary.test.js +0 -130
  470. package/dist/context/ingest/memory-flow/view-model.test.d.ts +0 -1
  471. package/dist/context/ingest/memory-flow/view-model.test.js +0 -397
  472. package/dist/context/ingest/memory-flow/visuals.test.d.ts +0 -1
  473. package/dist/context/ingest/memory-flow/visuals.test.js +0 -49
  474. package/dist/context/ingest/page-triage/page-triage.service.test.d.ts +0 -1
  475. package/dist/context/ingest/page-triage/page-triage.service.test.js +0 -311
  476. package/dist/context/ingest/raw-sources-paths.test.d.ts +0 -1
  477. package/dist/context/ingest/raw-sources-paths.test.js +0 -18
  478. package/dist/context/ingest/repo-fetch.test.d.ts +0 -1
  479. package/dist/context/ingest/repo-fetch.test.js +0 -168
  480. package/dist/context/ingest/report-snapshot.test.d.ts +0 -1
  481. package/dist/context/ingest/report-snapshot.test.js +0 -329
  482. package/dist/context/ingest/semantic-layer-target-policy.test.d.ts +0 -1
  483. package/dist/context/ingest/semantic-layer-target-policy.test.js +0 -25
  484. package/dist/context/ingest/source-adapter-registry.test.d.ts +0 -1
  485. package/dist/context/ingest/source-adapter-registry.test.js +0 -35
  486. package/dist/context/ingest/sqlite-bundle-ingest-store.test.d.ts +0 -1
  487. package/dist/context/ingest/sqlite-bundle-ingest-store.test.js +0 -517
  488. package/dist/context/ingest/sqlite-local-ingest-store.test.d.ts +0 -1
  489. package/dist/context/ingest/sqlite-local-ingest-store.test.js +0 -143
  490. package/dist/context/ingest/stages/build-reconcile-context.context-candidates.test.d.ts +0 -1
  491. package/dist/context/ingest/stages/build-reconcile-context.context-candidates.test.js +0 -102
  492. package/dist/context/ingest/stages/build-reconcile-context.test.d.ts +0 -1
  493. package/dist/context/ingest/stages/build-reconcile-context.test.js +0 -141
  494. package/dist/context/ingest/stages/build-wu-context.test.d.ts +0 -1
  495. package/dist/context/ingest/stages/build-wu-context.test.js +0 -196
  496. package/dist/context/ingest/stages/stage-1-stage-raw-files.test.d.ts +0 -1
  497. package/dist/context/ingest/stages/stage-1-stage-raw-files.test.js +0 -54
  498. package/dist/context/ingest/stages/stage-3-work-units.test.d.ts +0 -1
  499. package/dist/context/ingest/stages/stage-3-work-units.test.js +0 -175
  500. package/dist/context/ingest/stages/stage-4-reconciliation.test.d.ts +0 -1
  501. package/dist/context/ingest/stages/stage-4-reconciliation.test.js +0 -144
  502. package/dist/context/ingest/stages/validate-wu-sources.test.d.ts +0 -1
  503. package/dist/context/ingest/stages/validate-wu-sources.test.js +0 -27
  504. package/dist/context/ingest/tools/emit-reconciliation-records.tool.test.d.ts +0 -1
  505. package/dist/context/ingest/tools/emit-reconciliation-records.tool.test.js +0 -237
  506. package/dist/context/ingest/tools/eviction-list.tool.test.d.ts +0 -1
  507. package/dist/context/ingest/tools/eviction-list.tool.test.js +0 -44
  508. package/dist/context/ingest/tools/read-raw-file.tool.test.d.ts +0 -1
  509. package/dist/context/ingest/tools/read-raw-file.tool.test.js +0 -45
  510. package/dist/context/ingest/tools/read-raw-span.tool.test.d.ts +0 -1
  511. package/dist/context/ingest/tools/read-raw-span.tool.test.js +0 -34
  512. package/dist/context/ingest/tools/stage-diff.tool.test.d.ts +0 -1
  513. package/dist/context/ingest/tools/stage-diff.tool.test.js +0 -112
  514. package/dist/context/ingest/tools/stage-list.tool.test.d.ts +0 -1
  515. package/dist/context/ingest/tools/stage-list.tool.test.js +0 -58
  516. package/dist/context/ingest/tools/tool-transcript-summary.test.d.ts +0 -1
  517. package/dist/context/ingest/tools/tool-transcript-summary.test.js +0 -141
  518. package/dist/context/ingest/tools/warehouse-verification/discover-data.tool.test.d.ts +0 -1
  519. package/dist/context/ingest/tools/warehouse-verification/discover-data.tool.test.js +0 -107
  520. package/dist/context/ingest/tools/warehouse-verification/entity-details.tool.test.d.ts +0 -1
  521. package/dist/context/ingest/tools/warehouse-verification/entity-details.tool.test.js +0 -146
  522. package/dist/context/ingest/tools/warehouse-verification/sql-execution.tool.test.d.ts +0 -1
  523. package/dist/context/ingest/tools/warehouse-verification/sql-execution.tool.test.js +0 -50
  524. package/dist/context/ingest/wiki-body-refs.test.d.ts +0 -1
  525. package/dist/context/ingest/wiki-body-refs.test.js +0 -138
  526. package/dist/context/ingest/wiki-sl-ref-repair.test.d.ts +0 -1
  527. package/dist/context/ingest/wiki-sl-ref-repair.test.js +0 -81
  528. package/dist/context/llm/ai-sdk-runtime.test.d.ts +0 -1
  529. package/dist/context/llm/ai-sdk-runtime.test.js +0 -308
  530. package/dist/context/llm/claude-code-env.test.d.ts +0 -1
  531. package/dist/context/llm/claude-code-env.test.js +0 -17
  532. package/dist/context/llm/claude-code-models.test.d.ts +0 -1
  533. package/dist/context/llm/claude-code-models.test.js +0 -15
  534. package/dist/context/llm/claude-code-runtime.test.d.ts +0 -1
  535. package/dist/context/llm/claude-code-runtime.test.js +0 -434
  536. package/dist/context/llm/debug-request-recorder.test.d.ts +0 -1
  537. package/dist/context/llm/debug-request-recorder.test.js +0 -112
  538. package/dist/context/llm/embedding-port.test.d.ts +0 -1
  539. package/dist/context/llm/embedding-port.test.js +0 -34
  540. package/dist/context/llm/local-config.test.d.ts +0 -1
  541. package/dist/context/llm/local-config.test.js +0 -164
  542. package/dist/context/llm/runtime-local-config.test.d.ts +0 -1
  543. package/dist/context/llm/runtime-local-config.test.js +0 -17
  544. package/dist/context/llm/runtime-tools.test.d.ts +0 -1
  545. package/dist/context/llm/runtime-tools.test.js +0 -36
  546. package/dist/context/mcp/local-project-ports.test.d.ts +0 -1
  547. package/dist/context/mcp/local-project-ports.test.js +0 -689
  548. package/dist/context/mcp/server.test.d.ts +0 -1
  549. package/dist/context/mcp/server.test.js +0 -902
  550. package/dist/context/memory/local-memory.test.d.ts +0 -1
  551. package/dist/context/memory/local-memory.test.js +0 -173
  552. package/dist/context/memory/memory-agent.service.ingest.test.d.ts +0 -1
  553. package/dist/context/memory/memory-agent.service.ingest.test.js +0 -355
  554. package/dist/context/memory/memory-agent.service.test.d.ts +0 -1
  555. package/dist/context/memory/memory-agent.service.test.js +0 -413
  556. package/dist/context/memory/memory-runs.test.d.ts +0 -1
  557. package/dist/context/memory/memory-runs.test.js +0 -158
  558. package/dist/context/memory/memory-runtime-assets.test.d.ts +0 -1
  559. package/dist/context/memory/memory-runtime-assets.test.js +0 -162
  560. package/dist/context/project/config.test.d.ts +0 -1
  561. package/dist/context/project/config.test.js +0 -467
  562. package/dist/context/project/driver-schemas.test.d.ts +0 -1
  563. package/dist/context/project/driver-schemas.test.js +0 -125
  564. package/dist/context/project/local-git-file-store.test.d.ts +0 -1
  565. package/dist/context/project/local-git-file-store.test.js +0 -71
  566. package/dist/context/project/mappings-yaml-schema.test.d.ts +0 -1
  567. package/dist/context/project/mappings-yaml-schema.test.js +0 -79
  568. package/dist/context/project/project.test.d.ts +0 -1
  569. package/dist/context/project/project.test.js +0 -55
  570. package/dist/context/project/setup-config.test.d.ts +0 -1
  571. package/dist/context/project/setup-config.test.js +0 -38
  572. package/dist/context/prompts/prompt.service.test.d.ts +0 -1
  573. package/dist/context/prompts/prompt.service.test.js +0 -43
  574. package/dist/context/scan/credentials.test.d.ts +0 -1
  575. package/dist/context/scan/credentials.test.js +0 -162
  576. package/dist/context/scan/data-dictionary.test.d.ts +0 -1
  577. package/dist/context/scan/data-dictionary.test.js +0 -92
  578. package/dist/context/scan/description-generation.test.d.ts +0 -1
  579. package/dist/context/scan/description-generation.test.js +0 -693
  580. package/dist/context/scan/embedding-text.test.d.ts +0 -1
  581. package/dist/context/scan/embedding-text.test.js +0 -36
  582. package/dist/context/scan/enrichment-state.test.d.ts +0 -1
  583. package/dist/context/scan/enrichment-state.test.js +0 -147
  584. package/dist/context/scan/enrichment-summary.test.d.ts +0 -1
  585. package/dist/context/scan/enrichment-summary.test.js +0 -34
  586. package/dist/context/scan/enrichment-types.test.d.ts +0 -1
  587. package/dist/context/scan/enrichment-types.test.js +0 -141
  588. package/dist/context/scan/entity-details.test.d.ts +0 -1
  589. package/dist/context/scan/entity-details.test.js +0 -234
  590. package/dist/context/scan/local-enrichment-artifacts.test.d.ts +0 -1
  591. package/dist/context/scan/local-enrichment-artifacts.test.js +0 -771
  592. package/dist/context/scan/local-enrichment.test.d.ts +0 -1
  593. package/dist/context/scan/local-enrichment.test.js +0 -765
  594. package/dist/context/scan/local-scan.test.d.ts +0 -1
  595. package/dist/context/scan/local-scan.test.js +0 -1663
  596. package/dist/context/scan/local-structural-artifacts.test.d.ts +0 -1
  597. package/dist/context/scan/local-structural-artifacts.test.js +0 -144
  598. package/dist/context/scan/relationship-benchmark-report.test.d.ts +0 -1
  599. package/dist/context/scan/relationship-benchmark-report.test.js +0 -389
  600. package/dist/context/scan/relationship-benchmarks.test.d.ts +0 -1
  601. package/dist/context/scan/relationship-benchmarks.test.js +0 -1072
  602. package/dist/context/scan/relationship-budget.test.d.ts +0 -1
  603. package/dist/context/scan/relationship-budget.test.js +0 -71
  604. package/dist/context/scan/relationship-candidates.test.d.ts +0 -1
  605. package/dist/context/scan/relationship-candidates.test.js +0 -747
  606. package/dist/context/scan/relationship-composite-candidates.test.d.ts +0 -1
  607. package/dist/context/scan/relationship-composite-candidates.test.js +0 -69
  608. package/dist/context/scan/relationship-diagnostics.test.d.ts +0 -1
  609. package/dist/context/scan/relationship-diagnostics.test.js +0 -333
  610. package/dist/context/scan/relationship-discovery.test.d.ts +0 -1
  611. package/dist/context/scan/relationship-discovery.test.js +0 -618
  612. package/dist/context/scan/relationship-formal-metadata.test.d.ts +0 -1
  613. package/dist/context/scan/relationship-formal-metadata.test.js +0 -125
  614. package/dist/context/scan/relationship-graph-resolver.test.d.ts +0 -1
  615. package/dist/context/scan/relationship-graph-resolver.test.js +0 -604
  616. package/dist/context/scan/relationship-llm-proposal.test.d.ts +0 -1
  617. package/dist/context/scan/relationship-llm-proposal.test.js +0 -197
  618. package/dist/context/scan/relationship-locality.test.d.ts +0 -1
  619. package/dist/context/scan/relationship-locality.test.js +0 -128
  620. package/dist/context/scan/relationship-name-similarity.test.d.ts +0 -1
  621. package/dist/context/scan/relationship-name-similarity.test.js +0 -68
  622. package/dist/context/scan/relationship-profiling.test.d.ts +0 -1
  623. package/dist/context/scan/relationship-profiling.test.js +0 -392
  624. package/dist/context/scan/relationship-scoring.test.d.ts +0 -1
  625. package/dist/context/scan/relationship-scoring.test.js +0 -86
  626. package/dist/context/scan/relationship-validation.test.d.ts +0 -1
  627. package/dist/context/scan/relationship-validation.test.js +0 -455
  628. package/dist/context/scan/table-ref.test.d.ts +0 -1
  629. package/dist/context/scan/table-ref.test.js +0 -53
  630. package/dist/context/scan/type-normalization.test.d.ts +0 -1
  631. package/dist/context/scan/type-normalization.test.js +0 -21
  632. package/dist/context/scan/types.test.d.ts +0 -1
  633. package/dist/context/scan/types.test.js +0 -206
  634. package/dist/context/scan/warehouse-catalog.test.d.ts +0 -1
  635. package/dist/context/scan/warehouse-catalog.test.js +0 -158
  636. package/dist/context/search/backend-conformance.test-utils.d.ts +0 -39
  637. package/dist/context/search/backend-conformance.test-utils.js +0 -88
  638. package/dist/context/search/backend-conformance.test-utils.test.d.ts +0 -1
  639. package/dist/context/search/backend-conformance.test-utils.test.js +0 -408
  640. package/dist/context/search/discover.test.d.ts +0 -1
  641. package/dist/context/search/discover.test.js +0 -197
  642. package/dist/context/search/hybrid-search-core.test.d.ts +0 -1
  643. package/dist/context/search/hybrid-search-core.test.js +0 -113
  644. package/dist/context/search/pglite-owner-process.test.d.ts +0 -1
  645. package/dist/context/search/pglite-owner-process.test.js +0 -273
  646. package/dist/context/search/pglite-runtime-boundary.test.d.ts +0 -1
  647. package/dist/context/search/pglite-runtime-boundary.test.js +0 -40
  648. package/dist/context/search/pglite-spike.test.d.ts +0 -1
  649. package/dist/context/search/pglite-spike.test.js +0 -249
  650. package/dist/context/search/query.test.d.ts +0 -1
  651. package/dist/context/search/query.test.js +0 -23
  652. package/dist/context/search/rrf.test.d.ts +0 -1
  653. package/dist/context/search/rrf.test.js +0 -47
  654. package/dist/context/skills/skills-registry.service.test.d.ts +0 -1
  655. package/dist/context/skills/skills-registry.service.test.js +0 -161
  656. package/dist/context/sl/dictionary-search.test.d.ts +0 -1
  657. package/dist/context/sl/dictionary-search.test.js +0 -204
  658. package/dist/context/sl/local-query.test.d.ts +0 -1
  659. package/dist/context/sl/local-query.test.js +0 -283
  660. package/dist/context/sl/local-sl.test.d.ts +0 -1
  661. package/dist/context/sl/local-sl.test.js +0 -334
  662. package/dist/context/sl/pglite-sl-search-prototype.test.d.ts +0 -1
  663. package/dist/context/sl/pglite-sl-search-prototype.test.js +0 -240
  664. package/dist/context/sl/schemas.contract.test.d.ts +0 -1
  665. package/dist/context/sl/schemas.contract.test.js +0 -62
  666. package/dist/context/sl/semantic-layer.service.test.d.ts +0 -1
  667. package/dist/context/sl/semantic-layer.service.test.js +0 -1107
  668. package/dist/context/sl/sl-dictionary-profile.test.d.ts +0 -1
  669. package/dist/context/sl/sl-dictionary-profile.test.js +0 -88
  670. package/dist/context/sl/sl-search.service.test.d.ts +0 -1
  671. package/dist/context/sl/sl-search.service.test.js +0 -256
  672. package/dist/context/sl/sqlite-sl-sources-index.test.d.ts +0 -1
  673. package/dist/context/sl/sqlite-sl-sources-index.test.js +0 -175
  674. package/dist/context/sl/tools/connection-id-schema.test.d.ts +0 -1
  675. package/dist/context/sl/tools/connection-id-schema.test.js +0 -14
  676. package/dist/context/sl/tools/sl-discover.tool.test.d.ts +0 -1
  677. package/dist/context/sl/tools/sl-discover.tool.test.js +0 -72
  678. package/dist/context/sl/tools/sl-edit-source.tool.test.d.ts +0 -1
  679. package/dist/context/sl/tools/sl-edit-source.tool.test.js +0 -184
  680. package/dist/context/sl/tools/sl-read-source.tool.session.test.d.ts +0 -1
  681. package/dist/context/sl/tools/sl-read-source.tool.session.test.js +0 -55
  682. package/dist/context/sl/tools/sl-rollback.tool.test.d.ts +0 -1
  683. package/dist/context/sl/tools/sl-rollback.tool.test.js +0 -57
  684. package/dist/context/sl/tools/sl-validate.tool.test.d.ts +0 -1
  685. package/dist/context/sl/tools/sl-validate.tool.test.js +0 -54
  686. package/dist/context/sl/tools/sl-warehouse-validation.test.d.ts +0 -1
  687. package/dist/context/sl/tools/sl-warehouse-validation.test.js +0 -136
  688. package/dist/context/sl/tools/sl-write-source.tool.test.d.ts +0 -1
  689. package/dist/context/sl/tools/sl-write-source.tool.test.js +0 -307
  690. package/dist/context/sql-analysis/http-sql-analysis-port.test.d.ts +0 -1
  691. package/dist/context/sql-analysis/http-sql-analysis-port.test.js +0 -147
  692. package/dist/context/test/make-local-git-repo.d.ts +0 -10
  693. package/dist/context/test/make-local-git-repo.js +0 -34
  694. package/dist/context/tools/context-evidence-tools.test.d.ts +0 -1
  695. package/dist/context/tools/context-evidence-tools.test.js +0 -486
  696. package/dist/context/tools/touched-sl-sources.test.d.ts +0 -1
  697. package/dist/context/tools/touched-sl-sources.test.js +0 -31
  698. package/dist/context/wiki/knowledge-wiki.service.test.d.ts +0 -1
  699. package/dist/context/wiki/knowledge-wiki.service.test.js +0 -205
  700. package/dist/context/wiki/local-knowledge.test.d.ts +0 -1
  701. package/dist/context/wiki/local-knowledge.test.js +0 -270
  702. package/dist/context/wiki/sqlite-knowledge-index.test.d.ts +0 -1
  703. package/dist/context/wiki/sqlite-knowledge-index.test.js +0 -129
  704. package/dist/context/wiki/tools/wiki-list-tags.tool.test.d.ts +0 -1
  705. package/dist/context/wiki/tools/wiki-list-tags.tool.test.js +0 -35
  706. package/dist/context/wiki/tools/wiki-read.tool.test.d.ts +0 -1
  707. package/dist/context/wiki/tools/wiki-read.tool.test.js +0 -66
  708. package/dist/context/wiki/tools/wiki-remove.tool.test.d.ts +0 -1
  709. package/dist/context/wiki/tools/wiki-remove.tool.test.js +0 -95
  710. package/dist/context/wiki/tools/wiki-search.tool.test.d.ts +0 -1
  711. package/dist/context/wiki/tools/wiki-search.tool.test.js +0 -35
  712. package/dist/context/wiki/tools/wiki-write.tool.test.d.ts +0 -1
  713. package/dist/context/wiki/tools/wiki-write.tool.test.js +0 -264
  714. package/dist/context/wiki/wiki-ref-validation.test.d.ts +0 -1
  715. package/dist/context/wiki/wiki-ref-validation.test.js +0 -64
  716. package/dist/context-build-view.test.d.ts +0 -1
  717. package/dist/context-build-view.test.js +0 -942
  718. package/dist/database-tree-picker.test.d.ts +0 -1
  719. package/dist/database-tree-picker.test.js +0 -188
  720. package/dist/demo-assets.test.d.ts +0 -1
  721. package/dist/demo-assets.test.js +0 -121
  722. package/dist/demo-metrics.test.d.ts +0 -1
  723. package/dist/demo-metrics.test.js +0 -108
  724. package/dist/doctor.test.d.ts +0 -1
  725. package/dist/doctor.test.js +0 -596
  726. package/dist/embedding-resolution.test.d.ts +0 -1
  727. package/dist/embedding-resolution.test.js +0 -132
  728. package/dist/example-smoke.test.d.ts +0 -1
  729. package/dist/example-smoke.test.js +0 -83
  730. package/dist/index.test.d.ts +0 -1
  731. package/dist/index.test.js +0 -1300
  732. package/dist/ingest-query-executor.test.d.ts +0 -1
  733. package/dist/ingest-query-executor.test.js +0 -71
  734. package/dist/ingest-report-file.test.d.ts +0 -1
  735. package/dist/ingest-report-file.test.js +0 -63
  736. package/dist/ingest-viz.test.d.ts +0 -1
  737. package/dist/ingest-viz.test.js +0 -691
  738. package/dist/ingest.test-utils.d.ts +0 -126
  739. package/dist/ingest.test-utils.js +0 -629
  740. package/dist/ingest.test.d.ts +0 -1
  741. package/dist/ingest.test.js +0 -1568
  742. package/dist/io/logger.test.d.ts +0 -1
  743. package/dist/io/logger.test.js +0 -55
  744. package/dist/io/mode.test.d.ts +0 -1
  745. package/dist/io/mode.test.js +0 -48
  746. package/dist/io/print-list.test.d.ts +0 -1
  747. package/dist/io/print-list.test.js +0 -277
  748. package/dist/knowledge.test.d.ts +0 -1
  749. package/dist/knowledge.test.js +0 -198
  750. package/dist/llm/embedding-health.test.d.ts +0 -1
  751. package/dist/llm/embedding-health.test.js +0 -72
  752. package/dist/llm/embedding-provider.test.d.ts +0 -1
  753. package/dist/llm/embedding-provider.test.js +0 -84
  754. package/dist/llm/message-builder.test.d.ts +0 -1
  755. package/dist/llm/message-builder.test.js +0 -127
  756. package/dist/llm/model-health.test.d.ts +0 -1
  757. package/dist/llm/model-health.test.js +0 -55
  758. package/dist/llm/model-provider.test.d.ts +0 -1
  759. package/dist/llm/model-provider.test.js +0 -246
  760. package/dist/llm/repair.test.d.ts +0 -1
  761. package/dist/llm/repair.test.js +0 -78
  762. package/dist/local-adapters.test.d.ts +0 -1
  763. package/dist/local-adapters.test.js +0 -166
  764. package/dist/local-scan-connectors.test.d.ts +0 -1
  765. package/dist/local-scan-connectors.test.js +0 -92
  766. package/dist/managed-local-embeddings.test.d.ts +0 -1
  767. package/dist/managed-local-embeddings.test.js +0 -229
  768. package/dist/managed-mcp-daemon.test.d.ts +0 -1
  769. package/dist/managed-mcp-daemon.test.js +0 -187
  770. package/dist/managed-python-command.test.d.ts +0 -1
  771. package/dist/managed-python-command.test.js +0 -262
  772. package/dist/managed-python-daemon.test.d.ts +0 -1
  773. package/dist/managed-python-daemon.test.js +0 -360
  774. package/dist/managed-python-http.test.d.ts +0 -1
  775. package/dist/managed-python-http.test.js +0 -177
  776. package/dist/managed-python-runtime.test.d.ts +0 -1
  777. package/dist/managed-python-runtime.test.js +0 -426
  778. package/dist/mcp-http-server.test.d.ts +0 -1
  779. package/dist/mcp-http-server.test.js +0 -209
  780. package/dist/mcp-server-factory.test.d.ts +0 -1
  781. package/dist/mcp-server-factory.test.js +0 -142
  782. package/dist/memory-flow-interactive.test.d.ts +0 -1
  783. package/dist/memory-flow-interactive.test.js +0 -109
  784. package/dist/memory-flow-tui.test.d.ts +0 -1
  785. package/dist/memory-flow-tui.test.js +0 -247
  786. package/dist/next-steps.test.d.ts +0 -1
  787. package/dist/next-steps.test.js +0 -77
  788. package/dist/notion-page-picker.test.d.ts +0 -1
  789. package/dist/notion-page-picker.test.js +0 -244
  790. package/dist/print-command-tree.test.d.ts +0 -1
  791. package/dist/print-command-tree.test.js +0 -37
  792. package/dist/project-dir.test.d.ts +0 -1
  793. package/dist/project-dir.test.js +0 -124
  794. package/dist/project-resolver.test.d.ts +0 -1
  795. package/dist/project-resolver.test.js +0 -49
  796. package/dist/prompt-navigation.test.d.ts +0 -1
  797. package/dist/prompt-navigation.test.js +0 -33
  798. package/dist/proxy-env.test.d.ts +0 -1
  799. package/dist/proxy-env.test.js +0 -17
  800. package/dist/public-ingest-copy.test.d.ts +0 -1
  801. package/dist/public-ingest-copy.test.js +0 -24
  802. package/dist/public-ingest.test.d.ts +0 -1
  803. package/dist/public-ingest.test.js +0 -891
  804. package/dist/runtime-requirements.test.d.ts +0 -1
  805. package/dist/runtime-requirements.test.js +0 -73
  806. package/dist/runtime.test.d.ts +0 -1
  807. package/dist/runtime.test.js +0 -381
  808. package/dist/scan.test.d.ts +0 -1
  809. package/dist/scan.test.js +0 -1123
  810. package/dist/setup-agents.test.d.ts +0 -1
  811. package/dist/setup-agents.test.js +0 -1028
  812. package/dist/setup-context.test.d.ts +0 -1
  813. package/dist/setup-context.test.js +0 -491
  814. package/dist/setup-databases.test.d.ts +0 -1
  815. package/dist/setup-databases.test.js +0 -2101
  816. package/dist/setup-demo-tour.test.d.ts +0 -1
  817. package/dist/setup-demo-tour.test.js +0 -221
  818. package/dist/setup-embeddings.test.d.ts +0 -1
  819. package/dist/setup-embeddings.test.js +0 -436
  820. package/dist/setup-interrupt.test.d.ts +0 -1
  821. package/dist/setup-interrupt.test.js +0 -77
  822. package/dist/setup-models.test.d.ts +0 -1
  823. package/dist/setup-models.test.js +0 -885
  824. package/dist/setup-project.test.d.ts +0 -1
  825. package/dist/setup-project.test.js +0 -209
  826. package/dist/setup-prompts.test.d.ts +0 -1
  827. package/dist/setup-prompts.test.js +0 -208
  828. package/dist/setup-ready-menu.test.d.ts +0 -1
  829. package/dist/setup-ready-menu.test.js +0 -44
  830. package/dist/setup-runtime.test.d.ts +0 -1
  831. package/dist/setup-runtime.test.js +0 -111
  832. package/dist/setup-secrets.test.d.ts +0 -1
  833. package/dist/setup-secrets.test.js +0 -30
  834. package/dist/setup-sources-notion.test.d.ts +0 -1
  835. package/dist/setup-sources-notion.test.js +0 -109
  836. package/dist/setup-sources.test.d.ts +0 -1
  837. package/dist/setup-sources.test.js +0 -1303
  838. package/dist/setup.test.d.ts +0 -1
  839. package/dist/setup.test.js +0 -1825
  840. package/dist/sl.test.d.ts +0 -1
  841. package/dist/sl.test.js +0 -567
  842. package/dist/source-mapping.test.d.ts +0 -1
  843. package/dist/source-mapping.test.js +0 -65
  844. package/dist/sql.test.d.ts +0 -1
  845. package/dist/sql.test.js +0 -253
  846. package/dist/standalone-smoke.test.d.ts +0 -1
  847. package/dist/standalone-smoke.test.js +0 -250
  848. package/dist/status-project.test.d.ts +0 -1
  849. package/dist/status-project.test.js +0 -502
  850. package/dist/telemetry/command-hook.test.d.ts +0 -1
  851. package/dist/telemetry/command-hook.test.js +0 -31
  852. package/dist/telemetry/demo-detect.test.d.ts +0 -1
  853. package/dist/telemetry/demo-detect.test.js +0 -22
  854. package/dist/telemetry/emitter.test.d.ts +0 -1
  855. package/dist/telemetry/emitter.test.js +0 -103
  856. package/dist/telemetry/events.snapshot.test.d.ts +0 -1
  857. package/dist/telemetry/events.snapshot.test.js +0 -135
  858. package/dist/telemetry/events.test.d.ts +0 -1
  859. package/dist/telemetry/events.test.js +0 -136
  860. package/dist/telemetry/identity.test.d.ts +0 -1
  861. package/dist/telemetry/identity.test.js +0 -148
  862. package/dist/telemetry/project-snapshot.test.d.ts +0 -1
  863. package/dist/telemetry/project-snapshot.test.js +0 -71
  864. package/dist/telemetry/schema-writer.test.d.ts +0 -1
  865. package/dist/telemetry/schema-writer.test.js +0 -23
  866. package/dist/telemetry/scrubber.test.d.ts +0 -1
  867. package/dist/telemetry/scrubber.test.js +0 -21
  868. package/dist/text-ingest.test.d.ts +0 -1
  869. package/dist/text-ingest.test.js +0 -247
  870. package/dist/tree-picker-state.test.d.ts +0 -1
  871. package/dist/tree-picker-state.test.js +0 -303
  872. package/dist/tree-picker-tui.test.d.ts +0 -1
  873. package/dist/tree-picker-tui.test.js +0 -248
  874. package/dist/viz-fallback.test.d.ts +0 -1
  875. 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
- });