toolroll 0.5.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 (626) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1113 -0
  3. package/THIRD_PARTY_NOTICES.md +449 -0
  4. package/dist/accent-colors.d.ts +48 -0
  5. package/dist/accent-colors.js +122 -0
  6. package/dist/action-ledger.d.ts +26 -0
  7. package/dist/action-ledger.js +75 -0
  8. package/dist/agent-fence.d.ts +42 -0
  9. package/dist/agent-fence.js +183 -0
  10. package/dist/agentconfig.d.ts +216 -0
  11. package/dist/agentconfig.js +454 -0
  12. package/dist/api-tokens.d.ts +16 -0
  13. package/dist/api-tokens.js +27 -0
  14. package/dist/approval-policy.d.ts +69 -0
  15. package/dist/approval-policy.js +137 -0
  16. package/dist/approval-rules-ui.d.ts +25 -0
  17. package/dist/approval-rules-ui.js +39 -0
  18. package/dist/assignment-adapters.d.ts +180 -0
  19. package/dist/assignment-adapters.js +239 -0
  20. package/dist/assignment-brief.d.ts +71 -0
  21. package/dist/assignment-brief.js +129 -0
  22. package/dist/assignment-delivery.d.ts +56 -0
  23. package/dist/assignment-delivery.js +160 -0
  24. package/dist/assignment-presentation.d.ts +26 -0
  25. package/dist/assignment-presentation.js +80 -0
  26. package/dist/assignment-status.d.ts +62 -0
  27. package/dist/assignment-status.js +152 -0
  28. package/dist/assignment-ui.d.ts +71 -0
  29. package/dist/assignment-ui.js +103 -0
  30. package/dist/assignment.d.ts +222 -0
  31. package/dist/assignment.js +399 -0
  32. package/dist/attest.d.ts +56 -0
  33. package/dist/attest.js +153 -0
  34. package/dist/backend.d.ts +97 -0
  35. package/dist/backend.js +166 -0
  36. package/dist/backup-ui.d.ts +22 -0
  37. package/dist/backup-ui.js +59 -0
  38. package/dist/backup.d.ts +84 -0
  39. package/dist/backup.js +421 -0
  40. package/dist/beads.d.ts +34 -0
  41. package/dist/beads.js +135 -0
  42. package/dist/bin.d.ts +2 -0
  43. package/dist/bin.js +22 -0
  44. package/dist/board.d.ts +150 -0
  45. package/dist/board.js +210 -0
  46. package/dist/boot-identity.d.ts +63 -0
  47. package/dist/boot-identity.js +99 -0
  48. package/dist/browser/THIRD_PARTY_NOTICES.txt +2295 -0
  49. package/dist/browser/workspace.css +4 -0
  50. package/dist/browser/workspace.js +225 -0
  51. package/dist/browser-crew.d.ts +11 -0
  52. package/dist/browser-crew.js +50 -0
  53. package/dist/browser-shell.d.ts +8 -0
  54. package/dist/browser-shell.js +60 -0
  55. package/dist/browser-workspace.d.ts +780 -0
  56. package/dist/browser-workspace.js +47 -0
  57. package/dist/budget-alerts.d.ts +19 -0
  58. package/dist/budget-alerts.js +46 -0
  59. package/dist/builder.d.ts +370 -0
  60. package/dist/builder.js +3262 -0
  61. package/dist/capscan.d.ts +35 -0
  62. package/dist/capscan.js +113 -0
  63. package/dist/chat-acceptance.d.ts +71 -0
  64. package/dist/chat-acceptance.js +120 -0
  65. package/dist/chat-actions.d.ts +265 -0
  66. package/dist/chat-actions.js +1273 -0
  67. package/dist/chat-channel.d.ts +109 -0
  68. package/dist/chat-channel.js +652 -0
  69. package/dist/chat-continuity.d.ts +32 -0
  70. package/dist/chat-continuity.js +317 -0
  71. package/dist/chat-controls.d.ts +113 -0
  72. package/dist/chat-controls.js +53 -0
  73. package/dist/chat-delivery-state.d.ts +159 -0
  74. package/dist/chat-delivery-state.js +309 -0
  75. package/dist/chat-delivery.d.ts +38 -0
  76. package/dist/chat-delivery.js +693 -0
  77. package/dist/chat-display.d.ts +1 -0
  78. package/dist/chat-display.js +18 -0
  79. package/dist/chat-evidence.d.ts +123 -0
  80. package/dist/chat-evidence.js +207 -0
  81. package/dist/chat-flow.d.ts +44 -0
  82. package/dist/chat-flow.js +215 -0
  83. package/dist/chat-inbox.d.ts +57 -0
  84. package/dist/chat-inbox.js +123 -0
  85. package/dist/chat-polish.d.ts +16 -0
  86. package/dist/chat-polish.js +135 -0
  87. package/dist/chat-review.d.ts +46 -0
  88. package/dist/chat-review.js +98 -0
  89. package/dist/chat-rooms.d.ts +123 -0
  90. package/dist/chat-rooms.js +216 -0
  91. package/dist/chat-task-actions.d.ts +44 -0
  92. package/dist/chat-task-actions.js +79 -0
  93. package/dist/check-progress.d.ts +51 -0
  94. package/dist/check-progress.js +290 -0
  95. package/dist/child-database.d.ts +12 -0
  96. package/dist/child-database.js +30 -0
  97. package/dist/claim.d.ts +688 -0
  98. package/dist/claim.js +1740 -0
  99. package/dist/cli.d.ts +137 -0
  100. package/dist/cli.js +1461 -0
  101. package/dist/codex-limits.d.ts +15 -0
  102. package/dist/codex-limits.js +145 -0
  103. package/dist/coding-context.d.ts +55 -0
  104. package/dist/coding-context.js +92 -0
  105. package/dist/coding-handoff.d.ts +57 -0
  106. package/dist/coding-handoff.js +277 -0
  107. package/dist/coding-provider.d.ts +72 -0
  108. package/dist/coding-provider.js +424 -0
  109. package/dist/coding-shipping-ui.d.ts +4 -0
  110. package/dist/coding-shipping-ui.js +12 -0
  111. package/dist/coding-types.d.ts +62 -0
  112. package/dist/coding-types.js +1 -0
  113. package/dist/coding-ui.d.ts +17 -0
  114. package/dist/coding-ui.js +364 -0
  115. package/dist/coding-update.d.ts +15 -0
  116. package/dist/coding-update.js +149 -0
  117. package/dist/coding-workspace.d.ts +124 -0
  118. package/dist/coding-workspace.js +768 -0
  119. package/dist/container-state.d.ts +5 -0
  120. package/dist/container-state.js +62 -0
  121. package/dist/containment.d.ts +197 -0
  122. package/dist/containment.js +559 -0
  123. package/dist/contest.d.ts +318 -0
  124. package/dist/contest.js +753 -0
  125. package/dist/control-setup.d.ts +35 -0
  126. package/dist/control-setup.js +40 -0
  127. package/dist/control-ui.d.ts +29 -0
  128. package/dist/control-ui.js +53 -0
  129. package/dist/controller-service.d.ts +1 -0
  130. package/dist/controller-service.js +19 -0
  131. package/dist/controller-supervisor.d.ts +30 -0
  132. package/dist/controller-supervisor.js +104 -0
  133. package/dist/converse.d.ts +304 -0
  134. package/dist/converse.js +849 -0
  135. package/dist/coordinator-proposals.d.ts +29 -0
  136. package/dist/coordinator-proposals.js +137 -0
  137. package/dist/coordinator.d.ts +186 -0
  138. package/dist/coordinator.js +447 -0
  139. package/dist/credentials-ui.d.ts +25 -0
  140. package/dist/credentials-ui.js +48 -0
  141. package/dist/daemon.d.ts +209 -0
  142. package/dist/daemon.js +604 -0
  143. package/dist/decision.d.ts +120 -0
  144. package/dist/decision.js +388 -0
  145. package/dist/demo.d.ts +55 -0
  146. package/dist/demo.js +992 -0
  147. package/dist/desktop-access.d.ts +28 -0
  148. package/dist/desktop-access.js +88 -0
  149. package/dist/desktop-bundle.d.ts +16 -0
  150. package/dist/desktop-bundle.js +74 -0
  151. package/dist/desktop-host.d.ts +54 -0
  152. package/dist/desktop-host.js +508 -0
  153. package/dist/desktop-update-gate.d.ts +12 -0
  154. package/dist/desktop-update-gate.js +91 -0
  155. package/dist/desktop-update-recovery.d.ts +14 -0
  156. package/dist/desktop-update-recovery.js +243 -0
  157. package/dist/desktop-update.d.ts +110 -0
  158. package/dist/desktop-update.js +740 -0
  159. package/dist/discord-api.d.ts +20 -0
  160. package/dist/discord-api.js +138 -0
  161. package/dist/discord-chat.d.ts +16 -0
  162. package/dist/discord-chat.js +381 -0
  163. package/dist/discord-settings.d.ts +7 -0
  164. package/dist/discord-settings.js +75 -0
  165. package/dist/discord.d.ts +10 -0
  166. package/dist/discord.js +169 -0
  167. package/dist/discover.d.ts +75 -0
  168. package/dist/discover.js +150 -0
  169. package/dist/dispatch.d.ts +100 -0
  170. package/dist/dispatch.js +311 -0
  171. package/dist/dispose.d.ts +161 -0
  172. package/dist/dispose.js +803 -0
  173. package/dist/email-settings.d.ts +34 -0
  174. package/dist/email-settings.js +50 -0
  175. package/dist/envelope.d.ts +47 -0
  176. package/dist/envelope.js +105 -0
  177. package/dist/evidence-pack.d.ts +185 -0
  178. package/dist/evidence-pack.js +258 -0
  179. package/dist/evidence.d.ts +345 -0
  180. package/dist/evidence.js +782 -0
  181. package/dist/exec.d.ts +285 -0
  182. package/dist/exec.js +1841 -0
  183. package/dist/exhaustion.d.ts +85 -0
  184. package/dist/exhaustion.js +141 -0
  185. package/dist/export-ui.d.ts +4 -0
  186. package/dist/export-ui.js +17 -0
  187. package/dist/export.d.ts +48 -0
  188. package/dist/export.js +305 -0
  189. package/dist/flow-actions.d.ts +77 -0
  190. package/dist/flow-actions.js +203 -0
  191. package/dist/flow-code.d.ts +50 -0
  192. package/dist/flow-code.js +159 -0
  193. package/dist/flow-draft.d.ts +38 -0
  194. package/dist/flow-draft.js +80 -0
  195. package/dist/flow-engine.d.ts +66 -0
  196. package/dist/flow-engine.js +416 -0
  197. package/dist/flow-insights.d.ts +95 -0
  198. package/dist/flow-insights.js +149 -0
  199. package/dist/flow-live.d.ts +24 -0
  200. package/dist/flow-live.js +150 -0
  201. package/dist/flow-people.d.ts +24 -0
  202. package/dist/flow-people.js +91 -0
  203. package/dist/flow-replies.d.ts +48 -0
  204. package/dist/flow-replies.js +113 -0
  205. package/dist/flow-scripts.d.ts +38 -0
  206. package/dist/flow-scripts.js +73 -0
  207. package/dist/flow-secrets.d.ts +13 -0
  208. package/dist/flow-secrets.js +45 -0
  209. package/dist/flow-sort.d.ts +82 -0
  210. package/dist/flow-sort.js +153 -0
  211. package/dist/flow-steps.d.ts +40 -0
  212. package/dist/flow-steps.js +408 -0
  213. package/dist/flow-triggers.d.ts +244 -0
  214. package/dist/flow-triggers.js +959 -0
  215. package/dist/flows-ui.d.ts +20 -0
  216. package/dist/flows-ui.js +175 -0
  217. package/dist/flows.d.ts +229 -0
  218. package/dist/flows.js +968 -0
  219. package/dist/fonts.d.ts +19 -0
  220. package/dist/fonts.js +19 -0
  221. package/dist/gaps.d.ts +35 -0
  222. package/dist/gaps.js +101 -0
  223. package/dist/gate-failure.d.ts +40 -0
  224. package/dist/gate-failure.js +66 -0
  225. package/dist/git.d.ts +54 -0
  226. package/dist/git.js +94 -0
  227. package/dist/google-mail.d.ts +58 -0
  228. package/dist/google-mail.js +151 -0
  229. package/dist/grant.d.ts +136 -0
  230. package/dist/grant.js +238 -0
  231. package/dist/graph.d.ts +164 -0
  232. package/dist/graph.js +383 -0
  233. package/dist/guides.d.ts +22 -0
  234. package/dist/guides.js +363 -0
  235. package/dist/held.d.ts +150 -0
  236. package/dist/held.js +799 -0
  237. package/dist/invoke.d.ts +112 -0
  238. package/dist/invoke.js +780 -0
  239. package/dist/issues.d.ts +41 -0
  240. package/dist/issues.js +131 -0
  241. package/dist/job-object-helper.ps1 +252 -0
  242. package/dist/jsonl-discriminants.d.ts +11 -0
  243. package/dist/jsonl-discriminants.js +93 -0
  244. package/dist/keys.d.ts +104 -0
  245. package/dist/keys.js +229 -0
  246. package/dist/kits-ui.d.ts +17 -0
  247. package/dist/kits-ui.js +46 -0
  248. package/dist/kits.d.ts +86 -0
  249. package/dist/kits.js +215 -0
  250. package/dist/knowledge-cli.d.ts +101 -0
  251. package/dist/knowledge-cli.js +92 -0
  252. package/dist/knowledge-ui.d.ts +24 -0
  253. package/dist/knowledge-ui.js +40 -0
  254. package/dist/lead-context.d.ts +8 -0
  255. package/dist/lead-context.js +56 -0
  256. package/dist/lead-follow.d.ts +22 -0
  257. package/dist/lead-follow.js +167 -0
  258. package/dist/lead-status.d.ts +75 -0
  259. package/dist/lead-status.js +285 -0
  260. package/dist/ledger-chain.d.ts +46 -0
  261. package/dist/ledger-chain.js +187 -0
  262. package/dist/ledger-csv.d.ts +4 -0
  263. package/dist/ledger-csv.js +11 -0
  264. package/dist/ledger-view.d.ts +24 -0
  265. package/dist/ledger-view.js +58 -0
  266. package/dist/limits-ui.d.ts +26 -0
  267. package/dist/limits-ui.js +67 -0
  268. package/dist/link.d.ts +72 -0
  269. package/dist/link.js +217 -0
  270. package/dist/live.d.ts +96 -0
  271. package/dist/live.js +366 -0
  272. package/dist/liveness.d.ts +30 -0
  273. package/dist/liveness.js +42 -0
  274. package/dist/log.d.ts +7 -0
  275. package/dist/log.js +25 -0
  276. package/dist/mailbox.d.ts +57 -0
  277. package/dist/mailbox.js +150 -0
  278. package/dist/maintenance.d.ts +11 -0
  279. package/dist/maintenance.js +35 -0
  280. package/dist/mate-cli.d.ts +52 -0
  281. package/dist/mate-cli.js +345 -0
  282. package/dist/mate-contract.d.ts +10 -0
  283. package/dist/mate-contract.js +30 -0
  284. package/dist/mate-doors.d.ts +69 -0
  285. package/dist/mate-doors.js +548 -0
  286. package/dist/mate-progress.d.ts +29 -0
  287. package/dist/mate-progress.js +121 -0
  288. package/dist/mate-tools.d.ts +94 -0
  289. package/dist/mate-tools.js +1878 -0
  290. package/dist/mate.d.ts +92 -0
  291. package/dist/mate.js +435 -0
  292. package/dist/mcp-connect.d.ts +103 -0
  293. package/dist/mcp-connect.js +252 -0
  294. package/dist/mcp.d.ts +27 -0
  295. package/dist/mcp.js +651 -0
  296. package/dist/memory-cli.d.ts +466 -0
  297. package/dist/memory-cli.js +111 -0
  298. package/dist/memory-pass.d.ts +160 -0
  299. package/dist/memory-pass.js +409 -0
  300. package/dist/metrics.d.ts +3 -0
  301. package/dist/metrics.js +56 -0
  302. package/dist/mobile-viewport.d.ts +3 -0
  303. package/dist/mobile-viewport.js +37 -0
  304. package/dist/model-catalog.d.ts +118 -0
  305. package/dist/model-catalog.js +376 -0
  306. package/dist/models-cli.d.ts +102 -0
  307. package/dist/models-cli.js +66 -0
  308. package/dist/models-ui.d.ts +34 -0
  309. package/dist/models-ui.js +68 -0
  310. package/dist/modes.d.ts +80 -0
  311. package/dist/modes.js +182 -0
  312. package/dist/monitoring-settings.d.ts +44 -0
  313. package/dist/monitoring-settings.js +173 -0
  314. package/dist/monitoring-ui.d.ts +20 -0
  315. package/dist/monitoring-ui.js +51 -0
  316. package/dist/monitoring.d.ts +34 -0
  317. package/dist/monitoring.js +221 -0
  318. package/dist/names.d.ts +67 -0
  319. package/dist/names.js +102 -0
  320. package/dist/observations.d.ts +40 -0
  321. package/dist/observations.js +211 -0
  322. package/dist/oidc.d.ts +71 -0
  323. package/dist/oidc.js +182 -0
  324. package/dist/onboard.d.ts +108 -0
  325. package/dist/onboard.js +325 -0
  326. package/dist/openrouter-models.d.ts +30 -0
  327. package/dist/openrouter-models.js +120 -0
  328. package/dist/operate.d.ts +118 -0
  329. package/dist/operate.js +11321 -0
  330. package/dist/peek-cli.d.ts +97 -0
  331. package/dist/peek-cli.js +215 -0
  332. package/dist/peek.d.ts +134 -0
  333. package/dist/peek.js +578 -0
  334. package/dist/phase-routing.d.ts +307 -0
  335. package/dist/phase-routing.js +658 -0
  336. package/dist/plan-auto.d.ts +14 -0
  337. package/dist/plan-auto.js +92 -0
  338. package/dist/plan.d.ts +186 -0
  339. package/dist/plan.js +401 -0
  340. package/dist/planner-source.d.ts +251 -0
  341. package/dist/planner-source.js +460 -0
  342. package/dist/planner.d.ts +75 -0
  343. package/dist/planner.js +992 -0
  344. package/dist/policy-ui.d.ts +20 -0
  345. package/dist/policy-ui.js +41 -0
  346. package/dist/policy.d.ts +111 -0
  347. package/dist/policy.js +231 -0
  348. package/dist/prepared-evidence.d.ts +16 -0
  349. package/dist/prepared-evidence.js +96 -0
  350. package/dist/pricing.d.ts +45 -0
  351. package/dist/pricing.js +77 -0
  352. package/dist/principal.d.ts +42 -0
  353. package/dist/principal.js +82 -0
  354. package/dist/probe.d.ts +46 -0
  355. package/dist/probe.js +79 -0
  356. package/dist/process-custody.d.ts +17 -0
  357. package/dist/process-custody.js +91 -0
  358. package/dist/process-liveness.d.ts +10 -0
  359. package/dist/process-liveness.js +81 -0
  360. package/dist/process-recovery-anchor.d.ts +75 -0
  361. package/dist/process-recovery-anchor.js +188 -0
  362. package/dist/process-recovery-coalition.d.ts +25 -0
  363. package/dist/process-recovery-coalition.js +105 -0
  364. package/dist/process-recovery-eligibility.d.ts +178 -0
  365. package/dist/process-recovery-eligibility.js +170 -0
  366. package/dist/process-recovery-native.d.ts +172 -0
  367. package/dist/process-recovery-native.js +592 -0
  368. package/dist/process-recovery-provenance.d.ts +163 -0
  369. package/dist/process-recovery-provenance.js +292 -0
  370. package/dist/process-recovery-services.d.ts +56 -0
  371. package/dist/process-recovery-services.js +191 -0
  372. package/dist/process-recovery-settlement.d.ts +32 -0
  373. package/dist/process-recovery-settlement.js +132 -0
  374. package/dist/process-recovery.d.ts +41 -0
  375. package/dist/process-recovery.js +91 -0
  376. package/dist/process-tree.d.ts +41 -0
  377. package/dist/process-tree.js +264 -0
  378. package/dist/project-access.d.ts +14 -0
  379. package/dist/project-access.js +34 -0
  380. package/dist/project-cli.d.ts +18 -0
  381. package/dist/project-cli.js +104 -0
  382. package/dist/project-delete-ui.d.ts +22 -0
  383. package/dist/project-delete-ui.js +48 -0
  384. package/dist/project-delete.d.ts +55 -0
  385. package/dist/project-delete.js +413 -0
  386. package/dist/project-knowledge.d.ts +111 -0
  387. package/dist/project-knowledge.js +241 -0
  388. package/dist/project-learning.d.ts +100 -0
  389. package/dist/project-learning.js +438 -0
  390. package/dist/project-memory.d.ts +81 -0
  391. package/dist/project-memory.js +264 -0
  392. package/dist/project-skills.d.ts +152 -0
  393. package/dist/project-skills.js +660 -0
  394. package/dist/project-tools.d.ts +219 -0
  395. package/dist/project-tools.js +796 -0
  396. package/dist/project.d.ts +61 -0
  397. package/dist/project.js +125 -0
  398. package/dist/prompt.d.ts +22 -0
  399. package/dist/prompt.js +72 -0
  400. package/dist/proof.d.ts +513 -0
  401. package/dist/proof.js +1140 -0
  402. package/dist/proposal.d.ts +82 -0
  403. package/dist/proposal.js +210 -0
  404. package/dist/provider-connection.d.ts +22 -0
  405. package/dist/provider-connection.js +98 -0
  406. package/dist/provider-limits.d.ts +35 -0
  407. package/dist/provider-limits.js +95 -0
  408. package/dist/provider.d.ts +279 -0
  409. package/dist/provider.js +935 -0
  410. package/dist/publish.d.ts +107 -0
  411. package/dist/publish.js +650 -0
  412. package/dist/pulls.d.ts +118 -0
  413. package/dist/pulls.js +240 -0
  414. package/dist/push.d.ts +95 -0
  415. package/dist/push.js +353 -0
  416. package/dist/quality.d.ts +8 -0
  417. package/dist/quality.js +6 -0
  418. package/dist/recipe-ui.d.ts +18 -0
  419. package/dist/recipe-ui.js +152 -0
  420. package/dist/recipes.d.ts +81 -0
  421. package/dist/recipes.js +332 -0
  422. package/dist/remote.d.ts +67 -0
  423. package/dist/remote.js +122 -0
  424. package/dist/render.d.ts +64 -0
  425. package/dist/render.js +587 -0
  426. package/dist/report-summary.d.ts +13 -0
  427. package/dist/report-summary.js +15 -0
  428. package/dist/repos.d.ts +65 -0
  429. package/dist/repos.js +277 -0
  430. package/dist/repository-context-ui.d.ts +2 -0
  431. package/dist/repository-context-ui.js +10 -0
  432. package/dist/repository-context.d.ts +67 -0
  433. package/dist/repository-context.js +376 -0
  434. package/dist/restart-certification.d.ts +134 -0
  435. package/dist/restart-certification.js +226 -0
  436. package/dist/result-actions.d.ts +28 -0
  437. package/dist/result-actions.js +270 -0
  438. package/dist/result-completion.d.ts +18 -0
  439. package/dist/result-completion.js +66 -0
  440. package/dist/result-review.d.ts +213 -0
  441. package/dist/result-review.js +430 -0
  442. package/dist/retention-ui.d.ts +12 -0
  443. package/dist/retention-ui.js +39 -0
  444. package/dist/retention.d.ts +72 -0
  445. package/dist/retention.js +288 -0
  446. package/dist/review-context.d.ts +243 -0
  447. package/dist/review-context.js +1043 -0
  448. package/dist/review-evidence.d.ts +33 -0
  449. package/dist/review-evidence.js +56 -0
  450. package/dist/reviewer.d.ts +97 -0
  451. package/dist/reviewer.js +202 -0
  452. package/dist/routine.d.ts +228 -0
  453. package/dist/routine.js +764 -0
  454. package/dist/runner.d.ts +266 -0
  455. package/dist/runner.js +399 -0
  456. package/dist/scan.d.ts +32 -0
  457. package/dist/scan.js +92 -0
  458. package/dist/scope.d.ts +695 -0
  459. package/dist/scope.js +1176 -0
  460. package/dist/scout-report.d.ts +42 -0
  461. package/dist/scout-report.js +108 -0
  462. package/dist/scout.d.ts +69 -0
  463. package/dist/scout.js +351 -0
  464. package/dist/serve.d.ts +313 -0
  465. package/dist/serve.js +21776 -0
  466. package/dist/session-brief.d.ts +8 -0
  467. package/dist/session-brief.js +24 -0
  468. package/dist/session-cli.d.ts +13 -0
  469. package/dist/session-cli.js +284 -0
  470. package/dist/session-contract.d.ts +183 -0
  471. package/dist/session-contract.js +122 -0
  472. package/dist/session-http.d.ts +19 -0
  473. package/dist/session-http.js +154 -0
  474. package/dist/session-server.d.ts +12 -0
  475. package/dist/session-server.js +37 -0
  476. package/dist/session-service.d.ts +22 -0
  477. package/dist/session-service.js +157 -0
  478. package/dist/setup-guide.d.ts +39 -0
  479. package/dist/setup-guide.js +93 -0
  480. package/dist/sign-in-guard.d.ts +45 -0
  481. package/dist/sign-in-guard.js +74 -0
  482. package/dist/skills-ui.d.ts +11 -0
  483. package/dist/skills-ui.js +58 -0
  484. package/dist/skills.d.ts +97 -0
  485. package/dist/skills.js +276 -0
  486. package/dist/slack-api.d.ts +55 -0
  487. package/dist/slack-api.js +229 -0
  488. package/dist/slack-chat.d.ts +28 -0
  489. package/dist/slack-chat.js +413 -0
  490. package/dist/slack-settings.d.ts +7 -0
  491. package/dist/slack-settings.js +75 -0
  492. package/dist/slack-state.d.ts +13 -0
  493. package/dist/slack-state.js +9 -0
  494. package/dist/slack.d.ts +13 -0
  495. package/dist/slack.js +167 -0
  496. package/dist/spend-ui.d.ts +28 -0
  497. package/dist/spend-ui.js +95 -0
  498. package/dist/spend.d.ts +142 -0
  499. package/dist/spend.js +313 -0
  500. package/dist/sqlite-runtime.d.ts +3 -0
  501. package/dist/sqlite-runtime.js +6 -0
  502. package/dist/sso-settings.d.ts +33 -0
  503. package/dist/sso-settings.js +103 -0
  504. package/dist/sso-ui.d.ts +22 -0
  505. package/dist/sso-ui.js +39 -0
  506. package/dist/storage.d.ts +15 -0
  507. package/dist/storage.js +84 -0
  508. package/dist/store.d.ts +7754 -0
  509. package/dist/store.js +23279 -0
  510. package/dist/structured-output.d.ts +58 -0
  511. package/dist/structured-output.js +103 -0
  512. package/dist/style-asset.d.ts +7 -0
  513. package/dist/style-asset.js +41 -0
  514. package/dist/subscription-chat.d.ts +46 -0
  515. package/dist/subscription-chat.js +275 -0
  516. package/dist/summary.d.ts +33 -0
  517. package/dist/summary.js +71 -0
  518. package/dist/supervisor.mjs +297 -0
  519. package/dist/surface.d.ts +63 -0
  520. package/dist/surface.js +352 -0
  521. package/dist/sync.d.ts +94 -0
  522. package/dist/sync.js +279 -0
  523. package/dist/task-composer.d.ts +13 -0
  524. package/dist/task-composer.js +52 -0
  525. package/dist/task-control.d.ts +165 -0
  526. package/dist/task-control.js +214 -0
  527. package/dist/task-outcome-cli.d.ts +10 -0
  528. package/dist/task-outcome-cli.js +92 -0
  529. package/dist/task-text.d.ts +30 -0
  530. package/dist/task-text.js +41 -0
  531. package/dist/team-cli.d.ts +15 -0
  532. package/dist/team-cli.js +618 -0
  533. package/dist/team-contract.d.ts +92 -0
  534. package/dist/team-contract.js +1 -0
  535. package/dist/team-http.d.ts +17 -0
  536. package/dist/team-http.js +144 -0
  537. package/dist/team-leads.d.ts +81 -0
  538. package/dist/team-leads.js +565 -0
  539. package/dist/team-runtime.d.ts +27 -0
  540. package/dist/team-runtime.js +264 -0
  541. package/dist/team-ui.d.ts +3 -0
  542. package/dist/team-ui.js +9 -0
  543. package/dist/team-updates.d.ts +8 -0
  544. package/dist/team-updates.js +57 -0
  545. package/dist/teammate-admin.d.ts +53 -0
  546. package/dist/teammate-admin.js +111 -0
  547. package/dist/teammate-desk.d.ts +60 -0
  548. package/dist/teammate-desk.js +154 -0
  549. package/dist/teammate-memory.d.ts +64 -0
  550. package/dist/teammate-memory.js +196 -0
  551. package/dist/teammate-question.d.ts +59 -0
  552. package/dist/teammate-question.js +175 -0
  553. package/dist/teammate-tools.d.ts +108 -0
  554. package/dist/teammate-tools.js +271 -0
  555. package/dist/teammate-week.d.ts +68 -0
  556. package/dist/teammate-week.js +132 -0
  557. package/dist/teammate-work.d.ts +76 -0
  558. package/dist/teammate-work.js +280 -0
  559. package/dist/teammates-ui.d.ts +20 -0
  560. package/dist/teammates-ui.js +166 -0
  561. package/dist/teammates.d.ts +180 -0
  562. package/dist/teammates.js +253 -0
  563. package/dist/teams-api.d.ts +33 -0
  564. package/dist/teams-api.js +204 -0
  565. package/dist/teams-chat.d.ts +26 -0
  566. package/dist/teams-chat.js +215 -0
  567. package/dist/teams-settings.d.ts +12 -0
  568. package/dist/teams-settings.js +57 -0
  569. package/dist/teams.d.ts +21 -0
  570. package/dist/teams.js +124 -0
  571. package/dist/telegram-flow.d.ts +49 -0
  572. package/dist/telegram-flow.js +110 -0
  573. package/dist/telegram-mate.d.ts +137 -0
  574. package/dist/telegram-mate.js +707 -0
  575. package/dist/telegram-progress.d.ts +14 -0
  576. package/dist/telegram-progress.js +129 -0
  577. package/dist/telegram-settings.d.ts +9 -0
  578. package/dist/telegram-settings.js +36 -0
  579. package/dist/telegram-status.d.ts +75 -0
  580. package/dist/telegram-status.js +265 -0
  581. package/dist/telegram-team.d.ts +85 -0
  582. package/dist/telegram-team.js +359 -0
  583. package/dist/telegram.d.ts +230 -0
  584. package/dist/telegram.js +1931 -0
  585. package/dist/templates.d.ts +65 -0
  586. package/dist/templates.js +118 -0
  587. package/dist/tool-launcher.d.ts +1 -0
  588. package/dist/tool-launcher.js +101 -0
  589. package/dist/tools-ui.d.ts +30 -0
  590. package/dist/tools-ui.js +40 -0
  591. package/dist/transitions-recipes.d.ts +1 -0
  592. package/dist/transitions-recipes.js +203 -0
  593. package/dist/tree-proof.d.ts +34 -0
  594. package/dist/tree-proof.js +58 -0
  595. package/dist/verification-evidence.d.ts +44 -0
  596. package/dist/verification-evidence.js +238 -0
  597. package/dist/version.d.ts +2 -0
  598. package/dist/version.js +10 -0
  599. package/dist/webhooks.d.ts +91 -0
  600. package/dist/webhooks.js +283 -0
  601. package/dist/work-index.d.ts +68 -0
  602. package/dist/work-index.js +384 -0
  603. package/dist/work-summary.d.ts +57 -0
  604. package/dist/work-summary.js +116 -0
  605. package/dist/workspace-motion.d.ts +4 -0
  606. package/dist/workspace-motion.js +133 -0
  607. package/dist/workspace-revision.d.ts +19 -0
  608. package/dist/workspace-revision.js +92 -0
  609. package/dist/workspace-ui.d.ts +204 -0
  610. package/dist/workspace-ui.js +411 -0
  611. package/dist/worktree-notices.d.ts +13 -0
  612. package/dist/worktree-notices.js +17 -0
  613. package/dist/worktree.d.ts +249 -0
  614. package/dist/worktree.js +720 -0
  615. package/package.json +122 -0
  616. package/scripts/canary-assertions.mjs +42 -0
  617. package/scripts/crash-canary.mjs +253 -0
  618. package/scripts/fixtures/crash-process.mjs +74 -0
  619. package/scripts/fixtures/pilot-scenarios.mjs +85 -0
  620. package/scripts/fixtures/restart-service.mjs +27 -0
  621. package/scripts/launchd-certification.mjs +143 -0
  622. package/scripts/pilot.mjs +121 -0
  623. package/scripts/proof-preflight.mjs +140 -0
  624. package/scripts/provider-canary.mjs +379 -0
  625. package/scripts/recovery-canary.mjs +135 -0
  626. package/scripts/restart-certification.mjs +98 -0
