@intutic/cli 2.2.0 → 2.4.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 (356) hide show
  1. package/README.md +8 -8
  2. package/dist/cli.d.ts +0 -1
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +582 -21
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/apiCommand.d.ts +40 -0
  7. package/dist/commands/apiCommand.d.ts.map +1 -0
  8. package/dist/commands/apiCommand.js +88 -0
  9. package/dist/commands/apiCommand.js.map +1 -0
  10. package/dist/commands/budget.d.ts +4 -0
  11. package/dist/commands/budget.d.ts.map +1 -1
  12. package/dist/commands/budget.js +8 -0
  13. package/dist/commands/budget.js.map +1 -1
  14. package/dist/commands/budgetLimits.d.ts +70 -0
  15. package/dist/commands/budgetLimits.d.ts.map +1 -0
  16. package/dist/commands/budgetLimits.js +223 -0
  17. package/dist/commands/budgetLimits.js.map +1 -0
  18. package/dist/commands/compliance.d.ts +122 -0
  19. package/dist/commands/compliance.d.ts.map +1 -0
  20. package/dist/commands/compliance.js +278 -0
  21. package/dist/commands/compliance.js.map +1 -0
  22. package/dist/commands/connect.d.ts +26 -1
  23. package/dist/commands/connect.d.ts.map +1 -1
  24. package/dist/commands/connect.js +109 -51
  25. package/dist/commands/connect.js.map +1 -1
  26. package/dist/commands/credentials.d.ts +6 -2
  27. package/dist/commands/credentials.d.ts.map +1 -1
  28. package/dist/commands/credentials.js +99 -10
  29. package/dist/commands/credentials.js.map +1 -1
  30. package/dist/commands/decision.d.ts +4 -4
  31. package/dist/commands/decision.js +4 -4
  32. package/dist/commands/disconnect.d.ts +4 -0
  33. package/dist/commands/disconnect.d.ts.map +1 -1
  34. package/dist/commands/disconnect.js +17 -3
  35. package/dist/commands/disconnect.js.map +1 -1
  36. package/dist/commands/doctor.d.ts +0 -1
  37. package/dist/commands/doctor.d.ts.map +1 -1
  38. package/dist/commands/doctor.js +0 -1
  39. package/dist/commands/doctor.js.map +1 -1
  40. package/dist/commands/enforce.d.ts +1 -1
  41. package/dist/commands/enforce.js +1 -1
  42. package/dist/commands/enterprise.d.ts +3 -2
  43. package/dist/commands/enterprise.d.ts.map +1 -1
  44. package/dist/commands/enterprise.js +11 -3
  45. package/dist/commands/enterprise.js.map +1 -1
  46. package/dist/commands/env.js +1 -1
  47. package/dist/commands/exec.d.ts +2 -3
  48. package/dist/commands/exec.d.ts.map +1 -1
  49. package/dist/commands/exec.js +4 -5
  50. package/dist/commands/exec.js.map +1 -1
  51. package/dist/commands/gateLiveness.d.ts +15 -0
  52. package/dist/commands/gateLiveness.d.ts.map +1 -0
  53. package/dist/commands/gateLiveness.js +34 -0
  54. package/dist/commands/gateLiveness.js.map +1 -0
  55. package/dist/commands/gateway.d.ts +14 -4
  56. package/dist/commands/gateway.d.ts.map +1 -1
  57. package/dist/commands/gateway.js +34 -4
  58. package/dist/commands/gateway.js.map +1 -1
  59. package/dist/commands/github.d.ts +20 -0
  60. package/dist/commands/github.d.ts.map +1 -0
  61. package/dist/commands/github.js +41 -0
  62. package/dist/commands/github.js.map +1 -0
  63. package/dist/commands/guardrails.d.ts +28 -2
  64. package/dist/commands/guardrails.d.ts.map +1 -1
  65. package/dist/commands/guardrails.js +233 -24
  66. package/dist/commands/guardrails.js.map +1 -1
  67. package/dist/commands/incidents.d.ts +32 -0
  68. package/dist/commands/incidents.d.ts.map +1 -0
  69. package/dist/commands/incidents.js +94 -0
  70. package/dist/commands/incidents.js.map +1 -0
  71. package/dist/commands/init.d.ts +1 -2
  72. package/dist/commands/init.d.ts.map +1 -1
  73. package/dist/commands/init.js +1 -2
  74. package/dist/commands/init.js.map +1 -1
  75. package/dist/commands/install-daemon.d.ts +1 -1
  76. package/dist/commands/install-daemon.js +2 -2
  77. package/dist/commands/integrity.d.ts +10 -2
  78. package/dist/commands/integrity.d.ts.map +1 -1
  79. package/dist/commands/integrity.js +3 -3
  80. package/dist/commands/integrity.js.map +1 -1
  81. package/dist/commands/inventory.d.ts +60 -0
  82. package/dist/commands/inventory.d.ts.map +1 -0
  83. package/dist/commands/inventory.js +141 -0
  84. package/dist/commands/inventory.js.map +1 -0
  85. package/dist/commands/judge.d.ts +1 -1
  86. package/dist/commands/judge.js +2 -2
  87. package/dist/commands/judge.js.map +1 -1
  88. package/dist/commands/login.d.ts +0 -1
  89. package/dist/commands/login.d.ts.map +1 -1
  90. package/dist/commands/login.js +0 -1
  91. package/dist/commands/login.js.map +1 -1
  92. package/dist/commands/logout.d.ts +0 -1
  93. package/dist/commands/logout.d.ts.map +1 -1
  94. package/dist/commands/logout.js +0 -1
  95. package/dist/commands/logout.js.map +1 -1
  96. package/dist/commands/mcp.d.ts +31 -0
  97. package/dist/commands/mcp.d.ts.map +1 -0
  98. package/dist/commands/mcp.js +65 -0
  99. package/dist/commands/mcp.js.map +1 -0
  100. package/dist/commands/notifications.d.ts +54 -0
  101. package/dist/commands/notifications.d.ts.map +1 -0
  102. package/dist/commands/notifications.js +151 -0
  103. package/dist/commands/notifications.js.map +1 -0
  104. package/dist/commands/org.d.ts +3 -3
  105. package/dist/commands/org.js +3 -3
  106. package/dist/commands/policy.d.ts +6 -1
  107. package/dist/commands/policy.d.ts.map +1 -1
  108. package/dist/commands/policy.js +77 -37
  109. package/dist/commands/policy.js.map +1 -1
  110. package/dist/commands/rollback.d.ts.map +1 -1
  111. package/dist/commands/rollback.js +3 -1
  112. package/dist/commands/rollback.js.map +1 -1
  113. package/dist/commands/routing.d.ts +1 -1
  114. package/dist/commands/routing.js +1 -1
  115. package/dist/commands/rules.d.ts +74 -0
  116. package/dist/commands/rules.d.ts.map +1 -0
  117. package/dist/commands/rules.js +283 -0
  118. package/dist/commands/rules.js.map +1 -0
  119. package/dist/commands/settings.d.ts +44 -0
  120. package/dist/commands/settings.d.ts.map +1 -0
  121. package/dist/commands/settings.js +110 -0
  122. package/dist/commands/settings.js.map +1 -0
  123. package/dist/commands/setup.d.ts +1 -1
  124. package/dist/commands/setup.js +1 -1
  125. package/dist/commands/siem.d.ts +53 -0
  126. package/dist/commands/siem.d.ts.map +1 -0
  127. package/dist/commands/siem.js +132 -0
  128. package/dist/commands/siem.js.map +1 -0
  129. package/dist/commands/skill.d.ts +5 -5
  130. package/dist/commands/skill.js +7 -7
  131. package/dist/commands/skill.js.map +1 -1
  132. package/dist/commands/status.d.ts +0 -1
  133. package/dist/commands/status.d.ts.map +1 -1
  134. package/dist/commands/status.js +2 -3
  135. package/dist/commands/status.js.map +1 -1
  136. package/dist/commands/syncContext.d.ts +0 -1
  137. package/dist/commands/syncContext.d.ts.map +1 -1
  138. package/dist/commands/syncContext.js +0 -1
  139. package/dist/commands/syncContext.js.map +1 -1
  140. package/dist/commands/team.d.ts +2 -2
  141. package/dist/commands/team.js +2 -2
  142. package/dist/commands/traces.d.ts +0 -3
  143. package/dist/commands/traces.d.ts.map +1 -1
  144. package/dist/commands/traces.js +0 -3
  145. package/dist/commands/traces.js.map +1 -1
  146. package/dist/commands/usage.d.ts +41 -0
  147. package/dist/commands/usage.d.ts.map +1 -0
  148. package/dist/commands/usage.js +129 -0
  149. package/dist/commands/usage.js.map +1 -0
  150. package/dist/commands/whoami.d.ts +0 -1
  151. package/dist/commands/whoami.d.ts.map +1 -1
  152. package/dist/commands/whoami.js +0 -1
  153. package/dist/commands/whoami.js.map +1 -1
  154. package/dist/config/keychain.d.ts +0 -1
  155. package/dist/config/keychain.d.ts.map +1 -1
  156. package/dist/config/keychain.js +0 -1
  157. package/dist/config/keychain.js.map +1 -1
  158. package/dist/config/paths.d.ts +0 -1
  159. package/dist/config/paths.d.ts.map +1 -1
  160. package/dist/config/paths.js +0 -1
  161. package/dist/config/paths.js.map +1 -1
  162. package/dist/config/store.d.ts +0 -1
  163. package/dist/config/store.d.ts.map +1 -1
  164. package/dist/config/store.js +0 -1
  165. package/dist/config/store.js.map +1 -1
  166. package/dist/harness/ag2.d.ts +1 -1
  167. package/dist/harness/ag2.js +1 -1
  168. package/dist/harness/agentFramework.d.ts +1 -1
  169. package/dist/harness/agentFramework.js +1 -1
  170. package/dist/harness/agenticOrchestrator.d.ts +1 -1
  171. package/dist/harness/agenticOrchestrator.js +2 -2
  172. package/dist/harness/agenticOrchestrator.js.map +1 -1
  173. package/dist/harness/agentsMd.d.ts +24 -0
  174. package/dist/harness/agentsMd.d.ts.map +1 -0
  175. package/dist/harness/agentsMd.js +28 -0
  176. package/dist/harness/agentsMd.js.map +1 -0
  177. package/dist/harness/aider.d.ts +3 -1
  178. package/dist/harness/aider.d.ts.map +1 -1
  179. package/dist/harness/aider.js +9 -7
  180. package/dist/harness/aider.js.map +1 -1
  181. package/dist/harness/antigravity.d.ts +23 -5
  182. package/dist/harness/antigravity.d.ts.map +1 -1
  183. package/dist/harness/antigravity.js +45 -55
  184. package/dist/harness/antigravity.js.map +1 -1
  185. package/dist/harness/autogen.d.ts +1 -1
  186. package/dist/harness/autogen.js +2 -2
  187. package/dist/harness/autogen.js.map +1 -1
  188. package/dist/harness/claudeCode.d.ts +22 -1
  189. package/dist/harness/claudeCode.d.ts.map +1 -1
  190. package/dist/harness/claudeCode.js +47 -3
  191. package/dist/harness/claudeCode.js.map +1 -1
  192. package/dist/harness/cline.d.ts.map +1 -1
  193. package/dist/harness/cline.js +14 -23
  194. package/dist/harness/cline.js.map +1 -1
  195. package/dist/harness/codex.d.ts +6 -1
  196. package/dist/harness/codex.d.ts.map +1 -1
  197. package/dist/harness/codex.js +23 -21
  198. package/dist/harness/codex.js.map +1 -1
  199. package/dist/harness/continue.d.ts +10 -4
  200. package/dist/harness/continue.d.ts.map +1 -1
  201. package/dist/harness/continue.js +22 -22
  202. package/dist/harness/continue.js.map +1 -1
  203. package/dist/harness/cursor.d.ts +5 -2
  204. package/dist/harness/cursor.d.ts.map +1 -1
  205. package/dist/harness/cursor.js +19 -23
  206. package/dist/harness/cursor.js.map +1 -1
  207. package/dist/harness/detector.d.ts +0 -1
  208. package/dist/harness/detector.d.ts.map +1 -1
  209. package/dist/harness/detector.js +0 -1
  210. package/dist/harness/detector.js.map +1 -1
  211. package/dist/harness/dsh.d.ts +5 -3
  212. package/dist/harness/dsh.d.ts.map +1 -1
  213. package/dist/harness/dsh.js +17 -29
  214. package/dist/harness/dsh.js.map +1 -1
  215. package/dist/harness/eve.d.ts +3 -4
  216. package/dist/harness/eve.d.ts.map +1 -1
  217. package/dist/harness/eve.js +3 -4
  218. package/dist/harness/eve.js.map +1 -1
  219. package/dist/harness/githubCopilot.d.ts +4 -1
  220. package/dist/harness/githubCopilot.d.ts.map +1 -1
  221. package/dist/harness/githubCopilot.js +12 -20
  222. package/dist/harness/githubCopilot.js.map +1 -1
  223. package/dist/harness/goose.d.ts +7 -3
  224. package/dist/harness/goose.d.ts.map +1 -1
  225. package/dist/harness/goose.js +18 -21
  226. package/dist/harness/goose.js.map +1 -1
  227. package/dist/harness/grok.d.ts +2 -2
  228. package/dist/harness/grok.d.ts.map +1 -1
  229. package/dist/harness/grok.js +13 -24
  230. package/dist/harness/grok.js.map +1 -1
  231. package/dist/harness/hermes.d.ts +6 -0
  232. package/dist/harness/hermes.d.ts.map +1 -1
  233. package/dist/harness/hermes.js +17 -16
  234. package/dist/harness/hermes.js.map +1 -1
  235. package/dist/harness/muse.d.ts +3 -7
  236. package/dist/harness/muse.d.ts.map +1 -1
  237. package/dist/harness/muse.js +15 -35
  238. package/dist/harness/muse.js.map +1 -1
  239. package/dist/harness/n8n.d.ts +13 -14
  240. package/dist/harness/n8n.d.ts.map +1 -1
  241. package/dist/harness/n8n.js +21 -181
  242. package/dist/harness/n8n.js.map +1 -1
  243. package/dist/harness/openWebUI.d.ts.map +1 -1
  244. package/dist/harness/openWebUI.js +5 -4
  245. package/dist/harness/openWebUI.js.map +1 -1
  246. package/dist/harness/openaiAgents.d.ts +1 -1
  247. package/dist/harness/openaiAgents.js +2 -2
  248. package/dist/harness/openaiAgents.js.map +1 -1
  249. package/dist/harness/openclaw.d.ts +8 -0
  250. package/dist/harness/openclaw.d.ts.map +1 -1
  251. package/dist/harness/openclaw.js +27 -12
  252. package/dist/harness/openclaw.js.map +1 -1
  253. package/dist/harness/opencode.d.ts +4 -5
  254. package/dist/harness/opencode.d.ts.map +1 -1
  255. package/dist/harness/opencode.js +15 -30
  256. package/dist/harness/opencode.js.map +1 -1
  257. package/dist/harness/openhands.d.ts +9 -3
  258. package/dist/harness/openhands.d.ts.map +1 -1
  259. package/dist/harness/openhands.js +30 -24
  260. package/dist/harness/openhands.js.map +1 -1
  261. package/dist/harness/pi.d.ts +7 -2
  262. package/dist/harness/pi.d.ts.map +1 -1
  263. package/dist/harness/pi.js +19 -18
  264. package/dist/harness/pi.js.map +1 -1
  265. package/dist/harness/rooCode.d.ts +12 -5
  266. package/dist/harness/rooCode.d.ts.map +1 -1
  267. package/dist/harness/rooCode.js +23 -39
  268. package/dist/harness/rooCode.js.map +1 -1
  269. package/dist/harness/rulesFiles.d.ts +53 -0
  270. package/dist/harness/rulesFiles.d.ts.map +1 -0
  271. package/dist/harness/rulesFiles.js +106 -0
  272. package/dist/harness/rulesFiles.js.map +1 -0
  273. package/dist/harness/smolagents.d.ts +2 -2
  274. package/dist/harness/smolagents.js +3 -3
  275. package/dist/harness/smolagents.js.map +1 -1
  276. package/dist/harness/types.d.ts +20 -6
  277. package/dist/harness/types.d.ts.map +1 -1
  278. package/dist/harness/types.js +1 -95
  279. package/dist/harness/types.js.map +1 -1
  280. package/dist/harness/windsurf.d.ts +6 -1
  281. package/dist/harness/windsurf.d.ts.map +1 -1
  282. package/dist/harness/windsurf.js +21 -24
  283. package/dist/harness/windsurf.js.map +1 -1
  284. package/dist/harness/xirp.d.ts +1 -2
  285. package/dist/harness/xirp.d.ts.map +1 -1
  286. package/dist/harness/xirp.js +2 -3
  287. package/dist/harness/xirp.js.map +1 -1
  288. package/dist/lib/api.d.ts +27 -1
  289. package/dist/lib/api.d.ts.map +1 -1
  290. package/dist/lib/api.js +55 -18
  291. package/dist/lib/api.js.map +1 -1
  292. package/dist/lib/ciscoScanner.d.ts +1 -1
  293. package/dist/lib/ciscoScanner.js +1 -1
  294. package/dist/lib/decisionsLogRefresh.d.ts.map +1 -1
  295. package/dist/lib/decisionsLogRefresh.js +6 -7
  296. package/dist/lib/decisionsLogRefresh.js.map +1 -1
  297. package/dist/lib/deviceReport.d.ts +15 -0
  298. package/dist/lib/deviceReport.d.ts.map +1 -1
  299. package/dist/lib/deviceReport.js +30 -0
  300. package/dist/lib/deviceReport.js.map +1 -1
  301. package/dist/lib/gitHooks.d.ts +0 -1
  302. package/dist/lib/gitHooks.d.ts.map +1 -1
  303. package/dist/lib/gitHooks.js +8 -9
  304. package/dist/lib/gitHooks.js.map +1 -1
  305. package/dist/lib/gracefulShutdown.d.ts +1 -1
  306. package/dist/lib/gracefulShutdown.js +1 -1
  307. package/dist/lib/hash.d.ts +0 -1
  308. package/dist/lib/hash.d.ts.map +1 -1
  309. package/dist/lib/hash.js +0 -1
  310. package/dist/lib/hash.js.map +1 -1
  311. package/dist/lib/inventory.d.ts +47 -0
  312. package/dist/lib/inventory.d.ts.map +1 -0
  313. package/dist/lib/inventory.js +106 -0
  314. package/dist/lib/inventory.js.map +1 -0
  315. package/dist/lib/logger.d.ts +0 -1
  316. package/dist/lib/logger.d.ts.map +1 -1
  317. package/dist/lib/logger.js +0 -1
  318. package/dist/lib/logger.js.map +1 -1
  319. package/dist/lib/mdmManifest.d.ts +30 -2
  320. package/dist/lib/mdmManifest.d.ts.map +1 -1
  321. package/dist/lib/mdmManifest.js +50 -2
  322. package/dist/lib/mdmManifest.js.map +1 -1
  323. package/dist/lib/onboarding.d.ts +0 -1
  324. package/dist/lib/onboarding.d.ts.map +1 -1
  325. package/dist/lib/onboarding.js +1 -2
  326. package/dist/lib/onboarding.js.map +1 -1
  327. package/dist/lib/policySnapshot.d.ts +3 -2
  328. package/dist/lib/policySnapshot.d.ts.map +1 -1
  329. package/dist/lib/policySnapshot.js +6 -3
  330. package/dist/lib/policySnapshot.js.map +1 -1
  331. package/dist/lib/process.d.ts +5 -1
  332. package/dist/lib/process.d.ts.map +1 -1
  333. package/dist/lib/process.js +13 -4
  334. package/dist/lib/process.js.map +1 -1
  335. package/dist/lib/providerProbe.d.ts +3 -3
  336. package/dist/lib/providerProbe.d.ts.map +1 -1
  337. package/dist/lib/providerProbe.js +15 -7
  338. package/dist/lib/providerProbe.js.map +1 -1
  339. package/dist/lib/sandbox/firecracker.d.ts +3 -3
  340. package/dist/lib/sandbox/firecracker.js +3 -3
  341. package/dist/lib/sandbox/index.d.ts +2 -2
  342. package/dist/lib/sandbox/index.js +2 -2
  343. package/dist/lib/sandbox/oci.d.ts +1 -1
  344. package/dist/lib/sandbox/oci.js +1 -1
  345. package/dist/lib/sandbox/types.d.ts +1 -1
  346. package/dist/lib/sandbox/types.js +1 -1
  347. package/dist/lib/sopFrontMatter.d.ts +1 -1
  348. package/dist/lib/sopFrontMatter.js +1 -1
  349. package/package.json +6 -5
  350. package/resources/sandbox/Dockerfile +1 -1
  351. package/resources/sandbox/entrypoint.sh +4 -4
  352. package/resources/sandbox/firecracker-launch.sh +1 -1
  353. package/dist/harness/base.d.ts +0 -24
  354. package/dist/harness/base.d.ts.map +0 -1
  355. package/dist/harness/base.js +0 -74
  356. package/dist/harness/base.js.map +0 -1
