@openagentsy/hooks 0.0.0-stage → 0.2.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 (307) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +32 -2
  3. package/dist/accountability.d.ts +29 -0
  4. package/dist/accountability.d.ts.map +1 -0
  5. package/dist/accountability.js +21 -0
  6. package/dist/accountability.js.map +1 -0
  7. package/dist/accountability.test.d.ts +2 -0
  8. package/dist/accountability.test.d.ts.map +1 -0
  9. package/dist/accountability.test.js +42 -0
  10. package/dist/accountability.test.js.map +1 -0
  11. package/dist/approvals.d.ts +110 -0
  12. package/dist/approvals.d.ts.map +1 -0
  13. package/dist/approvals.js +464 -0
  14. package/dist/approvals.js.map +1 -0
  15. package/dist/approvals.test.d.ts +2 -0
  16. package/dist/approvals.test.d.ts.map +1 -0
  17. package/dist/approvals.test.js +307 -0
  18. package/dist/approvals.test.js.map +1 -0
  19. package/dist/base-tool.d.ts +26 -0
  20. package/dist/base-tool.d.ts.map +1 -0
  21. package/dist/base-tool.js +37 -0
  22. package/dist/base-tool.js.map +1 -0
  23. package/dist/base-tool.test.d.ts +2 -0
  24. package/dist/base-tool.test.d.ts.map +1 -0
  25. package/dist/base-tool.test.js +34 -0
  26. package/dist/base-tool.test.js.map +1 -0
  27. package/dist/eval/index.d.ts +3 -0
  28. package/dist/eval/index.d.ts.map +1 -0
  29. package/dist/eval/index.js +3 -0
  30. package/dist/eval/index.js.map +1 -0
  31. package/dist/eval/runner.d.ts +179 -0
  32. package/dist/eval/runner.d.ts.map +1 -0
  33. package/dist/eval/runner.js +616 -0
  34. package/dist/eval/runner.js.map +1 -0
  35. package/dist/eval/runner.test.d.ts +2 -0
  36. package/dist/eval/runner.test.d.ts.map +1 -0
  37. package/dist/eval/runner.test.js +431 -0
  38. package/dist/eval/runner.test.js.map +1 -0
  39. package/dist/eval/types.d.ts +173 -0
  40. package/dist/eval/types.d.ts.map +1 -0
  41. package/dist/eval/types.js +104 -0
  42. package/dist/eval/types.js.map +1 -0
  43. package/dist/event.d.ts +59 -0
  44. package/dist/event.d.ts.map +1 -0
  45. package/dist/event.js +178 -0
  46. package/dist/event.js.map +1 -0
  47. package/dist/event.test.d.ts +2 -0
  48. package/dist/event.test.d.ts.map +1 -0
  49. package/dist/event.test.js +49 -0
  50. package/dist/event.test.js.map +1 -0
  51. package/dist/index.d.ts +30 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +29 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/lessons/capture.d.ts +66 -0
  56. package/dist/lessons/capture.d.ts.map +1 -0
  57. package/dist/lessons/capture.js +166 -0
  58. package/dist/lessons/capture.js.map +1 -0
  59. package/dist/lessons/capture.test.d.ts +2 -0
  60. package/dist/lessons/capture.test.d.ts.map +1 -0
  61. package/dist/lessons/capture.test.js +200 -0
  62. package/dist/lessons/capture.test.js.map +1 -0
  63. package/dist/lessons/decide.d.ts +90 -0
  64. package/dist/lessons/decide.d.ts.map +1 -0
  65. package/dist/lessons/decide.js +334 -0
  66. package/dist/lessons/decide.js.map +1 -0
  67. package/dist/lessons/decide.test.d.ts +2 -0
  68. package/dist/lessons/decide.test.d.ts.map +1 -0
  69. package/dist/lessons/decide.test.js +527 -0
  70. package/dist/lessons/decide.test.js.map +1 -0
  71. package/dist/lessons/id.d.ts +5 -0
  72. package/dist/lessons/id.d.ts.map +1 -0
  73. package/dist/lessons/id.js +20 -0
  74. package/dist/lessons/id.js.map +1 -0
  75. package/dist/lessons/index.d.ts +5 -0
  76. package/dist/lessons/index.d.ts.map +1 -0
  77. package/dist/lessons/index.js +5 -0
  78. package/dist/lessons/index.js.map +1 -0
  79. package/dist/lessons/model.d.ts +163 -0
  80. package/dist/lessons/model.d.ts.map +1 -0
  81. package/dist/lessons/model.js +181 -0
  82. package/dist/lessons/model.js.map +1 -0
  83. package/dist/lessons/model.test.d.ts +2 -0
  84. package/dist/lessons/model.test.d.ts.map +1 -0
  85. package/dist/lessons/model.test.js +178 -0
  86. package/dist/lessons/model.test.js.map +1 -0
  87. package/dist/lessons/permissions.test.d.ts +2 -0
  88. package/dist/lessons/permissions.test.d.ts.map +1 -0
  89. package/dist/lessons/permissions.test.js +88 -0
  90. package/dist/lessons/permissions.test.js.map +1 -0
  91. package/dist/lessons/store.d.ts +74 -0
  92. package/dist/lessons/store.d.ts.map +1 -0
  93. package/dist/lessons/store.js +231 -0
  94. package/dist/lessons/store.js.map +1 -0
  95. package/dist/output-checks.d.ts +64 -0
  96. package/dist/output-checks.d.ts.map +1 -0
  97. package/dist/output-checks.js +248 -0
  98. package/dist/output-checks.js.map +1 -0
  99. package/dist/output-checks.test.d.ts +2 -0
  100. package/dist/output-checks.test.d.ts.map +1 -0
  101. package/dist/output-checks.test.js +58 -0
  102. package/dist/output-checks.test.js.map +1 -0
  103. package/dist/paths.d.ts +37 -0
  104. package/dist/paths.d.ts.map +1 -0
  105. package/dist/paths.js +70 -0
  106. package/dist/paths.js.map +1 -0
  107. package/dist/paths.test.d.ts +2 -0
  108. package/dist/paths.test.d.ts.map +1 -0
  109. package/dist/paths.test.js +36 -0
  110. package/dist/paths.test.js.map +1 -0
  111. package/dist/policies/agi-framing.d.ts +12 -0
  112. package/dist/policies/agi-framing.d.ts.map +1 -0
  113. package/dist/policies/agi-framing.js +33 -0
  114. package/dist/policies/agi-framing.js.map +1 -0
  115. package/dist/policies/anti-anthropomorphism.d.ts +13 -0
  116. package/dist/policies/anti-anthropomorphism.d.ts.map +1 -0
  117. package/dist/policies/anti-anthropomorphism.js +34 -0
  118. package/dist/policies/anti-anthropomorphism.js.map +1 -0
  119. package/dist/policies/anti-dependence.d.ts +12 -0
  120. package/dist/policies/anti-dependence.d.ts.map +1 -0
  121. package/dist/policies/anti-dependence.js +33 -0
  122. package/dist/policies/anti-dependence.js.map +1 -0
  123. package/dist/policies/anti-sycophancy.d.ts +13 -0
  124. package/dist/policies/anti-sycophancy.d.ts.map +1 -0
  125. package/dist/policies/anti-sycophancy.js +34 -0
  126. package/dist/policies/anti-sycophancy.js.map +1 -0
  127. package/dist/policies/dark-pattern.d.ts +14 -0
  128. package/dist/policies/dark-pattern.d.ts.map +1 -0
  129. package/dist/policies/dark-pattern.js +44 -0
  130. package/dist/policies/dark-pattern.js.map +1 -0
  131. package/dist/policies/destructive-needs-approval.d.ts +14 -0
  132. package/dist/policies/destructive-needs-approval.d.ts.map +1 -0
  133. package/dist/policies/destructive-needs-approval.js +31 -0
  134. package/dist/policies/destructive-needs-approval.js.map +1 -0
  135. package/dist/policies/discovery.d.ts +12 -0
  136. package/dist/policies/discovery.d.ts.map +1 -0
  137. package/dist/policies/discovery.js +130 -0
  138. package/dist/policies/discovery.js.map +1 -0
  139. package/dist/policies/high-risk.d.ts +25 -0
  140. package/dist/policies/high-risk.d.ts.map +1 -0
  141. package/dist/policies/high-risk.js +105 -0
  142. package/dist/policies/high-risk.js.map +1 -0
  143. package/dist/policies/human-only-decisions.d.ts +14 -0
  144. package/dist/policies/human-only-decisions.d.ts.map +1 -0
  145. package/dist/policies/human-only-decisions.js +33 -0
  146. package/dist/policies/human-only-decisions.js.map +1 -0
  147. package/dist/policies/index.d.ts +29 -0
  148. package/dist/policies/index.d.ts.map +1 -0
  149. package/dist/policies/index.js +82 -0
  150. package/dist/policies/index.js.map +1 -0
  151. package/dist/policies/no-skip-git-hooks.d.ts +14 -0
  152. package/dist/policies/no-skip-git-hooks.d.ts.map +1 -0
  153. package/dist/policies/no-skip-git-hooks.js +31 -0
  154. package/dist/policies/no-skip-git-hooks.js.map +1 -0
  155. package/dist/policies/package-manager.d.ts +12 -0
  156. package/dist/policies/package-manager.d.ts.map +1 -0
  157. package/dist/policies/package-manager.js +29 -0
  158. package/dist/policies/package-manager.js.map +1 -0
  159. package/dist/policies/patterns.d.ts +17 -0
  160. package/dist/policies/patterns.d.ts.map +1 -0
  161. package/dist/policies/patterns.js +30 -0
  162. package/dist/policies/patterns.js.map +1 -0
  163. package/dist/policies/policies.test.d.ts +2 -0
  164. package/dist/policies/policies.test.d.ts.map +1 -0
  165. package/dist/policies/policies.test.js +210 -0
  166. package/dist/policies/policies.test.js.map +1 -0
  167. package/dist/policies/privacy-transparency.d.ts +14 -0
  168. package/dist/policies/privacy-transparency.d.ts.map +1 -0
  169. package/dist/policies/privacy-transparency.js +50 -0
  170. package/dist/policies/privacy-transparency.js.map +1 -0
  171. package/dist/policies/professional-displacement.d.ts +15 -0
  172. package/dist/policies/professional-displacement.d.ts.map +1 -0
  173. package/dist/policies/professional-displacement.js +45 -0
  174. package/dist/policies/professional-displacement.js.map +1 -0
  175. package/dist/policies/protect-policy.d.ts +14 -0
  176. package/dist/policies/protect-policy.d.ts.map +1 -0
  177. package/dist/policies/protect-policy.js +35 -0
  178. package/dist/policies/protect-policy.js.map +1 -0
  179. package/dist/policies/scope-enforcement.d.ts +14 -0
  180. package/dist/policies/scope-enforcement.d.ts.map +1 -0
  181. package/dist/policies/scope-enforcement.js +34 -0
  182. package/dist/policies/scope-enforcement.js.map +1 -0
  183. package/dist/policies/secret-scan-writes.d.ts +13 -0
  184. package/dist/policies/secret-scan-writes.d.ts.map +1 -0
  185. package/dist/policies/secret-scan-writes.js +38 -0
  186. package/dist/policies/secret-scan-writes.js.map +1 -0
  187. package/dist/policies/selection.d.ts +20 -0
  188. package/dist/policies/selection.d.ts.map +1 -0
  189. package/dist/policies/selection.js +93 -0
  190. package/dist/policies/selection.js.map +1 -0
  191. package/dist/policies/structural-bias.d.ts +14 -0
  192. package/dist/policies/structural-bias.d.ts.map +1 -0
  193. package/dist/policies/structural-bias.js +41 -0
  194. package/dist/policies/structural-bias.js.map +1 -0
  195. package/dist/policies/third-party-impact.d.ts +13 -0
  196. package/dist/policies/third-party-impact.d.ts.map +1 -0
  197. package/dist/policies/third-party-impact.js +38 -0
  198. package/dist/policies/third-party-impact.js.map +1 -0
  199. package/dist/policies/tool-call.d.ts +38 -0
  200. package/dist/policies/tool-call.d.ts.map +1 -0
  201. package/dist/policies/tool-call.js +53 -0
  202. package/dist/policies/tool-call.js.map +1 -0
  203. package/dist/policies/truthfulness-uncertainty.d.ts +13 -0
  204. package/dist/policies/truthfulness-uncertainty.d.ts.map +1 -0
  205. package/dist/policies/truthfulness-uncertainty.js +45 -0
  206. package/dist/policies/truthfulness-uncertainty.js.map +1 -0
  207. package/dist/policies/workspace-writes-only.d.ts +25 -0
  208. package/dist/policies/workspace-writes-only.d.ts.map +1 -0
  209. package/dist/policies/workspace-writes-only.js +54 -0
  210. package/dist/policies/workspace-writes-only.js.map +1 -0
  211. package/dist/policy-engine.d.ts +69 -0
  212. package/dist/policy-engine.d.ts.map +1 -0
  213. package/dist/policy-engine.js +145 -0
  214. package/dist/policy-engine.js.map +1 -0
  215. package/dist/policy-registry.d.ts +62 -0
  216. package/dist/policy-registry.d.ts.map +1 -0
  217. package/dist/policy-registry.js +63 -0
  218. package/dist/policy-registry.js.map +1 -0
  219. package/dist/policy-registry.test.d.ts +2 -0
  220. package/dist/policy-registry.test.d.ts.map +1 -0
  221. package/dist/policy-registry.test.js +79 -0
  222. package/dist/policy-registry.test.js.map +1 -0
  223. package/dist/policy-release.d.ts +44 -0
  224. package/dist/policy-release.d.ts.map +1 -0
  225. package/dist/policy-release.js +65 -0
  226. package/dist/policy-release.js.map +1 -0
  227. package/dist/policy.d.ts +141 -0
  228. package/dist/policy.d.ts.map +1 -0
  229. package/dist/policy.js +22 -0
  230. package/dist/policy.js.map +1 -0
  231. package/dist/quality/audit.d.ts +56 -0
  232. package/dist/quality/audit.d.ts.map +1 -0
  233. package/dist/quality/audit.js +52 -0
  234. package/dist/quality/audit.js.map +1 -0
  235. package/dist/quality/findings.d.ts +34 -0
  236. package/dist/quality/findings.d.ts.map +1 -0
  237. package/dist/quality/findings.js +121 -0
  238. package/dist/quality/findings.js.map +1 -0
  239. package/dist/quality/findings.test.d.ts +2 -0
  240. package/dist/quality/findings.test.d.ts.map +1 -0
  241. package/dist/quality/findings.test.js +79 -0
  242. package/dist/quality/findings.test.js.map +1 -0
  243. package/dist/quality/index.d.ts +20 -0
  244. package/dist/quality/index.d.ts.map +1 -0
  245. package/dist/quality/index.js +20 -0
  246. package/dist/quality/index.js.map +1 -0
  247. package/dist/quality/rule.d.ts +43 -0
  248. package/dist/quality/rule.d.ts.map +1 -0
  249. package/dist/quality/rule.js +162 -0
  250. package/dist/quality/rule.js.map +1 -0
  251. package/dist/quality/rule.test.d.ts +2 -0
  252. package/dist/quality/rule.test.d.ts.map +1 -0
  253. package/dist/quality/rule.test.js +187 -0
  254. package/dist/quality/rule.test.js.map +1 -0
  255. package/dist/quality/tools.d.ts +30 -0
  256. package/dist/quality/tools.d.ts.map +1 -0
  257. package/dist/quality/tools.js +33 -0
  258. package/dist/quality/tools.js.map +1 -0
  259. package/dist/quality/tools.test.d.ts +2 -0
  260. package/dist/quality/tools.test.d.ts.map +1 -0
  261. package/dist/quality/tools.test.js +41 -0
  262. package/dist/quality/tools.test.js.map +1 -0
  263. package/dist/quality/waive.d.ts +37 -0
  264. package/dist/quality/waive.d.ts.map +1 -0
  265. package/dist/quality/waive.js +39 -0
  266. package/dist/quality/waive.js.map +1 -0
  267. package/dist/quality/waivers.d.ts +63 -0
  268. package/dist/quality/waivers.d.ts.map +1 -0
  269. package/dist/quality/waivers.js +132 -0
  270. package/dist/quality/waivers.js.map +1 -0
  271. package/dist/quality/waivers.test.d.ts +2 -0
  272. package/dist/quality/waivers.test.d.ts.map +1 -0
  273. package/dist/quality/waivers.test.js +138 -0
  274. package/dist/quality/waivers.test.js.map +1 -0
  275. package/dist/registry.d.ts +86 -0
  276. package/dist/registry.d.ts.map +1 -0
  277. package/dist/registry.js +92 -0
  278. package/dist/registry.js.map +1 -0
  279. package/dist/registry.test.d.ts +2 -0
  280. package/dist/registry.test.d.ts.map +1 -0
  281. package/dist/registry.test.js +117 -0
  282. package/dist/registry.test.js.map +1 -0
  283. package/dist/rules.d.ts +107 -0
  284. package/dist/rules.d.ts.map +1 -0
  285. package/dist/rules.js +632 -0
  286. package/dist/rules.js.map +1 -0
  287. package/dist/rules.test.d.ts +2 -0
  288. package/dist/rules.test.d.ts.map +1 -0
  289. package/dist/rules.test.js +488 -0
  290. package/dist/rules.test.js.map +1 -0
  291. package/dist/secrets.d.ts +17 -0
  292. package/dist/secrets.d.ts.map +1 -0
  293. package/dist/secrets.js +17 -0
  294. package/dist/secrets.js.map +1 -0
  295. package/dist/secrets.test.d.ts +2 -0
  296. package/dist/secrets.test.d.ts.map +1 -0
  297. package/dist/secrets.test.js +20 -0
  298. package/dist/secrets.test.js.map +1 -0
  299. package/dist/shell-env.d.ts +23 -0
  300. package/dist/shell-env.d.ts.map +1 -0
  301. package/dist/shell-env.js +34 -0
  302. package/dist/shell-env.js.map +1 -0
  303. package/dist/shell-env.test.d.ts +2 -0
  304. package/dist/shell-env.test.d.ts.map +1 -0
  305. package/dist/shell-env.test.js +45 -0
  306. package/dist/shell-env.test.js.map +1 -0
  307. package/package.json +49 -4
