@blxzer/cursor-trellis 0.1.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 (687) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/LICENSE +235 -0
  3. package/README.md +9 -0
  4. package/bin/smart-search.js +79 -0
  5. package/bin/trellis.js +3 -0
  6. package/dist/cli/index.d.ts +3 -0
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/index.js +258 -0
  9. package/dist/cli/index.js.map +1 -0
  10. package/dist/commands/channel/adapters/claude.d.ts +29 -0
  11. package/dist/commands/channel/adapters/claude.d.ts.map +1 -0
  12. package/dist/commands/channel/adapters/claude.js +203 -0
  13. package/dist/commands/channel/adapters/claude.js.map +1 -0
  14. package/dist/commands/channel/adapters/codex.d.ts +85 -0
  15. package/dist/commands/channel/adapters/codex.d.ts.map +1 -0
  16. package/dist/commands/channel/adapters/codex.js +505 -0
  17. package/dist/commands/channel/adapters/codex.js.map +1 -0
  18. package/dist/commands/channel/adapters/index.d.ts +84 -0
  19. package/dist/commands/channel/adapters/index.d.ts.map +1 -0
  20. package/dist/commands/channel/adapters/index.js +115 -0
  21. package/dist/commands/channel/adapters/index.js.map +1 -0
  22. package/dist/commands/channel/adapters/types.d.ts +33 -0
  23. package/dist/commands/channel/adapters/types.d.ts.map +1 -0
  24. package/dist/commands/channel/adapters/types.js +2 -0
  25. package/dist/commands/channel/adapters/types.js.map +1 -0
  26. package/dist/commands/channel/agent-loader.d.ts +32 -0
  27. package/dist/commands/channel/agent-loader.d.ts.map +1 -0
  28. package/dist/commands/channel/agent-loader.js +154 -0
  29. package/dist/commands/channel/agent-loader.js.map +1 -0
  30. package/dist/commands/channel/context-loader.d.ts +26 -0
  31. package/dist/commands/channel/context-loader.d.ts.map +1 -0
  32. package/dist/commands/channel/context-loader.js +290 -0
  33. package/dist/commands/channel/context-loader.js.map +1 -0
  34. package/dist/commands/channel/context.d.ts +16 -0
  35. package/dist/commands/channel/context.d.ts.map +1 -0
  36. package/dist/commands/channel/context.js +83 -0
  37. package/dist/commands/channel/context.js.map +1 -0
  38. package/dist/commands/channel/create.d.ts +27 -0
  39. package/dist/commands/channel/create.d.ts.map +1 -0
  40. package/dist/commands/channel/create.js +39 -0
  41. package/dist/commands/channel/create.js.map +1 -0
  42. package/dist/commands/channel/dev-parse-trace.d.ts +14 -0
  43. package/dist/commands/channel/dev-parse-trace.d.ts.map +1 -0
  44. package/dist/commands/channel/dev-parse-trace.js +70 -0
  45. package/dist/commands/channel/dev-parse-trace.js.map +1 -0
  46. package/dist/commands/channel/guard.d.ts +150 -0
  47. package/dist/commands/channel/guard.d.ts.map +1 -0
  48. package/dist/commands/channel/guard.js +474 -0
  49. package/dist/commands/channel/guard.js.map +1 -0
  50. package/dist/commands/channel/index.d.ts +3 -0
  51. package/dist/commands/channel/index.d.ts.map +1 -0
  52. package/dist/commands/channel/index.js +531 -0
  53. package/dist/commands/channel/index.js.map +1 -0
  54. package/dist/commands/channel/interrupt.d.ts +10 -0
  55. package/dist/commands/channel/interrupt.d.ts.map +1 -0
  56. package/dist/commands/channel/interrupt.js +22 -0
  57. package/dist/commands/channel/interrupt.js.map +1 -0
  58. package/dist/commands/channel/kill.d.ts +7 -0
  59. package/dist/commands/channel/kill.d.ts.map +1 -0
  60. package/dist/commands/channel/kill.js +121 -0
  61. package/dist/commands/channel/kill.js.map +1 -0
  62. package/dist/commands/channel/list.d.ts +17 -0
  63. package/dist/commands/channel/list.d.ts.map +1 -0
  64. package/dist/commands/channel/list.js +233 -0
  65. package/dist/commands/channel/list.js.map +1 -0
  66. package/dist/commands/channel/messages.d.ts +15 -0
  67. package/dist/commands/channel/messages.d.ts.map +1 -0
  68. package/dist/commands/channel/messages.js +245 -0
  69. package/dist/commands/channel/messages.js.map +1 -0
  70. package/dist/commands/channel/rm.d.ts +27 -0
  71. package/dist/commands/channel/rm.d.ts.map +1 -0
  72. package/dist/commands/channel/rm.js +216 -0
  73. package/dist/commands/channel/rm.js.map +1 -0
  74. package/dist/commands/channel/run.d.ts +30 -0
  75. package/dist/commands/channel/run.d.ts.map +1 -0
  76. package/dist/commands/channel/run.js +130 -0
  77. package/dist/commands/channel/run.js.map +1 -0
  78. package/dist/commands/channel/send.d.ts +11 -0
  79. package/dist/commands/channel/send.d.ts.map +1 -0
  80. package/dist/commands/channel/send.js +24 -0
  81. package/dist/commands/channel/send.js.map +1 -0
  82. package/dist/commands/channel/spawn.d.ts +40 -0
  83. package/dist/commands/channel/spawn.d.ts.map +1 -0
  84. package/dist/commands/channel/spawn.js +244 -0
  85. package/dist/commands/channel/spawn.js.map +1 -0
  86. package/dist/commands/channel/store/events.d.ts +39 -0
  87. package/dist/commands/channel/store/events.d.ts.map +1 -0
  88. package/dist/commands/channel/store/events.js +87 -0
  89. package/dist/commands/channel/store/events.js.map +1 -0
  90. package/dist/commands/channel/store/filter.d.ts +3 -0
  91. package/dist/commands/channel/store/filter.d.ts.map +1 -0
  92. package/dist/commands/channel/store/filter.js +2 -0
  93. package/dist/commands/channel/store/filter.js.map +1 -0
  94. package/dist/commands/channel/store/lock.d.ts +23 -0
  95. package/dist/commands/channel/store/lock.d.ts.map +1 -0
  96. package/dist/commands/channel/store/lock.js +99 -0
  97. package/dist/commands/channel/store/lock.js.map +1 -0
  98. package/dist/commands/channel/store/paths.d.ts +63 -0
  99. package/dist/commands/channel/store/paths.d.ts.map +1 -0
  100. package/dist/commands/channel/store/paths.js +246 -0
  101. package/dist/commands/channel/store/paths.js.map +1 -0
  102. package/dist/commands/channel/store/schema.d.ts +27 -0
  103. package/dist/commands/channel/store/schema.d.ts.map +1 -0
  104. package/dist/commands/channel/store/schema.js +34 -0
  105. package/dist/commands/channel/store/schema.js.map +1 -0
  106. package/dist/commands/channel/store/thread-state.d.ts +5 -0
  107. package/dist/commands/channel/store/thread-state.d.ts.map +1 -0
  108. package/dist/commands/channel/store/thread-state.js +16 -0
  109. package/dist/commands/channel/store/thread-state.js.map +1 -0
  110. package/dist/commands/channel/store/watch.d.ts +19 -0
  111. package/dist/commands/channel/store/watch.d.ts.map +1 -0
  112. package/dist/commands/channel/store/watch.js +146 -0
  113. package/dist/commands/channel/store/watch.js.map +1 -0
  114. package/dist/commands/channel/supervisor/idle.d.ts +46 -0
  115. package/dist/commands/channel/supervisor/idle.d.ts.map +1 -0
  116. package/dist/commands/channel/supervisor/idle.js +72 -0
  117. package/dist/commands/channel/supervisor/idle.js.map +1 -0
  118. package/dist/commands/channel/supervisor/inbox.d.ts +30 -0
  119. package/dist/commands/channel/supervisor/inbox.d.ts.map +1 -0
  120. package/dist/commands/channel/supervisor/inbox.js +160 -0
  121. package/dist/commands/channel/supervisor/inbox.js.map +1 -0
  122. package/dist/commands/channel/supervisor/shutdown.d.ts +68 -0
  123. package/dist/commands/channel/supervisor/shutdown.d.ts.map +1 -0
  124. package/dist/commands/channel/supervisor/shutdown.js +146 -0
  125. package/dist/commands/channel/supervisor/shutdown.js.map +1 -0
  126. package/dist/commands/channel/supervisor/stdout.d.ts +51 -0
  127. package/dist/commands/channel/supervisor/stdout.d.ts.map +1 -0
  128. package/dist/commands/channel/supervisor/stdout.js +121 -0
  129. package/dist/commands/channel/supervisor/stdout.js.map +1 -0
  130. package/dist/commands/channel/supervisor/turns.d.ts +31 -0
  131. package/dist/commands/channel/supervisor/turns.d.ts.map +1 -0
  132. package/dist/commands/channel/supervisor/turns.js +45 -0
  133. package/dist/commands/channel/supervisor/turns.js.map +1 -0
  134. package/dist/commands/channel/supervisor/warning.d.ts +48 -0
  135. package/dist/commands/channel/supervisor/warning.d.ts.map +1 -0
  136. package/dist/commands/channel/supervisor/warning.js +77 -0
  137. package/dist/commands/channel/supervisor/warning.js.map +1 -0
  138. package/dist/commands/channel/supervisor.d.ts +59 -0
  139. package/dist/commands/channel/supervisor.d.ts.map +1 -0
  140. package/dist/commands/channel/supervisor.js +344 -0
  141. package/dist/commands/channel/supervisor.js.map +1 -0
  142. package/dist/commands/channel/text-body.d.ts +13 -0
  143. package/dist/commands/channel/text-body.d.ts.map +1 -0
  144. package/dist/commands/channel/text-body.js +47 -0
  145. package/dist/commands/channel/text-body.js.map +1 -0
  146. package/dist/commands/channel/threads.d.ts +39 -0
  147. package/dist/commands/channel/threads.d.ts.map +1 -0
  148. package/dist/commands/channel/threads.js +106 -0
  149. package/dist/commands/channel/threads.js.map +1 -0
  150. package/dist/commands/channel/title.d.ts +12 -0
  151. package/dist/commands/channel/title.d.ts.map +1 -0
  152. package/dist/commands/channel/title.js +24 -0
  153. package/dist/commands/channel/title.js.map +1 -0
  154. package/dist/commands/channel/wait.d.ts +17 -0
  155. package/dist/commands/channel/wait.d.ts.map +1 -0
  156. package/dist/commands/channel/wait.js +75 -0
  157. package/dist/commands/channel/wait.js.map +1 -0
  158. package/dist/commands/init.d.ts +62 -0
  159. package/dist/commands/init.d.ts.map +1 -0
  160. package/dist/commands/init.js +1656 -0
  161. package/dist/commands/init.js.map +1 -0
  162. package/dist/commands/mem.d.ts +30 -0
  163. package/dist/commands/mem.d.ts.map +1 -0
  164. package/dist/commands/mem.js +424 -0
  165. package/dist/commands/mem.js.map +1 -0
  166. package/dist/commands/rollout.d.ts +34 -0
  167. package/dist/commands/rollout.d.ts.map +1 -0
  168. package/dist/commands/rollout.js +102 -0
  169. package/dist/commands/rollout.js.map +1 -0
  170. package/dist/commands/uninstall.d.ts +27 -0
  171. package/dist/commands/uninstall.d.ts.map +1 -0
  172. package/dist/commands/uninstall.js +339 -0
  173. package/dist/commands/uninstall.js.map +1 -0
  174. package/dist/commands/update.d.ts +80 -0
  175. package/dist/commands/update.d.ts.map +1 -0
  176. package/dist/commands/update.js +2185 -0
  177. package/dist/commands/update.js.map +1 -0
  178. package/dist/commands/upgrade.d.ts +28 -0
  179. package/dist/commands/upgrade.d.ts.map +1 -0
  180. package/dist/commands/upgrade.js +84 -0
  181. package/dist/commands/upgrade.js.map +1 -0
  182. package/dist/commands/workflow.d.ts +35 -0
  183. package/dist/commands/workflow.d.ts.map +1 -0
  184. package/dist/commands/workflow.js +219 -0
  185. package/dist/commands/workflow.js.map +1 -0
  186. package/dist/configurators/antigravity.d.ts +7 -0
  187. package/dist/configurators/antigravity.d.ts.map +1 -0
  188. package/dist/configurators/antigravity.js +19 -0
  189. package/dist/configurators/antigravity.js.map +1 -0
  190. package/dist/configurators/claude.d.ts +9 -0
  191. package/dist/configurators/claude.d.ts.map +1 -0
  192. package/dist/configurators/claude.js +72 -0
  193. package/dist/configurators/claude.js.map +1 -0
  194. package/dist/configurators/codebuddy.d.ts +10 -0
  195. package/dist/configurators/codebuddy.d.ts.map +1 -0
  196. package/dist/configurators/codebuddy.js +30 -0
  197. package/dist/configurators/codebuddy.js.map +1 -0
  198. package/dist/configurators/codex.d.ts +8 -0
  199. package/dist/configurators/codex.d.ts.map +1 -0
  200. package/dist/configurators/codex.js +87 -0
  201. package/dist/configurators/codex.js.map +1 -0
  202. package/dist/configurators/copilot.d.ts +10 -0
  203. package/dist/configurators/copilot.d.ts.map +1 -0
  204. package/dist/configurators/copilot.js +51 -0
  205. package/dist/configurators/copilot.js.map +1 -0
  206. package/dist/configurators/cursor.d.ts +20 -0
  207. package/dist/configurators/cursor.d.ts.map +1 -0
  208. package/dist/configurators/cursor.js +49 -0
  209. package/dist/configurators/cursor.js.map +1 -0
  210. package/dist/configurators/cursor2plus-local.d.ts +6 -0
  211. package/dist/configurators/cursor2plus-local.d.ts.map +1 -0
  212. package/dist/configurators/cursor2plus-local.js +20 -0
  213. package/dist/configurators/cursor2plus-local.js.map +1 -0
  214. package/dist/configurators/droid.d.ts +10 -0
  215. package/dist/configurators/droid.d.ts.map +1 -0
  216. package/dist/configurators/droid.js +30 -0
  217. package/dist/configurators/droid.js.map +1 -0
  218. package/dist/configurators/gemini.d.ts +16 -0
  219. package/dist/configurators/gemini.d.ts.map +1 -0
  220. package/dist/configurators/gemini.js +38 -0
  221. package/dist/configurators/gemini.js.map +1 -0
  222. package/dist/configurators/index.d.ts +69 -0
  223. package/dist/configurators/index.d.ts.map +1 -0
  224. package/dist/configurators/index.js +395 -0
  225. package/dist/configurators/index.js.map +1 -0
  226. package/dist/configurators/kilo.d.ts +7 -0
  227. package/dist/configurators/kilo.d.ts.map +1 -0
  228. package/dist/configurators/kilo.js +19 -0
  229. package/dist/configurators/kilo.js.map +1 -0
  230. package/dist/configurators/kiro.d.ts +8 -0
  231. package/dist/configurators/kiro.d.ts.map +1 -0
  232. package/dist/configurators/kiro.js +24 -0
  233. package/dist/configurators/kiro.js.map +1 -0
  234. package/dist/configurators/opencode.d.ts +14 -0
  235. package/dist/configurators/opencode.d.ts.map +1 -0
  236. package/dist/configurators/opencode.js +96 -0
  237. package/dist/configurators/opencode.js.map +1 -0
  238. package/dist/configurators/pi.d.ts +3 -0
  239. package/dist/configurators/pi.d.ts.map +1 -0
  240. package/dist/configurators/pi.js +45 -0
  241. package/dist/configurators/pi.js.map +1 -0
  242. package/dist/configurators/qoder.d.ts +11 -0
  243. package/dist/configurators/qoder.d.ts.map +1 -0
  244. package/dist/configurators/qoder.js +31 -0
  245. package/dist/configurators/qoder.js.map +1 -0
  246. package/dist/configurators/shared.d.ts +183 -0
  247. package/dist/configurators/shared.d.ts.map +1 -0
  248. package/dist/configurators/shared.js +557 -0
  249. package/dist/configurators/shared.js.map +1 -0
  250. package/dist/configurators/windsurf.d.ts +7 -0
  251. package/dist/configurators/windsurf.d.ts.map +1 -0
  252. package/dist/configurators/windsurf.js +19 -0
  253. package/dist/configurators/windsurf.js.map +1 -0
  254. package/dist/configurators/workflow.d.ts +46 -0
  255. package/dist/configurators/workflow.d.ts.map +1 -0
  256. package/dist/configurators/workflow.js +180 -0
  257. package/dist/configurators/workflow.js.map +1 -0
  258. package/dist/constants/paths.d.ts +70 -0
  259. package/dist/constants/paths.d.ts.map +1 -0
  260. package/dist/constants/paths.js +79 -0
  261. package/dist/constants/paths.js.map +1 -0
  262. package/dist/constants/version.d.ts +9 -0
  263. package/dist/constants/version.d.ts.map +1 -0
  264. package/dist/constants/version.js +15 -0
  265. package/dist/constants/version.js.map +1 -0
  266. package/dist/index.d.ts +9 -0
  267. package/dist/index.d.ts.map +1 -0
  268. package/dist/index.js +9 -0
  269. package/dist/index.js.map +1 -0
  270. package/dist/migrations/index.d.ts +62 -0
  271. package/dist/migrations/index.d.ts.map +1 -0
  272. package/dist/migrations/index.js +187 -0
  273. package/dist/migrations/index.js.map +1 -0
  274. package/dist/migrations/manifests/0.1.0.json +9 -0
  275. package/dist/templates/claude/agents/trellis-check.md +124 -0
  276. package/dist/templates/claude/agents/trellis-implement.md +110 -0
  277. package/dist/templates/claude/agents/trellis-research.md +137 -0
  278. package/dist/templates/claude/index.d.ts +22 -0
  279. package/dist/templates/claude/index.d.ts.map +1 -0
  280. package/dist/templates/claude/index.js +46 -0
  281. package/dist/templates/claude/index.js.map +1 -0
  282. package/dist/templates/claude/settings.json +84 -0
  283. package/dist/templates/codebuddy/agents/trellis-check.md +115 -0
  284. package/dist/templates/codebuddy/agents/trellis-implement.md +110 -0
  285. package/dist/templates/codebuddy/agents/trellis-research.md +137 -0
  286. package/dist/templates/codebuddy/index.d.ts +15 -0
  287. package/dist/templates/codebuddy/index.d.ts.map +1 -0
  288. package/dist/templates/codebuddy/index.js +15 -0
  289. package/dist/templates/codebuddy/index.js.map +1 -0
  290. package/dist/templates/codebuddy/settings.json +70 -0
  291. package/dist/templates/codex/agents/trellis-check.toml +67 -0
  292. package/dist/templates/codex/agents/trellis-implement.toml +40 -0
  293. package/dist/templates/codex/agents/trellis-research.toml +73 -0
  294. package/dist/templates/codex/config.toml +28 -0
  295. package/dist/templates/codex/hooks/session-start.py +575 -0
  296. package/dist/templates/codex/hooks.json +15 -0
  297. package/dist/templates/codex/index.d.ts +39 -0
  298. package/dist/templates/codex/index.d.ts.map +1 -0
  299. package/dist/templates/codex/index.js +85 -0
  300. package/dist/templates/codex/index.js.map +1 -0
  301. package/dist/templates/codex/skills/before-dev/SKILL.md +40 -0
  302. package/dist/templates/codex/skills/brainstorm/SKILL.md +112 -0
  303. package/dist/templates/codex/skills/break-loop/SKILL.md +130 -0
  304. package/dist/templates/codex/skills/check/SKILL.md +98 -0
  305. package/dist/templates/codex/skills/check-cross-layer/SKILL.md +158 -0
  306. package/dist/templates/codex/skills/create-command/SKILL.md +101 -0
  307. package/dist/templates/codex/skills/finish-work/SKILL.md +90 -0
  308. package/dist/templates/codex/skills/improve-ut/SKILL.md +69 -0
  309. package/dist/templates/codex/skills/integrate-skill/SKILL.md +221 -0
  310. package/dist/templates/codex/skills/onboard/SKILL.md +363 -0
  311. package/dist/templates/codex/skills/record-session/SKILL.md +67 -0
  312. package/dist/templates/codex/skills/start/SKILL.md +66 -0
  313. package/dist/templates/codex/skills/update-spec/SKILL.md +335 -0
  314. package/dist/templates/common/bundled-skills/smart-search-cli/SKILL.md +388 -0
  315. package/dist/templates/common/bundled-skills/smart-search-cli/agents/openai.yaml +3 -0
  316. package/dist/templates/common/bundled-skills/smart-search-cli/examples/batch-search.md +98 -0
  317. package/dist/templates/common/bundled-skills/smart-search-cli/examples/evidence-gathering.md +89 -0
  318. package/dist/templates/common/bundled-skills/smart-search-cli/references/cli-contract.md +337 -0
  319. package/dist/templates/common/bundled-skills/trellis-cursor2plus-setup/SKILL.md +62 -0
  320. package/dist/templates/common/bundled-skills/trellis-meta/SKILL.md +73 -0
  321. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/add-project-local-conventions.md +83 -0
  322. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-agents.md +54 -0
  323. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-context-loading.md +84 -0
  324. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-hooks.md +57 -0
  325. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-skills-or-commands.md +80 -0
  326. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-spec-structure.md +83 -0
  327. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-task-lifecycle.md +88 -0
  328. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-workflow.md +65 -0
  329. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/overview.md +55 -0
  330. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/context-injection.md +68 -0
  331. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/generated-files.md +80 -0
  332. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/overview.md +51 -0
  333. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/spec-system.md +102 -0
  334. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/task-system.md +133 -0
  335. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/workflow.md +75 -0
  336. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/workspace-memory.md +71 -0
  337. package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/agents.md +80 -0
  338. package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/hooks-and-settings.md +69 -0
  339. package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/overview.md +61 -0
  340. package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/platform-map.md +76 -0
  341. package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/skills-and-commands.md +128 -0
  342. package/dist/templates/common/bundled-skills/trellis-micro-grill/SKILL.md +47 -0
  343. package/dist/templates/common/bundled-skills/trellis-skill-creator/SKILL.md +44 -0
  344. package/dist/templates/common/bundled-skills/trellis-skill-creator/references/authoring-rules.md +97 -0
  345. package/dist/templates/common/bundled-skills/trellis-skill-creator/references/review-checklist.md +47 -0
  346. package/dist/templates/common/bundled-skills/trellis-skill-creator/references/trellis-skill-locations.md +52 -0
  347. package/dist/templates/common/bundled-skills/trellis-spec-bootstrap/SKILL.md +41 -0
  348. package/dist/templates/common/bundled-skills/trellis-spec-bootstrap/references/mcp-setup.md +90 -0
  349. package/dist/templates/common/bundled-skills/trellis-spec-bootstrap/references/repository-analysis.md +59 -0
  350. package/dist/templates/common/bundled-skills/trellis-spec-bootstrap/references/spec-task-planning.md +61 -0
  351. package/dist/templates/common/bundled-skills/trellis-spec-bootstrap/references/spec-writing.md +70 -0
  352. package/dist/templates/common/commands/continue.md +63 -0
  353. package/dist/templates/common/commands/finish-work.md +68 -0
  354. package/dist/templates/common/commands/start.md +69 -0
  355. package/dist/templates/common/index.d.ts +48 -0
  356. package/dist/templates/common/index.d.ts.map +1 -0
  357. package/dist/templates/common/index.js +104 -0
  358. package/dist/templates/common/index.js.map +1 -0
  359. package/dist/templates/common/skills/before-dev.md +35 -0
  360. package/dist/templates/common/skills/brainstorm.md +164 -0
  361. package/dist/templates/common/skills/break-loop.md +125 -0
  362. package/dist/templates/common/skills/check.md +106 -0
  363. package/dist/templates/common/skills/update-spec.md +364 -0
  364. package/dist/templates/copilot/hooks/session-start.py +557 -0
  365. package/dist/templates/copilot/hooks.json +19 -0
  366. package/dist/templates/copilot/index.d.ts +23 -0
  367. package/dist/templates/copilot/index.d.ts.map +1 -0
  368. package/dist/templates/copilot/index.js +54 -0
  369. package/dist/templates/copilot/index.js.map +1 -0
  370. package/dist/templates/copilot/prompts/before-dev.prompt.md +39 -0
  371. package/dist/templates/copilot/prompts/brainstorm.prompt.md +111 -0
  372. package/dist/templates/copilot/prompts/break-loop.prompt.md +129 -0
  373. package/dist/templates/copilot/prompts/check-cross-layer.prompt.md +157 -0
  374. package/dist/templates/copilot/prompts/check.prompt.md +97 -0
  375. package/dist/templates/copilot/prompts/create-command.prompt.md +116 -0
  376. package/dist/templates/copilot/prompts/finish-work.prompt.md +99 -0
  377. package/dist/templates/copilot/prompts/integrate-skill.prompt.md +223 -0
  378. package/dist/templates/copilot/prompts/onboard.prompt.md +362 -0
  379. package/dist/templates/copilot/prompts/parallel.prompt.md +204 -0
  380. package/dist/templates/copilot/prompts/record-session.prompt.md +66 -0
  381. package/dist/templates/copilot/prompts/start.prompt.md +63 -0
  382. package/dist/templates/copilot/prompts/update-spec.prompt.md +358 -0
  383. package/dist/templates/cursor/agents/trellis-check.md +139 -0
  384. package/dist/templates/cursor/agents/trellis-implement.md +119 -0
  385. package/dist/templates/cursor/agents/trellis-research.md +147 -0
  386. package/dist/templates/cursor/commands/cursor2plus-setup.md +82 -0
  387. package/dist/templates/cursor/hooks.json +30 -0
  388. package/dist/templates/cursor/index.d.ts +19 -0
  389. package/dist/templates/cursor/index.d.ts.map +1 -0
  390. package/dist/templates/cursor/index.js +19 -0
  391. package/dist/templates/cursor/index.js.map +1 -0
  392. package/dist/templates/cursor/rules/trellis-triage.mdc +38 -0
  393. package/dist/templates/cursor/worktrees.json +11 -0
  394. package/dist/templates/droid/droids/trellis-check.md +107 -0
  395. package/dist/templates/droid/droids/trellis-implement.md +102 -0
  396. package/dist/templates/droid/droids/trellis-research.md +137 -0
  397. package/dist/templates/droid/index.d.ts +15 -0
  398. package/dist/templates/droid/index.d.ts.map +1 -0
  399. package/dist/templates/droid/index.js +15 -0
  400. package/dist/templates/droid/index.js.map +1 -0
  401. package/dist/templates/droid/settings.json +70 -0
  402. package/dist/templates/extract.d.ts +40 -0
  403. package/dist/templates/extract.d.ts.map +1 -0
  404. package/dist/templates/extract.js +106 -0
  405. package/dist/templates/extract.js.map +1 -0
  406. package/dist/templates/gemini/agents/trellis-check.md +107 -0
  407. package/dist/templates/gemini/agents/trellis-implement.md +102 -0
  408. package/dist/templates/gemini/agents/trellis-research.md +136 -0
  409. package/dist/templates/gemini/index.d.ts +13 -0
  410. package/dist/templates/gemini/index.d.ts.map +1 -0
  411. package/dist/templates/gemini/index.js +13 -0
  412. package/dist/templates/gemini/index.js.map +1 -0
  413. package/dist/templates/gemini/settings.json +28 -0
  414. package/dist/templates/kiro/agents/trellis-check.json +26 -0
  415. package/dist/templates/kiro/agents/trellis-implement.json +26 -0
  416. package/dist/templates/kiro/agents/trellis-research.json +30 -0
  417. package/dist/templates/kiro/index.d.ts +18 -0
  418. package/dist/templates/kiro/index.d.ts.map +1 -0
  419. package/dist/templates/kiro/index.js +18 -0
  420. package/dist/templates/kiro/index.js.map +1 -0
  421. package/dist/templates/markdown/agents.md +32 -0
  422. package/dist/templates/markdown/gitignore.txt +15 -0
  423. package/dist/templates/markdown/index.d.ts +30 -0
  424. package/dist/templates/markdown/index.d.ts.map +1 -0
  425. package/dist/templates/markdown/index.js +55 -0
  426. package/dist/templates/markdown/index.js.map +1 -0
  427. package/dist/templates/markdown/spec/backend/database-guidelines.md.txt +51 -0
  428. package/dist/templates/markdown/spec/backend/directory-structure.md.txt +54 -0
  429. package/dist/templates/markdown/spec/backend/error-handling.md.txt +51 -0
  430. package/dist/templates/markdown/spec/backend/index.md.txt +38 -0
  431. package/dist/templates/markdown/spec/backend/logging-guidelines.md.txt +51 -0
  432. package/dist/templates/markdown/spec/backend/quality-guidelines.md.txt +51 -0
  433. package/dist/templates/markdown/spec/frontend/component-guidelines.md.txt +59 -0
  434. package/dist/templates/markdown/spec/frontend/directory-structure.md.txt +54 -0
  435. package/dist/templates/markdown/spec/frontend/hook-guidelines.md.txt +51 -0
  436. package/dist/templates/markdown/spec/frontend/index.md.txt +39 -0
  437. package/dist/templates/markdown/spec/frontend/quality-guidelines.md.txt +51 -0
  438. package/dist/templates/markdown/spec/frontend/state-management.md.txt +51 -0
  439. package/dist/templates/markdown/spec/frontend/type-safety.md.txt +51 -0
  440. package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md.txt +223 -0
  441. package/dist/templates/markdown/spec/guides/cross-layer-thinking-guide.md.txt +259 -0
  442. package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md.txt +633 -0
  443. package/dist/templates/markdown/spec/guides/cursor-context-injection-guide.md.txt +65 -0
  444. package/dist/templates/markdown/spec/guides/cursor-subagent-policy.md.txt +382 -0
  445. package/dist/templates/markdown/spec/guides/durable-learning-decision-guide.md.txt +76 -0
  446. package/dist/templates/markdown/spec/guides/index.md.txt +101 -0
  447. package/dist/templates/markdown/spec/guides/retrieval-daily-guide.md.txt +92 -0
  448. package/dist/templates/markdown/workspace-index.md +125 -0
  449. package/dist/templates/markdown/worktree.yaml.txt +58 -0
  450. package/dist/templates/opencode/agents/trellis-check.md +122 -0
  451. package/dist/templates/opencode/agents/trellis-implement.md +118 -0
  452. package/dist/templates/opencode/agents/trellis-research.md +145 -0
  453. package/dist/templates/opencode/lib/session-utils.js +667 -0
  454. package/dist/templates/opencode/lib/trellis-context.js +336 -0
  455. package/dist/templates/opencode/package.json +5 -0
  456. package/dist/templates/opencode/plugins/inject-subagent-context.js +495 -0
  457. package/dist/templates/opencode/plugins/inject-workflow-state.js +159 -0
  458. package/dist/templates/opencode/plugins/session-start.js +101 -0
  459. package/dist/templates/pi/agents/trellis-check.md +37 -0
  460. package/dist/templates/pi/agents/trellis-implement.md +42 -0
  461. package/dist/templates/pi/agents/trellis-research.md +25 -0
  462. package/dist/templates/pi/extensions/trellis/index.ts.txt +1600 -0
  463. package/dist/templates/pi/index.d.ts +5 -0
  464. package/dist/templates/pi/index.d.ts.map +1 -0
  465. package/dist/templates/pi/index.js +12 -0
  466. package/dist/templates/pi/index.js.map +1 -0
  467. package/dist/templates/pi/settings.json +12 -0
  468. package/dist/templates/qoder/agents/trellis-check.md +108 -0
  469. package/dist/templates/qoder/agents/trellis-implement.md +103 -0
  470. package/dist/templates/qoder/agents/trellis-research.md +137 -0
  471. package/dist/templates/qoder/index.d.ts +15 -0
  472. package/dist/templates/qoder/index.d.ts.map +1 -0
  473. package/dist/templates/qoder/index.js +15 -0
  474. package/dist/templates/qoder/index.js.map +1 -0
  475. package/dist/templates/qoder/settings.json +47 -0
  476. package/dist/templates/shared-hooks/index.d.ts +50 -0
  477. package/dist/templates/shared-hooks/index.d.ts.map +1 -0
  478. package/dist/templates/shared-hooks/index.js +92 -0
  479. package/dist/templates/shared-hooks/index.js.map +1 -0
  480. package/dist/templates/shared-hooks/inject-shell-session-context.py +183 -0
  481. package/dist/templates/shared-hooks/inject-subagent-context.py +774 -0
  482. package/dist/templates/shared-hooks/inject-workflow-state.py +366 -0
  483. package/dist/templates/shared-hooks/research-end-retrieval-pack.py +220 -0
  484. package/dist/templates/shared-hooks/session-start.py +873 -0
  485. package/dist/templates/template-utils.d.ts +28 -0
  486. package/dist/templates/template-utils.d.ts.map +1 -0
  487. package/dist/templates/template-utils.js +83 -0
  488. package/dist/templates/template-utils.js.map +1 -0
  489. package/dist/templates/trellis/config.yaml +132 -0
  490. package/dist/templates/trellis/gitignore.txt +39 -0
  491. package/dist/templates/trellis/index.d.ts +80 -0
  492. package/dist/templates/trellis/index.d.ts.map +1 -0
  493. package/dist/templates/trellis/index.js +171 -0
  494. package/dist/templates/trellis/index.js.map +1 -0
  495. package/dist/templates/trellis/local/README.md +59 -0
  496. package/dist/templates/trellis/local/config.local.json.example +6 -0
  497. package/dist/templates/trellis/local/index.d.ts +7 -0
  498. package/dist/templates/trellis/local/index.d.ts.map +1 -0
  499. package/dist/templates/trellis/local/index.js +14 -0
  500. package/dist/templates/trellis/local/index.js.map +1 -0
  501. package/dist/templates/trellis/local/patch_wpelc8.py +297 -0
  502. package/dist/templates/trellis/local/subagent-models.json.example +4 -0
  503. package/dist/templates/trellis/local/trellis-task-models.json.example +10 -0
  504. package/dist/templates/trellis/local/trellis-task-models.json5.example +45 -0
  505. package/dist/templates/trellis/local/trellis_task_models_config.py +200 -0
  506. package/dist/templates/trellis/scripts/__init__.py +5 -0
  507. package/dist/templates/trellis/scripts/add_session.py +547 -0
  508. package/dist/templates/trellis/scripts/build_context_pack.py +12 -0
  509. package/dist/templates/trellis/scripts/build_retrieval_pack.py +12 -0
  510. package/dist/templates/trellis/scripts/common/__init__.py +103 -0
  511. package/dist/templates/trellis/scripts/common/active_task.py +607 -0
  512. package/dist/templates/trellis/scripts/common/artifact_search.py +587 -0
  513. package/dist/templates/trellis/scripts/common/cli_adapter.py +811 -0
  514. package/dist/templates/trellis/scripts/common/cli_environment.py +155 -0
  515. package/dist/templates/trellis/scripts/common/codebase_retrieval_router.py +902 -0
  516. package/dist/templates/trellis/scripts/common/config.py +458 -0
  517. package/dist/templates/trellis/scripts/common/context_pack.py +371 -0
  518. package/dist/templates/trellis/scripts/common/developer.py +190 -0
  519. package/dist/templates/trellis/scripts/common/git.py +31 -0
  520. package/dist/templates/trellis/scripts/common/git_context.py +149 -0
  521. package/dist/templates/trellis/scripts/common/io.py +37 -0
  522. package/dist/templates/trellis/scripts/common/log.py +45 -0
  523. package/dist/templates/trellis/scripts/common/packages_context.py +239 -0
  524. package/dist/templates/trellis/scripts/common/parent_orchestration.py +691 -0
  525. package/dist/templates/trellis/scripts/common/paths.py +457 -0
  526. package/dist/templates/trellis/scripts/common/retrieval_adapter_metadata.py +889 -0
  527. package/dist/templates/trellis/scripts/common/retrieval_evidence.py +917 -0
  528. package/dist/templates/trellis/scripts/common/retrieval_pack.py +425 -0
  529. package/dist/templates/trellis/scripts/common/retrieval_pack_context.py +126 -0
  530. package/dist/templates/trellis/scripts/common/safe_commit.py +285 -0
  531. package/dist/templates/trellis/scripts/common/session_context.py +1159 -0
  532. package/dist/templates/trellis/scripts/common/session_memory.py +360 -0
  533. package/dist/templates/trellis/scripts/common/smart_search_evidence.py +479 -0
  534. package/dist/templates/trellis/scripts/common/smart_search_resolve.py +125 -0
  535. package/dist/templates/trellis/scripts/common/task_context.py +223 -0
  536. package/dist/templates/trellis/scripts/common/task_dashboard.py +140 -0
  537. package/dist/templates/trellis/scripts/common/task_gates.py +1735 -0
  538. package/dist/templates/trellis/scripts/common/task_map.py +586 -0
  539. package/dist/templates/trellis/scripts/common/task_queue.py +188 -0
  540. package/dist/templates/trellis/scripts/common/task_store.py +1533 -0
  541. package/dist/templates/trellis/scripts/common/task_utils.py +274 -0
  542. package/dist/templates/trellis/scripts/common/tasks.py +231 -0
  543. package/dist/templates/trellis/scripts/common/test_retrieval_arbitration.py +333 -0
  544. package/dist/templates/trellis/scripts/common/trellis_config.py +131 -0
  545. package/dist/templates/trellis/scripts/common/types.py +110 -0
  546. package/dist/templates/trellis/scripts/common/workflow_phase.py +212 -0
  547. package/dist/templates/trellis/scripts/get_context.py +17 -0
  548. package/dist/templates/trellis/scripts/get_developer.py +26 -0
  549. package/dist/templates/trellis/scripts/hooks/linear_sync.py +243 -0
  550. package/dist/templates/trellis/scripts/init_developer.py +51 -0
  551. package/dist/templates/trellis/scripts/route_codebase_retrieval.py +77 -0
  552. package/dist/templates/trellis/scripts/run_smart_search.py +12 -0
  553. package/dist/templates/trellis/scripts/search_artifacts.py +13 -0
  554. package/dist/templates/trellis/scripts/search_memory.py +12 -0
  555. package/dist/templates/trellis/scripts/task.py +851 -0
  556. package/dist/templates/trellis/tasks/.gitkeep +0 -0
  557. package/dist/templates/trellis/tasks/templates/release-execution/design.md +61 -0
  558. package/dist/templates/trellis/tasks/templates/release-execution/handoff-template.md +29 -0
  559. package/dist/templates/trellis/tasks/templates/release-execution/implement.md +29 -0
  560. package/dist/templates/trellis/tasks/templates/release-execution/prd.md +31 -0
  561. package/dist/templates/trellis/tasks/templates/release-readiness/design.md +50 -0
  562. package/dist/templates/trellis/tasks/templates/release-readiness/handoff-template.md +39 -0
  563. package/dist/templates/trellis/tasks/templates/release-readiness/implement.md +29 -0
  564. package/dist/templates/trellis/tasks/templates/release-readiness/prd.md +31 -0
  565. package/dist/templates/trellis/workflow.md +960 -0
  566. package/dist/types/ai-tools.d.ts +106 -0
  567. package/dist/types/ai-tools.d.ts.map +1 -0
  568. package/dist/types/ai-tools.js +294 -0
  569. package/dist/types/ai-tools.js.map +1 -0
  570. package/dist/types/migration.d.ts +125 -0
  571. package/dist/types/migration.d.ts.map +1 -0
  572. package/dist/types/migration.js +8 -0
  573. package/dist/types/migration.js.map +1 -0
  574. package/dist/utils/codebase-retrieval-router.d.ts +77 -0
  575. package/dist/utils/codebase-retrieval-router.d.ts.map +1 -0
  576. package/dist/utils/codebase-retrieval-router.js +767 -0
  577. package/dist/utils/codebase-retrieval-router.js.map +1 -0
  578. package/dist/utils/compare-versions.d.ts +12 -0
  579. package/dist/utils/compare-versions.d.ts.map +1 -0
  580. package/dist/utils/compare-versions.js +86 -0
  581. package/dist/utils/compare-versions.js.map +1 -0
  582. package/dist/utils/cwd-guard.d.ts +38 -0
  583. package/dist/utils/cwd-guard.d.ts.map +1 -0
  584. package/dist/utils/cwd-guard.js +62 -0
  585. package/dist/utils/cwd-guard.js.map +1 -0
  586. package/dist/utils/file-writer.d.ts +36 -0
  587. package/dist/utils/file-writer.d.ts.map +1 -0
  588. package/dist/utils/file-writer.js +203 -0
  589. package/dist/utils/file-writer.js.map +1 -0
  590. package/dist/utils/manifest-prune.d.ts +61 -0
  591. package/dist/utils/manifest-prune.d.ts.map +1 -0
  592. package/dist/utils/manifest-prune.js +136 -0
  593. package/dist/utils/manifest-prune.js.map +1 -0
  594. package/dist/utils/posix.d.ts +13 -0
  595. package/dist/utils/posix.d.ts.map +1 -0
  596. package/dist/utils/posix.js +15 -0
  597. package/dist/utils/posix.js.map +1 -0
  598. package/dist/utils/post-update-smoke.d.ts +7 -0
  599. package/dist/utils/post-update-smoke.d.ts.map +1 -0
  600. package/dist/utils/post-update-smoke.js +40 -0
  601. package/dist/utils/post-update-smoke.js.map +1 -0
  602. package/dist/utils/project-capabilities.d.ts +54 -0
  603. package/dist/utils/project-capabilities.d.ts.map +1 -0
  604. package/dist/utils/project-capabilities.js +515 -0
  605. package/dist/utils/project-capabilities.js.map +1 -0
  606. package/dist/utils/project-detector.d.ts +46 -0
  607. package/dist/utils/project-detector.d.ts.map +1 -0
  608. package/dist/utils/project-detector.js +666 -0
  609. package/dist/utils/project-detector.js.map +1 -0
  610. package/dist/utils/proxy.d.ts +25 -0
  611. package/dist/utils/proxy.d.ts.map +1 -0
  612. package/dist/utils/proxy.js +60 -0
  613. package/dist/utils/proxy.js.map +1 -0
  614. package/dist/utils/readiness.d.ts +20 -0
  615. package/dist/utils/readiness.d.ts.map +1 -0
  616. package/dist/utils/readiness.js +430 -0
  617. package/dist/utils/readiness.js.map +1 -0
  618. package/dist/utils/retrieval-execution-telemetry.d.ts +162 -0
  619. package/dist/utils/retrieval-execution-telemetry.d.ts.map +1 -0
  620. package/dist/utils/retrieval-execution-telemetry.js +288 -0
  621. package/dist/utils/retrieval-execution-telemetry.js.map +1 -0
  622. package/dist/utils/retrieval-result-ranking.d.ts +40 -0
  623. package/dist/utils/retrieval-result-ranking.d.ts.map +1 -0
  624. package/dist/utils/retrieval-result-ranking.js +162 -0
  625. package/dist/utils/retrieval-result-ranking.js.map +1 -0
  626. package/dist/utils/task-json.d.ts +13 -0
  627. package/dist/utils/task-json.d.ts.map +1 -0
  628. package/dist/utils/task-json.js +12 -0
  629. package/dist/utils/task-json.js.map +1 -0
  630. package/dist/utils/template-fetcher.d.ts +150 -0
  631. package/dist/utils/template-fetcher.d.ts.map +1 -0
  632. package/dist/utils/template-fetcher.js +907 -0
  633. package/dist/utils/template-fetcher.js.map +1 -0
  634. package/dist/utils/template-hash.d.ts +123 -0
  635. package/dist/utils/template-hash.d.ts.map +1 -0
  636. package/dist/utils/template-hash.js +334 -0
  637. package/dist/utils/template-hash.js.map +1 -0
  638. package/dist/utils/uninstall-scrubbers.d.ts +66 -0
  639. package/dist/utils/uninstall-scrubbers.d.ts.map +1 -0
  640. package/dist/utils/uninstall-scrubbers.js +342 -0
  641. package/dist/utils/uninstall-scrubbers.js.map +1 -0
  642. package/dist/utils/update-rollout-report.d.ts +137 -0
  643. package/dist/utils/update-rollout-report.d.ts.map +1 -0
  644. package/dist/utils/update-rollout-report.js +108 -0
  645. package/dist/utils/update-rollout-report.js.map +1 -0
  646. package/dist/utils/workflow-resolver.d.ts +86 -0
  647. package/dist/utils/workflow-resolver.d.ts.map +1 -0
  648. package/dist/utils/workflow-resolver.js +265 -0
  649. package/dist/utils/workflow-resolver.js.map +1 -0
  650. package/package.json +137 -0
  651. package/scripts/postinstall.js +45 -0
  652. package/vendor/smart-search/LICENSE +21 -0
  653. package/vendor/smart-search/README.md +412 -0
  654. package/vendor/smart-search/README.zh-CN.md +430 -0
  655. package/vendor/smart-search/npm/bin/smart-search.js +63 -0
  656. package/vendor/smart-search/npm/scripts/postinstall.js +87 -0
  657. package/vendor/smart-search/npm/scripts/resolve-prerelease-version.js +108 -0
  658. package/vendor/smart-search/npm/scripts/set-package-version.js +35 -0
  659. package/vendor/smart-search/npm/scripts/sync-python-version.js +22 -0
  660. package/vendor/smart-search/npm/scripts/test-wrapper-repair.js +99 -0
  661. package/vendor/smart-search/npm/scripts/test.js +85 -0
  662. package/vendor/smart-search/package.json +42 -0
  663. package/vendor/smart-search/pyproject.toml +37 -0
  664. package/vendor/smart-search/skills/smart-search-cli/SKILL.md +387 -0
  665. package/vendor/smart-search/skills/smart-search-cli/agents/openai.yaml +3 -0
  666. package/vendor/smart-search/skills/smart-search-cli/examples/batch-search.md +98 -0
  667. package/vendor/smart-search/skills/smart-search-cli/examples/evidence-gathering.md +89 -0
  668. package/vendor/smart-search/skills/smart-search-cli/references/cli-contract.md +337 -0
  669. package/vendor/smart-search/src/smart_search/__init__.py +1 -0
  670. package/vendor/smart-search/src/smart_search/assets/skills/smart-search-cli/SKILL.md +387 -0
  671. package/vendor/smart-search/src/smart_search/assets/skills/smart-search-cli/agents/openai.yaml +3 -0
  672. package/vendor/smart-search/src/smart_search/assets/skills/smart-search-cli/examples/batch-search.md +98 -0
  673. package/vendor/smart-search/src/smart_search/assets/skills/smart-search-cli/examples/evidence-gathering.md +89 -0
  674. package/vendor/smart-search/src/smart_search/assets/skills/smart-search-cli/references/cli-contract.md +337 -0
  675. package/vendor/smart-search/src/smart_search/cli.py +2003 -0
  676. package/vendor/smart-search/src/smart_search/config.py +580 -0
  677. package/vendor/smart-search/src/smart_search/logger.py +43 -0
  678. package/vendor/smart-search/src/smart_search/providers/__init__.py +16 -0
  679. package/vendor/smart-search/src/smart_search/providers/base.py +41 -0
  680. package/vendor/smart-search/src/smart_search/providers/context7.py +141 -0
  681. package/vendor/smart-search/src/smart_search/providers/exa.py +206 -0
  682. package/vendor/smart-search/src/smart_search/providers/jina.py +136 -0
  683. package/vendor/smart-search/src/smart_search/providers/openai_compatible.py +370 -0
  684. package/vendor/smart-search/src/smart_search/providers/zhipu.py +143 -0
  685. package/vendor/smart-search/src/smart_search/service.py +2865 -0
  686. package/vendor/smart-search/src/smart_search/sources.py +429 -0
  687. package/vendor/smart-search/src/smart_search/utils.py +220 -0