@@ -4,24 +4,34 @@
4
4
  * Detects OpenClaw presence and invokes the sync-daemon hooks compiler
5
5
  * to inject Intutic pre-tool use gates.
6
6
  *
7
+ * OpenClaw loads standing instructions only from its own agent workspace
8
+ * (`AGENTS.md` and the other bootstrap files), never from a project, even
9
+ * when it works in one. The rule sets therefore go into a marked section of
10
+ * that workspace's `AGENTS.md` (see `openclawAgentWorkspace`), and the rest
11
+ * of the file stays the user's. OpenClaw truncates a bootstrap file past
12
+ * 20,000 characters
13
+ * (https://github.com/openclaw/openclaw/blob/98457908cf3e4fbbd0354b530e0aa0d15b560158/docs/gateway/config-agents/workspace-and-bootstrap.md).
14
+ *
7
15
  * HLD §3.14 — Harness Onboarding Matrix
8
16
  * @module
9
17
  */
10
18
  import { join } from 'node:path';
11
- import { access } from 'node:fs/promises';
19
+ import { access, readFile } from 'node:fs/promises';
12
20
  import { existsSync } from 'node:fs';
13
21
  import { homedir } from 'node:os';
14
22
  import { HarnessType } from '@intutic/shared-types';
15
- import { hashFile } from '../lib/hash.js';
23
+ import { hashString } from '../lib/hash.js';
16
24
  import { loadCredentials } from '../config/store.js';
17
- import { writeOpenclawHooks } from '@intutic/sync-daemon';
18
- const CONFIG_FILE = '.openclaw/openclaw.json';
25
+ import { openclawAgentWorkspace, rulesSectionOf, writeOpenclawHooks, writeRulesSection } from '@intutic/sync-daemon';
26
+ import { buildRulesBody } from './rulesFiles.js';
27
+ const DETECT_FILE = '.openclaw/openclaw.json';
19
28
  export const openclawAdapter = {
20
29
  type: HarnessType.OPENCLAW,
21
- configFileName: CONFIG_FILE,
30
+ // The rules file is outside the workspace.
31
+ configFileName: '',
22
32
  async detect(workspaceRoot) {
23
33
  const globalOpenclaw = join(homedir(), '.openclaw');
24
- const localOpenclaw = join(workspaceRoot, CONFIG_FILE);
34
+ const localOpenclaw = join(workspaceRoot, DETECT_FILE);
25
35
  try {
26
36
  if (existsSync(globalOpenclaw))
27
37
  return true;
@@ -32,16 +42,21 @@ export const openclawAdapter = {
32
42
  return false;
33
43
  }
34
44
  },
35
- async writeConfig(workspaceRoot, _sops, proxyUrl) {
36
- const filePath = join(workspaceRoot, CONFIG_FILE);
45
+ async installGate(workspaceRoot, proxyUrl) {
37
46
  const creds = await loadCredentials();
38
- const workspaceId = creds?.workspaceId || 'local';
39
- await writeOpenclawHooks(workspaceRoot, proxyUrl, workspaceId);
47
+ await writeOpenclawHooks(workspaceRoot, proxyUrl, creds?.workspaceId || 'local');
48
+ },
49
+ async writeConfig(workspaceRoot, sops, proxyUrl) {
50
+ if (sops.length === 0)
51
+ return null;
52
+ const filePath = join(await openclawAgentWorkspace(), 'AGENTS.md');
53
+ await writeRulesSection(filePath, workspaceRoot, buildRulesBody(sops, proxyUrl, 'section'));
40
54
  return filePath;
41
55
  },
42
- async readCurrentHash(workspaceRoot) {
56
+ async readCurrentHash() {
43
57
  try {
44
- return await hashFile(join(workspaceRoot, CONFIG_FILE));
58
+ const section = rulesSectionOf(await readFile(join(await openclawAgentWorkspace(), 'AGENTS.md'), 'utf-8'));
59
+ return section === null ? null : hashString(section);
45
60
  }
46
61
  catch {
47
62
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../src/harness/openclaw.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGnD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAEzD,MAAM,WAAW,GAAG,yBAAyB,CAAA;AAE7C,MAAM,CAAC,MAAM,eAAe,GAAoB;IAC9C,IAAI,EAAE,WAAW,CAAC,QAAQ;IAC1B,cAAc,EAAE,WAAW;IAE3B,KAAK,CAAC,MAAM,CAAC,aAAqB;QAChC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAA;QACnD,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAA;QACtD,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,cAAc,CAAC;gBAAE,OAAO,IAAI,CAAA;YAC3C,MAAM,MAAM,CAAC,aAAa,CAAC,CAAA;YAC3B,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,aAAqB,EAAE,KAAqB,EAAE,QAAgB;QAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAA;QACjD,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAA;QACrC,MAAM,WAAW,GAAG,KAAK,EAAE,WAAW,IAAI,OAAO,CAAA;QACjD,MAAM,kBAAkB,CAAC,aAAa,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAA;QAC9D,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,aAAqB;QACzC,IAAI,CAAC;YACH,OAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAA;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;CACF,CAAA"}
1
+ {"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../src/harness/openclaw.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGnD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACpH,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAEhD,MAAM,WAAW,GAAG,yBAAyB,CAAA;AAE7C,MAAM,CAAC,MAAM,eAAe,GAAoB;IAC9C,IAAI,EAAE,WAAW,CAAC,QAAQ;IAC1B,2CAA2C;IAC3C,cAAc,EAAE,EAAE;IAElB,KAAK,CAAC,MAAM,CAAC,aAAqB;QAChC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAA;QACnD,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAA;QACtD,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,cAAc,CAAC;gBAAE,OAAO,IAAI,CAAA;YAC3C,MAAM,MAAM,CAAC,aAAa,CAAC,CAAA;YAC3B,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,aAAqB,EAAE,QAAgB;QACvD,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAA;QACrC,MAAM,kBAAkB,CAAC,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,IAAI,OAAO,CAAC,CAAA;IAClF,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,aAAqB,EAAE,IAAoB,EAAE,QAAgB;QAC7E,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,sBAAsB,EAAE,EAAE,WAAW,CAAC,CAAA;QAClE,MAAM,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAA;QAC3F,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,sBAAsB,EAAE,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;YAC1G,OAAO,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;CACF,CAAA"}
@@ -3,10 +3,9 @@
3
3
  * binary `opencode`).
4
4
  *
5
5
  * OpenCode is a terminal coding agent whose instructions file is `AGENTS.md`
6
- * (project, with a `CLAUDE.md` fallback, and `~/.config/opencode/AGENTS.md`)
7
- * — delivered here through the shared markdown builder every other
8
- * `AGENTS.md`/`CLAUDE.md` harness uses, so it grows no rules format of its
9
- * own.
6
+ * (project, with a `CLAUDE.md` fallback, and `~/.config/opencode/AGENTS.md`;
7
+ * https://opencode.ai/docs/rules/). The rule sets go there through the
8
+ * shared `AGENTS.md` writer (agentsMd.ts).
10
9
  *
11
10
  * The governance-critical half is a **plugin**, not a hook file: OpenCode
12
11
  * loads `.opencode/plugins/*.js` into its own process and runs the plugin's
@@ -14,7 +13,7 @@
14
13
  * every tool call; throwing refuses the call. That plugin is generated by
15
14
  * `@intutic/sync-daemon`'s `openCodeHooks.ts`, the same split Muse and Grok
16
15
  * use for their hook writers. This adapter does not write `opencode.json`;
17
- * the sync daemon's `mcpAutoWrite.ts` edits its `mcp` block only (TD-487) —
16
+ * the sync daemon's `mcpAutoWrite.ts` edits its `mcp` block only —
18
17
  * see the writer's module doc.
19
18
  *
20
19
  * HLD §3.14 — Harness Onboarding Matrix
@@ -1 +1 @@
1
- {"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../src/harness/opencode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAOH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAcjD,eAAO,MAAM,eAAe,EAAE,eA0D7B,CAAA"}
1
+ {"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../src/harness/opencode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAOH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AASjD,eAAO,MAAM,eAAe,EAAE,eA+C7B,CAAA"}
@@ -3,10 +3,9 @@
3
3
  * binary `opencode`).
4
4
  *
5
5
  * OpenCode is a terminal coding agent whose instructions file is `AGENTS.md`
6
- * (project, with a `CLAUDE.md` fallback, and `~/.config/opencode/AGENTS.md`)
7
- * — delivered here through the shared markdown builder every other
8
- * `AGENTS.md`/`CLAUDE.md` harness uses, so it grows no rules format of its
9
- * own.
6
+ * (project, with a `CLAUDE.md` fallback, and `~/.config/opencode/AGENTS.md`;
7
+ * https://opencode.ai/docs/rules/). The rule sets go there through the
8
+ * shared `AGENTS.md` writer (agentsMd.ts).
10
9
  *
11
10
  * The governance-critical half is a **plugin**, not a hook file: OpenCode
12
11
  * loads `.opencode/plugins/*.js` into its own process and runs the plugin's
@@ -14,7 +13,7 @@
14
13
  * every tool call; throwing refuses the call. That plugin is generated by
15
14
  * `@intutic/sync-daemon`'s `openCodeHooks.ts`, the same split Muse and Grok
16
15
  * use for their hook writers. This adapter does not write `opencode.json`;
17
- * the sync daemon's `mcpAutoWrite.ts` edits its `mcp` block only (TD-487) —
16
+ * the sync daemon's `mcpAutoWrite.ts` edits its `mcp` block only —
18
17
  * see the writer's module doc.
19
18
  *
20
19
  * HLD §3.14 — Harness Onboarding Matrix
@@ -24,19 +23,15 @@ import { join } from 'node:path';
24
23
  import { access } from 'node:fs/promises';
25
24
  import { homedir } from 'node:os';
26
25
  import { HarnessType } from '@intutic/shared-types';
27
- import { hashFile } from '../lib/hash.js';
28
- import { buildMarkdownContent } from './base.js';
29
26
  import { writeOpenCodeHooks } from '@intutic/sync-daemon/harness/openCodeHooks';
30
- import { writeOwnedFile } from '@intutic/sync-daemon';
31
- /** Workspace-relative rules file. OpenCode reads this, falling back to CLAUDE.md. */
32
- const CONFIG_FILE = 'AGENTS.md';
27
+ import { AGENTS_MD, agentsMdHash, writeAgentsMd } from './agentsMd.js';
33
28
  /** `$OPENCODE_CONFIG_DIR` or `~/.config/opencode` — the user-level config dir. */
34
29
  function openCodeConfigDir() {
35
30
  return process.env.OPENCODE_CONFIG_DIR || join(homedir(), '.config', 'opencode');
36
31
  }
37
32
  export const opencodeAdapter = {
38
33
  type: HarnessType.OPENCODE,
39
- configFileName: CONFIG_FILE,
34
+ configFileName: AGENTS_MD,
40
35
  async detect(workspaceRoot) {
41
36
  // 1. Project-local `.opencode/` directory or `opencode.json{,c}`. Not
42
37
  // AGENTS.md alone — Muse and Grok read the same file.
@@ -70,27 +65,17 @@ export const opencodeAdapter = {
70
65
  catch { /* ignore */ }
71
66
  return false;
72
67
  },
73
- async writeConfig(workspaceRoot, sops, proxyUrl) {
74
- const agentsPath = join(workspaceRoot, CONFIG_FILE);
75
- // 1. AGENTS.md rules file — same "skip when there is nothing to write"
76
- // convention every markdown adapter uses.
77
- if (sops.length > 0) {
78
- const content = buildMarkdownContent(sops, proxyUrl);
79
- await writeOwnedFile(agentsPath, workspaceRoot, content);
80
- }
81
- // 2. The plugin gate. `intutic connect` has no workspace id in scope —
82
- // same limitation `museAdapter` has — the sync daemon re-runs this
83
- // with a real one on the next cycle.
68
+ /** The plugin gate. `intutic connect` has no workspace id in scope — same
69
+ * limitation `museAdapter` has — the sync daemon re-runs this with a real
70
+ * one on the next cycle. */
71
+ async installGate(workspaceRoot, proxyUrl) {
84
72
  await writeOpenCodeHooks(workspaceRoot, proxyUrl, '');
85
- return agentsPath;
86
73
  },
87
- async readCurrentHash(workspaceRoot) {
88
- try {
89
- return await hashFile(join(workspaceRoot, CONFIG_FILE));
90
- }
91
- catch {
92
- return null;
93
- }
74
+ writeConfig(workspaceRoot, sops, proxyUrl) {
75
+ return writeAgentsMd(workspaceRoot, sops, proxyUrl);
76
+ },
77
+ readCurrentHash(workspaceRoot) {
78
+ return agentsMdHash(workspaceRoot);
94
79
  },
95
80
  };
96
81
  //# sourceMappingURL=opencode.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/harness/opencode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGnD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAA;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD,qFAAqF;AACrF,MAAM,WAAW,GAAG,WAAW,CAAA;AAE/B,kFAAkF;AAClF,SAAS,iBAAiB;IACxB,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;AAClF,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAoB;IAC9C,IAAI,EAAE,WAAW,CAAC,QAAQ;IAC1B,cAAc,EAAE,WAAW;IAE3B,KAAK,CAAC,MAAM,CAAC,aAAqB;QAChC,sEAAsE;QACtE,yDAAyD;QACzD,KAAK,MAAM,MAAM,IAAI,CAAC,WAAW,EAAE,eAAe,EAAE,gBAAgB,CAAC,EAAE,CAAC;YACtE,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAA;gBACzC,OAAO,IAAI,CAAA;YACb,CAAC;YAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;QAC5B,CAAC;QAED,wEAAwE;QACxE,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAA;YACjC,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;QAE1B,gEAAgE;QAChE,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QACzF,IAAI,CAAC;YACH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAA;YAC9C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,CAAC;oBAC5C,IAAI,CAAC;wBAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;wBAAC,OAAO,IAAI,CAAA;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACxB,OAAO,KAAK,CAAA;IACd,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,aAAqB,EAAE,IAAoB,EAAE,QAAgB;QAC7E,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAA;QAEnD,uEAAuE;QACvE,6CAA6C;QAC7C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;YACpD,MAAM,cAAc,CAAC,UAAU,EAAE,aAAa,EAAE,OAAO,CAAC,CAAA;QAC1D,CAAC;QAED,uEAAuE;QACvE,sEAAsE;QACtE,wCAAwC;QACxC,MAAM,kBAAkB,CAAC,aAAa,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAA;QAErD,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,aAAqB;QACzC,IAAI,CAAC;YACH,OAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAA;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;CACF,CAAA"}
1
+ {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/harness/opencode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAA;AAC/E,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAEtE,kFAAkF;AAClF,SAAS,iBAAiB;IACxB,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;AAClF,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAoB;IAC9C,IAAI,EAAE,WAAW,CAAC,QAAQ;IAC1B,cAAc,EAAE,SAAS;IAEzB,KAAK,CAAC,MAAM,CAAC,aAAqB;QAChC,sEAAsE;QACtE,yDAAyD;QACzD,KAAK,MAAM,MAAM,IAAI,CAAC,WAAW,EAAE,eAAe,EAAE,gBAAgB,CAAC,EAAE,CAAC;YACtE,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAA;gBACzC,OAAO,IAAI,CAAA;YACb,CAAC;YAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;QAC5B,CAAC;QAED,wEAAwE;QACxE,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAA;YACjC,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;QAE1B,gEAAgE;QAChE,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QACzF,IAAI,CAAC;YACH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAA;YAC9C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,CAAC;oBAC5C,IAAI,CAAC;wBAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;wBAAC,OAAO,IAAI,CAAA;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACxB,OAAO,KAAK,CAAA;IACd,CAAC;IAED;;iCAE6B;IAC7B,KAAK,CAAC,WAAW,CAAC,aAAqB,EAAE,QAAgB;QACvD,MAAM,kBAAkB,CAAC,aAAa,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAA;IACvD,CAAC;IAED,WAAW,CAAC,aAAqB,EAAE,IAAoB,EAAE,QAAgB;QACvE,OAAO,aAAa,CAAC,aAAa,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;IACrD,CAAC;IAED,eAAe,CAAC,aAAqB;QACnC,OAAO,YAAY,CAAC,aAAa,CAAC,CAAA;IACpC,CAAC;CACF,CAAA"}
@@ -1,9 +1,15 @@
1
1
  /**
2
2
  * openhands.ts — OpenHands adapter (full implementation with hooks + llm.base_url).
3
3
  *
4
- * Merges SOP content ([intutic]) and llm.base_url ([llm]) into config.toml,
5
- * keeping the rest of the file, and injects PreToolUse hooks via
6
- * .openhands/hooks.json.
4
+ * - rules: `.openhands/microagents/intutic-governance.md`, a repository
5
+ * microagent with no triggers, which OpenHands keeps active in every
6
+ * conversation (V0's `microagent.py`: "no triggers -> REPO (always
7
+ * active)"; the V1 software-agent SDK loads the same directory as legacy
8
+ * skills, "no keywords -> always active"). Earlier versions put the rules
9
+ * in an `[intutic]` table of `config.toml`, which OpenHands never reads;
10
+ * connect drops that table and disconnect removes it;
11
+ * - `[llm] base_url` merged into `config.toml`, keeping the rest of the file;
12
+ * - the PreToolUse hook in `.openhands/hooks.json`.
7
13
  *
8
14
  * HLD §3.14 — Harness Onboarding Matrix
9
15
  * @module
@@ -1 +1 @@
1
- {"version":3,"file":"openhands.d.ts","sourceRoot":"","sources":["../../src/harness/openhands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAQjD,eAAO,MAAM,gBAAgB,EAAE,eA4D9B,CAAA"}
1
+ {"version":3,"file":"openhands.d.ts","sourceRoot":"","sources":["../../src/harness/openhands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAUjD,eAAO,MAAM,gBAAgB,EAAE,eAwD9B,CAAA"}
@@ -1,9 +1,15 @@
1
1
  /**
2
2
  * openhands.ts — OpenHands adapter (full implementation with hooks + llm.base_url).
3
3
  *
4
- * Merges SOP content ([intutic]) and llm.base_url ([llm]) into config.toml,
5
- * keeping the rest of the file, and injects PreToolUse hooks via
6
- * .openhands/hooks.json.
4
+ * - rules: `.openhands/microagents/intutic-governance.md`, a repository
5
+ * microagent with no triggers, which OpenHands keeps active in every
6
+ * conversation (V0's `microagent.py`: "no triggers -> REPO (always
7
+ * active)"; the V1 software-agent SDK loads the same directory as legacy
8
+ * skills, "no keywords -> always active"). Earlier versions put the rules
9
+ * in an `[intutic]` table of `config.toml`, which OpenHands never reads;
10
+ * connect drops that table and disconnect removes it;
11
+ * - `[llm] base_url` merged into `config.toml`, keeping the rest of the file;
12
+ * - the PreToolUse hook in `.openhands/hooks.json`.
7
13
  *
8
14
  * HLD §3.14 — Harness Onboarding Matrix
9
15
  * @module
@@ -15,10 +21,12 @@ import { hashFile } from '../lib/hash.js';
15
21
  import { writeOpenHandsHooks, mergeOpenHandsToml, isOpenHandsConfig } from '@intutic/sync-daemon/harness/openhandsHooks';
16
22
  import { keepOriginal } from '@intutic/sync-daemon';
17
23
  import { log } from '../lib/logger.js';
24
+ import { writeOwnRulesFile } from './rulesFiles.js';
18
25
  const CONFIG_FILE = 'config.toml';
26
+ const RULES_FILE = '.openhands/microagents/intutic-governance.md';
19
27
  export const openhandsAdapter = {
20
28
  type: HarnessType.OPENHANDS,
21
- configFileName: CONFIG_FILE,
29
+ configFileName: RULES_FILE,
22
30
  // `.openhands/` is OpenHands' own per-repository directory (`setup.sh`,
23
31
  // microagents). Without it, a `config.toml` counts only when it is an
24
32
  // OpenHands configuration: the file name alone matched every Hugo site and
@@ -38,39 +46,37 @@ export const openhandsAdapter = {
38
46
  return false;
39
47
  }
40
48
  },
49
+ /** The .openhands/hooks.json PreToolUse hook. */
50
+ async installGate(workspaceRoot, proxyUrl) {
51
+ await writeOpenHandsHooks(workspaceRoot, proxyUrl);
52
+ },
41
53
  async writeConfig(workspaceRoot, sops, proxyUrl) {
42
- const filePath = join(workspaceRoot, CONFIG_FILE);
43
- const instructions = sops.length > 0
44
- ? sops.map((sop) => `## ${sop.title}\n\n${sop.content}`).join('\n\n---\n\n')
45
- : '# Intutic governance active — no SOP rules configured yet.';
46
- // Merged into the user's config.toml: [llm] base_url and an [intutic]
47
- // table for the SOP text; everything else is kept. A file that does not
48
- // parse is left alone.
54
+ // Merged into the user's config.toml: [llm] base_url; everything else is
55
+ // kept. A file that does not parse is left alone.
56
+ const configPath = join(workspaceRoot, CONFIG_FILE);
49
57
  let raw = '';
50
58
  try {
51
- raw = await readFile(filePath, 'utf-8');
59
+ raw = await readFile(configPath, 'utf-8');
52
60
  }
53
61
  catch { /* no config.toml yet */ }
54
- const merged = mergeOpenHandsToml(raw, proxyUrl, instructions);
62
+ const merged = mergeOpenHandsToml(raw, proxyUrl);
55
63
  let written = null;
56
64
  if (merged === null) {
57
- log.warn(`${filePath} is not valid TOML — left untouched`);
65
+ log.warn(`${configPath} is not valid TOML — left untouched`);
58
66
  }
59
- else {
60
- const tmpPath = filePath + '.intutic-tmp';
61
- await keepOriginal(filePath, workspaceRoot);
62
- await mkdir(dirname(filePath), { recursive: true });
67
+ else if (merged !== raw) {
68
+ const tmpPath = configPath + '.intutic-tmp';
69
+ await keepOriginal(configPath, workspaceRoot);
70
+ await mkdir(dirname(configPath), { recursive: true });
63
71
  await writeFile(tmpPath, merged, 'utf-8');
64
- await rename(tmpPath, filePath);
65
- written = filePath;
72
+ await rename(tmpPath, configPath);
73
+ written = configPath;
66
74
  }
67
- // Inject .openhands/hooks.json PreToolUse hook
68
- await writeOpenHandsHooks(workspaceRoot, proxyUrl);
69
- return written;
75
+ return (await writeOwnRulesFile(workspaceRoot, RULES_FILE, sops, proxyUrl)) ?? written;
70
76
  },
71
77
  async readCurrentHash(workspaceRoot) {
72
78
  try {
73
- return await hashFile(join(workspaceRoot, CONFIG_FILE));
79
+ return await hashFile(join(workspaceRoot, RULES_FILE));
74
80
  }
75
81
  catch {
76
82
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"openhands.js","sourceRoot":"","sources":["../../src/harness/openhands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openhands.js","sourceRoot":"","sources":["../../src/harness/openhands.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,13 @@
1
1
  /**
2
2
  * pi.ts — Pi adapter.
3
3
  *
4
- * Detects Pi presence and invokes the sync-daemon hooks compiler
5
- * to inject Intutic pre-tool use gates.
4
+ * Detects Pi (its `~/.pi` home, or a project's `.pi` directory) and installs
5
+ * the gate: an extension in `~/.pi/agent/extensions/` (see piHooks.ts).
6
+ *
7
+ * Pi loads `AGENTS.md` from its agent directory and from every directory
8
+ * between where it runs and the filesystem root, so the rule sets go into the
9
+ * workspace's `AGENTS.md` through the shared writer (agentsMd.ts;
10
+ * https://github.com/earendil-works/pi/blob/6fb2e7815167e6b19006fc526d1a5d0f5f998787/packages/coding-agent/docs/configuration.md).
6
11
  *
7
12
  * HLD §3.14 — Harness Onboarding Matrix
8
13
  * @module
@@ -1 +1 @@
1
- {"version":3,"file":"pi.d.ts","sourceRoot":"","sources":["../../src/harness/pi.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAOjD,eAAO,MAAM,SAAS,EAAE,eA+BvB,CAAA"}
1
+ {"version":3,"file":"pi.d.ts","sourceRoot":"","sources":["../../src/harness/pi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAQjD,eAAO,MAAM,SAAS,EAAE,eA4BvB,CAAA"}
@@ -1,8 +1,13 @@
1
1
  /**
2
2
  * pi.ts — Pi adapter.
3
3
  *
4
- * Detects Pi presence and invokes the sync-daemon hooks compiler
5
- * to inject Intutic pre-tool use gates.
4
+ * Detects Pi (its `~/.pi` home, or a project's `.pi` directory) and installs
5
+ * the gate: an extension in `~/.pi/agent/extensions/` (see piHooks.ts).
6
+ *
7
+ * Pi loads `AGENTS.md` from its agent directory and from every directory
8
+ * between where it runs and the filesystem root, so the rule sets go into the
9
+ * workspace's `AGENTS.md` through the shared writer (agentsMd.ts;
10
+ * https://github.com/earendil-works/pi/blob/6fb2e7815167e6b19006fc526d1a5d0f5f998787/packages/coding-agent/docs/configuration.md).
6
11
  *
7
12
  * HLD §3.14 — Harness Onboarding Matrix
8
13
  * @module
@@ -12,16 +17,17 @@ import { access } from 'node:fs/promises';
12
17
  import { existsSync } from 'node:fs';
13
18
  import { homedir } from 'node:os';
14
19
  import { HarnessType } from '@intutic/shared-types';
15
- import { hashFile } from '../lib/hash.js';
16
20
  import { loadCredentials } from '../config/store.js';
21
+ import { AGENTS_MD, agentsMdHash, writeAgentsMd } from './agentsMd.js';
17
22
  import { writePiHooks } from '@intutic/sync-daemon';
18
- const CONFIG_FILE = '.pi/hooks.json';
23
+ /** A project's Pi configuration directory (settings, extensions, MCP servers). */
24
+ const DETECT_FILE = '.pi';
19
25
  export const piAdapter = {
20
26
  type: HarnessType.PI,
21
- configFileName: CONFIG_FILE,
27
+ configFileName: AGENTS_MD,
22
28
  async detect(workspaceRoot) {
23
29
  const globalPi = join(homedir(), '.pi');
24
- const localPi = join(workspaceRoot, CONFIG_FILE);
30
+ const localPi = join(workspaceRoot, DETECT_FILE);
25
31
  try {
26
32
  if (existsSync(globalPi))
27
33
  return true;
@@ -32,20 +38,15 @@ export const piAdapter = {
32
38
  return false;
33
39
  }
34
40
  },
35
- async writeConfig(workspaceRoot, _sops, proxyUrl) {
36
- const filePath = join(workspaceRoot, CONFIG_FILE);
41
+ async installGate(workspaceRoot, proxyUrl) {
37
42
  const creds = await loadCredentials();
38
- const workspaceId = creds?.workspaceId || 'local';
39
- await writePiHooks(workspaceRoot, proxyUrl, workspaceId);
40
- return filePath;
43
+ await writePiHooks(workspaceRoot, proxyUrl, creds?.workspaceId || 'local');
41
44
  },
42
- async readCurrentHash(workspaceRoot) {
43
- try {
44
- return await hashFile(join(workspaceRoot, CONFIG_FILE));
45
- }
46
- catch {
47
- return null;
48
- }
45
+ writeConfig(workspaceRoot, sops, proxyUrl) {
46
+ return writeAgentsMd(workspaceRoot, sops, proxyUrl);
47
+ },
48
+ readCurrentHash(workspaceRoot) {
49
+ return agentsMdHash(workspaceRoot);
49
50
  },
50
51
  };
51
52
  //# sourceMappingURL=pi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pi.js","sourceRoot":"","sources":["../../src/harness/pi.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGnD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEnD,MAAM,WAAW,GAAG,gBAAgB,CAAA;AAEpC,MAAM,CAAC,MAAM,SAAS,GAAoB;IACxC,IAAI,EAAE,WAAW,CAAC,EAAE;IACpB,cAAc,EAAE,WAAW;IAE3B,KAAK,CAAC,MAAM,CAAC,aAAqB;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAA;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAA;QAChD,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,QAAQ,CAAC;gBAAE,OAAO,IAAI,CAAA;YACrC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAA;YACrB,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,aAAqB,EAAE,KAAqB,EAAE,QAAgB;QAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAA;QACjD,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAA;QACrC,MAAM,WAAW,GAAG,KAAK,EAAE,WAAW,IAAI,OAAO,CAAA;QACjD,MAAM,YAAY,CAAC,aAAa,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAA;QACxD,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,aAAqB;QACzC,IAAI,CAAC;YACH,OAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAA;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;CACF,CAAA"}
1
+ {"version":3,"file":"pi.js","sourceRoot":"","sources":["../../src/harness/pi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGnD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEnD,kFAAkF;AAClF,MAAM,WAAW,GAAG,KAAK,CAAA;AAEzB,MAAM,CAAC,MAAM,SAAS,GAAoB;IACxC,IAAI,EAAE,WAAW,CAAC,EAAE;IACpB,cAAc,EAAE,SAAS;IAEzB,KAAK,CAAC,MAAM,CAAC,aAAqB;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAA;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAA;QAChD,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,QAAQ,CAAC;gBAAE,OAAO,IAAI,CAAA;YACrC,MAAM,MAAM,CAAC,OAAO,CAAC,CAAA;YACrB,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,aAAqB,EAAE,QAAgB;QACvD,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAA;QACrC,MAAM,YAAY,CAAC,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,IAAI,OAAO,CAAC,CAAA;IAC5E,CAAC;IAED,WAAW,CAAC,aAAqB,EAAE,IAAoB,EAAE,QAAgB;QACvE,OAAO,aAAa,CAAC,aAAa,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;IACrD,CAAC;IAED,eAAe,CAAC,aAAqB;QACnC,OAAO,YAAY,CAAC,aAAa,CAAC,CAAA;IACpC,CAAC;CACF,CAAA"}
@@ -1,11 +1,18 @@
1
1
  /**
2
2
  * rooCode.ts — Roo Code adapter.
3
3
  *
4
- * Detects the Roo Code VS Code extension and writes Intutic governance rules
5
- * as .roorules. Roo Code has no hook system to install a tool-call gate into,
6
- * and keeps its API provider and base URL in its own settings panel rather
7
- * than in any file this adapter can write, so routing it through the proxy is
8
- * a manual step (see the Roo Code integration page).
4
+ * Detects the Roo Code VS Code extension and writes the rule sets into the
5
+ * workspace's `AGENTS.md` through the shared writer (agentsMd.ts). Roo reads
6
+ * `AGENTS.md` at the workspace root unless `roo-cline.useAgentRules` is off,
7
+ * the default being on. Not `.roo/rules/`: once that directory has a file,
8
+ * Roo stops reading a `.roorules` or `.clinerules` the user keeps
9
+ * (https://github.com/RooCodeInc/Roo-Code/blob/b867ec9145750d0ae1ff7f02d35406e9bf2a0b16/src/core/prompts/sections/custom-instructions.ts).
10
+ * Earlier versions overwrote `.roorules`; the user's own copy comes back.
11
+ *
12
+ * Roo Code has no hook system to install a tool-call gate into, and keeps its
13
+ * API provider and base URL in its own settings panel rather than in any file
14
+ * this adapter can write, so routing it through the proxy is a manual step
15
+ * (see the Roo Code integration page).
9
16
  *
10
17
  * HLD §3.14 — Harness Onboarding Matrix
11
18
  * @module
@@ -1 +1 @@
1
- {"version":3,"file":"rooCode.d.ts","sourceRoot":"","sources":["../../src/harness/rooCode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAOjD,eAAO,MAAM,cAAc,EAAE,eAsD5B,CAAA"}
1
+ {"version":3,"file":"rooCode.d.ts","sourceRoot":"","sources":["../../src/harness/rooCode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAOH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAMjD,eAAO,MAAM,cAAc,EAAE,eA8B5B,CAAA"}
@@ -1,11 +1,18 @@
1
1
  /**
2
2
  * rooCode.ts — Roo Code adapter.
3
3
  *
4
- * Detects the Roo Code VS Code extension and writes Intutic governance rules
5
- * as .roorules. Roo Code has no hook system to install a tool-call gate into,
6
- * and keeps its API provider and base URL in its own settings panel rather
7
- * than in any file this adapter can write, so routing it through the proxy is
8
- * a manual step (see the Roo Code integration page).
4
+ * Detects the Roo Code VS Code extension and writes the rule sets into the
5
+ * workspace's `AGENTS.md` through the shared writer (agentsMd.ts). Roo reads
6
+ * `AGENTS.md` at the workspace root unless `roo-cline.useAgentRules` is off,
7
+ * the default being on. Not `.roo/rules/`: once that directory has a file,
8
+ * Roo stops reading a `.roorules` or `.clinerules` the user keeps
9
+ * (https://github.com/RooCodeInc/Roo-Code/blob/b867ec9145750d0ae1ff7f02d35406e9bf2a0b16/src/core/prompts/sections/custom-instructions.ts).
10
+ * Earlier versions overwrote `.roorules`; the user's own copy comes back.
11
+ *
12
+ * Roo Code has no hook system to install a tool-call gate into, and keeps its
13
+ * API provider and base URL in its own settings panel rather than in any file
14
+ * this adapter can write, so routing it through the proxy is a manual step
15
+ * (see the Roo Code integration page).
9
16
  *
10
17
  * HLD §3.14 — Harness Onboarding Matrix
11
18
  * @module
@@ -14,16 +21,14 @@ import { access, readdir } from 'node:fs/promises';
14
21
  import { join } from 'node:path';
15
22
  import { homedir } from 'node:os';
16
23
  import { HarnessType } from '@intutic/shared-types';
17
- import { hashFile } from '../lib/hash.js';
18
- import { newIso } from '@intutic/id';
19
- import { writeOwnedFile } from '@intutic/sync-daemon';
20
- const CONFIG_FILE = '.roorules';
24
+ import { AGENTS_MD, agentsMdHash, writeAgentsMd } from './agentsMd.js';
25
+ import { retireLegacyRulesFile } from './rulesFiles.js';
26
+ const LEGACY_FILE = '.roorules';
21
27
  export const rooCodeAdapter = {
22
28
  type: HarnessType.ROO_CODE,
23
- configFileName: CONFIG_FILE,
29
+ configFileName: AGENTS_MD,
24
30
  async detect(workspaceRoot) {
25
- // Check for .roomodes or .roorules in workspace
26
- for (const marker of ['.roomodes', '.roorules']) {
31
+ for (const marker of ['.roomodes', LEGACY_FILE]) {
27
32
  try {
28
33
  await access(join(workspaceRoot, marker));
29
34
  return true;
@@ -32,41 +37,20 @@ export const rooCodeAdapter = {
32
37
  // fall through
33
38
  }
34
39
  }
35
- // Check for VS Code extension directory
36
40
  try {
37
- const extensionsDir = join(homedir(), '.vscode', 'extensions');
38
- const entries = await readdir(extensionsDir);
41
+ const entries = await readdir(join(homedir(), '.vscode', 'extensions'));
39
42
  return entries.some((entry) => entry.startsWith('rooveterinaryinc.roo-cline-'));
40
43
  }
41
44
  catch {
42
45
  return false;
43
46
  }
44
47
  },
45
- async writeConfig(workspaceRoot, sops, _proxyUrl) {
46
- const filePath = join(workspaceRoot, CONFIG_FILE);
47
- const instructions = sops.length > 0
48
- ? sops.map((sop) => `## ${sop.title}\n\n${sop.content}`).join('\n\n---\n\n')
49
- : '# Intutic governance active — no SOP rules configured yet.';
50
- const content = [
51
- '# Intutic Governance Rules (auto-generated)',
52
- '# DO NOT EDIT — managed by intutic sync daemon',
53
- `# Last sync: ${newIso()}`,
54
- '# NOTE: Roo Code has no hook system, so these rules are advisory.',
55
- '# Governance is enforced via the proxy and the drift guard.',
56
- '',
57
- instructions,
58
- '',
59
- ].join('\n');
60
- await writeOwnedFile(filePath, workspaceRoot, content);
61
- return filePath;
48
+ async writeConfig(workspaceRoot, sops, proxyUrl) {
49
+ await retireLegacyRulesFile(workspaceRoot, LEGACY_FILE);
50
+ return writeAgentsMd(workspaceRoot, sops, proxyUrl);
62
51
  },
63
- async readCurrentHash(workspaceRoot) {
64
- try {
65
- return await hashFile(join(workspaceRoot, CONFIG_FILE));
66
- }
67
- catch {
68
- return null;
69
- }
52
+ readCurrentHash(workspaceRoot) {
53
+ return agentsMdHash(workspaceRoot);
70
54
  },
71
55
  };
72
56
  //# sourceMappingURL=rooCode.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rooCode.js","sourceRoot":"","sources":["../../src/harness/rooCode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGnD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD,MAAM,WAAW,GAAG,WAAW,CAAA;AAE/B,MAAM,CAAC,MAAM,cAAc,GAAoB;IAC7C,IAAI,EAAE,WAAW,CAAC,QAAQ;IAC1B,cAAc,EAAE,WAAW;IAE3B,KAAK,CAAC,MAAM,CAAC,aAAqB;QAChC,gDAAgD;QAChD,KAAK,MAAM,MAAM,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAA;gBACzC,OAAO,IAAI,CAAA;YACb,CAAC;YAAC,MAAM,CAAC;gBACP,eAAe;YACjB,CAAC;QACH,CAAC;QAED,wCAAwC;QACxC,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,YAAY,CAAC,CAAA;YAC9D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,CAAA;YAC5C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,6BAA6B,CAAC,CAAC,CAAA;QACjF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,aAAqB,EAAE,IAAoB,EAAE,SAAiB;QAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAA;QACjD,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;YAClC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,KAAK,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC;YAC5E,CAAC,CAAC,4DAA4D,CAAA;QAEhE,MAAM,OAAO,GAAG;YACd,6CAA6C;YAC7C,gDAAgD;YAChD,gBAAgB,MAAM,EAAE,EAAE;YAC1B,mEAAmE;YACnE,6DAA6D;YAC7D,EAAE;YACF,YAAY;YACZ,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEZ,MAAM,cAAc,CAAC,QAAQ,EAAE,aAAa,EAAE,OAAO,CAAC,CAAA;QAEtD,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,aAAqB;QACzC,IAAI,CAAC;YACH,OAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAA;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;CACF,CAAA"}
1
+ {"version":3,"file":"rooCode.js","sourceRoot":"","sources":["../../src/harness/rooCode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGnD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAEvD,MAAM,WAAW,GAAG,WAAW,CAAA;AAE/B,MAAM,CAAC,MAAM,cAAc,GAAoB;IAC7C,IAAI,EAAE,WAAW,CAAC,QAAQ;IAC1B,cAAc,EAAE,SAAS;IAEzB,KAAK,CAAC,MAAM,CAAC,aAAqB;QAChC,KAAK,MAAM,MAAM,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAA;gBACzC,OAAO,IAAI,CAAA;YACb,CAAC;YAAC,MAAM,CAAC;gBACP,eAAe;YACjB,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAA;YACvE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,6BAA6B,CAAC,CAAC,CAAA;QACjF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,aAAqB,EAAE,IAAoB,EAAE,QAAgB;QAC7E,MAAM,qBAAqB,CAAC,aAAa,EAAE,WAAW,CAAC,CAAA;QACvD,OAAO,aAAa,CAAC,aAAa,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;IACrD,CAAC;IAED,eAAe,CAAC,aAAqB;QACnC,OAAO,YAAY,CAAC,aAAa,CAAC,CAAA;IACpC,CAAC;CACF,CAAA"}