@blxzer/cursor-trellis 0.1.0 → 0.1.2

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 (285) hide show
  1. package/README.md +124 -5
  2. package/README.zh-CN.md +170 -0
  3. package/dist/cli/index.d.ts.map +1 -1
  4. package/dist/cli/index.js +1 -33
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/commands/init.d.ts +0 -13
  7. package/dist/commands/init.d.ts.map +1 -1
  8. package/dist/commands/init.js +7 -14
  9. package/dist/commands/init.js.map +1 -1
  10. package/dist/commands/uninstall.d.ts.map +1 -1
  11. package/dist/commands/uninstall.js +3 -32
  12. package/dist/commands/uninstall.js.map +1 -1
  13. package/dist/commands/update.d.ts.map +1 -1
  14. package/dist/commands/update.js +7 -84
  15. package/dist/commands/update.js.map +1 -1
  16. package/dist/configurators/index.d.ts +7 -8
  17. package/dist/configurators/index.d.ts.map +1 -1
  18. package/dist/configurators/index.js +11 -236
  19. package/dist/configurators/index.js.map +1 -1
  20. package/dist/configurators/workflow.d.ts.map +1 -1
  21. package/dist/configurators/workflow.js +5 -1
  22. package/dist/configurators/workflow.js.map +1 -1
  23. package/dist/migrations/manifests/0.1.1.json +9 -0
  24. package/dist/migrations/manifests/0.1.2.json +9 -0
  25. package/dist/templates/common/bundled-skills/smart-search-cli/SKILL.md +3 -3
  26. package/dist/templates/common/bundled-skills/trellis-meta/SKILL.md +4 -2
  27. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-agents.md +8 -15
  28. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-hooks.md +7 -7
  29. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/change-skills-or-commands.md +18 -21
  30. package/dist/templates/common/bundled-skills/trellis-meta/references/customize-local/overview.md +2 -2
  31. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/generated-files.md +10 -7
  32. package/dist/templates/common/bundled-skills/trellis-meta/references/local-architecture/overview.md +4 -4
  33. package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/agents.md +20 -31
  34. package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/hooks-and-settings.md +20 -31
  35. package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/overview.md +24 -40
  36. package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/platform-map.md +28 -59
  37. package/dist/templates/common/bundled-skills/trellis-meta/references/platform-files/skills-and-commands.md +12 -28
  38. package/dist/templates/common/bundled-skills/trellis-skill-creator/references/trellis-skill-locations.md +2 -2
  39. package/dist/templates/cursor/hooks.json +6 -0
  40. package/dist/templates/cursor/rules/retrieval-routing.mdc +57 -0
  41. package/dist/templates/extract.d.ts +0 -14
  42. package/dist/templates/extract.d.ts.map +1 -1
  43. package/dist/templates/extract.js +0 -34
  44. package/dist/templates/extract.js.map +1 -1
  45. package/dist/templates/markdown/agents.md +2 -6
  46. package/dist/templates/markdown/index.d.ts +1 -0
  47. package/dist/templates/markdown/index.d.ts.map +1 -1
  48. package/dist/templates/markdown/index.js +1 -0
  49. package/dist/templates/markdown/index.js.map +1 -1
  50. package/dist/templates/markdown/prompts/run-semantic-slice-12.md.txt +41 -0
  51. package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md.txt +14 -14
  52. package/dist/templates/markdown/spec/guides/cross-layer-thinking-guide.md.txt +8 -20
  53. package/dist/templates/markdown/spec/guides/cross-platform-thinking-guide.md.txt +15 -14
  54. package/dist/templates/markdown/spec/guides/cursor-context-injection-guide.md.txt +4 -2
  55. package/dist/templates/markdown/spec/guides/cursor-semantic-compliance.md.txt +49 -0
  56. package/dist/templates/markdown/spec/guides/cursor-subagent-policy.md.txt +18 -5
  57. package/dist/templates/markdown/spec/guides/retrieval-daily-guide.md.txt +68 -20
  58. package/dist/templates/shared-hooks/index.d.ts +1 -1
  59. package/dist/templates/shared-hooks/index.d.ts.map +1 -1
  60. package/dist/templates/shared-hooks/index.js +1 -0
  61. package/dist/templates/shared-hooks/index.js.map +1 -1
  62. package/dist/templates/shared-hooks/inject-retrieval-plan.py +163 -0
  63. package/dist/templates/shared-hooks/inject-subagent-context.py +31 -567
  64. package/dist/templates/shared-hooks/research-end-retrieval-pack.py +2 -11
  65. package/dist/templates/trellis/index.d.ts +12 -0
  66. package/dist/templates/trellis/index.d.ts.map +1 -1
  67. package/dist/templates/trellis/index.js +24 -0
  68. package/dist/templates/trellis/index.js.map +1 -1
  69. package/dist/templates/trellis/scripts/aggregate_retrieval_telemetry.py +342 -0
  70. package/dist/templates/trellis/scripts/batch_plan_envelope.py +105 -0
  71. package/dist/templates/trellis/scripts/codegraph_session_smoke.py +76 -0
  72. package/dist/templates/trellis/scripts/common/active_task.py +116 -147
  73. package/dist/templates/trellis/scripts/common/cli_adapter.py +34 -710
  74. package/dist/templates/trellis/scripts/common/codebase_retrieval_router.py +49 -106
  75. package/dist/templates/trellis/scripts/common/git_context.py +17 -2
  76. package/dist/templates/trellis/scripts/common/project_file_stats.py +91 -0
  77. package/dist/templates/trellis/scripts/common/retrieval_adapter_metadata.py +9 -11
  78. package/dist/templates/trellis/scripts/common/retrieval_agent_instructions.py +313 -0
  79. package/dist/templates/trellis/scripts/common/retrieval_pack.py +0 -6
  80. package/dist/templates/trellis/scripts/common/retrieval_pack_context.py +0 -4
  81. package/dist/templates/trellis/scripts/common/retrieval_plan_gate.py +76 -0
  82. package/dist/templates/trellis/scripts/common/retrieval_result_ranking.py +253 -0
  83. package/dist/templates/trellis/scripts/common/retrieval_tool_classification.py +157 -0
  84. package/dist/templates/trellis/scripts/common/semantic_plan_gate.py +52 -0
  85. package/dist/templates/trellis/scripts/common/subagent_dispatch.py +527 -0
  86. package/dist/templates/trellis/scripts/common/task_store.py +32 -0
  87. package/dist/templates/trellis/scripts/common/workflow_phase.py +3 -24
  88. package/dist/templates/trellis/scripts/rank_retrieval_candidates.py +80 -0
  89. package/dist/templates/trellis/scripts/route_codebase_retrieval.py +38 -11
  90. package/dist/templates/trellis/scripts/score_evidence.py +112 -0
  91. package/dist/templates/trellis/scripts/task.py +26 -0
  92. package/dist/templates/trellis/workflow.md +844 -960
  93. package/dist/types/ai-tools.d.ts +13 -16
  94. package/dist/types/ai-tools.d.ts.map +1 -1
  95. package/dist/types/ai-tools.js +5 -238
  96. package/dist/types/ai-tools.js.map +1 -1
  97. package/dist/utils/codebase-retrieval-router.d.ts +1 -8
  98. package/dist/utils/codebase-retrieval-router.d.ts.map +1 -1
  99. package/dist/utils/codebase-retrieval-router.js +39 -180
  100. package/dist/utils/codebase-retrieval-router.js.map +1 -1
  101. package/dist/utils/project-capabilities.d.ts.map +1 -1
  102. package/dist/utils/project-capabilities.js +10 -24
  103. package/dist/utils/project-capabilities.js.map +1 -1
  104. package/dist/utils/retrieval-agent-instructions.d.ts +14 -0
  105. package/dist/utils/retrieval-agent-instructions.d.ts.map +1 -0
  106. package/dist/utils/retrieval-agent-instructions.js +221 -0
  107. package/dist/utils/retrieval-agent-instructions.js.map +1 -0
  108. package/dist/utils/retrieval-execution-telemetry.d.ts +43 -85
  109. package/dist/utils/retrieval-execution-telemetry.d.ts.map +1 -1
  110. package/dist/utils/retrieval-execution-telemetry.js +289 -22
  111. package/dist/utils/retrieval-execution-telemetry.js.map +1 -1
  112. package/dist/utils/retrieval-result-ranking.js +1 -1
  113. package/dist/utils/retrieval-result-ranking.js.map +1 -1
  114. package/dist/utils/retrieval-tool-classification.d.ts +32 -0
  115. package/dist/utils/retrieval-tool-classification.d.ts.map +1 -0
  116. package/dist/utils/retrieval-tool-classification.js +113 -0
  117. package/dist/utils/retrieval-tool-classification.js.map +1 -0
  118. package/dist/utils/uninstall-scrubbers.d.ts +0 -36
  119. package/dist/utils/uninstall-scrubbers.d.ts.map +1 -1
  120. package/dist/utils/uninstall-scrubbers.js +0 -184
  121. package/dist/utils/uninstall-scrubbers.js.map +1 -1
  122. package/package.json +4 -2
  123. package/dist/commands/mem.d.ts +0 -30
  124. package/dist/commands/mem.d.ts.map +0 -1
  125. package/dist/commands/mem.js +0 -424
  126. package/dist/commands/mem.js.map +0 -1
  127. package/dist/configurators/antigravity.d.ts +0 -7
  128. package/dist/configurators/antigravity.d.ts.map +0 -1
  129. package/dist/configurators/antigravity.js +0 -19
  130. package/dist/configurators/antigravity.js.map +0 -1
  131. package/dist/configurators/claude.d.ts +0 -9
  132. package/dist/configurators/claude.d.ts.map +0 -1
  133. package/dist/configurators/claude.js +0 -72
  134. package/dist/configurators/claude.js.map +0 -1
  135. package/dist/configurators/codebuddy.d.ts +0 -10
  136. package/dist/configurators/codebuddy.d.ts.map +0 -1
  137. package/dist/configurators/codebuddy.js +0 -30
  138. package/dist/configurators/codebuddy.js.map +0 -1
  139. package/dist/configurators/codex.d.ts +0 -8
  140. package/dist/configurators/codex.d.ts.map +0 -1
  141. package/dist/configurators/codex.js +0 -87
  142. package/dist/configurators/codex.js.map +0 -1
  143. package/dist/configurators/copilot.d.ts +0 -10
  144. package/dist/configurators/copilot.d.ts.map +0 -1
  145. package/dist/configurators/copilot.js +0 -51
  146. package/dist/configurators/copilot.js.map +0 -1
  147. package/dist/configurators/droid.d.ts +0 -10
  148. package/dist/configurators/droid.d.ts.map +0 -1
  149. package/dist/configurators/droid.js +0 -30
  150. package/dist/configurators/droid.js.map +0 -1
  151. package/dist/configurators/gemini.d.ts +0 -16
  152. package/dist/configurators/gemini.d.ts.map +0 -1
  153. package/dist/configurators/gemini.js +0 -38
  154. package/dist/configurators/gemini.js.map +0 -1
  155. package/dist/configurators/kilo.d.ts +0 -7
  156. package/dist/configurators/kilo.d.ts.map +0 -1
  157. package/dist/configurators/kilo.js +0 -19
  158. package/dist/configurators/kilo.js.map +0 -1
  159. package/dist/configurators/kiro.d.ts +0 -8
  160. package/dist/configurators/kiro.d.ts.map +0 -1
  161. package/dist/configurators/kiro.js +0 -24
  162. package/dist/configurators/kiro.js.map +0 -1
  163. package/dist/configurators/opencode.d.ts +0 -14
  164. package/dist/configurators/opencode.d.ts.map +0 -1
  165. package/dist/configurators/opencode.js +0 -96
  166. package/dist/configurators/opencode.js.map +0 -1
  167. package/dist/configurators/pi.d.ts +0 -3
  168. package/dist/configurators/pi.d.ts.map +0 -1
  169. package/dist/configurators/pi.js +0 -45
  170. package/dist/configurators/pi.js.map +0 -1
  171. package/dist/configurators/qoder.d.ts +0 -11
  172. package/dist/configurators/qoder.d.ts.map +0 -1
  173. package/dist/configurators/qoder.js +0 -31
  174. package/dist/configurators/qoder.js.map +0 -1
  175. package/dist/configurators/windsurf.d.ts +0 -7
  176. package/dist/configurators/windsurf.d.ts.map +0 -1
  177. package/dist/configurators/windsurf.js +0 -19
  178. package/dist/configurators/windsurf.js.map +0 -1
  179. package/dist/templates/claude/agents/trellis-check.md +0 -124
  180. package/dist/templates/claude/agents/trellis-implement.md +0 -110
  181. package/dist/templates/claude/agents/trellis-research.md +0 -137
  182. package/dist/templates/claude/index.d.ts +0 -22
  183. package/dist/templates/claude/index.d.ts.map +0 -1
  184. package/dist/templates/claude/index.js +0 -46
  185. package/dist/templates/claude/index.js.map +0 -1
  186. package/dist/templates/claude/settings.json +0 -84
  187. package/dist/templates/codebuddy/agents/trellis-check.md +0 -115
  188. package/dist/templates/codebuddy/agents/trellis-implement.md +0 -110
  189. package/dist/templates/codebuddy/agents/trellis-research.md +0 -137
  190. package/dist/templates/codebuddy/index.d.ts +0 -15
  191. package/dist/templates/codebuddy/index.d.ts.map +0 -1
  192. package/dist/templates/codebuddy/index.js +0 -15
  193. package/dist/templates/codebuddy/index.js.map +0 -1
  194. package/dist/templates/codebuddy/settings.json +0 -70
  195. package/dist/templates/codex/agents/trellis-check.toml +0 -67
  196. package/dist/templates/codex/agents/trellis-implement.toml +0 -40
  197. package/dist/templates/codex/agents/trellis-research.toml +0 -73
  198. package/dist/templates/codex/config.toml +0 -28
  199. package/dist/templates/codex/hooks/session-start.py +0 -575
  200. package/dist/templates/codex/hooks.json +0 -15
  201. package/dist/templates/codex/index.d.ts +0 -39
  202. package/dist/templates/codex/index.d.ts.map +0 -1
  203. package/dist/templates/codex/index.js +0 -85
  204. package/dist/templates/codex/index.js.map +0 -1
  205. package/dist/templates/codex/skills/before-dev/SKILL.md +0 -40
  206. package/dist/templates/codex/skills/brainstorm/SKILL.md +0 -112
  207. package/dist/templates/codex/skills/break-loop/SKILL.md +0 -130
  208. package/dist/templates/codex/skills/check/SKILL.md +0 -98
  209. package/dist/templates/codex/skills/check-cross-layer/SKILL.md +0 -158
  210. package/dist/templates/codex/skills/create-command/SKILL.md +0 -101
  211. package/dist/templates/codex/skills/finish-work/SKILL.md +0 -90
  212. package/dist/templates/codex/skills/improve-ut/SKILL.md +0 -69
  213. package/dist/templates/codex/skills/integrate-skill/SKILL.md +0 -221
  214. package/dist/templates/codex/skills/onboard/SKILL.md +0 -363
  215. package/dist/templates/codex/skills/record-session/SKILL.md +0 -67
  216. package/dist/templates/codex/skills/start/SKILL.md +0 -66
  217. package/dist/templates/codex/skills/update-spec/SKILL.md +0 -335
  218. package/dist/templates/copilot/hooks/session-start.py +0 -557
  219. package/dist/templates/copilot/hooks.json +0 -19
  220. package/dist/templates/copilot/index.d.ts +0 -23
  221. package/dist/templates/copilot/index.d.ts.map +0 -1
  222. package/dist/templates/copilot/index.js +0 -54
  223. package/dist/templates/copilot/index.js.map +0 -1
  224. package/dist/templates/copilot/prompts/before-dev.prompt.md +0 -39
  225. package/dist/templates/copilot/prompts/brainstorm.prompt.md +0 -111
  226. package/dist/templates/copilot/prompts/break-loop.prompt.md +0 -129
  227. package/dist/templates/copilot/prompts/check-cross-layer.prompt.md +0 -157
  228. package/dist/templates/copilot/prompts/check.prompt.md +0 -97
  229. package/dist/templates/copilot/prompts/create-command.prompt.md +0 -116
  230. package/dist/templates/copilot/prompts/finish-work.prompt.md +0 -99
  231. package/dist/templates/copilot/prompts/integrate-skill.prompt.md +0 -223
  232. package/dist/templates/copilot/prompts/onboard.prompt.md +0 -362
  233. package/dist/templates/copilot/prompts/parallel.prompt.md +0 -204
  234. package/dist/templates/copilot/prompts/record-session.prompt.md +0 -66
  235. package/dist/templates/copilot/prompts/start.prompt.md +0 -63
  236. package/dist/templates/copilot/prompts/update-spec.prompt.md +0 -358
  237. package/dist/templates/droid/droids/trellis-check.md +0 -107
  238. package/dist/templates/droid/droids/trellis-implement.md +0 -102
  239. package/dist/templates/droid/droids/trellis-research.md +0 -137
  240. package/dist/templates/droid/index.d.ts +0 -15
  241. package/dist/templates/droid/index.d.ts.map +0 -1
  242. package/dist/templates/droid/index.js +0 -15
  243. package/dist/templates/droid/index.js.map +0 -1
  244. package/dist/templates/droid/settings.json +0 -70
  245. package/dist/templates/gemini/agents/trellis-check.md +0 -107
  246. package/dist/templates/gemini/agents/trellis-implement.md +0 -102
  247. package/dist/templates/gemini/agents/trellis-research.md +0 -136
  248. package/dist/templates/gemini/index.d.ts +0 -13
  249. package/dist/templates/gemini/index.d.ts.map +0 -1
  250. package/dist/templates/gemini/index.js +0 -13
  251. package/dist/templates/gemini/index.js.map +0 -1
  252. package/dist/templates/gemini/settings.json +0 -28
  253. package/dist/templates/kiro/agents/trellis-check.json +0 -26
  254. package/dist/templates/kiro/agents/trellis-implement.json +0 -26
  255. package/dist/templates/kiro/agents/trellis-research.json +0 -30
  256. package/dist/templates/kiro/index.d.ts +0 -18
  257. package/dist/templates/kiro/index.d.ts.map +0 -1
  258. package/dist/templates/kiro/index.js +0 -18
  259. package/dist/templates/kiro/index.js.map +0 -1
  260. package/dist/templates/opencode/agents/trellis-check.md +0 -122
  261. package/dist/templates/opencode/agents/trellis-implement.md +0 -118
  262. package/dist/templates/opencode/agents/trellis-research.md +0 -145
  263. package/dist/templates/opencode/lib/session-utils.js +0 -667
  264. package/dist/templates/opencode/lib/trellis-context.js +0 -336
  265. package/dist/templates/opencode/package.json +0 -5
  266. package/dist/templates/opencode/plugins/inject-subagent-context.js +0 -495
  267. package/dist/templates/opencode/plugins/inject-workflow-state.js +0 -159
  268. package/dist/templates/opencode/plugins/session-start.js +0 -101
  269. package/dist/templates/pi/agents/trellis-check.md +0 -37
  270. package/dist/templates/pi/agents/trellis-implement.md +0 -42
  271. package/dist/templates/pi/agents/trellis-research.md +0 -25
  272. package/dist/templates/pi/extensions/trellis/index.ts.txt +0 -1600
  273. package/dist/templates/pi/index.d.ts +0 -5
  274. package/dist/templates/pi/index.d.ts.map +0 -1
  275. package/dist/templates/pi/index.js +0 -12
  276. package/dist/templates/pi/index.js.map +0 -1
  277. package/dist/templates/pi/settings.json +0 -12
  278. package/dist/templates/qoder/agents/trellis-check.md +0 -108
  279. package/dist/templates/qoder/agents/trellis-implement.md +0 -103
  280. package/dist/templates/qoder/agents/trellis-research.md +0 -137
  281. package/dist/templates/qoder/index.d.ts +0 -15
  282. package/dist/templates/qoder/index.d.ts.map +0 -1
  283. package/dist/templates/qoder/index.js +0 -15
  284. package/dist/templates/qoder/index.js.map +0 -1
  285. package/dist/templates/qoder/settings.json +0 -47