@@ -0,0 +1,902 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Deterministic codebase retrieval intent router (Python template).
4
+
5
+ Mirrors packages/cli/src/utils/codebase-retrieval-router.ts for dogfood and
6
+ get_context retrieval-pack flows. Does not invoke rg, MCP, or network tools.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import json
12
+ import re
13
+ from pathlib import Path
14
+ from typing import Any
15
+
16
+ ROUTER_VERSION = 2
17
+
18
+ PLATFORM_CURSOR = "cursor"
19
+ PLATFORM_CLAUDE_CODE = "claude-code"
20
+ PLATFORM_CODEX = "codex"
21
+ PLATFORM_GENERIC = "generic"
22
+ KNOWN_PLATFORMS = {PLATFORM_CURSOR, PLATFORM_CLAUDE_CODE, PLATFORM_CODEX, PLATFORM_GENERIC}
23
+
24
+ MODALITY_LEXICAL = "lexical"
25
+ MODALITY_STRUCTURAL = "structural"
26
+ MODALITY_SEMANTIC = "semantic"
27
+
28
+ TOKEN_ECONOMY_HIGH = "high"
29
+ TOKEN_ECONOMY_MEDIUM = "medium"
30
+ TOKEN_ECONOMY_LOW = "low"
31
+
32
+ INTENT_EXACT = "exact-symbol-path"
33
+ INTENT_POLICY = "policy-document"
34
+ INTENT_CALLER = "caller-chain"
35
+ INTENT_TRAP = "trap-package-disambiguation"
36
+ INTENT_EXTENSION = "extension-shared-symbol"
37
+ INTENT_ENV = "env-config-literal"
38
+ INTENT_PRESERVE = "protocol-platform-preserve"
39
+ INTENT_CONCEPTUAL = "cross-cutting-discovery"
40
+
41
+ POLICY_PATTERNS = [
42
+ re.compile(r"\bstorage\s+policy\b", re.I),
43
+ re.compile(r"\bsidecar\b", re.I),
44
+ re.compile(r"\bsqlite\s+only\b", re.I),
45
+ re.compile(r"\bpersistence\b", re.I),
46
+ re.compile(r"\bimport\s+boundar", re.I),
47
+ re.compile(r"\btransport[- ]only\b", re.I),
48
+ re.compile(r"\barchitecture\b", re.I),
49
+ re.compile(r"\bconvention(s)?\b", re.I),
50
+ re.compile(r"\bforbidden\b", re.I),
51
+ re.compile(r"\ballowed\b", re.I),
52
+ re.compile(r"\bwhere\s+is\s+\w+\s+defined\b", re.I),
53
+ re.compile(r"\bwho\s+owns\b", re.I),
54
+ re.compile(r"\bwho\s+is\s+responsible\s+for\b", re.I),
55
+ re.compile(r"\bwhich\s+module\s+handles\b", re.I),
56
+ re.compile(r"\bwhich\s+package\s+is\s+responsible\b", re.I),
57
+ re.compile(r"\ballowed\s+in\b", re.I),
58
+ re.compile(r"\bforbidden\s+in\b", re.I),
59
+ re.compile(r"\brestricted\s+to\b", re.I),
60
+ re.compile(r"\bmust\s+not\b", re.I),
61
+ re.compile(r"\bshould\s+not\b", re.I),
62
+ re.compile(r"\bboundary\s+between\b", re.I),
63
+ re.compile(r"\bboundary\s+of\b", re.I),
64
+ re.compile(r"\bcode\s+boundary\b", re.I),
65
+ re.compile(r"\bmodule\s+boundary\b", re.I),
66
+ re.compile(r"\bpackage\s+boundary\b", re.I),
67
+ re.compile(r"规定"),
68
+ re.compile(r"边界"),
69
+ re.compile(r"为什么不能"),
70
+ re.compile(r"\bAGENTS\.md\b", re.I),
71
+ re.compile(r"\bpolicy\b", re.I),
72
+ re.compile(r"\bownership\b", re.I),
73
+ re.compile(r"\bresponsibilit(y|ies)\b", re.I),
74
+ re.compile(r"不能"),
75
+ re.compile(r"规则"),
76
+ ]
77
+
78
+ CONCEPTUAL_PATTERNS = [
79
+ re.compile(r"\bhow\s+does\b", re.I),
80
+ re.compile(r"\bacross\s+(packages|modules)\b", re.I),
81
+ re.compile(r"\bwhere\s+is\b.*\b(handled|implemented)\b", re.I),
82
+ re.compile(r"\bdifference\s+between\b", re.I),
83
+ re.compile(r"\boverall\s+design\b", re.I),
84
+ re.compile(r"如何"),
85
+ re.compile(r"机制"),
86
+ re.compile(r"跨"),
87
+ re.compile(r"为什么"),
88
+ re.compile(r"原理"),
89
+ re.compile(r"区别"),
90
+ ]
91
+
92
+ PRESERVE_PATTERNS = [
93
+ re.compile(r"\bapps/(ios|android)\b", re.I),
94
+ re.compile(r"\bgateway-protocol\b", re.I),
95
+ re.compile(r"\bpackages/gateway-protocol\b", re.I),
96
+ re.compile(r"\.swift\b", re.I),
97
+ re.compile(r"\.kt\b", re.I),
98
+ re.compile(r"\bschema\b", re.I),
99
+ re.compile(r"\bcontract\b", re.I),
100
+ re.compile(r"\bprotocol\s+constant\b", re.I),
101
+ ]
102
+
103
+ CALLER_PATTERNS = [
104
+ re.compile(r"\bwho\s+calls\b", re.I),
105
+ re.compile(r"\bwhich\s+modules?\s+invoke\b", re.I),
106
+ re.compile(r"\bcall\s*sites?\b", re.I),
107
+ re.compile(r"\bcaller(s)?\b", re.I),
108
+ re.compile(r"\bwired\b", re.I),
109
+ re.compile(r"\bdelegate(s|d)?\b", re.I),
110
+ re.compile(r"\bassembly\b", re.I),
111
+ re.compile(r"\bdependents\b", re.I),
112
+ re.compile(r"\busages?\s+of\b", re.I),
113
+ re.compile(r"谁调用"),
114
+ re.compile(r"调用链"),
115
+ re.compile(r"影响面"),
116
+ re.compile(r"被哪些"),
117
+ re.compile(r"哪些地方"),
118
+ re.compile(r"哪里用到"),
119
+ ]
120
+
121
+ TRAP_PATTERNS = [
122
+ re.compile(r"\bpackages/[a-z0-9-]+\b", re.I),
123
+ re.compile(r"\bsrc/agents\b", re.I),
124
+ re.compile(r"\btrap\b", re.I),
125
+ re.compile(r"\bdifferent\s+package\b", re.I),
126
+ re.compile(r"\blayer\b", re.I),
127
+ re.compile(r"\boverlay\b", re.I),
128
+ re.compile(r"\bcore\s+library\b", re.I),
129
+ ]
130
+
131
+ EXTENSION_PATTERNS = [
132
+ re.compile(r"\bextensions/\b", re.I),
133
+ re.compile(r"\bextension\s+id\b", re.I),
134
+ re.compile(r"\bshared\s+symbol\b", re.I),
135
+ re.compile(r"\bacross\s+extensions\b", re.I),
136
+ ]
137
+
138
+ ENV_PATTERNS = [
139
+ re.compile(r"\bOPENCLAW_[A-Z0-9_]+\b"),
140
+ re.compile(r"\be2e\b", re.I),
141
+ re.compile(r"\bbench(mark)?\b", re.I),
142
+ re.compile(r"\benv\s+var", re.I),
143
+ re.compile(r"\benvironment\s+variable\b", re.I),
144
+ re.compile(r"\bstartup\s+script\b", re.I),
145
+ ]
146
+
147
+ EXACT_PATTERNS = [
148
+ re.compile(r"\b[A-Z][a-zA-Z0-9]+(?:[A-Z][a-zA-Z0-9]+)+\b"),
149
+ re.compile(r"\b[a-z][a-zA-Z0-9]+(?:[A-Z][a-zA-Z0-9]+)+\b"),
150
+ re.compile(r"`[^`]+`"),
151
+ re.compile(r"\b[\w.-]+\.(ts|tsx|js|jsx|py|rs|go|swift|kt|md|json|yaml|yml)\b", re.I),
152
+ re.compile(r"\b(?:src|packages|extensions)/[\w./-]+", re.I),
153
+ ]
154
+
155
+
156
+ def _normalize_query(query: str) -> str:
157
+ return " ".join(query.split())
158
+
159
+
160
+ def _match_any(patterns: list[re.Pattern[str]], text: str) -> list[str]:
161
+ hits: list[str] = []
162
+ for pattern in patterns:
163
+ match = pattern.search(text)
164
+ if match:
165
+ hits.append(match.group(0))
166
+ return hits
167
+
168
+
169
+ def _confidence(hit_count: int, strong: bool) -> str:
170
+ if strong and hit_count >= 2:
171
+ return "high"
172
+ if hit_count >= 2:
173
+ return "medium"
174
+ if hit_count == 1:
175
+ return "medium" if strong else "low"
176
+ return "low"
177
+
178
+
179
+ def _intent(
180
+ intent_id: str,
181
+ label: str,
182
+ signals: list[str],
183
+ confidence: str,
184
+ preserve_exact_primary: bool,
185
+ ) -> dict[str, object]:
186
+ unique_signals = list(dict.fromkeys(signals))[:12]
187
+ return {
188
+ "id": intent_id,
189
+ "label": label,
190
+ "confidence": confidence,
191
+ "signals": unique_signals,
192
+ "preserveExactPrimary": preserve_exact_primary,
193
+ }
194
+
195
+
196
+ def _classify_intents(query: str) -> list[dict[str, object]]:
197
+ intents: list[dict[str, object]] = []
198
+
199
+ preserve_hits = _match_any(PRESERVE_PATTERNS, query)
200
+ if preserve_hits:
201
+ intents.append(
202
+ _intent(
203
+ INTENT_PRESERVE,
204
+ "Protocol / platform preserve (F/G)",
205
+ preserve_hits,
206
+ _confidence(len(preserve_hits), True),
207
+ True,
208
+ )
209
+ )
210
+
211
+ exact_hits = _match_any(EXACT_PATTERNS, query)
212
+ if exact_hits:
213
+ intents.append(
214
+ _intent(
215
+ INTENT_EXACT,
216
+ "Exact symbol or path",
217
+ exact_hits,
218
+ _confidence(len(exact_hits), True),
219
+ True,
220
+ )
221
+ )
222
+
223
+ policy_hits = _match_any(POLICY_PATTERNS, query)
224
+ if policy_hits:
225
+ intents.append(
226
+ _intent(
227
+ INTENT_POLICY,
228
+ "Policy and document-first (C-class)",
229
+ policy_hits,
230
+ _confidence(len(policy_hits), False),
231
+ False,
232
+ )
233
+ )
234
+
235
+ caller_hits = _match_any(CALLER_PATTERNS, query)
236
+ if caller_hits:
237
+ intents.append(
238
+ _intent(
239
+ INTENT_CALLER,
240
+ "Caller and assembly chain (B-class)",
241
+ caller_hits,
242
+ _confidence(len(caller_hits), False),
243
+ False,
244
+ )
245
+ )
246
+
247
+ trap_hits = _match_any(TRAP_PATTERNS, query)
248
+ if trap_hits:
249
+ intents.append(
250
+ _intent(
251
+ INTENT_TRAP,
252
+ "Trap demotion and package boundary (E-class)",
253
+ trap_hits,
254
+ _confidence(len(trap_hits), False),
255
+ False,
256
+ )
257
+ )
258
+
259
+ extension_hits = _match_any(EXTENSION_PATTERNS, query)
260
+ if extension_hits:
261
+ intents.append(
262
+ _intent(
263
+ INTENT_EXTENSION,
264
+ "Extension shared-symbol disambiguation (A-class)",
265
+ extension_hits,
266
+ _confidence(len(extension_hits), False),
267
+ False,
268
+ )
269
+ )
270
+
271
+ env_hits = _match_any(ENV_PATTERNS, query)
272
+ if env_hits:
273
+ intents.append(
274
+ _intent(
275
+ INTENT_ENV,
276
+ "Environment and config literals (D-class)",
277
+ env_hits,
278
+ _confidence(len(env_hits), False),
279
+ False,
280
+ )
281
+ )
282
+
283
+ if not exact_hits and not preserve_hits:
284
+ conceptual_hits = _match_any(CONCEPTUAL_PATTERNS, query)
285
+ if conceptual_hits:
286
+ intents.append(
287
+ _intent(
288
+ INTENT_CONCEPTUAL,
289
+ "Conceptual / cross-cutting discovery",
290
+ conceptual_hits,
291
+ _confidence(len(conceptual_hits), False),
292
+ False,
293
+ )
294
+ )
295
+
296
+ if not intents:
297
+ intents.append(
298
+ _intent(
299
+ INTENT_EXACT,
300
+ "General codebase (exact baseline)",
301
+ ["default-exact-baseline"],
302
+ "low",
303
+ True,
304
+ )
305
+ )
306
+
307
+ seen: set[str] = set()
308
+ deduped: list[dict[str, object]] = []
309
+ for item in intents:
310
+ intent_id = str(item["id"])
311
+ if intent_id in seen:
312
+ continue
313
+ seen.add(intent_id)
314
+ deduped.append(item)
315
+ return deduped
316
+
317
+
318
+ def _base_verification() -> list[dict[str, object]]:
319
+ return [
320
+ {
321
+ "id": "source-read",
322
+ "requirement": "Read current source around candidate file ranges before final claims.",
323
+ "appliesToRoles": ["exact", "ast", "lsp", "semantic"],
324
+ },
325
+ {
326
+ "id": "git-scope",
327
+ "requirement": "Inspect relevant Git diff/log evidence when behavior or impact is claimed.",
328
+ "appliesToRoles": ["verification"],
329
+ },
330
+ {
331
+ "id": "focused-tests",
332
+ "requirement": "Run task-appropriate validation when tests define the claim boundary.",
333
+ "appliesToRoles": ["verification"],
334
+ },
335
+ ]
336
+
337
+
338
+ def _verification_for_intents(intents: list[dict[str, object]]) -> list[dict[str, object]]:
339
+ ids = {str(item["id"]) for item in intents}
340
+ if INTENT_POLICY in ids:
341
+ return [
342
+ {
343
+ "id": "policy-doc-top1",
344
+ "requirement": (
345
+ "For policy/document intents, confirm Top-1 policy evidence from "
346
+ "AGENTS.md or .trellis/spec before ranking implementation modules first."
347
+ ),
348
+ "appliesToRoles": ["exact", "semantic"],
349
+ },
350
+ {
351
+ "id": "agents-neighborhood",
352
+ "requirement": (
353
+ "Read AGENTS.md neighborhood: root AGENTS.md, nested **/AGENTS.md, "
354
+ "and package-level policy files before searching implementation modules."
355
+ ),
356
+ "appliesToRoles": ["exact", "semantic"],
357
+ },
358
+ *_base_verification(),
359
+ ]
360
+ if INTENT_CALLER in ids:
361
+ return [
362
+ {
363
+ "id": "caller-sites",
364
+ "requirement": (
365
+ "Confirm codegraph-caller results cover the call chain, then verify "
366
+ "dynamic dispatch points (callbacks, event handlers, DI registrations) "
367
+ "that codegraph may not resolve statically."
368
+ ),
369
+ "appliesToRoles": ["exact", "ast"],
370
+ },
371
+ *_base_verification(),
372
+ ]
373
+ if INTENT_TRAP in ids:
374
+ return [
375
+ {
376
+ "id": "trap-package-check",
377
+ "requirement": (
378
+ "When multiple same-named symbols exist across packages, confirm the "
379
+ "codegraph result belongs to the correct package by checking the file's "
380
+ "package root or AGENTS.md scope before ranking."
381
+ ),
382
+ "appliesToRoles": ["ast", "exact"],
383
+ },
384
+ *_base_verification(),
385
+ ]
386
+ if INTENT_EXTENSION in ids:
387
+ return [
388
+ {
389
+ "id": "extension-scope-check",
390
+ "requirement": (
391
+ "Confirm the symbol definition lives inside the target extension "
392
+ "directory, not in a shared core module with the same name."
393
+ ),
394
+ "appliesToRoles": ["ast", "exact"],
395
+ },
396
+ *_base_verification(),
397
+ ]
398
+ return _base_verification()
399
+
400
+
401
+ def _modality_for_intent(
402
+ intent_ids: set[str],
403
+ *,
404
+ structural_intents: set[str] | None = None,
405
+ ) -> list[str]:
406
+ """Map classified intents to an ordered list of retrieval modalities.
407
+
408
+ Structural intents (caller-chain, trap, extension) prefer structural search;
409
+ conceptual-only queries prefer semantic first; all others default to lexical-first.
410
+ """
411
+ if structural_intents is None:
412
+ structural_intents = {INTENT_CALLER, INTENT_TRAP, INTENT_EXTENSION}
413
+
414
+ if intent_ids & structural_intents:
415
+ return [MODALITY_STRUCTURAL, MODALITY_LEXICAL, MODALITY_SEMANTIC]
416
+ if INTENT_CONCEPTUAL in intent_ids and INTENT_EXACT not in intent_ids:
417
+ return [MODALITY_SEMANTIC, MODALITY_LEXICAL, MODALITY_STRUCTURAL]
418
+ return [MODALITY_LEXICAL, MODALITY_STRUCTURAL, MODALITY_SEMANTIC]
419
+
420
+
421
+ def _token_economy_for_route(route_id: str, platform: str) -> str:
422
+ """Return a token-economy label for a given route ID."""
423
+ high_economy = {
424
+ "caller-chain-ast",
425
+ "trap-demote-codegraph",
426
+ "extension-codegraph",
427
+ "ast-codegraph",
428
+ "platform-semantic",
429
+ }
430
+ if route_id in high_economy:
431
+ return TOKEN_ECONOMY_HIGH
432
+ low_economy = {"exact-rg-primary"}
433
+ if route_id in low_economy and platform != PLATFORM_CURSOR:
434
+ return TOKEN_ECONOMY_LOW
435
+ return TOKEN_ECONOMY_MEDIUM
436
+
437
+
438
+ def _large_project(project_file_count: int | None) -> bool:
439
+ if project_file_count is None:
440
+ return False
441
+ return project_file_count > 2000
442
+
443
+
444
+ def _ordered_routes(
445
+ intents: list[dict[str, object]],
446
+ include_optional_adapters: bool,
447
+ *,
448
+ platform: str = PLATFORM_GENERIC,
449
+ project_file_count: int | None = None,
450
+ ) -> list[dict[str, object]]:
451
+ ids = {str(item["id"]) for item in intents}
452
+ active = list(ids)
453
+ preserve = INTENT_PRESERVE in ids
454
+ policy = INTENT_POLICY in ids
455
+ caller = INTENT_CALLER in ids
456
+ trap = INTENT_TRAP in ids
457
+ extension = INTENT_EXTENSION in ids
458
+ env = INTENT_ENV in ids
459
+ exact = INTENT_EXACT in ids
460
+ conceptual = INTENT_CONCEPTUAL in ids
461
+ exact_primary_first = preserve or exact
462
+ conceptual_primary = conceptual and not preserve and not exact_primary_first
463
+ is_cursor = platform == PLATFORM_CURSOR
464
+ large = _large_project(project_file_count)
465
+ semantic_promoted = False
466
+
467
+ routes: list[dict[str, object]] = []
468
+
469
+ def append(route: dict[str, object]) -> None:
470
+ route_id = str(route.get("id", ""))
471
+ routes.append({
472
+ **route,
473
+ "order": len(routes) + 1,
474
+ "intentIds": active,
475
+ "tokenEconomy": _token_economy_for_route(route_id, platform),
476
+ "platformNative": route.get("platformNative", False),
477
+ })
478
+
479
+ # ── Structural-first intents: caller, trap, extension ──
480
+ # R2: codegraph ahead of rg for structural intents
481
+ if caller:
482
+ append({
483
+ "id": "caller-chain-ast",
484
+ "role": "ast",
485
+ "sourceFamily": "codegraph",
486
+ "commands": [
487
+ "codegraph callers <symbol> --path <path> --json",
488
+ ],
489
+ "rationale": "Caller-chain intent: codegraph for precise call edges first.",
490
+ })
491
+ append({
492
+ "id": "caller-rg-followup",
493
+ "role": "exact",
494
+ "sourceFamily": "rg",
495
+ "commands": ["rg <symbol> --glob '*.ts'"],
496
+ "rationale": "Caller-chain intent: rg follow-up for dynamic callsites codegraph may miss.",
497
+ })
498
+
499
+ if trap and not preserve:
500
+ append({
501
+ "id": "trap-demote-codegraph",
502
+ "role": "ast",
503
+ "sourceFamily": "codegraph",
504
+ "commands": ["codegraph search <symbol> --path <path> --json"],
505
+ "rationale": "Trap intent: codegraph distinguishes same-named symbols across packages.",
506
+ })
507
+ append({
508
+ "id": "trap-demote-rg",
509
+ "role": "exact",
510
+ "sourceFamily": "rg",
511
+ "commands": ["rg <symbol> packages/<name>/", "rg <symbol> src/"],
512
+ "rationale": "Trap intent: rg follow-up across package boundaries.",
513
+ })
514
+
515
+ if extension and not preserve:
516
+ append({
517
+ "id": "extension-codegraph",
518
+ "role": "ast",
519
+ "sourceFamily": "codegraph",
520
+ "commands": ["codegraph search <symbol> --path <path> --json"],
521
+ "rationale": "Extension intent: codegraph finds cross-extension symbol definitions.",
522
+ })
523
+ append({
524
+ "id": "extension-rg",
525
+ "role": "exact",
526
+ "sourceFamily": "rg",
527
+ "commands": ["rg <symbol> extensions/"],
528
+ "rationale": "Extension intent: rg follow-up for extension directory.",
529
+ })
530
+
531
+ # ── Lexical-first intents: exact, policy, preserve, env ──
532
+ if conceptual_primary:
533
+ if policy:
534
+ append({
535
+ "id": "policy-docs-rg",
536
+ "role": "exact",
537
+ "sourceFamily": "policy-docs",
538
+ "commands": [
539
+ 'rg -i "storage default|sidecar|sqlite only" AGENTS.md "**/AGENTS.md" '
540
+ "README.md CONTRIBUTING.md .trellis/spec"
541
+ ],
542
+ "rationale": "Policy/document intent: search instruction and spec docs first.",
543
+ })
544
+ semantic_rationale = (
545
+ "Policy plus conceptual intent: semantic recall after policy docs, before exact rg follow-up."
546
+ if policy
547
+ else "Conceptual query without exact signals; semantic recall before exact rg narrowing."
548
+ )
549
+ if is_cursor:
550
+ append({
551
+ "id": "platform-semantic",
552
+ "role": "semantic",
553
+ "sourceFamily": "platform-semantic",
554
+ "commands": ["cursor @codebase or built-in semantic search"],
555
+ "rationale": semantic_rationale + " (platform-native on Cursor)",
556
+ "platformNative": True,
557
+ })
558
+ else:
559
+ append({
560
+ "id": "semantic-fast-context",
561
+ "role": "semantic",
562
+ "sourceFamily": "fast-context",
563
+ "commands": ["fast_context_search query=<question> project_path=<root>"],
564
+ "rationale": semantic_rationale,
565
+ })
566
+ semantic_promoted = True
567
+ append({
568
+ "id": "exact-rg-primary",
569
+ "role": "exact",
570
+ "sourceFamily": "rg",
571
+ "commands": ["rg <pattern> <path>"],
572
+ "rationale": (
573
+ "Exact rg follow-up after semantic recall (or policy docs) "
574
+ "narrows candidate files and symbols."
575
+ ),
576
+ })
577
+ elif policy and not preserve and not exact_primary_first:
578
+ append({
579
+ "id": "policy-docs-rg",
580
+ "role": "exact",
581
+ "sourceFamily": "policy-docs",
582
+ "commands": [
583
+ 'rg -i "storage default|sidecar|sqlite only" AGENTS.md "**/AGENTS.md" '
584
+ "README.md CONTRIBUTING.md .trellis/spec"
585
+ ],
586
+ "rationale": "Policy/document intent: search instruction and spec docs first.",
587
+ })
588
+ append({
589
+ "id": "exact-rg-primary",
590
+ "role": "exact",
591
+ "sourceFamily": "rg",
592
+ "commands": ["rg <pattern> <path>"],
593
+ "rationale": "Exact rg after policy doc pass when no symbol/path intent is present.",
594
+ })
595
+ elif exact_primary_first:
596
+ append({
597
+ "id": "exact-rg-primary",
598
+ "role": "exact",
599
+ "sourceFamily": "rg",
600
+ "commands": ["rg <pattern> <path>"],
601
+ "rationale": "Exact identifiers and paths stay primary.",
602
+ })
603
+ if policy and not preserve:
604
+ append({
605
+ "id": "policy-docs-rg",
606
+ "role": "exact",
607
+ "sourceFamily": "policy-docs",
608
+ "commands": [
609
+ 'rg -i "storage default|sidecar|sqlite only" AGENTS.md "**/AGENTS.md" '
610
+ "README.md CONTRIBUTING.md .trellis/spec"
611
+ ],
612
+ "rationale": "Policy/document branch after exact-primary when both intents match.",
613
+ })
614
+
615
+ if env and not preserve:
616
+ append({
617
+ "id": "env-scripts-rg",
618
+ "role": "exact",
619
+ "sourceFamily": "rg",
620
+ "commands": ["rg <env-prefix> scripts test e2e bench"],
621
+ "rationale": "Env/config literals: scripts and test trees before src/ modules.",
622
+ })
623
+
624
+ if not any(str(item.get("id")) == "exact-rg-primary" for item in routes):
625
+ append({
626
+ "id": "exact-rg-primary",
627
+ "role": "exact",
628
+ "sourceFamily": "rg",
629
+ "commands": ["rg <pattern> <path>"],
630
+ "rationale": "Baseline exact search.",
631
+ })
632
+
633
+ # ── Optional adapters ──
634
+ if include_optional_adapters:
635
+ # R4: large project → codegraph as structural-first supplement
636
+ if not any(str(r.get("id")) == "caller-chain-ast" for r in routes):
637
+ cg_rationale = (
638
+ "Structural search first on large codebase for token efficiency."
639
+ if large
640
+ else "Structural expansion after exact candidates."
641
+ )
642
+ append({
643
+ "id": "ast-codegraph",
644
+ "role": "ast",
645
+ "sourceFamily": "codegraph",
646
+ "commands": [
647
+ "codegraph query <symbol-or-search> --path <path> --json",
648
+ "codegraph callers <symbol> --path <path> --json",
649
+ ],
650
+ "rationale": cg_rationale,
651
+ })
652
+ if is_cursor:
653
+ append({
654
+ "id": "lsp-navigation",
655
+ "role": "lsp",
656
+ "sourceFamily": "language-server",
657
+ "commands": ["definition", "references", "hover"],
658
+ "rationale": "LSP via platform-native Cursor features.",
659
+ "platformNative": True,
660
+ })
661
+ else:
662
+ append({
663
+ "id": "lsp-navigation",
664
+ "role": "lsp",
665
+ "sourceFamily": "language-server",
666
+ "commands": ["definition", "references", "hover"],
667
+ "rationale": "LSP after candidate symbols exist.",
668
+ })
669
+ if not semantic_promoted:
670
+ if is_cursor:
671
+ append({
672
+ "id": "platform-semantic",
673
+ "role": "semantic",
674
+ "sourceFamily": "platform-semantic",
675
+ "commands": ["cursor @codebase or built-in semantic search"],
676
+ "rationale": "Semantic recall via platform-native Cursor search.",
677
+ "platformNative": True,
678
+ })
679
+ else:
680
+ append({
681
+ "id": "semantic-fast-context",
682
+ "role": "semantic",
683
+ "sourceFamily": "fast-context",
684
+ "commands": ["fast_context_search query=<question> project_path=<root>"],
685
+ "rationale": "Semantic recall last; convert to exact rg follow-ups.",
686
+ })
687
+
688
+ append({
689
+ "id": "verification-source-git-tests",
690
+ "role": "verification",
691
+ "sourceFamily": "source-git-tests",
692
+ "commands": ["git diff -- <path>", "Get-Content <file>"],
693
+ "rationale": "Required proof layer for verified claims.",
694
+ })
695
+
696
+ # R4: large project → reorder so codegraph routes precede rg when not already
697
+ if large:
698
+ structural = [r for r in routes if r.get("role") in ("ast",)]
699
+ others = [r for r in routes if r.get("role") not in ("ast",)]
700
+ routes = structural + others
701
+
702
+ return [{**route, "order": index + 1} for index, route in enumerate(routes)]
703
+
704
+
705
+ def _fallback_hints(
706
+ intents: list[dict[str, object]],
707
+ include_optional_adapters: bool,
708
+ routes: list[dict[str, object]],
709
+ *,
710
+ platform: str = PLATFORM_GENERIC,
711
+ ) -> list[dict[str, object]]:
712
+ hints: list[dict[str, object]] = [
713
+ {
714
+ "when": "rg missing on PATH",
715
+ "action": "Codebase retrieval readiness fails; install or expose rg.",
716
+ }
717
+ ]
718
+ is_cursor = platform == PLATFORM_CURSOR
719
+ if not include_optional_adapters:
720
+ hints.append({
721
+ "when": "codebase-retrieval not selected",
722
+ "action": "Skip optional AST/LSP/semantic routes; use exact search and verification.",
723
+ "replacesRole": "semantic",
724
+ })
725
+ if any(str(item["id"]) == INTENT_POLICY for item in intents):
726
+ hints.append({
727
+ "when": "semantic Top-1 is implementation-only for policy query",
728
+ "action": "Fall back to policy-doc rg and AGENTS.md/.trellis/spec reads.",
729
+ "replacesRole": "semantic",
730
+ })
731
+ semantic_route = next(
732
+ (r for r in routes if str(r.get("role")) == "semantic"),
733
+ None,
734
+ )
735
+ ids = {str(item["id"]) for item in intents}
736
+ has_conceptual = INTENT_CONCEPTUAL in ids
737
+ exact_primary = any(
738
+ str(item["id"]) == INTENT_EXACT and bool(item.get("preserveExactPrimary"))
739
+ for item in intents
740
+ )
741
+ if include_optional_adapters and semantic_route and (
742
+ has_conceptual or int(semantic_route.get("order", 99)) >= 3 or exact_primary
743
+ ):
744
+ if is_cursor:
745
+ hints.append({
746
+ "when": (
747
+ "exact rg returns no corroborated file/range candidates "
748
+ "(or only trap hits) before final Top-1"
749
+ ),
750
+ "action": (
751
+ "Use Cursor @codebase or built-in semantic search per platform-semantic route, "
752
+ "then narrow with rg on returned keywords and paths."
753
+ ),
754
+ "replacesRole": "semantic",
755
+ })
756
+ else:
757
+ hints.append({
758
+ "when": (
759
+ "exact rg returns no corroborated file/range candidates "
760
+ "(or only trap hits) before final Top-1"
761
+ ),
762
+ "action": (
763
+ "Invoke fast_context_search per semantic-fast-context route, then narrow "
764
+ "with rg on returned keywords and paths; semantic output remains recall-only "
765
+ "until source reads confirm."
766
+ ),
767
+ "replacesRole": "semantic",
768
+ })
769
+ return hints
770
+
771
+
772
+ def _warnings(
773
+ intents: list[dict[str, object]],
774
+ *,
775
+ platform: str = PLATFORM_GENERIC,
776
+ ) -> list[str]:
777
+ warnings: list[str] = []
778
+ low = [str(item["id"]) for item in intents if item.get("confidence") == "low"]
779
+ if low:
780
+ warnings.append(f"Low-confidence intent classification for: {', '.join(low)}.")
781
+ ids = {str(item["id"]) for item in intents}
782
+ if INTENT_POLICY in ids and INTENT_PRESERVE in ids:
783
+ warnings.append(
784
+ "Both policy-document and protocol-platform-preserve detected; preserve keeps exact-symbol primary."
785
+ )
786
+ if (
787
+ INTENT_CONCEPTUAL in ids
788
+ and INTENT_EXACT not in ids
789
+ and INTENT_PRESERVE not in ids
790
+ ):
791
+ semantic_hint = (
792
+ "platform-semantic" if platform == PLATFORM_CURSOR else "semantic-fast-context"
793
+ )
794
+ warnings.append(
795
+ f"Conceptual intent without exact signals; {semantic_hint} route promoted in plan. "
796
+ "Convert semantic hits to exact rg follow-ups before final claims."
797
+ )
798
+ return warnings
799
+
800
+
801
+ def route_codebase_retrieval(
802
+ query: str,
803
+ *,
804
+ codebase_retrieval_selected: bool = True,
805
+ platform: str = PLATFORM_GENERIC,
806
+ project_file_count: int | None = None,
807
+ ) -> dict[str, object]:
808
+ """Return the shared evidence envelope with router-owned fields populated."""
809
+ normalized = _normalize_query(query)
810
+ include_optional = codebase_retrieval_selected
811
+ normalized_platform = platform if platform in KNOWN_PLATFORMS else PLATFORM_GENERIC
812
+
813
+ if not normalized:
814
+ intents = [
815
+ _intent(INTENT_EXACT, "General codebase (exact baseline)", ["empty-query"], "low", True)
816
+ ]
817
+ empty_routes = _ordered_routes(
818
+ intents, include_optional,
819
+ platform=normalized_platform, project_file_count=project_file_count,
820
+ )
821
+ return {
822
+ "version": ROUTER_VERSION,
823
+ "query": normalized,
824
+ "intents": intents,
825
+ "routes": empty_routes,
826
+ "adapterState": [],
827
+ "freshness": [],
828
+ "fallback": _fallback_hints(intents, include_optional, empty_routes, platform=normalized_platform),
829
+ "warnings": ["Empty query; only baseline exact route is emitted."],
830
+ "verification": _base_verification(),
831
+ "platform": normalized_platform,
832
+ "projectFileCount": project_file_count,
833
+ }
834
+
835
+ intents = _classify_intents(normalized)
836
+ routes = _ordered_routes(
837
+ intents, include_optional,
838
+ platform=normalized_platform, project_file_count=project_file_count,
839
+ )
840
+ return {
841
+ "version": ROUTER_VERSION,
842
+ "query": normalized,
843
+ "intents": intents,
844
+ "routes": routes,
845
+ "adapterState": [],
846
+ "freshness": [],
847
+ "fallback": _fallback_hints(intents, include_optional, routes, platform=normalized_platform),
848
+ "warnings": _warnings(intents, platform=normalized_platform),
849
+ "verification": _verification_for_intents(intents),
850
+ "platform": normalized_platform,
851
+ "projectFileCount": project_file_count,
852
+ }
853
+
854
+
855
+ def codebase_retrieval_selected_from_capabilities(
856
+ capabilities: dict[str, Any] | None,
857
+ ) -> bool:
858
+ if not capabilities:
859
+ return True
860
+ selected = capabilities.get("selected")
861
+ if not isinstance(selected, list):
862
+ return True
863
+ return "codebase-retrieval" in selected
864
+
865
+
866
+ def load_capabilities_json(repo_root: Path | None) -> dict[str, Any] | None:
867
+ if repo_root is None:
868
+ return None
869
+ path = repo_root / ".trellis" / "capabilities.json"
870
+ if not path.is_file():
871
+ return None
872
+ try:
873
+ with path.open(encoding="utf-8") as handle:
874
+ parsed = json.load(handle)
875
+ except (OSError, json.JSONDecodeError):
876
+ return None
877
+ return parsed if isinstance(parsed, dict) else None
878
+
879
+
880
+ def resolve_router_envelope(
881
+ repo_root: Path | None,
882
+ *,
883
+ explicit_router: dict[str, Any] | None = None,
884
+ query: str | None = None,
885
+ platform: str | None = None,
886
+ project_file_count: int | None = None,
887
+ ) -> dict[str, object] | None:
888
+ """Prefer explicit routerEnvelope; otherwise route from query when present."""
889
+ if explicit_router:
890
+ return explicit_router
891
+ normalized = " ".join((query or "").split())
892
+ if not normalized:
893
+ return None
894
+ caps = load_capabilities_json(repo_root)
895
+ selected = codebase_retrieval_selected_from_capabilities(caps)
896
+ resolved_platform = platform if platform in KNOWN_PLATFORMS else PLATFORM_GENERIC
897
+ return route_codebase_retrieval(
898
+ normalized,
899
+ codebase_retrieval_selected=selected,
900
+ platform=resolved_platform,
901
+ project_file_count=project_file_count,
902
+ )