@@ -0,0 +1,58 @@
1
+ import { randomUUID } from "node:crypto";
2
+ const e = (value) => String(value ?? "").replace(/[&<>"']/g, (c) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" })[c]);
3
+ const hidden = (data) => Object.entries(data)
4
+ .map(([k, v]) => `<input type="hidden" name="${e(k)}" value="${e(v)}">`)
5
+ .join("");
6
+ export const SKILLS_CSS = `.skills{max-width:780px;min-width:0;overflow-wrap:anywhere}.skills h2{font-size:1.1rem}.skills .card{padding:18px;margin:14px 0;min-width:0}.skills form,.skills label{display:grid;gap:10px}.skills input,.skills textarea,.skills select{box-sizing:border-box;width:100%;max-width:100%;min-width:0}.skills textarea{resize:vertical;min-height:130px}.skills button{justify-self:start;white-space:nowrap;min-height:44px}.skills summary{cursor:pointer;min-height:44px;display:flex;align-items:center;gap:10px;flex-wrap:wrap}.skills pre{white-space:pre-wrap;overflow-wrap:anywhere;max-height:360px;overflow:auto;font-size:.9rem}.skills .skill-heading{display:flex;align-items:baseline;justify-content:space-between;gap:12px}.skills .skill-heading h2{margin:0}.skills .skill-state{font-size:.85rem;flex-shrink:0}.skills .skill-source{font-size:.85rem}.skills .skill-controls{display:flex;gap:12px;flex-wrap:wrap}.skills .skill-controls form{margin:0}.skills details details{margin-top:10px}.skills [hidden]{display:none!important}.skills .skill-files{max-height:200px;overflow:auto}.skills .problem{padding:12px}@media(max-width:600px){.skills input,.skills textarea,.skills select{font-size:16px}.skills .card{padding:14px}.skills .skill-heading{align-items:flex-start}}`;
7
+ function source(skill) {
8
+ return `<p class="skill-source">${e(skill.source)} · ${skill.sha.slice(0, 10)}</p><p>${skill.files.length} files · ${Math.ceil(skill.files.reduce((n, f) => n + Buffer.from(f.base64, "base64").length, 0) / 1024)} KB</p><pre>${e(Buffer.from(skill.files.find((f) => f.path === "SKILL.md").base64, "base64").toString("utf8"))}</pre><details><summary>Package files</summary><ul class="skill-files">${skill.files.map((f) => `<li>${e(f.path)}</li>`).join("")}</ul></details>`;
9
+ }
10
+ export function skillsHtml(view, csrf, canManage, options = {}) {
11
+ const manage = canManage && !!csrf, base = {
12
+ csrf,
13
+ repo: view.repo,
14
+ identity: view.identity,
15
+ revision: view.revision,
16
+ };
17
+ const form = (action, contents, extra = {}) => `<form method="post" action="/settings/skills/change">${hidden({ ...base, action, ...extra })}${contents}</form>`;
18
+ const active = Object.values(view.selection).filter((c) => c.enabled).length;
19
+ const renderSkill = (skill) => {
20
+ const enabled = view.selection[skill.name]?.sha === skill.sha &&
21
+ view.selection[skill.name]?.enabled === true;
22
+ const replaced = view.selection[skill.name]?.enabled &&
23
+ view.selection[skill.name]?.sha !== skill.sha;
24
+ return `<article class="card" id="skill-${skill.sha}"><div class="skill-heading"><h2>${e(skill.name)}</h2><span class="skill-state">${enabled ? "Enabled" : "In library"}</span></div><p>${e(skill.description)}</p>${skill.requirements ? `<p><strong>Requires:</strong> ${e(skill.requirements)} <span class="meta">Availability is checked when the agent tests or uses it.</span></p>` : ""}${skill.warnings.map((w) => `<p class="meta">${e(w)}</p>`).join("")}<details${options.focus === skill.sha ? " open" : ""}><summary>Review skill</summary>${source(skill)}${manage ? form(enabled ? "disable" : "enable", `${replaced ? "<p>Replaces the enabled version of this skill for new tasks.</p>" : ""}<button>${enabled ? "Disable skill" : "Enable skill"}</button>`, { sha: skill.sha }) : ""}</details>${manage ? `<details${options.draft?.["sha"] === skill.sha ? " open" : ""}><summary>Test skill</summary>${form("test", `<p>${e(options.agent ?? "Uses this project’s configured report agent")}. Runs a read-only sample through the normal task and approval flow.</p><label>Sample request<textarea name="sample" required maxlength="800" placeholder="Review this project’s home page and suggest three clearer button labels.">${e(options.draft?.["sha"] === skill.sha ? (options.draft?.["sample"] ?? "") : "")}</textarea></label><p class="meta">The report shows what worked and what needs tools or permission. Enabled status alone does not prove use.</p><button>Create test</button>`, { sha: skill.sha, nonce: randomUUID() })}</details>` : ""}</article>`;
25
+ };
26
+ const names = [...new Set(view.library.map((s) => s.name))];
27
+ const cards = names
28
+ .map((name) => {
29
+ const versions = view.library.filter((s) => s.name === name), primary = versions.find((s) => s.sha === options.focus) ??
30
+ versions.find((s) => s.sha === view.selection[name]?.sha) ??
31
+ versions.at(-1);
32
+ const older = versions.filter((s) => s !== primary);
33
+ return `<div data-skill-group data-skill-query="${e(name + " " + primary.description)}">${renderSkill(primary)}${older.length ? `<details><summary>Other versions (${older.length})</summary>${older.map(renderSkill).join("")}</details>` : ""}</div>`;
34
+ })
35
+ .join("");
36
+ const search = names.length > 5
37
+ ? '<label>Search library<input type="search" data-skill-search placeholder="Name or description"></label><p data-skill-no-matches hidden>No matching skills.</p>'
38
+ : "";
39
+ const d = options.draft ?? {};
40
+ const add = manage
41
+ ? `<details class="card"${options.error && options.draft?.["method"] ? " open" : ""}><summary>Add skill</summary><form method="post" action="/settings/skills/import" data-skill-import>${hidden(base)}<label>Add from<select name="method" data-skill-method><option value="paste"${d["method"] === "paste" ? " selected" : ""}>Paste SKILL.md</option><option value="github"${d["method"] === "github" ? " selected" : ""}>GitHub folder</option><option value="folder"${d["method"] === "folder" ? " selected" : ""}>Local folder</option></select></label><div data-skill-input="paste"><label>SKILL.md<textarea name="content" rows="8" maxlength="24576" placeholder="---&#10;name: design-review&#10;description: Review interface copy and layout.&#10;---&#10;Write your instructions here.">${e(d["content"])}</textarea></label></div><div data-skill-input="github"><label>Public GitHub folder<input name="url" type="url" value="${e(d["url"])}" placeholder="https://github.com/owner/repo/tree/main/skills/review"></label></div><div data-skill-input="folder"><label>Skill folder<input type="file" webkitdirectory multiple data-skill-folder></label><input type="hidden" name="files" value=""><p class="meta">Choose the folder containing SKILL.md. Up to 64 files, 1 MB total.</p><noscript>Folder uploads require JavaScript. You can paste SKILL.md or use a GitHub folder.</noscript></div><p class="meta">Added to your library first. Review its source and requirements before enabling it.</p><p data-skill-error role="alert" hidden></p><button>Add to library</button></form></details>`
42
+ : "";
43
+ const history = view.history.length
44
+ ? `<details><summary>Change history</summary>${view.history.map((h) => `<div class="card"><p>Selection ${h.revision} · ${e(h.actor)} · ${e(h.at.slice(0, 16).replace("T", " "))} UTC</p><ul>${h.enabled.length ? h.enabled.map((s) => `<li>${e(s.name)} · ${e(s.version)}</li>`).join("") : "<li>No skills enabled</li>"}</ul>${manage && h.revision !== view.revision ? form("restore", "<button>Restore selection</button>", { restore: h.revision }) : '<span class="meta">Current selection</span>'}</div>`).join("")}</details>`
45
+ : "";
46
+ return `<section class="skills">${options.error ? `<p class="problem" role="alert">${e(options.error)}</p>` : ""}<p>${active ? `${active} skill${active === 1 ? "" : "s"} enabled for new tasks.` : "No skills enabled for this project."} Active tasks keep their saved versions.</p>${add}${search}${cards || "<p>Your library is empty. Add a skill to review and enable it here.</p>"}${history}</section>`;
47
+ }
48
+ export function skillsSnapshotHtml(snapshot) {
49
+ if (!snapshot || !snapshot.packages.length)
50
+ return "";
51
+ return `<details class="skills"><summary>Skills supplied (${snapshot.packages.length})</summary><p class="meta">Exact versions supplied to this run. This does not confirm the agent read or applied them.</p>${snapshot.packages.map((s) => `<details><summary>${e(s.name)} · ${s.sha.slice(0, 10)}</summary>${source(s)}</details>`).join("")}</details>`;
52
+ }
53
+ export function skillsScript() {
54
+ return `(()=>{const search=document.querySelector('[data-skill-search]');if(search)search.addEventListener('input',()=>{let found=0;document.querySelectorAll('[data-skill-group]').forEach(el=>{el.hidden=!el.dataset.skillQuery.toLowerCase().includes(search.value.trim().toLowerCase());if(!el.hidden)found++;});document.querySelector('[data-skill-no-matches]').hidden=found>0;});const form=document.querySelector('[data-skill-import]');if(!form)return;const method=form.querySelector('[data-skill-method]'),error=form.querySelector('[data-skill-error]');function sync(){form.querySelectorAll('[data-skill-input]').forEach(el=>{el.hidden=el.dataset.skillInput!==method.value;el.querySelectorAll('input,textarea').forEach(i=>i.disabled=el.hidden);});}method.addEventListener('change',sync);sync();form.addEventListener('submit',async event=>{if(method.value!=='folder')return;if(form.dataset.prepared==='yes'){delete form.dataset.prepared;return;}event.preventDefault();error.hidden=true;const button=form.querySelector('button');button.disabled=true;try{const files=Array.from(form.querySelector('[data-skill-folder]').files);if(!files.length||files.length>64||files.reduce((n,f)=>n+f.size,0)>1048576||files.some(f=>f.size>262144))throw Error('Choose one skill folder with up to 64 files and 1 MB total.');const packed=[];for(const file of files){const parts=file.webkitRelativePath.split('/');parts.shift();const data=new Uint8Array(await file.arrayBuffer());let binary='';for(const byte of data)binary+=String.fromCharCode(byte);packed.push({path:parts.join('/'),base64:btoa(binary)});}form.querySelector('[name=files]').value=JSON.stringify(packed);form.dataset.prepared='yes';button.disabled=false;form.requestSubmit();}catch(e){error.textContent=e.message||'The folder could not be read. Select it again.';error.hidden=false;button.disabled=false;}});})();`;
55
+ }
56
+ export function skillTestFeedbackHtml(test, csrf, canManage, error = "", draft = "") {
57
+ return `<section class="skills" id="skill-test-feedback"><h2>Improve this test</h2>${test.sourceRun ? `<p>Revises test run #${test.sourceRun}.</p>` : ""}${test.feedback ? `<details><summary>Feedback for this test</summary><p>${e(test.feedback)}</p></details>` : ""}${test.revisions.length ? `<p>${test.revisions.map((id, i) => `<a href="/t/${encodeURIComponent(id)}">Test revision ${i + 1}</a>`).join(" · ")}</p>` : ""}${error ? `<p role="alert">${e(error)}</p>` : ""}${canManage && csrf ? `<form method="post" action="/settings/skills/revise">${hidden({ csrf, repo: test.repo, run: test.run, nonce: randomUUID() })}<label>What should change?<textarea name="feedback" required maxlength="500" rows="3" placeholder="Try a clearer action label and explain why it fits the user’s goal.">${e(draft)}</textarea></label><p class="meta">Creates another report task with this skill version and your feedback. Review its scope before it runs.</p><button>Create revision</button></form>` : ""}</section>`;
58
+ }
@@ -0,0 +1,97 @@
1
+ /**
2
+ * `toolroll skills install` (M7.13) — how a repository tells its
3
+ * agents this queue exists.
4
+ *
5
+ * Two artifacts, both operator-invoked, previewed by default, and marked
6
+ * as managed so nothing here ever overwrites a file it does not own:
7
+ *
8
+ * - `.claude/skills/toolroll/SKILL.md` — the Agent Skills entry
9
+ * (the cross-vendor layout Claude Code, Codex, Gemini CLI, and
10
+ * opencode all read). Router-style: the description says when to
11
+ * reach for the CLI; the body carries the operating contract and
12
+ * defers to live `--help` for everything else, because a skill that
13
+ * duplicates the manual drifts from it.
14
+ * - a managed AGENTS.md block (CLAUDE.md-compatible), written only
15
+ * with --write-context, replaced only between its own markers.
16
+ *
17
+ * DESIGN's "nothing is ever installed for you" holds: this command runs
18
+ * when the operator runs it, shows exactly what it would write, and
19
+ * touches nothing without --yes.
20
+ */
21
+ export declare const SKILL_DIR: string;
22
+ /** Where installs before the rename to Toolroll put the skill: still found, and replaced by the new one. */
23
+ export declare const LEGACY_SKILL_DIR: string;
24
+ export declare const SKILL_FILE = "SKILL.md";
25
+ export declare const MANAGED_MARK = "managed by toolroll \u2014 edits outside the markers survive reinstalls";
26
+ export declare const CONTEXT_BEGIN = "<!-- standing-orders:begin -->";
27
+ export declare const CONTEXT_END = "<!-- standing-orders:end -->";
28
+ /** The skill, complete. The description is the routing contract. The body
29
+ * is the binary-served `operating` guide (guides.ts) — ONE source, so the
30
+ * installed snapshot and `skills get operating` cannot drift apart within
31
+ * a version. The frontmatter prefix and the managed mark are the ownership
32
+ * signature planInstall checks — do not reword them. */
33
+ export declare function skillContent(): string;
34
+ /** The AGENTS.md block, marker-fenced so reinstalls replace only themselves. */
35
+ export declare function contextBlock(): string;
36
+ export type InstallPlan = {
37
+ skillPath: string;
38
+ skillAction: "create" | "replace" | "refuse-foreign";
39
+ /** A skill of ours under the old folder name, removed once the new one is written. */
40
+ legacySkillPath: string | null;
41
+ contextPath: string | null;
42
+ contextAction: "create" | "insert" | "replace" | "skip";
43
+ };
44
+ export type InstallResult = {
45
+ ok: true;
46
+ plan: InstallPlan;
47
+ wrote: string[];
48
+ } | {
49
+ ok: false;
50
+ reason: "foreign-skill" | "broken-markers";
51
+ message: string;
52
+ };
53
+ /** What install would do, computed without writing anything. */
54
+ export declare function planInstall(repo: string, writeContext: boolean): InstallPlan;
55
+ /** Apply the plan. Refuses a foreign skill file rather than eating it. */
56
+ export declare function applyInstall(repo: string, writeContext: boolean): InstallResult;
57
+ /**
58
+ * The user-level Claude Code skill is separate from the repository-local
59
+ * skill above. The former teaches one Claude Code installation how to use
60
+ * this exact Toolroll binary; the latter remains part of the shared
61
+ * project setup flow.
62
+ */
63
+ export declare const CLAUDE_CODE_MANAGED_MARK = "<!-- standing-orders:claude-code-skill:v1 -->";
64
+ export declare const CLAUDE_CODE_GUIDES: readonly ["console", "operating", "runner"];
65
+ export type ClaudeCodeSkillFile = {
66
+ name: string;
67
+ path: string;
68
+ action: "create" | "replace" | "refuse-foreign";
69
+ };
70
+ export type ClaudeCodeInstallPlan = {
71
+ directory: string;
72
+ directoryAction: "create" | "use" | "refuse-foreign";
73
+ files: ClaudeCodeSkillFile[];
74
+ /** Managed files left under the old folder name, removed once the new ones are written. */
75
+ legacyFiles: string[];
76
+ };
77
+ export type ClaudeCodeInstallResult = {
78
+ ok: true;
79
+ plan: ClaudeCodeInstallPlan;
80
+ wrote: string[];
81
+ } | {
82
+ ok: false;
83
+ reason: "foreign-file";
84
+ message: string;
85
+ plan: ClaudeCodeInstallPlan;
86
+ };
87
+ export declare function defaultClaudeCodeSkillDir(home?: string): string;
88
+ /** Where installs before the rename put the Claude Code skill. */
89
+ export declare function legacyClaudeCodeSkillDir(home?: string): string;
90
+ /** SKILL.md links to the full guides instead of copying their detail. */
91
+ export declare function claudeCodeSkillContent(): string;
92
+ /** One linked file, generated from the guide embedded in this binary. */
93
+ export declare function claudeCodeGuideContent(name: typeof CLAUDE_CODE_GUIDES[number]): string;
94
+ /** Compute the complete write set without changing the filesystem. */
95
+ export declare function planClaudeCodeInstall(directory?: string, legacyDirectory?: string | null): ClaudeCodeInstallPlan;
96
+ /** Refresh every managed file, after validating the whole set first. */
97
+ export declare function applyClaudeCodeInstall(directory?: string, legacyDirectory?: string | null): ClaudeCodeInstallResult;
package/dist/skills.js ADDED
@@ -0,0 +1,276 @@
1
+ /**
2
+ * `toolroll skills install` (M7.13) — how a repository tells its
3
+ * agents this queue exists.
4
+ *
5
+ * Two artifacts, both operator-invoked, previewed by default, and marked
6
+ * as managed so nothing here ever overwrites a file it does not own:
7
+ *
8
+ * - `.claude/skills/toolroll/SKILL.md` — the Agent Skills entry
9
+ * (the cross-vendor layout Claude Code, Codex, Gemini CLI, and
10
+ * opencode all read). Router-style: the description says when to
11
+ * reach for the CLI; the body carries the operating contract and
12
+ * defers to live `--help` for everything else, because a skill that
13
+ * duplicates the manual drifts from it.
14
+ * - a managed AGENTS.md block (CLAUDE.md-compatible), written only
15
+ * with --write-context, replaced only between its own markers.
16
+ *
17
+ * DESIGN's "nothing is ever installed for you" holds: this command runs
18
+ * when the operator runs it, shows exactly what it would write, and
19
+ * touches nothing without --yes.
20
+ */
21
+ import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, rmdirSync, unlinkSync, writeFileSync } from "node:fs";
22
+ import { homedir } from "node:os";
23
+ import { dirname, join } from "node:path";
24
+ import { guideNamed } from "./guides.js";
25
+ export const SKILL_DIR = join(".claude", "skills", "toolroll");
26
+ /** Where installs before the rename to Toolroll put the skill: still found, and replaced by the new one. */
27
+ export const LEGACY_SKILL_DIR = join(".claude", "skills", "standing-orders");
28
+ export const SKILL_FILE = "SKILL.md";
29
+ export const MANAGED_MARK = "managed by toolroll — edits outside the markers survive reinstalls";
30
+ const LEGACY_MANAGED_MARK = "managed by standing-orders — edits outside the markers survive reinstalls";
31
+ /** Frontmatter a skill of ours starts with, under either name. */
32
+ const OWN_HEADERS = ["---\nname: toolroll\n", "---\nname: standing-orders\n"];
33
+ const ownHeader = (content) => OWN_HEADERS.some(header => content.startsWith(header));
34
+ export const CONTEXT_BEGIN = "<!-- standing-orders:begin -->";
35
+ export const CONTEXT_END = "<!-- standing-orders:end -->";
36
+ /** The skill, complete. The description is the routing contract. The body
37
+ * is the binary-served `operating` guide (guides.ts) — ONE source, so the
38
+ * installed snapshot and `skills get operating` cannot drift apart within
39
+ * a version. The frontmatter prefix and the managed mark are the ownership
40
+ * signature planInstall checks — do not reword them. */
41
+ export function skillContent() {
42
+ const operating = guideNamed("operating");
43
+ if (operating === null)
44
+ throw new Error("the operating guide is missing from the build");
45
+ return `---
46
+ name: toolroll
47
+ description: Operate this repository's unattended work queue via the toolroll CLI, and explain its console. Use when asked to file or inspect tasks (including scout tasks that deliver a report), check what is ready or blocked, peek at live agents, read run results and briefs, see what awaits a human decision, or tell the operator which screen or command does what. Not for pushing, merging, or approving anything — approvals are the operator's, always.
48
+ ---
49
+
50
+ <!-- ${MANAGED_MARK} -->
51
+
52
+ ${operating.content}
53
+ <!-- end ${MANAGED_MARK} -->
54
+ `;
55
+ }
56
+ /** The AGENTS.md block, marker-fenced so reinstalls replace only themselves. */
57
+ export function contextBlock() {
58
+ return `${CONTEXT_BEGIN}
59
+ This repository's unattended work runs through the \`toolroll\` CLI
60
+ (work queue, decisions, runs). Machine answers: add \`--json\` — one
61
+ envelope per command, stable \`reason\` tokens, exit 3 means "no" not
62
+ "broken", every mutation takes an idempotency \`--key\`. Refusals like
63
+ \`held\`, \`fenced\`, \`reserved\`, \`unapproved\`, and \`external\` are
64
+ answers to branch on, not errors to retry. Details:
65
+ \`.claude/skills/toolroll/SKILL.md\`, or \`toolroll --help\`,
66
+ which is authoritative — and \`toolroll skills get <name>\` serves
67
+ version-matched guides straight from the binary (\`skills list\` names
68
+ them). Project memory (instructions, references, lessons, decisions) lives
69
+ in the plane: read \`skills get knowledge\`, search it with
70
+ \`toolroll memory search\`, and record settled choices with
71
+ \`memory decide\` instead of editing this file. Never approve, push, or
72
+ merge anything yourself.
73
+ ${CONTEXT_END}`;
74
+ }
75
+ /** What install would do, computed without writing anything. */
76
+ export function planInstall(repo, writeContext) {
77
+ const skillPath = join(repo, SKILL_DIR, SKILL_FILE);
78
+ let skillAction = "create";
79
+ if (existsSync(skillPath)) {
80
+ const current = readFileSync(skillPath, "utf8");
81
+ // Ownership is the exact header AND the managed mark — a foreign file
82
+ // that merely quotes the mark somewhere is not ours (audit C-10).
83
+ const ours = ownHeader(current) && (current.includes(MANAGED_MARK) || current.includes(LEGACY_MANAGED_MARK));
84
+ skillAction = ours ? "replace" : "refuse-foreign";
85
+ }
86
+ const legacy = join(repo, LEGACY_SKILL_DIR, SKILL_FILE);
87
+ const legacySkillPath = realFolder(join(repo, ".claude")) && realFolder(join(repo, ".claude", "skills")) && realFolder(join(repo, LEGACY_SKILL_DIR)) && isOwnFile(legacy, current => ownHeader(current) && (current.includes(MANAGED_MARK) || current.includes(LEGACY_MANAGED_MARK))) ? legacy : null;
88
+ const contextPath = writeContext ? join(repo, "AGENTS.md") : null;
89
+ let contextAction = "skip";
90
+ if (contextPath !== null) {
91
+ if (!existsSync(contextPath))
92
+ contextAction = "create";
93
+ else {
94
+ const current = readFileSync(contextPath, "utf8");
95
+ contextAction = current.includes(CONTEXT_BEGIN) ? "replace" : "insert";
96
+ }
97
+ }
98
+ return { skillPath, skillAction, legacySkillPath, contextPath, contextAction };
99
+ }
100
+ /** Apply the plan. Refuses a foreign skill file rather than eating it. */
101
+ export function applyInstall(repo, writeContext) {
102
+ const plan = planInstall(repo, writeContext);
103
+ if (plan.skillAction === "refuse-foreign") {
104
+ return {
105
+ ok: false,
106
+ reason: "foreign-skill",
107
+ message: `${plan.skillPath} exists and was not written by this installer — refusing to overwrite a file that is not mine`,
108
+ };
109
+ }
110
+ // EVERY validation happens before EITHER file is touched — "nothing was
111
+ // written" must be true when it is said (arc-5 review, finding 6; the
112
+ // old order wrote the skill first and then refused on damaged markers).
113
+ let contextNext = null;
114
+ if (plan.contextPath !== null && plan.contextAction !== "create") {
115
+ const current = readFileSync(plan.contextPath, "utf8");
116
+ if (plan.contextAction === "replace") {
117
+ // Exactly one well-ordered pair, or a typed refusal — a half block
118
+ // must never produce a silent false success (audit C-10).
119
+ const begins = current.split(CONTEXT_BEGIN).length - 1;
120
+ const ends = current.split(CONTEXT_END).length - 1;
121
+ const begin = current.indexOf(CONTEXT_BEGIN);
122
+ const end = current.indexOf(CONTEXT_END);
123
+ if (begins !== 1 || ends !== 1 || end <= begin) {
124
+ return {
125
+ ok: false,
126
+ reason: "broken-markers",
127
+ message: `${plan.contextPath} carries a damaged managed block (${begins} begin, ${ends} end marker(s)) — repair or remove it by hand; nothing was written`,
128
+ };
129
+ }
130
+ contextNext = current.slice(0, begin) + contextBlock() + current.slice(end + CONTEXT_END.length);
131
+ }
132
+ else {
133
+ // insert: append after existing content, never rewriting a word of it.
134
+ contextNext = `${current.replace(/\n*$/, "\n\n")}${contextBlock()}\n`;
135
+ }
136
+ }
137
+ const wrote = [];
138
+ mkdirSync(dirname(plan.skillPath), { recursive: true });
139
+ writeFileSync(plan.skillPath, skillContent());
140
+ wrote.push(plan.skillPath);
141
+ if (plan.legacySkillPath !== null)
142
+ removeOwn([plan.legacySkillPath]);
143
+ if (plan.contextPath !== null) {
144
+ writeFileSync(plan.contextPath, contextNext ?? `${contextBlock()}\n`);
145
+ wrote.push(plan.contextPath);
146
+ }
147
+ return { ok: true, plan, wrote };
148
+ }
149
+ /**
150
+ * The user-level Claude Code skill is separate from the repository-local
151
+ * skill above. The former teaches one Claude Code installation how to use
152
+ * this exact Toolroll binary; the latter remains part of the shared
153
+ * project setup flow.
154
+ */
155
+ export const CLAUDE_CODE_MANAGED_MARK = "<!-- standing-orders:claude-code-skill:v1 -->";
156
+ export const CLAUDE_CODE_GUIDES = ["console", "operating", "runner"];
157
+ export function defaultClaudeCodeSkillDir(home = homedir()) {
158
+ return join(home, ".claude", "skills", "toolroll");
159
+ }
160
+ /** Where installs before the rename put the Claude Code skill. */
161
+ export function legacyClaudeCodeSkillDir(home = homedir()) {
162
+ return join(home, ".claude", "skills", "standing-orders");
163
+ }
164
+ /** A regular file (not a link) whose text says it is ours. */
165
+ function isOwnFile(path, ours) {
166
+ if (!existsSync(path))
167
+ return false;
168
+ const entry = lstatSync(path);
169
+ return !entry.isSymbolicLink() && entry.isFile() && entry.size <= 2_000_000 && ours(readFileSync(path, "utf8"));
170
+ }
171
+ /** A folder that is itself, not a link to somewhere else. */
172
+ function realFolder(path) {
173
+ try {
174
+ const entry = lstatSync(path);
175
+ return entry.isDirectory() && !entry.isSymbolicLink();
176
+ }
177
+ catch {
178
+ return false;
179
+ }
180
+ }
181
+ /** Remove files of ours, then their folder only if nothing else is left in it. */
182
+ function removeOwn(paths) {
183
+ for (const path of paths)
184
+ unlinkSync(path);
185
+ const folders = new Set(paths.map(path => dirname(path)));
186
+ for (const folder of folders)
187
+ if (readdirSync(folder).length === 0)
188
+ rmdirSync(folder);
189
+ }
190
+ /** SKILL.md links to the full guides instead of copying their detail. */
191
+ export function claudeCodeSkillContent() {
192
+ return `---
193
+ name: toolroll
194
+ description: Use this machine's Toolroll installation from Claude Code. Use when the user asks about its console, tasks, approvals, results, or runner workflow.
195
+ ---
196
+
197
+ ${CLAUDE_CODE_MANAGED_MARK}
198
+
199
+ # Toolroll
200
+
201
+ Use the installed \`toolroll\` command. Its live help is authoritative.
202
+
203
+ - [Console guide](console.md) — where a person can review and act.
204
+ - [Operating guide](operating.md) — the command contract and safe workflow.
205
+ - [Runner guide](runner.md) — claims, leases, heartbeats, and fencing.
206
+ `;
207
+ }
208
+ /** One linked file, generated from the guide embedded in this binary. */
209
+ export function claudeCodeGuideContent(name) {
210
+ const guide = guideNamed(name);
211
+ if (guide === null)
212
+ throw new Error(`the ${name} guide is missing from the build`);
213
+ return `${CLAUDE_CODE_MANAGED_MARK}\n\n${guide.content.replace(/\n*$/, "\n")}`;
214
+ }
215
+ function claudeCodeFiles(directory) {
216
+ return [
217
+ { name: "SKILL.md", path: join(directory, "SKILL.md"), content: claudeCodeSkillContent() },
218
+ ...CLAUDE_CODE_GUIDES.map(name => ({
219
+ name: `${name}.md`,
220
+ path: join(directory, `${name}.md`),
221
+ content: claudeCodeGuideContent(name),
222
+ })),
223
+ ];
224
+ }
225
+ function isClaudeCodeManaged(name, content) {
226
+ if (name === "SKILL.md") {
227
+ return ownHeader(content) && content.includes(`\n${CLAUDE_CODE_MANAGED_MARK}\n`);
228
+ }
229
+ return content.startsWith(`${CLAUDE_CODE_MANAGED_MARK}\n\n`);
230
+ }
231
+ /** Compute the complete write set without changing the filesystem. */
232
+ export function planClaudeCodeInstall(directory = defaultClaudeCodeSkillDir(), legacyDirectory = directory === defaultClaudeCodeSkillDir() ? legacyClaudeCodeSkillDir() : null) {
233
+ let directoryAction = "create";
234
+ if (existsSync(directory)) {
235
+ const entry = lstatSync(directory);
236
+ directoryAction = entry.isDirectory() && !entry.isSymbolicLink() ? "use" : "refuse-foreign";
237
+ }
238
+ const files = claudeCodeFiles(directory).map(({ name, path }) => {
239
+ if (directoryAction === "refuse-foreign" || !existsSync(path))
240
+ return {
241
+ name,
242
+ path,
243
+ action: directoryAction === "refuse-foreign" ? "refuse-foreign" : "create",
244
+ };
245
+ const entry = lstatSync(path);
246
+ if (entry.isSymbolicLink() || !entry.isFile() || entry.size > 2_000_000) {
247
+ return { name, path, action: "refuse-foreign" };
248
+ }
249
+ const current = readFileSync(path, "utf8");
250
+ return { name, path, action: isClaudeCodeManaged(name, current) ? "replace" : "refuse-foreign" };
251
+ });
252
+ const legacyFiles = legacyDirectory === null || legacyDirectory === directory || !realFolder(legacyDirectory)
253
+ ? []
254
+ : claudeCodeFiles(legacyDirectory).filter(({ name, path }) => isOwnFile(path, content => isClaudeCodeManaged(name, content))).map(({ path }) => path);
255
+ return { directory, directoryAction, files, legacyFiles };
256
+ }
257
+ /** Refresh every managed file, after validating the whole set first. */
258
+ export function applyClaudeCodeInstall(directory = defaultClaudeCodeSkillDir(), legacyDirectory = directory === defaultClaudeCodeSkillDir() ? legacyClaudeCodeSkillDir() : null) {
259
+ const plan = planClaudeCodeInstall(directory, legacyDirectory);
260
+ const refused = plan.files.find(file => file.action === "refuse-foreign");
261
+ if (refused !== undefined) {
262
+ const message = plan.directoryAction === "refuse-foreign"
263
+ ? `${plan.directory} is not a regular directory — refusing to replace it`
264
+ : `${refused.path} exists and was not written by this installer — refusing to overwrite it`;
265
+ return { ok: false, reason: "foreign-file", message, plan };
266
+ }
267
+ mkdirSync(directory, { recursive: true });
268
+ const wrote = [];
269
+ for (const file of claudeCodeFiles(directory)) {
270
+ writeFileSync(file.path, file.content);
271
+ wrote.push(file.path);
272
+ }
273
+ if (plan.legacyFiles.length > 0)
274
+ removeOwn(plan.legacyFiles);
275
+ return { ok: true, plan, wrote };
276
+ }
@@ -0,0 +1,55 @@
1
+ import { ChatDeliveryError } from "./chat-delivery-state.js";
2
+ import { type SlackIdentity } from "./slack-state.js";
3
+ export type SlackCredentials = SlackIdentity & {
4
+ appToken: string;
5
+ botToken: string;
6
+ };
7
+ export type SlackApi = (method: string, args?: Record<string, unknown>) => Promise<Record<string, unknown>>;
8
+ export declare class SlackError extends ChatDeliveryError {
9
+ constructor(code: string, retryMs?: number, uncertain?: boolean);
10
+ }
11
+ export declare function slackApi(token: string, fetcher?: typeof fetch): SlackApi;
12
+ export declare const slackCredentialFile: (dir: string) => string;
13
+ export declare function loadSlackCredentials(dir: string): SlackCredentials | null;
14
+ export declare function saveSlackCredentials(dir: string, value: SlackCredentials): void;
15
+ export declare function clearSlackCredentials(dir: string): void;
16
+ export declare function checkSlackCredentials(appToken: string, botToken: string, fetcher?: typeof fetch): Promise<SlackCredentials>;
17
+ export declare function object(value: unknown): Record<string, unknown>;
18
+ export declare function slackId(value: unknown, prefix: string): value is string;
19
+ export declare function slackTs(value: unknown): value is string;
20
+ export declare function slackMember(api: SlackApi, identity: SlackIdentity, member: string, channel: string): Promise<boolean>;
21
+ export declare function uploadSlackBytes(url: string, bytes: Uint8Array, fetcher?: typeof fetch): Promise<void>;
22
+ /** DM scopes plus channel history for rooms that follow a team conversation. */
23
+ export declare const SLACK_MANIFEST: {
24
+ display_information: {
25
+ name: string;
26
+ description: string;
27
+ background_color: string;
28
+ };
29
+ features: {
30
+ bot_user: {
31
+ display_name: string;
32
+ always_online: boolean;
33
+ };
34
+ app_home: {
35
+ home_tab_enabled: boolean;
36
+ messages_tab_enabled: boolean;
37
+ messages_tab_read_only_enabled: boolean;
38
+ };
39
+ };
40
+ oauth_config: {
41
+ scopes: {
42
+ bot: string[];
43
+ };
44
+ };
45
+ settings: {
46
+ event_subscriptions: {
47
+ bot_events: string[];
48
+ };
49
+ interactivity: {
50
+ is_enabled: boolean;
51
+ };
52
+ socket_mode_enabled: boolean;
53
+ token_rotation_enabled: boolean;
54
+ };
55
+ };