@@ -1,336 +0,0 @@
1
- /**
2
- * Trellis Context Manager
3
- *
4
- * Utility class for OpenCode plugins providing file reading,
5
- * JSONL parsing, and context building capabilities.
6
- */
7
-
8
- import { existsSync, readFileSync, appendFileSync, readdirSync } from "fs"
9
- import { isAbsolute, join } from "path"
10
- import { platform } from "os"
11
- import { execSync } from "child_process"
12
- import { createHash } from "crypto"
13
- import process from "process"
14
-
15
- const PYTHON_CMD = platform() === "win32" ? "python" : "python3"
16
- // Debug logging
17
- const DEBUG_LOG = "/tmp/trellis-plugin-debug.log"
18
-
19
- function debugLog(prefix, ...args) {
20
- const timestamp = new Date().toISOString()
21
- const msg = `[${timestamp}] [${prefix}] ${args.map(a => typeof a === "object" ? JSON.stringify(a) : a).join(" ")}\n`
22
- try {
23
- appendFileSync(DEBUG_LOG, msg)
24
- } catch {
25
- // ignore
26
- }
27
- }
28
-
29
- function stringValue(value) {
30
- return typeof value === "string" && value.trim() ? value.trim() : null
31
- }
32
-
33
- function sanitizeKey(raw) {
34
- const safe = raw.trim().replace(/[^A-Za-z0-9._-]+/g, "_").replace(/^[._-]+|[._-]+$/g, "")
35
- return safe ? safe.slice(0, 160) : ""
36
- }
37
-
38
- function hashValue(raw) {
39
- return createHash("sha256").update(raw).digest("hex").slice(0, 24)
40
- }
41
-
42
- function lookupString(data, keys) {
43
- if (!data || typeof data !== "object") return null
44
- for (const key of keys) {
45
- const value = stringValue(data[key])
46
- if (value) return value
47
- }
48
- for (const nestedKey of ["input", "properties", "event", "hook_input", "hookInput"]) {
49
- const nested = data[nestedKey]
50
- if (nested && typeof nested === "object") {
51
- const value = lookupString(nested, keys)
52
- if (value) return value
53
- }
54
- }
55
- return null
56
- }
57
-
58
- function buildContextKey(platformName, kind, value) {
59
- if (kind === "transcript") {
60
- return `${platformName}_transcript_${hashValue(value)}`
61
- }
62
- const safeValue = sanitizeKey(value)
63
- return safeValue ? `${platformName}_${safeValue}` : `${platformName}_${hashValue(value)}`
64
- }
65
-
66
- // Matches `trellis-implement`, `trellis-check`, `trellis-research` exactly.
67
- // Used by chat.message plugins to skip injection inside Trellis sub-agent turns.
68
- const TRELLIS_SUBAGENT_RE = /^trellis-(implement|check|research)$/
69
-
70
- /**
71
- * Return true when the OpenCode `chat.message` input represents a Trellis
72
- * sub-agent turn. `input.agent` is set by OpenCode when a Task tool spawns a
73
- * child session with a custom agent (see `packages/opencode/src/tool/task.ts`).
74
- */
75
- export function isTrellisSubagent(input) {
76
- if (!input || typeof input !== "object") return false
77
- const agent = typeof input.agent === "string" ? input.agent.trim() : ""
78
- return TRELLIS_SUBAGENT_RE.test(agent)
79
- }
80
-
81
- /**
82
- * Trellis Context Manager
83
- */
84
- export class TrellisContext {
85
- constructor(directory) {
86
- this.directory = directory
87
- debugLog("context", "TrellisContext initialized", { directory })
88
- }
89
-
90
- // ============================================================
91
- // Trellis Project Detection
92
- // ============================================================
93
-
94
- isTrellisProject() {
95
- return existsSync(join(this.directory, ".trellis"))
96
- }
97
-
98
- getContextKey(platformInput = null) {
99
- const override = stringValue(process.env.TRELLIS_CONTEXT_ID)
100
- if (override) {
101
- return sanitizeKey(override) || hashValue(override)
102
- }
103
-
104
- const runID = stringValue(process.env.OPENCODE_RUN_ID)
105
- if (runID) return buildContextKey("opencode", "session", runID)
106
-
107
- const input = platformInput && typeof platformInput === "object" ? platformInput : null
108
- if (!input) return null
109
-
110
- const sessionID = lookupString(input, ["session_id", "sessionId", "sessionID"])
111
- if (sessionID) return buildContextKey("opencode", "session", sessionID)
112
-
113
- const conversationID = lookupString(input, ["conversation_id", "conversationId", "conversationID"])
114
- if (conversationID) return buildContextKey("opencode", "conversation", conversationID)
115
-
116
- const transcriptPath = lookupString(input, ["transcript_path", "transcriptPath", "transcript"])
117
- if (transcriptPath) return buildContextKey("opencode", "transcript", transcriptPath)
118
-
119
- return null
120
- }
121
-
122
- readContext(contextKey) {
123
- try {
124
- const contextPath = join(this.directory, ".trellis", ".runtime", "sessions", `${contextKey}.json`)
125
- if (!existsSync(contextPath)) return null
126
- return JSON.parse(readFileSync(contextPath, "utf-8"))
127
- } catch {
128
- return null
129
- }
130
- }
131
-
132
- /**
133
- * Get selected task from explicit session runtime context.
134
- *
135
- * Resolution mirrors Python `active_task.resolve_selected_task`: lookup only
136
- * the runtime file for the input-derived context key. A new live session must
137
- * not infer selection from existing runtime files.
138
- */
139
- getActiveTask(platformInput = null) {
140
- const contextKey = this.getContextKey(platformInput)
141
- if (contextKey) {
142
- const context = this.readContext(contextKey)
143
- const taskRef = this.normalizeTaskRef(context?.selected_task || "")
144
- if (taskRef) {
145
- const taskDir = this.resolveTaskDir(taskRef)
146
- return {
147
- taskPath: taskRef,
148
- source: `session:${contextKey}`,
149
- stale: !taskDir || !existsSync(taskDir),
150
- }
151
- }
152
- }
153
-
154
- return { taskPath: null, source: "none", stale: false }
155
- }
156
-
157
- getCurrentTask(platformInput = null) {
158
- return this.getActiveTask(platformInput).taskPath
159
- }
160
-
161
- normalizeTaskRef(taskRef) {
162
- if (!taskRef) {
163
- return ""
164
- }
165
-
166
- if (isAbsolute(taskRef)) {
167
- return taskRef.trim()
168
- }
169
-
170
- let normalized = taskRef.trim().replace(/\\/g, "/")
171
- while (normalized.startsWith("./")) {
172
- normalized = normalized.slice(2)
173
- }
174
-
175
- if (normalized.startsWith("tasks/")) {
176
- return `.trellis/${normalized}`
177
- }
178
-
179
- return normalized
180
- }
181
-
182
- resolveTaskDir(taskRef) {
183
- const normalized = this.normalizeTaskRef(taskRef)
184
- if (!normalized) {
185
- return null
186
- }
187
-
188
- if (isAbsolute(normalized)) {
189
- return normalized
190
- }
191
-
192
- if (normalized.startsWith(".trellis/")) {
193
- return join(this.directory, normalized)
194
- }
195
-
196
- return join(this.directory, ".trellis", "tasks", normalized)
197
- }
198
-
199
- // ============================================================
200
- // File Reading Utilities
201
- // ============================================================
202
-
203
- readFile(filePath) {
204
- try {
205
- if (existsSync(filePath)) {
206
- return readFileSync(filePath, "utf-8")
207
- }
208
- } catch {
209
- // Ignore read errors
210
- }
211
- return null
212
- }
213
-
214
- readProjectFile(relativePath) {
215
- return this.readFile(join(this.directory, relativePath))
216
- }
217
-
218
- runScript(scriptPath, cwd = null, contextKey = null) {
219
- try {
220
- const result = execSync(`${PYTHON_CMD} "${scriptPath}"`, {
221
- cwd: cwd || this.directory,
222
- timeout: 10000,
223
- encoding: "utf-8",
224
- stdio: ["pipe", "pipe", "pipe"],
225
- env: {
226
- ...process.env,
227
- ...(contextKey ? { TRELLIS_CONTEXT_ID: contextKey } : {}),
228
- },
229
- })
230
- return result || ""
231
- } catch {
232
- return ""
233
- }
234
- }
235
-
236
- // ============================================================
237
- // JSONL Reading
238
- // ============================================================
239
-
240
- readDirectoryMdFiles(dirPath, maxFiles = 20) {
241
- const results = []
242
- const fullPath = join(this.directory, dirPath)
243
-
244
- if (!existsSync(fullPath)) {
245
- return results
246
- }
247
-
248
- try {
249
- const files = readdirSync(fullPath)
250
- .filter(f => f.endsWith(".md"))
251
- .sort()
252
- .slice(0, maxFiles)
253
-
254
- for (const filename of files) {
255
- const filePath = join(dirPath, filename)
256
- const content = this.readProjectFile(filePath)
257
- if (content) {
258
- results.push({ path: filePath, content })
259
- }
260
- }
261
- } catch {
262
- // Ignore directory read errors
263
- }
264
-
265
- return results
266
- }
267
-
268
- /**
269
- * Read a JSONL file and load referenced files/directories
270
- * Supports:
271
- * {"file": "path/to/file.md", "reason": "..."}
272
- * {"file": "path/to/dir/", "type": "directory", "reason": "..."}
273
- */
274
- readJsonlWithFiles(jsonlPath) {
275
- const results = []
276
- const content = this.readFile(jsonlPath)
277
- if (!content) return results
278
-
279
- for (const line of content.split("\n")) {
280
- if (!line.trim()) continue
281
- try {
282
- const item = JSON.parse(line)
283
- const file = item.file || item.path
284
- const entryType = item.type || "file"
285
-
286
- if (!file) continue
287
-
288
- if (entryType === "directory") {
289
- const dirEntries = this.readDirectoryMdFiles(file)
290
- results.push(...dirEntries)
291
- } else {
292
- const fullPath = join(this.directory, file)
293
- const fileContent = this.readFile(fullPath)
294
- if (fileContent) {
295
- results.push({ path: file, content: fileContent })
296
- }
297
- }
298
- } catch {
299
- // Ignore parse errors for individual lines
300
- }
301
- }
302
- return results
303
- }
304
-
305
- buildContextFromEntries(entries) {
306
- return entries.map(e => `=== ${e.path} ===\n${e.content}`).join("\n\n")
307
- }
308
- }
309
-
310
- // ============================================================
311
- // Context Collector (for session deduplication)
312
- // ============================================================
313
-
314
- class ContextCollector {
315
- constructor() {
316
- this.processed = new Set()
317
- }
318
-
319
- markProcessed(sessionID) {
320
- this.processed.add(sessionID)
321
- }
322
-
323
- isProcessed(sessionID) {
324
- return this.processed.has(sessionID)
325
- }
326
-
327
- clear(sessionID) {
328
- this.processed.delete(sessionID)
329
- }
330
- }
331
-
332
- // Singleton instance
333
- export const contextCollector = new ContextCollector()
334
-
335
- // Export debug log for plugins
336
- export { debugLog }
@@ -1,5 +0,0 @@
1
- {
2
- "dependencies": {
3
- "@opencode-ai/plugin": "^1.14.39"
4
- }
5
- }