@b00dea/cockpit 0.0.0-stage → 0.1.1

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 (426) hide show
  1. package/CHANGELOG.md +474 -0
  2. package/LICENSE +21 -0
  3. package/README.md +25 -2
  4. package/bin/cockpit.mjs +33 -0
  5. package/cockpit.schema.json +2644 -0
  6. package/dist/autonomy.d.ts +45 -0
  7. package/dist/autonomy.js +173 -0
  8. package/dist/bounded-read.d.ts +14 -0
  9. package/dist/bounded-read.js +42 -0
  10. package/dist/browser/commands.d.ts +117 -0
  11. package/dist/browser/commands.js +453 -0
  12. package/dist/browser/package-paths.d.ts +1 -0
  13. package/dist/browser/package-paths.js +6 -0
  14. package/dist/browser/proxy.d.ts +22 -0
  15. package/dist/browser/proxy.js +37 -0
  16. package/dist/browser/runtime.d.ts +118 -0
  17. package/dist/browser/runtime.js +186 -0
  18. package/dist/browser/surfaces.d.ts +141 -0
  19. package/dist/browser/surfaces.js +561 -0
  20. package/dist/browser/ui-gate.d.ts +15 -0
  21. package/dist/browser/ui-gate.js +18 -0
  22. package/dist/canonical-json.d.ts +2 -0
  23. package/dist/canonical-json.js +5 -0
  24. package/dist/cli-guard.d.ts +5 -0
  25. package/dist/cli-guard.js +71 -0
  26. package/dist/cli-main.d.ts +176 -0
  27. package/dist/cli-main.js +1584 -0
  28. package/dist/cli.d.ts +3 -0
  29. package/dist/cli.js +16 -0
  30. package/dist/command-table.d.ts +121 -0
  31. package/dist/command-table.js +664 -0
  32. package/dist/config/load.d.ts +183 -0
  33. package/dist/config/load.js +367 -0
  34. package/dist/config/sibling-toml.d.ts +48 -0
  35. package/dist/config/sibling-toml.js +160 -0
  36. package/dist/config/surface-tools-toml.d.ts +9 -0
  37. package/dist/config/surface-tools-toml.js +37 -0
  38. package/dist/config/unconfirmed-toml.d.ts +9 -0
  39. package/dist/config/unconfirmed-toml.js +29 -0
  40. package/dist/config/verified-write.d.ts +43 -0
  41. package/dist/config/verified-write.js +89 -0
  42. package/dist/diagnostics.d.ts +26 -0
  43. package/dist/diagnostics.js +344 -0
  44. package/dist/docs/check.d.ts +16 -0
  45. package/dist/docs/check.js +197 -0
  46. package/dist/docs/decision-record.d.ts +34 -0
  47. package/dist/docs/decision-record.js +135 -0
  48. package/dist/docs/decisions.d.ts +16 -0
  49. package/dist/docs/decisions.js +103 -0
  50. package/dist/docs/markdown.d.ts +36 -0
  51. package/dist/docs/markdown.js +88 -0
  52. package/dist/docs/references.d.ts +32 -0
  53. package/dist/docs/references.js +148 -0
  54. package/dist/emit.d.ts +22 -0
  55. package/dist/emit.js +43 -0
  56. package/dist/entrypoint-kinds.d.ts +3 -0
  57. package/dist/entrypoint-kinds.js +11 -0
  58. package/dist/environment/application/confirm.d.ts +35 -0
  59. package/dist/environment/application/confirm.js +122 -0
  60. package/dist/environment/application/destructive.d.ts +6 -0
  61. package/dist/environment/application/destructive.js +429 -0
  62. package/dist/environment/application/doctor.d.ts +94 -0
  63. package/dist/environment/application/doctor.js +247 -0
  64. package/dist/environment/application/guard.d.ts +49 -0
  65. package/dist/environment/application/guard.js +677 -0
  66. package/dist/environment/application/health.d.ts +143 -0
  67. package/dist/environment/application/health.js +385 -0
  68. package/dist/environment/application/lifecycle-context.d.ts +235 -0
  69. package/dist/environment/application/lifecycle-context.js +154 -0
  70. package/dist/environment/application/lifecycle-state.d.ts +25 -0
  71. package/dist/environment/application/lifecycle-state.js +202 -0
  72. package/dist/environment/application/lifecycle.d.ts +18 -0
  73. package/dist/environment/application/lifecycle.js +737 -0
  74. package/dist/environment/application/logs.d.ts +45 -0
  75. package/dist/environment/application/logs.js +127 -0
  76. package/dist/environment/application/services.d.ts +60 -0
  77. package/dist/environment/application/services.js +89 -0
  78. package/dist/environment/application/setup.d.ts +129 -0
  79. package/dist/environment/application/setup.js +741 -0
  80. package/dist/environment/application/shared.d.ts +11 -0
  81. package/dist/environment/application/shared.js +61 -0
  82. package/dist/environment/application/siblings.d.ts +43 -0
  83. package/dist/environment/application/siblings.js +269 -0
  84. package/dist/environment/claims.d.ts +389 -0
  85. package/dist/environment/claims.js +1701 -0
  86. package/dist/environment/codex-hook-trust.d.ts +11 -0
  87. package/dist/environment/codex-hook-trust.js +185 -0
  88. package/dist/environment/compose-environment.d.ts +1 -0
  89. package/dist/environment/compose-environment.js +6 -0
  90. package/dist/environment/compose-ownership.d.ts +21 -0
  91. package/dist/environment/compose-ownership.js +117 -0
  92. package/dist/environment/compose-topology.d.ts +125 -0
  93. package/dist/environment/compose-topology.js +490 -0
  94. package/dist/environment/contract.d.ts +522 -0
  95. package/dist/environment/contract.js +794 -0
  96. package/dist/environment/declaration.d.ts +14 -0
  97. package/dist/environment/declaration.js +39 -0
  98. package/dist/environment/destructive-composition.d.ts +29 -0
  99. package/dist/environment/destructive-composition.js +333 -0
  100. package/dist/environment/docker-daemon.d.ts +30 -0
  101. package/dist/environment/docker-daemon.js +78 -0
  102. package/dist/environment/docker-endpoint.d.ts +10 -0
  103. package/dist/environment/docker-endpoint.js +19 -0
  104. package/dist/environment/env-schema-observation.d.ts +46 -0
  105. package/dist/environment/env-schema-observation.js +241 -0
  106. package/dist/environment/evidence.d.ts +136 -0
  107. package/dist/environment/evidence.js +437 -0
  108. package/dist/environment/executable.d.ts +38 -0
  109. package/dist/environment/executable.js +190 -0
  110. package/dist/environment/generated-application/authorities.d.ts +5 -0
  111. package/dist/environment/generated-application/authorities.js +61 -0
  112. package/dist/environment/generated-application/bootstrap-skill.d.ts +16 -0
  113. package/dist/environment/generated-application/bootstrap-skill.js +328 -0
  114. package/dist/environment/generated-application/check.d.ts +13 -0
  115. package/dist/environment/generated-application/check.js +191 -0
  116. package/dist/environment/generated-application/custom-surface.d.ts +26 -0
  117. package/dist/environment/generated-application/custom-surface.js +289 -0
  118. package/dist/environment/generated-application/prepare.d.ts +29 -0
  119. package/dist/environment/generated-application/prepare.js +278 -0
  120. package/dist/environment/generated-application/publication.d.ts +33 -0
  121. package/dist/environment/generated-application/publication.js +547 -0
  122. package/dist/environment/generated-application/shared.d.ts +492 -0
  123. package/dist/environment/generated-application/shared.js +354 -0
  124. package/dist/environment/generated-application/surface-observation.d.ts +4 -0
  125. package/dist/environment/generated-application/surface-observation.js +69 -0
  126. package/dist/environment/generated-application/surface-outputs.d.ts +71 -0
  127. package/dist/environment/generated-application/surface-outputs.js +400 -0
  128. package/dist/environment/generated-application/surfaces.d.ts +3 -0
  129. package/dist/environment/generated-application/surfaces.js +704 -0
  130. package/dist/environment/generated-application/sync.d.ts +6 -0
  131. package/dist/environment/generated-application/sync.js +124 -0
  132. package/dist/environment/git-observation.d.ts +202 -0
  133. package/dist/environment/git-observation.js +553 -0
  134. package/dist/environment/health-composition.d.ts +12 -0
  135. package/dist/environment/health-composition.js +645 -0
  136. package/dist/environment/host-observation.d.ts +56 -0
  137. package/dist/environment/host-observation.js +52 -0
  138. package/dist/environment/identity.d.ts +48 -0
  139. package/dist/environment/identity.js +85 -0
  140. package/dist/environment/init-application.d.ts +333 -0
  141. package/dist/environment/init-application.js +726 -0
  142. package/dist/environment/install-policy-observation.d.ts +71 -0
  143. package/dist/environment/install-policy-observation.js +284 -0
  144. package/dist/environment/install-policy.d.ts +48 -0
  145. package/dist/environment/install-policy.js +96 -0
  146. package/dist/environment/instance.d.ts +33 -0
  147. package/dist/environment/instance.js +122 -0
  148. package/dist/environment/instruction-pointer.d.ts +19 -0
  149. package/dist/environment/instruction-pointer.js +144 -0
  150. package/dist/environment/lifecycle-composition.d.ts +31 -0
  151. package/dist/environment/lifecycle-composition.js +742 -0
  152. package/dist/environment/lifecycle-stage.d.ts +120 -0
  153. package/dist/environment/lifecycle-stage.js +408 -0
  154. package/dist/environment/lifecycle.d.ts +75 -0
  155. package/dist/environment/lifecycle.js +354 -0
  156. package/dist/environment/logs.d.ts +132 -0
  157. package/dist/environment/logs.js +519 -0
  158. package/dist/environment/map-limit.d.ts +2 -0
  159. package/dist/environment/map-limit.js +13 -0
  160. package/dist/environment/mcp-observation.d.ts +9 -0
  161. package/dist/environment/mcp-observation.js +46 -0
  162. package/dist/environment/observations.d.ts +46 -0
  163. package/dist/environment/observations.js +346 -0
  164. package/dist/environment/operator-application.d.ts +79 -0
  165. package/dist/environment/operator-application.js +197 -0
  166. package/dist/environment/ports.d.ts +182 -0
  167. package/dist/environment/ports.js +1205 -0
  168. package/dist/environment/posture-observation.d.ts +68 -0
  169. package/dist/environment/posture-observation.js +253 -0
  170. package/dist/environment/presence.d.ts +4 -0
  171. package/dist/environment/presence.js +26 -0
  172. package/dist/environment/read-composition.d.ts +32 -0
  173. package/dist/environment/read-composition.js +397 -0
  174. package/dist/environment/readiness-composition.d.ts +57 -0
  175. package/dist/environment/readiness-composition.js +151 -0
  176. package/dist/environment/reclaim.d.ts +370 -0
  177. package/dist/environment/reclaim.js +1940 -0
  178. package/dist/environment/repository-identity.d.ts +13 -0
  179. package/dist/environment/repository-identity.js +108 -0
  180. package/dist/environment/runtime-measurement-record.d.ts +38 -0
  181. package/dist/environment/runtime-measurement-record.js +111 -0
  182. package/dist/environment/runtime-measurement.d.ts +27 -0
  183. package/dist/environment/runtime-measurement.js +224 -0
  184. package/dist/environment/runtime-probe-residue.d.ts +43 -0
  185. package/dist/environment/runtime-probe-residue.js +148 -0
  186. package/dist/environment/runtime-probe.d.ts +72 -0
  187. package/dist/environment/runtime-probe.js +725 -0
  188. package/dist/environment/runtime.d.ts +551 -0
  189. package/dist/environment/runtime.js +2405 -0
  190. package/dist/environment/seed.d.ts +16 -0
  191. package/dist/environment/seed.js +43 -0
  192. package/dist/environment/selftest-application.d.ts +86 -0
  193. package/dist/environment/selftest-application.js +713 -0
  194. package/dist/environment/sensitive.d.ts +3 -0
  195. package/dist/environment/sensitive.js +48 -0
  196. package/dist/environment/served-checkout-grants.d.ts +53 -0
  197. package/dist/environment/served-checkout-grants.js +182 -0
  198. package/dist/environment/setup-observation.d.ts +62 -0
  199. package/dist/environment/setup-observation.js +1473 -0
  200. package/dist/environment/setup.d.ts +43 -0
  201. package/dist/environment/setup.js +176 -0
  202. package/dist/environment/sibling-checkouts.d.ts +119 -0
  203. package/dist/environment/sibling-checkouts.js +254 -0
  204. package/dist/environment/sibling-instructions.d.ts +33 -0
  205. package/dist/environment/sibling-instructions.js +224 -0
  206. package/dist/environment/sibling-observation.d.ts +27 -0
  207. package/dist/environment/sibling-observation.js +45 -0
  208. package/dist/environment/sibling-pull.d.ts +23 -0
  209. package/dist/environment/sibling-pull.js +95 -0
  210. package/dist/environment/sibling-registration.d.ts +45 -0
  211. package/dist/environment/sibling-registration.js +538 -0
  212. package/dist/environment/stack-inputs.d.ts +18 -0
  213. package/dist/environment/stack-inputs.js +210 -0
  214. package/dist/environment/stack-inventory-prune.d.ts +31 -0
  215. package/dist/environment/stack-inventory-prune.js +129 -0
  216. package/dist/environment/stack-inventory-report.d.ts +44 -0
  217. package/dist/environment/stack-inventory-report.js +78 -0
  218. package/dist/environment/stack-inventory.d.ts +94 -0
  219. package/dist/environment/stack-inventory.js +418 -0
  220. package/dist/environment/state.d.ts +410 -0
  221. package/dist/environment/state.js +2153 -0
  222. package/dist/environment/templates.d.ts +140 -0
  223. package/dist/environment/templates.js +685 -0
  224. package/dist/environment/tool-registration.d.ts +9 -0
  225. package/dist/environment/tool-registration.js +92 -0
  226. package/dist/environment/upgrade-application.d.ts +19 -0
  227. package/dist/environment/upgrade-application.js +175 -0
  228. package/dist/environment-exec/execute.d.ts +105 -0
  229. package/dist/environment-exec/execute.js +1179 -0
  230. package/dist/environment-exec/libexec-program.d.ts +6 -0
  231. package/dist/environment-exec/libexec-program.js +22 -0
  232. package/dist/environment-exec/verified-digest.d.ts +4 -0
  233. package/dist/environment-exec/verified-digest.js +16 -0
  234. package/dist/exact-keys.d.ts +7 -0
  235. package/dist/exact-keys.js +15 -0
  236. package/dist/fix-catalogue.d.ts +32 -0
  237. package/dist/fix-catalogue.js +60 -0
  238. package/dist/freshness.d.ts +29 -0
  239. package/dist/freshness.js +75 -0
  240. package/dist/generated-environment/adopt.d.ts +16 -0
  241. package/dist/generated-environment/adopt.js +271 -0
  242. package/dist/generated-environment/command.d.ts +47 -0
  243. package/dist/generated-environment/command.js +75 -0
  244. package/dist/generated-environment/transaction.d.ts +186 -0
  245. package/dist/generated-environment/transaction.js +1770 -0
  246. package/dist/grading/evaluate.d.ts +71 -0
  247. package/dist/grading/evaluate.js +403 -0
  248. package/dist/grading/grade.d.ts +33 -0
  249. package/dist/grading/grade.js +57 -0
  250. package/dist/guards/answer-confirmation.d.ts +41 -0
  251. package/dist/guards/answer-confirmation.js +109 -0
  252. package/dist/guards/evaluator.d.ts +130 -0
  253. package/dist/guards/evaluator.js +1258 -0
  254. package/dist/guards/harness-adapter.d.ts +17 -0
  255. package/dist/guards/harness-adapter.js +57 -0
  256. package/dist/guards/host.d.ts +8 -0
  257. package/dist/guards/host.js +10 -0
  258. package/dist/guards/invocation-parser.d.ts +66 -0
  259. package/dist/guards/invocation-parser.js +595 -0
  260. package/dist/guards/local-identity.d.ts +44 -0
  261. package/dist/guards/local-identity.js +129 -0
  262. package/dist/guards/policy-change.d.ts +43 -0
  263. package/dist/guards/policy-change.js +159 -0
  264. package/dist/guards/policy-pin.d.ts +13 -0
  265. package/dist/guards/policy-pin.js +177 -0
  266. package/dist/guards/protected-locations.d.ts +62 -0
  267. package/dist/guards/protected-locations.js +461 -0
  268. package/dist/guards/read-only.d.ts +37 -0
  269. package/dist/guards/read-only.js +315 -0
  270. package/dist/init/command.d.ts +41 -0
  271. package/dist/init/command.js +330 -0
  272. package/dist/init/derive.d.ts +53 -0
  273. package/dist/init/derive.js +819 -0
  274. package/dist/init/draft.d.ts +140 -0
  275. package/dist/init/draft.js +1228 -0
  276. package/dist/init/render.d.ts +47 -0
  277. package/dist/init/render.js +104 -0
  278. package/dist/init/scaffold.d.ts +53 -0
  279. package/dist/init/scaffold.js +121 -0
  280. package/dist/invocation.d.ts +13 -0
  281. package/dist/invocation.js +20 -0
  282. package/dist/package-metadata.d.ts +9 -0
  283. package/dist/package-metadata.js +19 -0
  284. package/dist/readiness.d.ts +53 -0
  285. package/dist/readiness.js +88 -0
  286. package/dist/references/named.d.ts +24 -0
  287. package/dist/references/named.js +27 -0
  288. package/dist/refusal.d.ts +15 -0
  289. package/dist/refusal.js +7 -0
  290. package/dist/registry-derivation.d.ts +31 -0
  291. package/dist/registry-derivation.js +32 -0
  292. package/dist/registry-resolve/command.d.ts +47 -0
  293. package/dist/registry-resolve/command.js +226 -0
  294. package/dist/registry-resolve/registry.d.ts +68 -0
  295. package/dist/registry-resolve/registry.js +292 -0
  296. package/dist/registry-resolve/render-shell.d.ts +18 -0
  297. package/dist/registry-resolve/render-shell.js +36 -0
  298. package/dist/repair.d.ts +29 -0
  299. package/dist/repair.js +8 -0
  300. package/dist/repository-path.d.ts +9 -0
  301. package/dist/repository-path.js +16 -0
  302. package/dist/schema-json.d.ts +1 -0
  303. package/dist/schema-json.js +177 -0
  304. package/dist/schema.d.ts +1289 -0
  305. package/dist/schema.js +985 -0
  306. package/dist/setup/command.d.ts +4 -0
  307. package/dist/setup/command.js +4 -0
  308. package/dist/sha256.d.ts +1 -0
  309. package/dist/sha256.js +4 -0
  310. package/dist/surfaces/adoption.d.ts +41 -0
  311. package/dist/surfaces/adoption.js +217 -0
  312. package/dist/surfaces/consumer-instructions.d.ts +20 -0
  313. package/dist/surfaces/consumer-instructions.js +43 -0
  314. package/dist/surfaces/contract.d.ts +42 -0
  315. package/dist/surfaces/contract.js +169 -0
  316. package/dist/surfaces/core-declarations.d.ts +24 -0
  317. package/dist/surfaces/core-declarations.js +79 -0
  318. package/dist/surfaces/development-markers.d.ts +1 -0
  319. package/dist/surfaces/development-markers.js +18 -0
  320. package/dist/surfaces/generator-adapter.d.ts +71 -0
  321. package/dist/surfaces/generator-adapter.js +809 -0
  322. package/dist/surfaces/harness-registry.d.ts +260 -0
  323. package/dist/surfaces/harness-registry.js +146 -0
  324. package/dist/surfaces/mcp.d.ts +145 -0
  325. package/dist/surfaces/mcp.js +349 -0
  326. package/dist/surfaces/merge.d.ts +30 -0
  327. package/dist/surfaces/merge.js +105 -0
  328. package/dist/surfaces/ownership.d.ts +190 -0
  329. package/dist/surfaces/ownership.js +795 -0
  330. package/dist/surfaces/projection.d.ts +136 -0
  331. package/dist/surfaces/projection.js +716 -0
  332. package/dist/surfaces/render.d.ts +79 -0
  333. package/dist/surfaces/render.js +636 -0
  334. package/dist/surfaces/restrictions.d.ts +130 -0
  335. package/dist/surfaces/restrictions.js +447 -0
  336. package/dist/surfaces/selftest.d.ts +162 -0
  337. package/dist/surfaces/selftest.js +393 -0
  338. package/dist/surfaces/skill-contract.d.ts +85 -0
  339. package/dist/surfaces/skill-contract.js +449 -0
  340. package/dist/surfaces/sync.d.ts +57 -0
  341. package/dist/surfaces/sync.js +164 -0
  342. package/dist/team-metadata.d.ts +41 -0
  343. package/dist/team-metadata.js +513 -0
  344. package/dist/testing/gates.d.ts +91 -0
  345. package/dist/testing/gates.js +182 -0
  346. package/dist/testing/hooks.d.ts +59 -0
  347. package/dist/testing/hooks.js +139 -0
  348. package/dist/testing/test-protection.d.ts +34 -0
  349. package/dist/testing/test-protection.js +137 -0
  350. package/dist/testing/verdict.d.ts +29 -0
  351. package/dist/testing/verdict.js +62 -0
  352. package/dist/testing/weakening.d.ts +15 -0
  353. package/dist/testing/weakening.js +30 -0
  354. package/dist/work-orders/application-closure.d.ts +7 -0
  355. package/dist/work-orders/application-closure.js +76 -0
  356. package/dist/work-orders/application-context.d.ts +162 -0
  357. package/dist/work-orders/application-context.js +137 -0
  358. package/dist/work-orders/application-decisions.d.ts +27 -0
  359. package/dist/work-orders/application-decisions.js +121 -0
  360. package/dist/work-orders/application-grading.d.ts +11 -0
  361. package/dist/work-orders/application-grading.js +212 -0
  362. package/dist/work-orders/application.d.ts +6 -0
  363. package/dist/work-orders/application.js +223 -0
  364. package/dist/work-orders/composition.d.ts +101 -0
  365. package/dist/work-orders/composition.js +1202 -0
  366. package/dist/work-orders/contract.d.ts +77 -0
  367. package/dist/work-orders/contract.js +140 -0
  368. package/dist/work-orders/decisions.d.ts +23 -0
  369. package/dist/work-orders/decisions.js +55 -0
  370. package/dist/work-orders/store.d.ts +207 -0
  371. package/dist/work-orders/store.js +291 -0
  372. package/docs/README.md +68 -0
  373. package/docs/architecture.md +136 -0
  374. package/docs/capability-matrix.md +58 -0
  375. package/docs/cli-reference.md +807 -0
  376. package/docs/command-list.md +62 -0
  377. package/docs/compose-patterns.md +99 -0
  378. package/docs/concepts.md +173 -0
  379. package/docs/configuration-essentials.md +177 -0
  380. package/docs/configuration-reference.md +636 -0
  381. package/docs/docs-check.md +76 -0
  382. package/docs/environment.md +948 -0
  383. package/docs/extending.md +43 -0
  384. package/docs/faq.md +113 -0
  385. package/docs/getting-started.md +692 -0
  386. package/docs/harness-surfaces.md +500 -0
  387. package/docs/joining-a-team.md +76 -0
  388. package/docs/release-policy.md +49 -0
  389. package/docs/safety-and-autonomy.md +463 -0
  390. package/docs/troubleshooting.md +382 -0
  391. package/docs/tutorial.md +171 -0
  392. package/docs/work-and-browser.md +420 -0
  393. package/libexec/browser-operation.cjs +270 -0
  394. package/libexec/fence-marker.cjs +101 -0
  395. package/libexec/fence-marker.d.cts +24 -0
  396. package/libexec/fenced-group-runner.cjs +77 -0
  397. package/libexec/fenced-supervisor.cjs +137 -0
  398. package/libexec/generated-filesystem.cjs +731 -0
  399. package/libexec/install-filesystem.cjs +225 -0
  400. package/libexec/rulesync-generator.NOTICE.md +1112 -0
  401. package/libexec/rulesync-generator.cjs +743 -0
  402. package/libexec/surface-generator-worker.cjs +266 -0
  403. package/libexec/surface-output-reader.cjs +99 -0
  404. package/libexec/surface-scratch-cleanup.cjs +14 -0
  405. package/libexec/validate-harness-evidence.d.mts +183 -0
  406. package/libexec/validate-harness-evidence.mjs +1312 -0
  407. package/package.json +74 -4
  408. package/surfaces/README.md +33 -0
  409. package/surfaces/agents/evaluator.agent.md +76 -0
  410. package/surfaces/guards/bash-guard.sh +48 -0
  411. package/surfaces/guards/claude.adapter.json +25 -0
  412. package/surfaces/guards/codex.adapter.json +24 -0
  413. package/surfaces/guards/opencode.adapter.json +25 -0
  414. package/surfaces/references/browser.md +63 -0
  415. package/surfaces/references/test-data-and-personas.md +84 -0
  416. package/surfaces/references/testing-tiers.md +11 -0
  417. package/surfaces/skills/cockpit-browser.skill.md +59 -0
  418. package/surfaces/skills/cockpit-explain.skill.md +32 -0
  419. package/surfaces/skills/cockpit-fix.skill.md +37 -0
  420. package/surfaces/skills/cockpit-setup.skill.md +39 -0
  421. package/surfaces/skills/cockpit-work.skill.md +34 -0
  422. package/surfaces/skills/collection.json +5 -0
  423. package/surfaces/skills/procedures/explain.md +66 -0
  424. package/surfaces/skills/procedures/fix.md +95 -0
  425. package/surfaces/skills/procedures/setup.md +452 -0
  426. package/surfaces/skills/procedures/work.md +134 -0