@@ -0,0 +1,488 @@
1
+ import { mkdir, mkdtemp } from 'node:fs/promises';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { beforeEach, describe, expect, it } from 'vitest';
5
+ import { createApprovalStore } from './approvals.js';
6
+ import { defaultRules, isProtected } from './rules.js';
7
+ // The fixture is assembled from segments on purpose: the value is the real
8
+ // shape the rule pins, and the source carries no contiguous secret for a
9
+ // scanner to flag. It is not a credential.
10
+ const SECRET_VALUE = ['aB3dF6hJ', '9kM2nP5rT', '8vW1xZ4cE', '7gH0'].join('');
11
+ const SECRET_CONTENT = `api_key = ${SECRET_VALUE}`;
12
+ /** The name of the workspace fixture, so the worktree path can be pinned. */
13
+ const WORKSPACE_NAME = 'oa-workspace-fixture';
14
+ /** The reason a result carries, when it stops the call. */
15
+ function reasonOf(result) {
16
+ return 'reason' in result ? result.reason : undefined;
17
+ }
18
+ /** Whether a result lets the call through. */
19
+ function continues(result) {
20
+ return 'continue' in result ? result.continue : true;
21
+ }
22
+ let workspace;
23
+ let stateRoot;
24
+ let rules;
25
+ beforeEach(async () => {
26
+ const base = await mkdtemp(join(tmpdir(), 'oa-wt-'));
27
+ workspace = join(base, WORKSPACE_NAME);
28
+ await mkdir(workspace, { recursive: true });
29
+ stateRoot = await mkdtemp(join(tmpdir(), 'oa-state-'));
30
+ rules = defaultRules({ workspace, stateRoot, home: '/home/dev' });
31
+ });
32
+ function ruleOf(id) {
33
+ const found = rules.find((rule) => rule.id === id);
34
+ if (found === undefined)
35
+ throw new Error(`no rule called ${id}`);
36
+ return found;
37
+ }
38
+ async function decide(id, event) {
39
+ return ruleOf(id).handler(event);
40
+ }
41
+ /** The event a shell call arrives as. */
42
+ function shell(command, extra = {}) {
43
+ return { toolName: 'bash', args: {}, files: [], command, ...extra };
44
+ }
45
+ /** The event a file write arrives as. */
46
+ function write(path, content = '') {
47
+ return { toolName: 'write', args: { filePath: path, content }, files: [{ path }] };
48
+ }
49
+ describe('the default rules', () => {
50
+ it('is the seven rules of the plan, in the plan order', () => {
51
+ expect(rules.map((rule) => rule.id)).toEqual([
52
+ 'no-skip-git-hooks',
53
+ 'package-manager',
54
+ 'workspace-writes-only',
55
+ 'protect-policy',
56
+ 'human-only-decisions',
57
+ 'secret-scan-writes',
58
+ 'destructive-needs-approval',
59
+ ]);
60
+ });
61
+ it('blocks every one of them', () => {
62
+ for (const rule of rules)
63
+ expect(rule.block).toBe(true);
64
+ });
65
+ it('is checked before a tool call', () => {
66
+ for (const rule of rules)
67
+ expect(rule.event).toBe('PreToolCall');
68
+ });
69
+ });
70
+ describe('no-skip-git-hooks', () => {
71
+ it('blocks a commit that skips the hooks', async () => {
72
+ const result = await decide('no-skip-git-hooks', shell('git commit --no-verify -m "wip"'));
73
+ expect(continues(result)).toBe(false);
74
+ });
75
+ it('blocks a bare -n right after git commit', async () => {
76
+ expect(continues(await decide('no-skip-git-hooks', shell('git commit -n')))).toBe(false);
77
+ });
78
+ it('blocks the -n behind the message', async () => {
79
+ expect(continues(await decide('no-skip-git-hooks', shell('git commit -m "wip" -n')))).toBe(false);
80
+ });
81
+ it('blocks the -n behind another flag', async () => {
82
+ expect(continues(await decide('no-skip-git-hooks', shell('git commit -a -n')))).toBe(false);
83
+ });
84
+ it('blocks the -n behind an amend', async () => {
85
+ expect(continues(await decide('no-skip-git-hooks', shell('git commit --amend -n')))).toBe(false);
86
+ });
87
+ it('blocks the -n in a flag cluster', async () => {
88
+ expect(continues(await decide('no-skip-git-hooks', shell('git commit -nm "wip"')))).toBe(false);
89
+ });
90
+ it('blocks the husky switch', async () => {
91
+ expect(continues(await decide('no-skip-git-hooks', shell('HUSKY=0 git commit -m "wip"')))).toBe(false);
92
+ });
93
+ it('lets a commit that only talks about -n through', async () => {
94
+ const result = await decide('no-skip-git-hooks', shell('git commit -m "fix -n handling"'));
95
+ expect(continues(result)).toBe(true);
96
+ });
97
+ it('lets a commit whose message names the long flag through', async () => {
98
+ const result = await decide('no-skip-git-hooks', shell('git commit -m "docs: note --no-verify"'));
99
+ expect(continues(result)).toBe(true);
100
+ });
101
+ it('blocks a commit that is passed as a quoted argument', async () => {
102
+ expect(continues(await decide('no-skip-git-hooks', shell('bash -c "git commit -n"')))).toBe(false);
103
+ expect(continues(await decide('no-skip-git-hooks', shell('bash -c "git commit --no-verify"')))).toBe(false);
104
+ expect(continues(await decide('no-skip-git-hooks', shell('bash -c "HUSKY=0 git commit -m x"')))).toBe(false);
105
+ });
106
+ it('blocks the abbreviations of the long flag', async () => {
107
+ expect(continues(await decide('no-skip-git-hooks', shell('git commit --no-verif -m x')))).toBe(false);
108
+ expect(continues(await decide('no-skip-git-hooks', shell('git commit --no-veri -m x')))).toBe(false);
109
+ });
110
+ it('lets the options that only look like the flag through', async () => {
111
+ expect(continues(await decide('no-skip-git-hooks', shell('git commit --no-verbose -m x')))).toBe(true);
112
+ expect(continues(await decide('no-skip-git-hooks', shell('git merge --no-verify-signatures')))).toBe(true);
113
+ expect(continues(await decide('no-skip-git-hooks', shell('git commit --no-ver -m x')))).toBe(true);
114
+ });
115
+ it('lets a -n that belongs to another command through', async () => {
116
+ expect(continues(await decide('no-skip-git-hooks', shell('git merge -n')))).toBe(true);
117
+ expect(continues(await decide('no-skip-git-hooks', shell('git rebase -n')))).toBe(true);
118
+ expect(continues(await decide('no-skip-git-hooks', shell('sudo -n git commit -m x')))).toBe(true);
119
+ expect(continues(await decide('no-skip-git-hooks', shell('git commit -m add -- -n')))).toBe(true);
120
+ });
121
+ it('lets an ordinary commit through', async () => {
122
+ expect(continues(await decide('no-skip-git-hooks', shell('git commit -m "wip"')))).toBe(true);
123
+ });
124
+ });
125
+ describe('package-manager', () => {
126
+ it('blocks another package manager', async () => {
127
+ expect(continues(await decide('package-manager', shell('pnpm add x')))).toBe(false);
128
+ expect(continues(await decide('package-manager', shell('npm install')))).toBe(false);
129
+ expect(continues(await decide('package-manager', shell('yarn add x')))).toBe(false);
130
+ });
131
+ it('blocks another package manager behind a path', async () => {
132
+ expect(continues(await decide('package-manager', shell('/usr/local/bin/pnpm add x')))).toBe(false);
133
+ expect(continues(await decide('package-manager', shell('./node_modules/.bin/pnpm add x')))).toBe(false);
134
+ });
135
+ it('blocks another package manager in another case', async () => {
136
+ expect(continues(await decide('package-manager', shell('PNPM add x')))).toBe(false);
137
+ });
138
+ it('lets bun through', async () => {
139
+ expect(continues(await decide('package-manager', shell('bun add x')))).toBe(true);
140
+ });
141
+ });
142
+ describe('workspace-writes-only', () => {
143
+ it('blocks a write outside the workspace', async () => {
144
+ const result = await decide('workspace-writes-only', write('/elsewhere/file.ts'));
145
+ expect(continues(result)).toBe(false);
146
+ });
147
+ it('lets a write inside the workspace through', async () => {
148
+ const result = await decide('workspace-writes-only', write(join(workspace, 'src/a.ts')));
149
+ expect(continues(result)).toBe(true);
150
+ });
151
+ it('lets a write inside a worktree of the project through', async () => {
152
+ // The path is pinned, so the test fails when the rule looks in the
153
+ // wrong place.
154
+ const result = await decide('workspace-writes-only', {
155
+ toolName: 'write',
156
+ args: { filePath: '/home/dev/.openagentsy/worktrees/oa-workspace-fixture/src/a.ts' },
157
+ files: [],
158
+ });
159
+ expect(continues(result)).toBe(true);
160
+ });
161
+ it('lets a read of a file through', async () => {
162
+ const result = await decide('workspace-writes-only', {
163
+ toolName: 'read',
164
+ args: { filePath: '/etc/passwd' },
165
+ files: [],
166
+ });
167
+ expect(continues(result)).toBe(true);
168
+ });
169
+ it('lets a search through', async () => {
170
+ const result = await decide('workspace-writes-only', {
171
+ toolName: 'grep',
172
+ args: { path: '/tmp' },
173
+ files: [],
174
+ });
175
+ expect(continues(result)).toBe(true);
176
+ });
177
+ it('lets a read of a file through, even when the host says which file it read', async () => {
178
+ const path = '.opencode/skills/openagentsy-review/SKILL.md';
179
+ const result = await decide('workspace-writes-only', {
180
+ toolName: 'read',
181
+ args: { filePath: path },
182
+ files: [{ path }],
183
+ });
184
+ expect(continues(result)).toBe(true);
185
+ const protectedResult = await decide('protect-policy', {
186
+ toolName: 'read',
187
+ args: { filePath: path },
188
+ files: [{ path }],
189
+ });
190
+ expect(continues(protectedResult)).toBe(true);
191
+ });
192
+ it('knows the tools a host composes', async () => {
193
+ for (const tool of ['write_file', 'create_file']) {
194
+ const result = await decide('workspace-writes-only', {
195
+ toolName: tool,
196
+ args: { filePath: '/elsewhere/file.ts' },
197
+ files: [],
198
+ });
199
+ expect(continues(result), tool).toBe(false);
200
+ }
201
+ });
202
+ it('lets a call that touches no file through', async () => {
203
+ expect(continues(await decide('workspace-writes-only', shell('ls -la')))).toBe(true);
204
+ });
205
+ });
206
+ describe('protect-policy', () => {
207
+ it('blocks the files a person changes', async () => {
208
+ const protectedPaths = [
209
+ 'roles.yaml',
210
+ 'openagentsy.models.lock.json',
211
+ 'opencode.jsonc',
212
+ 'biome.jsonc',
213
+ 'turbo.json',
214
+ 'bun.lock',
215
+ '.opencode/agents/lead.md',
216
+ '.husky/pre-commit',
217
+ '.github/workflows/check.yml',
218
+ 'templates/.opencode/skills/x/SKILL.md',
219
+ '.openagentsy/lessons/one.json',
220
+ '.openagentsy/quality/waivers.json',
221
+ '.openagentsy/approvals.json',
222
+ ];
223
+ for (const path of protectedPaths) {
224
+ const result = await decide('protect-policy', write(join(workspace, path)));
225
+ expect(continues(result), path).toBe(false);
226
+ }
227
+ });
228
+ it('blocks a directory that is named without its slash', async () => {
229
+ for (const path of ['.opencode', 'templates', 'roles.yaml/']) {
230
+ expect(isProtected(path), path).toBe(true);
231
+ const result = await decide('protect-policy', write(path));
232
+ expect(continues(result), path).toBe(false);
233
+ }
234
+ });
235
+ it('blocks the lock of the approval store', async () => {
236
+ expect(isProtected('.openagentsy/approvals.json.lock')).toBe(true);
237
+ const result = await decide('protect-policy', write('.openagentsy/approvals.json.lock'));
238
+ expect(continues(result)).toBe(false);
239
+ });
240
+ it('lets a read of a policy file through', async () => {
241
+ const result = await decide('protect-policy', {
242
+ toolName: 'read',
243
+ args: { filePath: '.opencode/skills/openagentsy-review/SKILL.md' },
244
+ files: [],
245
+ });
246
+ expect(continues(result)).toBe(true);
247
+ });
248
+ it('lets an ordinary file through', async () => {
249
+ const result = await decide('protect-policy', write(join(workspace, 'src/a.ts')));
250
+ expect(continues(result)).toBe(true);
251
+ });
252
+ });
253
+ describe('human-only-decisions', () => {
254
+ it('blocks the three decision tools', async () => {
255
+ for (const tool of [
256
+ 'oa_lesson_decide',
257
+ 'oa_quality_waive',
258
+ 'openagentsy_oa_quality_waive',
259
+ 'oa_memory_decide',
260
+ ]) {
261
+ const result = await decide('human-only-decisions', { toolName: tool, args: {}, files: [] });
262
+ expect(continues(result), tool).toBe(false);
263
+ }
264
+ });
265
+ it('blocks a decision tool behind a server prefix', async () => {
266
+ const result = await decide('human-only-decisions', {
267
+ toolName: 'openagentsy-lessons_oa_lesson_decide',
268
+ args: {},
269
+ files: [],
270
+ });
271
+ expect(continues(result)).toBe(false);
272
+ });
273
+ it('lets an ordinary tool through', async () => {
274
+ const result = await decide('human-only-decisions', {
275
+ toolName: 'oa_task_list',
276
+ args: {},
277
+ files: [],
278
+ });
279
+ expect(continues(result)).toBe(true);
280
+ });
281
+ });
282
+ describe('secret-scan-writes', () => {
283
+ it('blocks content that carries a secret', async () => {
284
+ const result = await decide('secret-scan-writes', write(join(workspace, 'src/a.ts'), SECRET_CONTENT));
285
+ expect(continues(result)).toBe(false);
286
+ expect(reasonOf(result)).toContain('credential');
287
+ });
288
+ it('lets clean content through', async () => {
289
+ const result = await decide('secret-scan-writes', write(join(workspace, 'src/a.ts'), 'export const answer = 42;'));
290
+ expect(continues(result)).toBe(true);
291
+ });
292
+ it('scans the content of the tools a host composes', async () => {
293
+ for (const tool of ['write_file', 'create_file']) {
294
+ const result = await decide('secret-scan-writes', {
295
+ toolName: tool,
296
+ args: { content: SECRET_CONTENT },
297
+ files: [],
298
+ });
299
+ expect(continues(result), tool).toBe(false);
300
+ }
301
+ });
302
+ it('finds a secret in the lines a patch adds', async () => {
303
+ const patch = ['*** Update File: src/a.ts', '@@', `+const api_key = '${SECRET_VALUE}';`].join('\n');
304
+ const result = await decide('secret-scan-writes', {
305
+ toolName: 'apply_patch',
306
+ args: { patchText: patch },
307
+ files: [{ path: 'src/a.ts' }],
308
+ });
309
+ expect(continues(result)).toBe(false);
310
+ });
311
+ });
312
+ describe('destructive-needs-approval', () => {
313
+ it('blocks a destructive command and names the escape hatch', async () => {
314
+ const result = await decide('destructive-needs-approval', shell('rm -rf /', { callID: 'call-9' }));
315
+ expect(continues(result)).toBe(false);
316
+ expect(reasonOf(result)).toContain('/oa approve <callID>');
317
+ });
318
+ it('blocks the destructive flags in any order', async () => {
319
+ expect(continues(await decide('destructive-needs-approval', shell('rm -fr /')))).toBe(false);
320
+ expect(continues(await decide('destructive-needs-approval', shell('rm -r -f /')))).toBe(false);
321
+ });
322
+ it('blocks the destructive flags in their long form', async () => {
323
+ expect(continues(await decide('destructive-needs-approval', shell('rm --recursive --force /')))).toBe(false);
324
+ });
325
+ it('blocks a destructive command behind a separator', async () => {
326
+ expect(continues(await decide('destructive-needs-approval', shell('ls;rm -rf /')))).toBe(false);
327
+ expect(continues(await decide('destructive-needs-approval', shell('ls && rm -rf /')))).toBe(false);
328
+ });
329
+ it('blocks a forced push and a hard reset', async () => {
330
+ expect(continues(await decide('destructive-needs-approval', shell('git push --force')))).toBe(false);
331
+ expect(continues(await decide('destructive-needs-approval', shell('git reset --hard HEAD')))).toBe(false);
332
+ });
333
+ it('lets an approved call through once', async () => {
334
+ await createApprovalStore(stateRoot).approve('call-9', Date.now(), 60_000);
335
+ const first = await decide('destructive-needs-approval', shell('rm -rf /', { callID: 'call-9' }));
336
+ expect(continues(first)).toBe(true);
337
+ const second = await decide('destructive-needs-approval', shell('rm -rf /', { callID: 'call-9' }));
338
+ expect(continues(second)).toBe(false);
339
+ });
340
+ it('blocks a removal whose flags come after the operand', async () => {
341
+ expect(continues(await decide('destructive-needs-approval', shell('rm build -rf')))).toBe(false);
342
+ expect(continues(await decide('destructive-needs-approval', shell('rm -r build -f')))).toBe(false);
343
+ expect(continues(await decide('destructive-needs-approval', shell('rm -r build --force')))).toBe(false);
344
+ });
345
+ it('lets a message that talks about a removal through', async () => {
346
+ expect(continues(await decide('destructive-needs-approval', shell('git commit -m "docs: explain rm -rf /"')))).toBe(true);
347
+ expect(continues(await decide('destructive-needs-approval', shell('git commit -m "never git push --force"')))).toBe(true);
348
+ expect(continues(await decide('destructive-needs-approval', shell('git commit -m "drop table in a migration"')))).toBe(true);
349
+ });
350
+ it('lets a removal that is not both recursive and forced through', async () => {
351
+ expect(continues(await decide('destructive-needs-approval', shell('rm -r build')))).toBe(true);
352
+ expect(continues(await decide('destructive-needs-approval', shell('rm -R build')))).toBe(true);
353
+ expect(continues(await decide('destructive-needs-approval', shell('rm -f /tmp/x')))).toBe(true);
354
+ });
355
+ it('blocks a recursive and forced removal in any spelling', async () => {
356
+ expect(continues(await decide('destructive-needs-approval', shell('rm -Rf /')))).toBe(false);
357
+ });
358
+ it('blocks a destructive command inside a substitution', async () => {
359
+ expect(continues(await decide('destructive-needs-approval', shell('echo $(rm -rf /)')))).toBe(false);
360
+ });
361
+ it('blocks a destructive command inside a quoted argument', async () => {
362
+ expect(continues(await decide('destructive-needs-approval', shell('bash -c "rm -rf /"')))).toBe(false);
363
+ });
364
+ it('lets an ordinary command through', async () => {
365
+ expect(continues(await decide('destructive-needs-approval', shell('rm build/output.txt')))).toBe(true);
366
+ });
367
+ });
368
+ describe('the raw host shape', () => {
369
+ it('reads the command out of the arguments', async () => {
370
+ const result = await decide('no-skip-git-hooks', {
371
+ toolName: 'bash',
372
+ args: { command: 'git commit --no-verify' },
373
+ files: [],
374
+ });
375
+ expect(continues(result)).toBe(false);
376
+ });
377
+ it('reads the file out of the arguments', async () => {
378
+ const result = await decide('workspace-writes-only', {
379
+ toolName: 'write',
380
+ args: { filePath: '/etc/passwd' },
381
+ files: [],
382
+ });
383
+ expect(continues(result)).toBe(false);
384
+ });
385
+ it('reads the content out of the arguments', async () => {
386
+ const result = await decide('secret-scan-writes', {
387
+ toolName: 'write',
388
+ args: { content: SECRET_CONTENT },
389
+ files: [],
390
+ });
391
+ expect(continues(result)).toBe(false);
392
+ });
393
+ });
394
+ describe('the commands that hide their payload', () => {
395
+ it('blocks a removal that hides in a substitution', async () => {
396
+ expect(continues(await decide('destructive-needs-approval', shell('git commit -m "$(rm -rf /tmp/victim)"')))).toBe(false);
397
+ });
398
+ it('blocks a hook skip that hides in a substitution', async () => {
399
+ expect(continues(await decide('no-skip-git-hooks', shell('git commit -m "$(git commit -n)"')))).toBe(false);
400
+ });
401
+ it('blocks a removal that hides in a process substitution', async () => {
402
+ expect(continues(await decide('destructive-needs-approval', shell('git commit -F <(rm -rf /)')))).toBe(false);
403
+ });
404
+ it('blocks a removal behind another command', async () => {
405
+ expect(continues(await decide('destructive-needs-approval', shell('unshare -m rm -rf /tmp/x')))).toBe(false);
406
+ });
407
+ it('blocks another package manager that hides in a substitution', async () => {
408
+ expect(continues(await decide('package-manager', shell('echo $(pnpm add x)')))).toBe(false);
409
+ });
410
+ });
411
+ describe('the removals of two segments', () => {
412
+ it('lets them through when neither is dangerous', async () => {
413
+ expect(continues(await decide('destructive-needs-approval', shell('rm -r build; rm -f /tmp/x')))).toBe(true);
414
+ expect(continues(await decide('destructive-needs-approval', shell('rm build && tar -rf archive.tar file')))).toBe(true);
415
+ });
416
+ });
417
+ describe('the tools a host composes', () => {
418
+ it('treats an unknown name that carries files as a writer', async () => {
419
+ const path = '.opencode/skills/openagentsy-review/SKILL.md';
420
+ const copy = await decide('protect-policy', {
421
+ toolName: 'copy_file',
422
+ args: { filePath: path },
423
+ files: [{ path }],
424
+ });
425
+ expect(continues(copy)).toBe(false);
426
+ });
427
+ it('blocks a write outside the workspace', async () => {
428
+ for (const tool of ['push_files', 'upload_file']) {
429
+ const result = await decide('workspace-writes-only', {
430
+ toolName: tool,
431
+ args: { filePath: '/elsewhere/a.ts' },
432
+ files: [{ path: '/elsewhere/a.ts' }],
433
+ });
434
+ expect(continues(result), tool).toBe(false);
435
+ }
436
+ });
437
+ it('scans the content of a tool it does not know', async () => {
438
+ const result = await decide('secret-scan-writes', {
439
+ toolName: 'save_file',
440
+ args: { content: SECRET_CONTENT, filePath: 'a.ts' },
441
+ files: [{ path: 'a.ts' }],
442
+ });
443
+ expect(continues(result)).toBe(false);
444
+ });
445
+ it('blocks a directory a person changes', async () => {
446
+ const result = await decide('protect-policy', {
447
+ toolName: 'create_directory',
448
+ args: { filePath: '.opencode/skills' },
449
+ files: [{ path: '.opencode/skills' }],
450
+ });
451
+ expect(continues(result)).toBe(false);
452
+ });
453
+ });
454
+ describe('the removals in a subshell', () => {
455
+ it('blocks a removal behind the punctuation of the shell', async () => {
456
+ const commands = [
457
+ '(rm -rf /tmp/victim)',
458
+ 'bash -c "(rm -rf /tmp/victim)"',
459
+ "sh -c '(rm -rf /tmp/victim)'",
460
+ 'time (rm -rf /tmp/victim)',
461
+ '\\rm -rf /tmp/victim',
462
+ '( rm -rf /tmp/victim )',
463
+ ];
464
+ for (const command of commands) {
465
+ const result = await decide('destructive-needs-approval', shell(command));
466
+ expect(continues(result), command).toBe(false);
467
+ }
468
+ });
469
+ });
470
+ describe('a name the matcher does not know', () => {
471
+ it('treats a call that carries files as a writer', async () => {
472
+ const result = await decide('protect-policy', {
473
+ toolName: 'some_new_tool',
474
+ args: { filePath: '.opencode/skills/openagentsy-review/SKILL.md' },
475
+ files: [{ path: '.opencode/skills/openagentsy-review/SKILL.md' }],
476
+ });
477
+ expect(continues(result)).toBe(false);
478
+ });
479
+ it('treats a call that carries content as a writer', async () => {
480
+ const result = await decide('secret-scan-writes', {
481
+ toolName: 'some_new_tool',
482
+ args: { content: SECRET_CONTENT },
483
+ files: [],
484
+ });
485
+ expect(continues(result)).toBe(false);
486
+ });
487
+ });
488
+ //# sourceMappingURL=rules.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.test.js","sourceRoot":"","sources":["../src/rules.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * The redaction every stored thing goes through.
3
+ *
4
+ * The patterns live in core, because the memory slice needed them first
5
+ * and two copies of a secret pattern are two things to keep in step. This
6
+ * is the one door: a board record, a harvested memory candidate, a lesson
7
+ * summary. The count is what the Accountability block shows.
8
+ *
9
+ * The known gap stays where the plan records it: the entropy guard is
10
+ * strictly above 4.0 bits per character, so a pure-hex value of 32
11
+ * characters is never flagged. The helper is core's, and 2f owns the fix.
12
+ */
13
+ export declare function redactForStorage(s: string): {
14
+ text: string;
15
+ count: number;
16
+ };
17
+ //# sourceMappingURL=secrets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../src/secrets.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAE3E"}
@@ -0,0 +1,17 @@
1
+ import { redact } from '@openagentsy/core';
2
+ /**
3
+ * The redaction every stored thing goes through.
4
+ *
5
+ * The patterns live in core, because the memory slice needed them first
6
+ * and two copies of a secret pattern are two things to keep in step. This
7
+ * is the one door: a board record, a harvested memory candidate, a lesson
8
+ * summary. The count is what the Accountability block shows.
9
+ *
10
+ * The known gap stays where the plan records it: the entropy guard is
11
+ * strictly above 4.0 bits per character, so a pure-hex value of 32
12
+ * characters is never flagged. The helper is core's, and 2f owns the fix.
13
+ */
14
+ export function redactForStorage(s) {
15
+ return redact(s);
16
+ }
17
+ //# sourceMappingURL=secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../src/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAS;IACxC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=secrets.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.test.d.ts","sourceRoot":"","sources":["../src/secrets.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { redactForStorage } from './secrets.js';
3
+ // The fixture is assembled from segments on purpose: the value is the real
4
+ // shape the helper pins, and the source carries no contiguous secret for a
5
+ // scanner to flag. It is not a credential.
6
+ const OPENAI_KEY = ['sk', '-ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'].join('');
7
+ describe('redactForStorage', () => {
8
+ it('redacts a secret and reports the count', () => {
9
+ const result = redactForStorage(`the key is ${OPENAI_KEY}`);
10
+ expect(result.count).toBe(1);
11
+ expect(result.text).not.toContain('ABCDEFGH');
12
+ expect(result.text).toContain('«redacted:openai-key»');
13
+ });
14
+ it('leaves clean text alone', () => {
15
+ const result = redactForStorage('the build is green');
16
+ expect(result.count).toBe(0);
17
+ expect(result.text).toBe('the build is green');
18
+ });
19
+ });
20
+ //# sourceMappingURL=secrets.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.test.js","sourceRoot":"","sources":["../src/secrets.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,2EAA2E;AAC3E,2EAA2E;AAC3E,2CAA2C;AAC3C,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,uCAAuC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAE5E,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,MAAM,GAAG,gBAAgB,CAAC,cAAc,UAAU,EAAE,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,MAAM,GAAG,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * The environment every agent shell sees.
3
+ *
4
+ * The shell env hook tightens only: it removes the switches that skip the
5
+ * hooks and the keys that belong to the board, and it marks the shell as
6
+ * an agent's. It never adds a credential, because a credential in a shell
7
+ * is a credential in every log the shell writes.
8
+ */
9
+ /** The variables that are removed. */
10
+ export declare const STRIPPED_ENV_VARS: readonly ["HUSKY", "HUSKY_SKIP_HOOKS", "SKIP_SIMPLE_GIT_HOOKS", "TOGETHER_API_KEY", "TYPESAFE_API_KEY"];
11
+ /**
12
+ * Apply the policy to a shell environment.
13
+ *
14
+ * The environment is changed in place, because that is the shape the host
15
+ * hands over: the shell env hook fills an object and the shell reads it, and
16
+ * the V2 shell domain hands the plugin the same object before the child is
17
+ * spawned.
18
+ *
19
+ * The values are optional, because the V2 event types the environment of a
20
+ * shell that way. A key that is absent is a key that is not there.
21
+ */
22
+ export declare function applyShellEnvPolicy(env: Record<string, string | undefined>): void;
23
+ //# sourceMappingURL=shell-env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-env.d.ts","sourceRoot":"","sources":["../src/shell-env.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,sCAAsC;AACtC,eAAO,MAAM,iBAAiB,yGAMpB,CAAC;AAEX;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,IAAI,CAIjF"}