@@ -0,0 +1,3 @@
1
+ export declare function isSensitiveField(name: string): boolean;
2
+ export declare function redactSensitiveText(value: string): string;
3
+ export declare function redactSensitiveMessage(message: string): string | undefined;
@@ -0,0 +1,48 @@
1
+ import { RefusalError } from './contract.js';
2
+ const SENSITIVE_FIELD = /(?:authorization|password|passwd|token|secret|credential|private[_-]?key|api[_-]?key)/i;
3
+ const SENSITIVE_ASSIGNMENT = /((?:authorization|password|passwd|token|secret|credential|private[_-]?key|api[_-]?key)[a-z0-9_-]*[\\"']*\s*[=:]\s*(?:bearer\s+)?)[^\r\n]*/ig;
4
+ export function isSensitiveField(name) {
5
+ return SENSITIVE_FIELD.test(name);
6
+ }
7
+ export function redactSensitiveText(value) {
8
+ return value.replace(SENSITIVE_ASSIGNMENT, '$1[redacted]');
9
+ }
10
+ function redactStructured(value, key = '', depth = 0) {
11
+ if (depth > 64)
12
+ throw new RefusalError('structured diagnostic exceeds the nesting limit');
13
+ if (isSensitiveField(key))
14
+ return '[redacted]';
15
+ if (Array.isArray(value))
16
+ return value.map(item => redactStructured(item, '', depth + 1));
17
+ if (value !== null && typeof value === 'object')
18
+ return Object.fromEntries(Object.entries(value)
19
+ .map(([name, child]) => [name, redactStructured(child, name, depth + 1)]));
20
+ return typeof value === 'string' ? redactSensitiveText(value) : value;
21
+ }
22
+ export function redactSensitiveMessage(message) {
23
+ let parsed;
24
+ try {
25
+ parsed = JSON.parse(message);
26
+ }
27
+ catch { // A message that is not JSON is plain text, redacted below.
28
+ if (/[\r\n]/.test(message)) {
29
+ const lines = message.split(/(\r?\n|\r)/).map((line, index) => index % 2 ? line : redactSensitiveMessage(line));
30
+ return lines.some(line => line === undefined) ? undefined : lines.join('');
31
+ }
32
+ // A partial sensitive object cannot be redacted safely one header at a time.
33
+ for (const match of message.matchAll(SENSITIVE_ASSIGNMENT)) {
34
+ const value = match[0].slice(match[1].length).trimStart();
35
+ if (!value || value.startsWith('{') || value.startsWith('['))
36
+ return undefined;
37
+ }
38
+ return redactSensitiveText(message);
39
+ }
40
+ if (typeof parsed === 'string')
41
+ return redactSensitiveText(parsed);
42
+ try {
43
+ return JSON.stringify(redactStructured(parsed));
44
+ }
45
+ catch {
46
+ return undefined;
47
+ } // Fails closed: a structure that cannot be redacted is withheld, and its error text could quote the secret.
48
+ }
@@ -0,0 +1,53 @@
1
+ import type { SurfaceTarget } from '../surfaces/contract.js';
2
+ import { type EnvironmentDiagnostic } from './contract.js';
3
+ export declare function inside(path: string, root: string): boolean;
4
+ /**
5
+ * The directory the OpenCode grant file names: the served checkout when it lies outside the
6
+ * declared one, which the grant would not otherwise reach.
7
+ */
8
+ export declare function openCodeGrantDirectory(declared: string, served: string | undefined): string;
9
+ /** Why a directory cannot go into an OpenCode access pattern, or undefined when it can. */
10
+ export declare function openCodePatternUnsafe(directory: string): string | undefined;
11
+ export interface AgentGrantPlan {
12
+ readonly settings: Readonly<{
13
+ bytes: string | null;
14
+ }> | undefined;
15
+ readonly local: readonly Readonly<{
16
+ name: string;
17
+ bytes: string;
18
+ }>[];
19
+ /** What the tools can reach, for a served checkout outside the declared one. */
20
+ readonly lines: readonly string[];
21
+ readonly report: Readonly<{
22
+ granted: readonly SurfaceTarget[];
23
+ ungranted: readonly SurfaceTarget[];
24
+ }> | undefined;
25
+ }
26
+ type Planned = Readonly<{
27
+ kind: 'complete';
28
+ plan: AgentGrantPlan;
29
+ }> | Readonly<{
30
+ kind: 'refusal';
31
+ diagnostic: EnvironmentDiagnostic;
32
+ }>;
33
+ /**
34
+ * Plans the machine-local grants for one sibling. `served` is the checkout that serves it, or
35
+ * undefined when the sibling is no longer declared; `targets` are the listed tools that hold a
36
+ * committed grant for it. A grant cockpit added earlier for the sibling is taken back when the
37
+ * served checkout no longer needs it.
38
+ */
39
+ export declare function planAgentGrants(input: Readonly<{
40
+ root: string;
41
+ slug: string;
42
+ declared: string | undefined;
43
+ served: string | undefined;
44
+ targets: readonly SurfaceTarget[];
45
+ }>): Promise<Planned>;
46
+ /** Writes a plan: cockpit's own record first, so a grant it added is never one it forgets. */
47
+ export declare function applyAgentGrants(root: string, plan: AgentGrantPlan): Promise<Readonly<{
48
+ kind: 'complete';
49
+ } | {
50
+ kind: 'refusal';
51
+ diagnostic: EnvironmentDiagnostic;
52
+ }>>;
53
+ export {};
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Grants the agent tools a sibling checkout `use` serves from outside the declared one. The grants
3
+ * `sync` writes are committed and name the declared checkout, the same in every clone; a worktree
4
+ * path is one person's disk, so it goes only where a tool reads a machine-local setting.
5
+ *
6
+ * Measured on 2026-11-04 beside an ungranted control directory, each run writing into both:
7
+ * - Claude Code 2.1.318 (`claude -p --permission-mode acceptEdits`): a directory listed in
8
+ * `.claude/settings.local.json` `permissions.additionalDirectories` was written and the control
9
+ * refused; a twin whose list was a string was named as not loaded and granted nothing. The run
10
+ * was in an untrusted workspace, where Claude ignored the committed `.claude/settings.json` list,
11
+ * so whether the two lists combine once a person trusts the workspace was not measured.
12
+ * - OpenCode 1.19.5 (`opencode run`): the `{file:...}` grant file `sync` writes, holding the
13
+ * worktree path, allowed the write and the control was denied; a pattern naming a missing grant
14
+ * file stopped OpenCode at start, naming the file.
15
+ * - Codex 0.166.0 (`codex exec`): no project file Codex reads is machine-local. Its project
16
+ * `.codex/config.toml` is committed and its only per-project user setting is the trust level;
17
+ * `--add-dir <dir>` at start made the worktree writable beside the committed roots, and without
18
+ * it the same write was refused.
19
+ * Cursor and Grok Build were not installed, so nothing is written for them.
20
+ */
21
+ import { lstat, mkdir, rename, rm, writeFile } from 'node:fs/promises';
22
+ import { basename, join, sep } from 'node:path';
23
+ import { readBoundedFile } from '../bounded-read.js';
24
+ import { GUARD_LOCAL_PATHS, writeCockpitLocalFiles } from '../guards/local-identity.js';
25
+ import { ENVIRONMENT_CODES, errorCause, isMissing, tryParseJson } from './contract.js';
26
+ import { openCodeGrantFile } from './generated-application/surface-outputs.js';
27
+ const CLAUDE_LOCAL_SETTINGS = '.claude/settings.local.json';
28
+ // What cockpit put in Claude's local settings, so a person's own entries are never taken back.
29
+ const ADDED_NAME = 'claude-local-grants';
30
+ const ADDED_PATH = `${GUARD_LOCAL_PATHS.directory}/${ADDED_NAME}`;
31
+ const ADDED_FORMAT = 'cockpit-claude-local-grants/v1';
32
+ const SETTINGS_MAX_BYTES = 1_048_576;
33
+ export function inside(path, root) {
34
+ return path === root || path.startsWith(`${root}${sep}`);
35
+ }
36
+ /**
37
+ * The directory the OpenCode grant file names: the served checkout when it lies outside the
38
+ * declared one, which the grant would not otherwise reach.
39
+ */
40
+ export function openCodeGrantDirectory(declared, served) {
41
+ return served !== undefined && !inside(served, declared) ? served : declared;
42
+ }
43
+ /** Why a directory cannot go into an OpenCode access pattern, or undefined when it can. */
44
+ export function openCodePatternUnsafe(directory) {
45
+ // The file's bytes become part of an OpenCode pattern: a wildcard would widen the grant and a
46
+ // quote or backslash would change the JSON around it.
47
+ return /[*?"\\\x00-\x1f\x7f]/.test(directory)
48
+ ? `${directory} contains *, ?, a quote, a backslash or a control character, which OpenCode would read as part of its access pattern`
49
+ : undefined;
50
+ }
51
+ const HARNESS_NAMES = { codexcli: 'Codex', cursor: 'Cursor', grokcli: 'Grok Build' };
52
+ function grantRefusal(message, target, fix) {
53
+ return { kind: 'refusal', diagnostic: { severity: 'error', code: ENVIRONMENT_CODES.SIBLING_CHECKOUT_RECORD_INVALID, message, target, fix } };
54
+ }
55
+ function plainObject(value) {
56
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
57
+ }
58
+ /** The JSON text of a local file, or undefined when there is none; a link or unreadable file is a reason. */
59
+ function readLocalJson(path) {
60
+ try {
61
+ const read = readBoundedFile(path, SETTINGS_MAX_BYTES);
62
+ if (read.kind === 'too-large')
63
+ return { reason: `it is larger than ${SETTINGS_MAX_BYTES} bytes` };
64
+ const bytes = read.bytes.toString('utf8');
65
+ return { value: tryParseJson(bytes), bytes };
66
+ }
67
+ catch (error) {
68
+ if (isMissing(error))
69
+ return undefined;
70
+ return { reason: `it could not be read as a plain file: ${errorCause(error)}` };
71
+ }
72
+ }
73
+ /**
74
+ * Plans the machine-local grants for one sibling. `served` is the checkout that serves it, or
75
+ * undefined when the sibling is no longer declared; `targets` are the listed tools that hold a
76
+ * committed grant for it. A grant cockpit added earlier for the sibling is taken back when the
77
+ * served checkout no longer needs it.
78
+ */
79
+ export async function planAgentGrants(input) {
80
+ const outside = input.declared !== undefined && input.served !== undefined && !inside(input.served, input.declared) ? input.served : undefined;
81
+ const addedPath = join(input.root, ADDED_PATH);
82
+ const recorded = readLocalJson(addedPath);
83
+ const addedFix = `delete ${addedPath}, remove the additionalDirectories entries cockpit added from ${CLAUDE_LOCAL_SETTINGS}, then run this command again`;
84
+ if (recorded && 'reason' in recorded)
85
+ return grantRefusal(`${addedPath} could not be read: ${recorded.reason}`, ADDED_PATH, addedFix);
86
+ const record = recorded?.value;
87
+ if (recorded && !(plainObject(record) && record.format === ADDED_FORMAT && plainObject(record.directories)
88
+ && Object.values(record.directories).every(directory => typeof directory === 'string'))) {
89
+ return grantRefusal(`${addedPath} is not a record cockpit wrote (it does not carry the ${ADDED_FORMAT} format)`, ADDED_PATH, addedFix);
90
+ }
91
+ const added = { ...(plainObject(record) ? record.directories : {}) };
92
+ const previous = Object.hasOwn(added, input.slug) ? added[input.slug] : undefined;
93
+ delete added[input.slug];
94
+ const wantClaude = outside !== undefined && input.targets.includes('claudecode') ? outside : undefined;
95
+ let settings;
96
+ if (previous !== undefined || wantClaude !== undefined) {
97
+ const settingsPath = join(input.root, CLAUDE_LOCAL_SETTINGS);
98
+ const settingsFix = `make ${settingsPath} a JSON object whose permissions.additionalDirectories is a list of paths, or remove it, then run this command again`;
99
+ const current = readLocalJson(settingsPath);
100
+ if (current && 'reason' in current)
101
+ return grantRefusal(`${settingsPath} could not be read: ${current.reason}`, CLAUDE_LOCAL_SETTINGS, settingsFix);
102
+ const object = current === undefined ? {} : current.value;
103
+ const permissions = plainObject(object) ? object.permissions ?? {} : undefined;
104
+ const listed = plainObject(permissions) ? permissions.additionalDirectories ?? [] : undefined;
105
+ // Claude Code drops a whole settings file it cannot load, so cockpit never rewrites one it cannot read either.
106
+ if (!plainObject(object) || !plainObject(permissions) || !Array.isArray(listed) || !listed.every(entry => typeof entry === 'string')) {
107
+ return grantRefusal(`${settingsPath} is not a Claude Code settings object cockpit can add a directory to`, CLAUDE_LOCAL_SETTINGS, settingsFix);
108
+ }
109
+ let directories = listed;
110
+ if (previous !== undefined && previous !== wantClaude && !Object.values(added).includes(previous)) {
111
+ directories = directories.filter(directory => directory !== previous);
112
+ }
113
+ if (wantClaude !== undefined) {
114
+ // A directory the person listed themselves stays theirs: cockpit neither records nor removes it.
115
+ if (previous === wantClaude || !directories.includes(wantClaude))
116
+ added[input.slug] = wantClaude;
117
+ if (!directories.includes(wantClaude))
118
+ directories = [...directories, wantClaude];
119
+ }
120
+ if (directories.length !== listed.length || directories.some((directory, index) => directory !== listed[index])) {
121
+ const { additionalDirectories: _replaced, ...otherPermissions } = permissions;
122
+ const nextPermissions = directories.length > 0 ? { ...otherPermissions, additionalDirectories: directories } : otherPermissions;
123
+ const { permissions: _permissions, ...otherSettings } = object;
124
+ const next = Object.keys(nextPermissions).length > 0 ? { ...otherSettings, permissions: nextPermissions } : otherSettings;
125
+ settings = { bytes: Object.keys(next).length > 0 ? `${JSON.stringify(next, null, 2)}\n` : null };
126
+ }
127
+ }
128
+ const local = [];
129
+ if (previous !== added[input.slug])
130
+ local.push({ name: ADDED_NAME, bytes: `${JSON.stringify({ format: ADDED_FORMAT, directories: added })}\n` });
131
+ if (input.declared !== undefined && input.targets.includes('opencode')) {
132
+ const directory = openCodeGrantDirectory(input.declared, input.served);
133
+ const unsafe = openCodePatternUnsafe(directory);
134
+ if (unsafe)
135
+ return grantRefusal(`OpenCode cannot be granted the checkout: ${unsafe}`, directory, 'move the checkout to a plain path, then run this command again');
136
+ local.push({ name: basename(openCodeGrantFile(input.slug)), bytes: directory });
137
+ }
138
+ if (outside === undefined)
139
+ return { kind: 'complete', plan: { settings, local, lines: [], report: undefined } };
140
+ const granted = input.targets.filter(target => target === 'claudecode' || target === 'opencode');
141
+ const ungranted = input.targets.filter(target => target !== 'claudecode' && target !== 'opencode');
142
+ const lines = [
143
+ ...granted.map(target => `${target === 'claudecode' ? 'Claude Code' : 'OpenCode'} may edit ${outside} through ${target === 'claudecode' ? CLAUDE_LOCAL_SETTINGS : openCodeGrantFile(input.slug)}, which only this machine reads; restart a session that is already running.`),
144
+ ...ungranted.map(target => target === 'codexcli'
145
+ ? `Codex has no machine-local setting for extra writable roots, so its sandbox still reaches only ${input.declared}; start Codex with --add-dir ${outside}.`
146
+ : `${HARNESS_NAMES[target] ?? target} was not measured for a machine-local grant, so its grant still names only ${input.declared} and it may ask before editing ${outside}.`),
147
+ ];
148
+ return { kind: 'complete', plan: { settings, local, lines, report: { granted, ungranted } } };
149
+ }
150
+ /** Writes a plan: cockpit's own record first, so a grant it added is never one it forgets. */
151
+ export async function applyAgentGrants(root, plan) {
152
+ if (plan.local.length > 0) {
153
+ const written = await writeCockpitLocalFiles(root, plan.local);
154
+ if (written.kind !== 'complete')
155
+ return grantRefusal(`the agent tools' machine-local grants could not be written: ${written.message}`, GUARD_LOCAL_PATHS.directory, 'make .cockpit/local a plain directory you can write, then run this command again');
156
+ }
157
+ if (plan.settings === undefined)
158
+ return { kind: 'complete' };
159
+ const path = join(root, CLAUDE_LOCAL_SETTINGS);
160
+ try {
161
+ if (plan.settings.bytes === null) {
162
+ await rm(path);
163
+ return { kind: 'complete' };
164
+ }
165
+ const directory = join(root, '.claude');
166
+ await mkdir(directory, { recursive: true });
167
+ if ((await lstat(directory)).isSymbolicLink())
168
+ throw new Error(`${directory} is a symbolic link`);
169
+ const temporary = join(directory, `.settings.local.json.${process.pid}.tmp`);
170
+ try {
171
+ await writeFile(temporary, plan.settings.bytes, { flag: 'wx' });
172
+ await rename(temporary, path);
173
+ }
174
+ finally {
175
+ await rm(temporary, { force: true });
176
+ }
177
+ return { kind: 'complete' };
178
+ }
179
+ catch (error) {
180
+ return grantRefusal(`${path} could not be written: ${errorCause(error)}`, CLAUDE_LOCAL_SETTINGS, 'make .claude a plain directory you can write, then run this command again');
181
+ }
182
+ }
@@ -0,0 +1,62 @@
1
+ import { ENVIRONMENT_CODES, type CheckoutId, type CockpitId, type SourceProvenance } from './contract.js';
2
+ import type { SetupObservation } from './setup.js';
3
+ import { type ResolvedExecutable } from './executable.js';
4
+ declare const OWNER = "setup-observation";
5
+ type SynchronousResult<T> = T extends PromiseLike<unknown> ? never : T;
6
+ export type EnvironmentIgnoreRefusal = Readonly<{
7
+ kind: 'refusal';
8
+ code: typeof ENVIRONMENT_CODES.INSTANCE_NOT_IGNORED | typeof ENVIRONMENT_CODES.TEMPLATE_NOT_TRACKED | typeof ENVIRONMENT_CODES.TEMPLATE_IGNORED;
9
+ path: string;
10
+ }>;
11
+ export declare function observeEnvironmentIgnore<T>(value: unknown, use: () => SynchronousResult<T>): Promise<SynchronousResult<T> | EnvironmentIgnoreRefusal | undefined>;
12
+ export type SetupCheckoutObservation = Readonly<{
13
+ state: 'available';
14
+ producer: typeof OWNER;
15
+ observedAt: string;
16
+ validThrough: string;
17
+ }> | Readonly<{
18
+ state: 'failed';
19
+ producer: typeof OWNER;
20
+ code: typeof ENVIRONMENT_CODES.SETUP_PATH_TYPE_INVALID;
21
+ reason: string;
22
+ }>;
23
+ export interface ConsumedSetupCheckoutObservation {
24
+ readonly source: SourceProvenance;
25
+ readonly cockpitName: string;
26
+ readonly currentCheckoutPath: string;
27
+ readonly mainCheckoutPath: string;
28
+ readonly cockpitId: CockpitId;
29
+ readonly checkoutId: CheckoutId;
30
+ readonly observedAt: string;
31
+ readonly validThrough: string;
32
+ }
33
+ declare const setupCheckoutProjectionBrand: unique symbol;
34
+ export interface SetupCheckoutProjection {
35
+ readonly [setupCheckoutProjectionBrand]: true;
36
+ }
37
+ export interface SetupCheckoutObservationContext {
38
+ readonly source: SourceProvenance;
39
+ readonly cockpitName: string;
40
+ readonly evaluatedAt: number;
41
+ }
42
+ export declare function observeSetupCheckout(input: unknown): Promise<SetupCheckoutObservation>;
43
+ export declare function withSetupCheckoutProjection<T>(observation: unknown, expected: SetupCheckoutObservationContext, use: (projection: SetupCheckoutProjection) => SynchronousResult<T>): Promise<SynchronousResult<T> | undefined>;
44
+ export declare function consumeSetupCheckoutProjection(projection: SetupCheckoutProjection): ConsumedSetupCheckoutObservation | undefined;
45
+ export interface GeneratedCheckoutIdentity {
46
+ readonly state: 'available';
47
+ readonly kind: 'checkout' | 'standalone';
48
+ readonly cockpitId: CockpitId;
49
+ readonly checkoutId: CheckoutId;
50
+ readonly currentCheckoutPath: string;
51
+ readonly mainCheckoutPath: string;
52
+ }
53
+ export declare function observeGeneratedCheckoutIdentity(input: {
54
+ readonly source: SourceProvenance;
55
+ readonly cockpitName: string;
56
+ readonly env: Readonly<Record<string, string | undefined>>;
57
+ }): Promise<GeneratedCheckoutIdentity | Extract<SetupCheckoutObservation, {
58
+ state: 'failed';
59
+ }>>;
60
+ export declare function revalidateGeneratedCheckoutIdentity(identity: GeneratedCheckoutIdentity): Promise<boolean>;
61
+ export declare function observeSetupPath(target: string, siblingsRoot: string, env: Readonly<Record<string, string>>, gitExecutable: ResolvedExecutable): Promise<SetupObservation>;
62
+ export {};