@agentwhy/cli 0.0.0-dev

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 (400) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +2 -0
  3. package/README.md +181 -0
  4. package/THIRD_PARTY_NOTICES.md +31 -0
  5. package/dist/adapter/claude-code/contract/assumptions.js +208 -0
  6. package/dist/adapter/claude-code/contract/denials.js +15 -0
  7. package/dist/adapter/claude-code/contract/entry-points.js +15 -0
  8. package/dist/adapter/claude-code/contract/fields.js +73 -0
  9. package/dist/adapter/claude-code/contract/hooks.js +96 -0
  10. package/dist/adapter/claude-code/contract/identifiers.js +15 -0
  11. package/dist/adapter/claude-code/contract/layout.js +29 -0
  12. package/dist/adapter/claude-code/contract/line-types.js +26 -0
  13. package/dist/adapter/claude-code/contract/projects.js +23 -0
  14. package/dist/adapter/claude-code/contract/recognition.js +14 -0
  15. package/dist/adapter/claude-code/contract/session-title.js +20 -0
  16. package/dist/adapter/claude-code/contract/settings.js +27 -0
  17. package/dist/adapter/claude-code/contract/task-notifications.js +33 -0
  18. package/dist/adapter/claude-code/contract/tools.js +37 -0
  19. package/dist/adapter/claude-code/contract/version.js +51 -0
  20. package/dist/adapter/claude-code/discovery/claude-code-project-catalogue.js +129 -0
  21. package/dist/adapter/claude-code/discovery/claude-code-recognition.js +46 -0
  22. package/dist/adapter/claude-code/discovery/claude-code-session-catalogue.js +100 -0
  23. package/dist/adapter/claude-code/discovery/claude-code-session-discovery.js +61 -0
  24. package/dist/adapter/claude-code/discovery/claude-code-session-titles.js +28 -0
  25. package/dist/adapter/claude-code/discovery/discovered-session.js +1 -0
  26. package/dist/adapter/claude-code/discovery/session-entries.js +41 -0
  27. package/dist/adapter/claude-code/discovery/transcript-tail.js +81 -0
  28. package/dist/adapter/claude-code/events/claude-code-session-source.js +197 -0
  29. package/dist/adapter/claude-code/events/delegation-index.js +15 -0
  30. package/dist/adapter/claude-code/events/transcript-scan.js +179 -0
  31. package/dist/adapter/claude-code/hooks/hook-output.js +42 -0
  32. package/dist/adapter/claude-code/hooks/pre-tool-use-input.js +23 -0
  33. package/dist/adapter/claude-code/hooks/stop-input.js +25 -0
  34. package/dist/adapter/claude-code/hooks/subagent-stop-input.js +26 -0
  35. package/dist/adapter/claude-code/policy/deny-rules.js +46 -0
  36. package/dist/adapter/claude-code/probe/claude-code-probe.js +86 -0
  37. package/dist/adapter/claude-code/probe/collectors/agent-tool-input-key-collector.js +24 -0
  38. package/dist/adapter/claude-code/probe/collectors/denial-kind-collector.js +20 -0
  39. package/dist/adapter/claude-code/probe/collectors/denied-call-collector.js +11 -0
  40. package/dist/adapter/claude-code/probe/collectors/identifier-collector.js +19 -0
  41. package/dist/adapter/claude-code/probe/collectors/line-collector.js +1 -0
  42. package/dist/adapter/claude-code/probe/collectors/line-type-collector.js +29 -0
  43. package/dist/adapter/claude-code/probe/collectors/sidechain-collector.js +20 -0
  44. package/dist/adapter/claude-code/probe/collectors/task-notification-collector.js +51 -0
  45. package/dist/adapter/claude-code/probe/collectors/tool-result-reference-collector.js +31 -0
  46. package/dist/adapter/claude-code/probe/collectors/tool-use-collector.js +24 -0
  47. package/dist/adapter/claude-code/probe/collectors/tool-version-collector.js +14 -0
  48. package/dist/adapter/claude-code/probe/collectors/top-level-key-collector.js +14 -0
  49. package/dist/adapter/claude-code/probe/collectors/unknown-line-type-key-collector.js +24 -0
  50. package/dist/adapter/claude-code/probe/collectors/working-directory-collector.js +28 -0
  51. package/dist/adapter/claude-code/probe/doctor-report.js +1 -0
  52. package/dist/adapter/claude-code/probe/meta-tally.js +42 -0
  53. package/dist/adapter/claude-code/probe/session-probe.js +1 -0
  54. package/dist/adapter/claude-code/probe/session-tally.js +41 -0
  55. package/dist/adapter/claude-code/probe/transcript-line.js +30 -0
  56. package/dist/adapter/claude-code/probe/transcript-tally.js +74 -0
  57. package/dist/adapter/claude-code/settings/deny-entries.js +65 -0
  58. package/dist/adapter/claude-code/settings/hook-entries.js +303 -0
  59. package/dist/adapter/codex/contract/actions.js +69 -0
  60. package/dist/adapter/codex/contract/assumptions.js +55 -0
  61. package/dist/adapter/codex/contract/capabilities.js +24 -0
  62. package/dist/adapter/codex/contract/delegations.js +30 -0
  63. package/dist/adapter/codex/contract/deliveries.js +25 -0
  64. package/dist/adapter/codex/contract/envelope.js +33 -0
  65. package/dist/adapter/codex/contract/hook-refusals.js +14 -0
  66. package/dist/adapter/codex/contract/hooks.js +46 -0
  67. package/dist/adapter/codex/contract/messages.js +47 -0
  68. package/dist/adapter/codex/contract/permissions.js +27 -0
  69. package/dist/adapter/codex/contract/reviews.js +13 -0
  70. package/dist/adapter/codex/contract/session.js +31 -0
  71. package/dist/adapter/codex/contract/turns.js +23 -0
  72. package/dist/adapter/codex/contract/version.js +15 -0
  73. package/dist/adapter/codex/discovery/codex-conversations.js +44 -0
  74. package/dist/adapter/codex/discovery/codex-project-catalogue.js +49 -0
  75. package/dist/adapter/codex/discovery/codex-recognition.js +20 -0
  76. package/dist/adapter/codex/discovery/codex-session-catalogue.js +28 -0
  77. package/dist/adapter/codex/discovery/codex-session-discovery.js +115 -0
  78. package/dist/adapter/codex/discovery/codex-session-index.js +21 -0
  79. package/dist/adapter/codex/discovery/codex-session-titles.js +135 -0
  80. package/dist/adapter/codex/discovery/session-header.js +86 -0
  81. package/dist/adapter/codex/discovery/session-owners.js +11 -0
  82. package/dist/adapter/codex/discovery/session-roots.js +49 -0
  83. package/dist/adapter/codex/events/action-items.js +138 -0
  84. package/dist/adapter/codex/events/capability-records.js +26 -0
  85. package/dist/adapter/codex/events/codex-session-source.js +121 -0
  86. package/dist/adapter/codex/events/hook-refusals.js +27 -0
  87. package/dist/adapter/codex/events/rollout-scan.js +614 -0
  88. package/dist/adapter/codex/events/turn-permissions.js +60 -0
  89. package/dist/adapter/codex/hooks/pre-tool-use-input.js +24 -0
  90. package/dist/adapter/codex/hooks/stop-refusals.js +57 -0
  91. package/dist/adapter/codex/probe/codex-doctor-report.js +1 -0
  92. package/dist/adapter/codex/probe/codex-probe.js +268 -0
  93. package/dist/adapter/codex/settings/codex-hooks.js +83 -0
  94. package/dist/cli/cli-command.js +1 -0
  95. package/dist/cli/command-router.js +42 -0
  96. package/dist/cli/commands/check-cli-command.js +128 -0
  97. package/dist/cli/commands/codex-stop-cli-command.js +27 -0
  98. package/dist/cli/commands/doctor-arguments.js +32 -0
  99. package/dist/cli/commands/doctor-cli-command.js +31 -0
  100. package/dist/cli/commands/doctor-usage.js +14 -0
  101. package/dist/cli/commands/init-cli-command.js +123 -0
  102. package/dist/cli/commands/menu-cli-command.js +58 -0
  103. package/dist/cli/commands/notify-cli-command.js +158 -0
  104. package/dist/cli/commands/refuse-cli-command.js +79 -0
  105. package/dist/cli/commands/report-arguments.js +62 -0
  106. package/dist/cli/commands/report-cli-command.js +36 -0
  107. package/dist/cli/commands/report-usage.js +41 -0
  108. package/dist/cli/commands/sessions-cli-command.js +184 -0
  109. package/dist/cli/commands/start-cli-command.js +83 -0
  110. package/dist/cli/commands/watch-cli-command.js +142 -0
  111. package/dist/cli/exit-codes.js +13 -0
  112. package/dist/cli/project-switches.js +46 -0
  113. package/dist/cli.js +80 -0
  114. package/dist/composition-root.js +411 -0
  115. package/dist/core/access/command-line.js +454 -0
  116. package/dist/core/access/listing.js +58 -0
  117. package/dist/core/access/path-shape.js +59 -0
  118. package/dist/core/access/path-tokens.js +37 -0
  119. package/dist/core/access/protected-access.js +310 -0
  120. package/dist/core/access/protected-values.js +102 -0
  121. package/dist/core/access/recorded-effect.js +67 -0
  122. package/dist/core/access/returns.js +173 -0
  123. package/dist/core/access/search-output.js +34 -0
  124. package/dist/core/access/search-reach.js +268 -0
  125. package/dist/core/access/uses.js +143 -0
  126. package/dist/core/access/words-before.js +52 -0
  127. package/dist/core/agent.js +1 -0
  128. package/dist/core/capability.js +11 -0
  129. package/dist/core/combined-project-catalogue.js +36 -0
  130. package/dist/core/combined-session-catalogue.js +25 -0
  131. package/dist/core/completeness.js +10 -0
  132. package/dist/core/context.js +1 -0
  133. package/dist/core/correlation/correlate.js +329 -0
  134. package/dist/core/delegation.js +1 -0
  135. package/dist/core/detector/prompt-signals.js +78 -0
  136. package/dist/core/entry-point.js +1 -0
  137. package/dist/core/event.js +1 -0
  138. package/dist/core/evidence.js +9 -0
  139. package/dist/core/late-message.js +32 -0
  140. package/dist/core/message.js +1 -0
  141. package/dist/core/nearest-project.js +28 -0
  142. package/dist/core/policy/default-policy.js +32 -0
  143. package/dist/core/policy/glob.js +56 -0
  144. package/dist/core/policy/parse-policy.js +70 -0
  145. package/dist/core/policy/policy.js +20 -0
  146. package/dist/core/policy/resolve-policy.js +16 -0
  147. package/dist/core/project-catalogue.js +1 -0
  148. package/dist/core/project-root.js +133 -0
  149. package/dist/core/provider-titles.js +10 -0
  150. package/dist/core/redaction/entropy.js +46 -0
  151. package/dist/core/redaction/redacted.js +4 -0
  152. package/dist/core/redaction/redactor.js +339 -0
  153. package/dist/core/redaction/secret-patterns.js +22 -0
  154. package/dist/core/redaction/value-shapes.js +81 -0
  155. package/dist/core/redaction/value-trace.js +110 -0
  156. package/dist/core/review.js +1 -0
  157. package/dist/core/session-catalogue.js +19 -0
  158. package/dist/core/session-filter.js +42 -0
  159. package/dist/core/session-format.js +27 -0
  160. package/dist/core/session-model.js +1 -0
  161. package/dist/core/session-reader.js +22 -0
  162. package/dist/core/session-records.js +1 -0
  163. package/dist/core/session-source.js +1 -0
  164. package/dist/core/session-titles.js +21 -0
  165. package/dist/core/turn.js +1 -0
  166. package/dist/doctor/codex-doctor.js +14 -0
  167. package/dist/doctor/doctor-use-case.js +1 -0
  168. package/dist/doctor/format-selecting-doctor.js +28 -0
  169. package/dist/doctor/render/attention/attention-rule.js +1 -0
  170. package/dist/doctor/render/attention/doctor-attention-rules.js +28 -0
  171. package/dist/doctor/render/attention/rules/damaged-meta-files-rule.js +8 -0
  172. package/dist/doctor/render/attention/rules/damaged-transcripts-rule.js +9 -0
  173. package/dist/doctor/render/attention/rules/incomplete-subagent-pairs-rule.js +6 -0
  174. package/dist/doctor/render/attention/rules/missing-main-transcript-rule.js +5 -0
  175. package/dist/doctor/render/attention/rules/missing-spilled-results-rule.js +6 -0
  176. package/dist/doctor/render/attention/rules/multiple-working-directories-rule.js +15 -0
  177. package/dist/doctor/render/attention/rules/unknown-denial-kinds-rule.js +5 -0
  178. package/dist/doctor/render/attention/rules/unknown-line-types-rule.js +6 -0
  179. package/dist/doctor/render/attention/rules/unrecognised-entries-rule.js +6 -0
  180. package/dist/doctor/render/attention/rules/unusable-directories-rule.js +12 -0
  181. package/dist/doctor/render/attention/transcript-scopes.js +6 -0
  182. package/dist/doctor/render/codex-text-doctor-renderer.js +97 -0
  183. package/dist/doctor/render/doctor-renderers.js +1 -0
  184. package/dist/doctor/render/json-doctor-renderer.js +7 -0
  185. package/dist/doctor/render/output-format.js +1 -0
  186. package/dist/doctor/render/text-doctor-renderer.js +124 -0
  187. package/dist/doctor/session-doctor.js +16 -0
  188. package/dist/infrastructure/clack-asker.js +24 -0
  189. package/dist/infrastructure/clack-chooser.js +40 -0
  190. package/dist/infrastructure/clack-multi-chooser.js +31 -0
  191. package/dist/infrastructure/file-alert-store.js +120 -0
  192. package/dist/infrastructure/file-checked-store.js +55 -0
  193. package/dist/infrastructure/file-mark-store.js +67 -0
  194. package/dist/infrastructure/file-onboarding-store.js +93 -0
  195. package/dist/infrastructure/folder-window.js +26 -0
  196. package/dist/infrastructure/node-agentwhy-invocation.js +99 -0
  197. package/dist/infrastructure/node-browser.js +40 -0
  198. package/dist/infrastructure/node-file-system.js +111 -0
  199. package/dist/infrastructure/node-local-server.js +115 -0
  200. package/dist/infrastructure/node-text-input.js +26 -0
  201. package/dist/infrastructure/os-notifier.js +21 -0
  202. package/dist/infrastructure/osascript-folder-chooser.js +53 -0
  203. package/dist/infrastructure/powershell-folder-chooser.js +78 -0
  204. package/dist/infrastructure/real-directory.js +18 -0
  205. package/dist/infrastructure/stream-printer.js +11 -0
  206. package/dist/infrastructure/terminal-banner.js +19 -0
  207. package/dist/ports/agentwhy-invocation.js +1 -0
  208. package/dist/ports/alert-store.js +1 -0
  209. package/dist/ports/asker.js +1 -0
  210. package/dist/ports/browser.js +1 -0
  211. package/dist/ports/checked-store.js +1 -0
  212. package/dist/ports/chooser.js +1 -0
  213. package/dist/ports/directory-reader.js +1 -0
  214. package/dist/ports/file-access-error.js +11 -0
  215. package/dist/ports/file-reader.js +1 -0
  216. package/dist/ports/file-tail-reader.js +1 -0
  217. package/dist/ports/file-writer.js +1 -0
  218. package/dist/ports/folder-chooser.js +1 -0
  219. package/dist/ports/local-server.js +1 -0
  220. package/dist/ports/mark-store.js +10 -0
  221. package/dist/ports/multi-chooser.js +1 -0
  222. package/dist/ports/notifier.js +1 -0
  223. package/dist/ports/onboarding-store.js +1 -0
  224. package/dist/ports/printer.js +1 -0
  225. package/dist/ports/text-input.js +1 -0
  226. package/dist/refuse/command-reach.js +135 -0
  227. package/dist/refuse/command-refusal.js +88 -0
  228. package/dist/refuse/render/codex-stop-words.js +21 -0
  229. package/dist/refuse/render/refusal-words.js +34 -0
  230. package/dist/report/build-report.js +1037 -0
  231. package/dist/report/check/actions-digest.js +73 -0
  232. package/dist/report/check/check-lines.js +83 -0
  233. package/dist/report/check/mark-request.js +90 -0
  234. package/dist/report/check/marks.js +84 -0
  235. package/dist/report/check/render/text-digest-renderer.js +332 -0
  236. package/dist/report/check/session-actions.js +90 -0
  237. package/dist/report/check/session-check.js +91 -0
  238. package/dist/report/choose-policy.js +61 -0
  239. package/dist/report/flow-reads.js +18 -0
  240. package/dist/report/private-files/tell-lists.js +84 -0
  241. package/dist/report/project-rules.js +33 -0
  242. package/dist/report/render/home-relative.js +18 -0
  243. package/dist/report/render/html-head.js +26 -0
  244. package/dist/report/render/html-report-components.js +48 -0
  245. package/dist/report/render/html-report-styles.js +500 -0
  246. package/dist/report/render/html-sidebar.js +42 -0
  247. package/dist/report/render/path-tail.js +14 -0
  248. package/dist/report/render/report-copy.js +1177 -0
  249. package/dist/report/render/report-page/advanced-view.js +167 -0
  250. package/dist/report/render/report-page/file-story.js +114 -0
  251. package/dist/report/render/report-page/files-view.js +381 -0
  252. package/dist/report/render/report-page/files.js +77 -0
  253. package/dist/report/render/report-page/fix-wizard-script.js +269 -0
  254. package/dist/report/render/report-page/fix-wizard.js +310 -0
  255. package/dist/report/render/report-page/helpers-view.js +383 -0
  256. package/dist/report/render/report-page/helpers.js +51 -0
  257. package/dist/report/render/report-page/item-names.js +63 -0
  258. package/dist/report/render/report-page/protect-patterns.js +13 -0
  259. package/dist/report/render/report-page/providers.js +208 -0
  260. package/dist/report/render/report-page/record-view.js +367 -0
  261. package/dist/report/render/report-page/report-page-renderer.js +129 -0
  262. package/dist/report/render/report-page/report-views.js +31 -0
  263. package/dist/report/render/report-page/story-window.js +356 -0
  264. package/dist/report/render/report-page/times.js +25 -0
  265. package/dist/report/render/report-page/to-do-view.js +299 -0
  266. package/dist/report/render/report-page/to-do.js +152 -0
  267. package/dist/report/render/report-page.js +1 -0
  268. package/dist/report/render/session-view.js +250 -0
  269. package/dist/report/render/text-report-renderer.js +981 -0
  270. package/dist/report/render/ui/add-file-popup.js +122 -0
  271. package/dist/report/render/ui/app-sidebar.js +78 -0
  272. package/dist/report/render/ui/ask-panel.js +80 -0
  273. package/dist/report/render/ui/avatar.js +19 -0
  274. package/dist/report/render/ui/backdrop.js +29 -0
  275. package/dist/report/render/ui/brand-mark.js +4 -0
  276. package/dist/report/render/ui/button.js +67 -0
  277. package/dist/report/render/ui/callout.js +20 -0
  278. package/dist/report/render/ui/chat-example.js +17 -0
  279. package/dist/report/render/ui/checklist.js +50 -0
  280. package/dist/report/render/ui/confirm-dialog.js +34 -0
  281. package/dist/report/render/ui/data-table.js +49 -0
  282. package/dist/report/render/ui/drawer.js +25 -0
  283. package/dist/report/render/ui/file-chip.js +37 -0
  284. package/dist/report/render/ui/fold-line.js +22 -0
  285. package/dist/report/render/ui/guide-card.js +25 -0
  286. package/dist/report/render/ui/hero.js +37 -0
  287. package/dist/report/render/ui/labelled-select.js +10 -0
  288. package/dist/report/render/ui/live-script.js +222 -0
  289. package/dist/report/render/ui/local-date.js +58 -0
  290. package/dist/report/render/ui/mode-icon.js +6 -0
  291. package/dist/report/render/ui/page-shell.js +101 -0
  292. package/dist/report/render/ui/pill-tabs.js +47 -0
  293. package/dist/report/render/ui/popup.js +77 -0
  294. package/dist/report/render/ui/progress.js +35 -0
  295. package/dist/report/render/ui/project-list.js +284 -0
  296. package/dist/report/render/ui/scope-choice.js +19 -0
  297. package/dist/report/render/ui/stats.js +21 -0
  298. package/dist/report/render/ui/status-icon.js +30 -0
  299. package/dist/report/render/ui/status-look.js +21 -0
  300. package/dist/report/render/ui/switch.js +11 -0
  301. package/dist/report/render/ui/tag.js +19 -0
  302. package/dist/report/render/ui/task-list.js +56 -0
  303. package/dist/report/render/ui/tokens.js +46 -0
  304. package/dist/report/render/ui/update-notice.js +146 -0
  305. package/dist/report/render/ui/words/app-words.js +163 -0
  306. package/dist/report/render/ui/words/conversations-words.js +457 -0
  307. package/dist/report/render/ui/words/month-words.js +59 -0
  308. package/dist/report/render/ui/words/onboarding-words.js +446 -0
  309. package/dist/report/render/ui/words/projects-words.js +217 -0
  310. package/dist/report/render/ui/words/report-words.js +2099 -0
  311. package/dist/report/render/ui/words/settings-words.js +611 -0
  312. package/dist/report/render/ui/words/to-fix-words.js +287 -0
  313. package/dist/report/report-model.js +2 -0
  314. package/dist/report/report-use-case.js +1 -0
  315. package/dist/report/rule-names.js +20 -0
  316. package/dist/report/session-report.js +163 -0
  317. package/dist/report/start/app-nav.js +37 -0
  318. package/dist/report/start/conversations/calendar-view.js +104 -0
  319. package/dist/report/start/conversations/conversation-columns.js +187 -0
  320. package/dist/report/start/conversations/conversations-renderer.js +54 -0
  321. package/dist/report/start/conversations/empty-week.js +120 -0
  322. package/dist/report/start/conversations/files-window.js +166 -0
  323. package/dist/report/start/conversations/period-section.js +280 -0
  324. package/dist/report/start/conversations/periods-script.js +440 -0
  325. package/dist/report/start/conversations/periods.js +110 -0
  326. package/dist/report/start/conversations/week-view.js +30 -0
  327. package/dist/report/start/conversations/weeks.js +17 -0
  328. package/dist/report/start/month/month-renderer.js +50 -0
  329. package/dist/report/start/month/month-view.js +135 -0
  330. package/dist/report/start/month/months.js +17 -0
  331. package/dist/report/start/onboarding/done.js +171 -0
  332. package/dist/report/start/onboarding/finish-onboarding.js +93 -0
  333. package/dist/report/start/onboarding/intro.js +100 -0
  334. package/dist/report/start/onboarding/onboarding-changes.js +40 -0
  335. package/dist/report/start/onboarding/onboarding-renderer.js +195 -0
  336. package/dist/report/start/onboarding/onboarding-script.js +400 -0
  337. package/dist/report/start/onboarding/onboarding-view.js +98 -0
  338. package/dist/report/start/onboarding/project-step.js +210 -0
  339. package/dist/report/start/onboarding/steps.js +239 -0
  340. package/dist/report/start/onboarding/welcome.js +66 -0
  341. package/dist/report/start/page-notice.js +10 -0
  342. package/dist/report/start/projects/index-projects.js +43 -0
  343. package/dist/report/start/projects/moved-page.js +82 -0
  344. package/dist/report/start/projects/project-switch.js +138 -0
  345. package/dist/report/start/projects/projects-window.js +67 -0
  346. package/dist/report/start/projects/temporary-space.js +18 -0
  347. package/dist/report/start/render/air-datepicker-vendor.js +27 -0
  348. package/dist/report/start/render/session-status.js +41 -0
  349. package/dist/report/start/render/start-words.js +84 -0
  350. package/dist/report/start/repository.js +28 -0
  351. package/dist/report/start/serve/index-handler.js +372 -0
  352. package/dist/report/start/serve/onboarding-request.js +50 -0
  353. package/dist/report/start/serve/settings-request.js +1 -0
  354. package/dist/report/start/serve/settings-setup.js +193 -0
  355. package/dist/report/start/session-index.js +1 -0
  356. package/dist/report/start/session-start.js +974 -0
  357. package/dist/report/start/settings/alerts-tab.js +104 -0
  358. package/dist/report/start/settings/files-tab.js +169 -0
  359. package/dist/report/start/settings/general-tab.js +71 -0
  360. package/dist/report/start/settings/settings-renderer.js +254 -0
  361. package/dist/report/start/settings/settings-script.js +161 -0
  362. package/dist/report/start/settings/settings-view.js +240 -0
  363. package/dist/report/start/settings/settings-windows.js +334 -0
  364. package/dist/report/start/settings-files.js +43 -0
  365. package/dist/report/start/to-fix/done-list.js +45 -0
  366. package/dist/report/start/to-fix/file-window.js +110 -0
  367. package/dist/report/start/to-fix/to-fix-list.js +70 -0
  368. package/dist/report/start/to-fix/to-fix-renderer.js +237 -0
  369. package/dist/report/start/to-fix/to-fix-script.js +94 -0
  370. package/dist/report/start/to-fix/to-fix-view.js +124 -0
  371. package/dist/report/watch/agent-alert.js +72 -0
  372. package/dist/report/watch/notice-choices.js +35 -0
  373. package/dist/report/watch/notice-settings.js +65 -0
  374. package/dist/report/watch/preferences.js +100 -0
  375. package/dist/report/watch/render/instruction-words.js +54 -0
  376. package/dist/report/watch/render/notice-words.js +182 -0
  377. package/dist/report/watch/subagent-watch.js +345 -0
  378. package/dist/report/watch/watch-notice.js +1 -0
  379. package/dist/setup/behind.js +18 -0
  380. package/dist/setup/codex-mirror.js +171 -0
  381. package/dist/setup/not-a-project.js +19 -0
  382. package/dist/setup/project-setup.js +644 -0
  383. package/dist/setup/protected-patterns.js +30 -0
  384. package/dist/shared/colour.js +23 -0
  385. package/dist/shared/compare.js +4 -0
  386. package/dist/shared/content-version.js +13 -0
  387. package/dist/shared/counter.js +11 -0
  388. package/dist/shared/file-stamp.js +4 -0
  389. package/dist/shared/json.js +13 -0
  390. package/dist/shared/label.js +13 -0
  391. package/dist/shared/package-name.js +6 -0
  392. package/dist/shared/plain-invocation.js +44 -0
  393. package/dist/shared/plain-version.js +21 -0
  394. package/dist/shared/printable.js +25 -0
  395. package/dist/shared/renderer.js +1 -0
  396. package/dist/shared/sentence.js +20 -0
  397. package/dist/shared/terminal-logo.js +41 -0
  398. package/dist/shared/text-table.js +15 -0
  399. package/dist/shared/wrap.js +29 -0
  400. package/package.json +70 -0
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,135 @@
1
+ import { resolve } from 'node:path';
2
+ import { hasGlob, matchesName, reachOf } from '../core/access/search-reach.js';
3
+ import { protectionOf } from '../core/policy/policy.js';
4
+ import { FileAccessError } from '../ports/file-access-error.js';
5
+ /**
6
+ * How many directory entries one command may cost before the walk gives up. A search is walked breadth first, so a
7
+ * protected file near where it starts - a `.env` at the root - is met in the first listing; this bounds only a search
8
+ * that reaches nothing protected through a very large tree, which a hook on every shell command must not stall on.
9
+ */
10
+ const MAX_ENTRIES = 50_000;
11
+ /**
12
+ * The first protected file a command line would open without naming it: through a word the shell expands (`cat .env*`),
13
+ * or through a recursive search (`grep -rn KEY .`) whose own filters do not leave it out (R21a). Undefined when it
14
+ * reaches none. Paths are shown as the command would print them, relative to where it starts.
15
+ */
16
+ export async function protectedFileReached(command, policy, place, directories) {
17
+ const { searches, globs } = reachOf(command);
18
+ for (const word of globs) {
19
+ for (const path of await expand(word, place, directories)) {
20
+ const pattern = protectingPattern(policy, path, place);
21
+ if (pattern !== undefined)
22
+ return { kind: 'glob', word, path, pattern };
23
+ }
24
+ }
25
+ const budget = { left: MAX_ENTRIES };
26
+ for (const search of searches) {
27
+ const found = await walk(search, policy, place, directories, budget);
28
+ if (found !== undefined)
29
+ return { kind: 'search', ...found };
30
+ }
31
+ return budget.left < 0 ? { kind: 'too-large' } : undefined;
32
+ }
33
+ /**
34
+ * The names a shell would put in place of a glob, as it would write them. Only a glob in the last part of the word is
35
+ * expanded; a wildcard in a directory part is left alone, which misses a rarer command rather than guessing at one.
36
+ */
37
+ async function expand(word, place, directories) {
38
+ const slash = word.lastIndexOf('/');
39
+ const directory = word.slice(0, slash + 1);
40
+ const name = word.slice(slash + 1);
41
+ if (hasGlob(directory) || !hasGlob(name))
42
+ return [];
43
+ const entries = await listOf(directories, located(directory === '' ? '.' : directory, place));
44
+ return entries.filter((entry) => matchesName(entry.name, name, { period: true })).map((entry) => `${directory}${entry.name}`);
45
+ }
46
+ async function walk(search, policy, place, directories, budget) {
47
+ const roots = (await Promise.all(search.roots.map(async (root) => (hasGlob(root) ? expand(root, place, directories) : [root])))).flat();
48
+ const queue = [];
49
+ for (const root of roots) {
50
+ const kind = await kindOf(directories, located(root, place));
51
+ // A file named on the command line is read whatever the filters say about names met on the way down.
52
+ if (kind === 'file') {
53
+ const pattern = protectingPattern(policy, root, place);
54
+ if (pattern !== undefined)
55
+ return { path: root, pattern };
56
+ }
57
+ else if (kind === 'directory') {
58
+ queue.push(root);
59
+ }
60
+ }
61
+ for (let directory = queue.shift(); directory !== undefined; directory = queue.shift()) {
62
+ const entries = await listOf(directories, located(directory, place));
63
+ budget.left -= entries.length;
64
+ if (budget.left < 0)
65
+ return undefined;
66
+ const below = [];
67
+ for (const entry of entries) {
68
+ if (!search.hidden && entry.name.startsWith('.'))
69
+ continue;
70
+ const path = joined(directory, entry.name);
71
+ if (entry.kind === 'directory') {
72
+ if (!matchesAny(entry.name, search.excludeDirs))
73
+ below.push(path);
74
+ }
75
+ else if (entry.kind === 'file' && isSearched(entry.name, search)) {
76
+ const pattern = protectingPattern(policy, path, place);
77
+ if (pattern !== undefined)
78
+ return { path, pattern };
79
+ }
80
+ }
81
+ queue.push(...below);
82
+ }
83
+ return undefined;
84
+ }
85
+ function isSearched(name, search) {
86
+ return (search.includes.length === 0 || matchesAny(name, search.includes)) && !matchesAny(name, search.excludes);
87
+ }
88
+ /** A program matching its own globs has no rule about a leading dot. */
89
+ function matchesAny(name, globs) {
90
+ return globs.some(({ glob, caseless }) => matchesName(name, glob, { period: false, caseless: caseless === true }));
91
+ }
92
+ /** A path as a search prints it: `.env` below `.`, `apps/web/.env` below `apps`. */
93
+ function joined(directory, name) {
94
+ if (directory === '.' || directory === './')
95
+ return name;
96
+ return directory.endsWith('/') ? `${directory}${name}` : `${directory}/${name}`;
97
+ }
98
+ /** Tried as written first, as a report reads a command; then absolute, for a rule written with the whole path. */
99
+ function protectingPattern(policy, path, place) {
100
+ return (protectionOf(policy, path) ?? protectionOf(policy, located(path, place)))?.pattern;
101
+ }
102
+ /**
103
+ * The absolute path a word names once the shell has rewritten it: `~`, `$HOME` and `${HOME}` at its start become the
104
+ * home directory, `$PWD` and `${PWD}` where the command runs. Read as written, `grep -rn KEY ~/app` named a directory
105
+ * that is not there, and the `.env` below the real one was let through. Quoting was removed before the word got here, so
106
+ * a quoted `'~/app'`, which the shell leaves as it is, is read as the home too: a refusal the agent can answer, never a
107
+ * file let through. Any other variable is not known here and is left as written.
108
+ */
109
+ function located(word, place) {
110
+ const expanded = word
111
+ .replace(/^(?:~|\$HOME|\$\{HOME\})(?=\/|$)/, () => place.home)
112
+ .replace(/^(?:\$PWD|\$\{PWD\})(?=\/|$)/, () => place.workingDirectory);
113
+ return resolve(place.workingDirectory, expanded);
114
+ }
115
+ /** What cannot be listed is not searched by the command either, so it reaches nothing here. */
116
+ async function listOf(directories, path) {
117
+ try {
118
+ return await directories.list(path);
119
+ }
120
+ catch (error) {
121
+ if (!(error instanceof FileAccessError))
122
+ throw error;
123
+ return [];
124
+ }
125
+ }
126
+ async function kindOf(directories, path) {
127
+ try {
128
+ return await directories.kindOf(path);
129
+ }
130
+ catch (error) {
131
+ if (!(error instanceof FileAccessError))
132
+ throw error;
133
+ return undefined;
134
+ }
135
+ }
@@ -0,0 +1,88 @@
1
+ import { isAbsolute, join, dirname } from 'node:path';
2
+ import { parsePreToolUseInput } from '../adapter/claude-code/hooks/pre-tool-use-input.js';
3
+ import { PROJECT_HOOKS } from '../adapter/codex/contract/hooks.js';
4
+ import { parseCodexPreToolUseInput } from '../adapter/codex/hooks/pre-tool-use-input.js';
5
+ import { protectedPathsInCommand } from '../core/access/protected-access.js';
6
+ import { FileAccessError } from '../ports/file-access-error.js';
7
+ import { choosePolicy } from '../report/choose-policy.js';
8
+ import { blockingOnly } from '../core/policy/policy.js';
9
+ import { protectedFileReached } from './command-reach.js';
10
+ /** How many folders above the session's the project is looked for in: deeper than any project, short of a loop. */
11
+ const MAX_PROJECT_DEPTH = 64;
12
+ /** A command line is a few kilobytes; past this the input is not held at all, and the command is not checked. */
13
+ const MAX_INPUT_BYTES = 1024 * 1024;
14
+ /**
15
+ * `agentwhy refuse`: the project's own rules, applied to a shell command line before it runs
16
+ * (`specs/2026-09-16-worth-running-every-day.md` R18-R21a). It adds no rule of its own - the policy is chosen as `report`
17
+ * chooses it - and it reads the line with the code a report uses. A command that names a protected path is refused;
18
+ * so is one that would open a protected file without naming it, through a glob or a recursive search. The usage says
19
+ * what still walks past it.
20
+ */
21
+ export class CommandRefusal {
22
+ #dependencies;
23
+ constructor(dependencies) {
24
+ this.#dependencies = dependencies;
25
+ }
26
+ async decide(options) {
27
+ const { codex = false, ...choice } = options;
28
+ const text = await this.#dependencies.input.readAll(MAX_INPUT_BYTES);
29
+ const parsed = text === undefined ? undefined : codex ? parseCodexPreToolUseInput(text) : parsePreToolUseInput(text);
30
+ if (parsed === undefined || 'unusable' in parsed)
31
+ return { kind: 'not-checked', reason: 'input' };
32
+ if ('anotherTool' in parsed)
33
+ return { kind: 'allow' };
34
+ const settled = codex ? await this.#inCodexProject(choice, parsed.cwd ?? this.#dependencies.workingDirectory) : choice;
35
+ if (settled === undefined)
36
+ return { kind: 'not-checked', reason: 'project' };
37
+ const chosen = await choosePolicy(settled, this.#dependencies.files, this.#dependencies.tell);
38
+ if ('errors' in chosen)
39
+ return { kind: 'not-checked', reason: 'policy' };
40
+ // F57: a file a person asked only to be told about is theirs to let the agent read. Only what is blocked is refused.
41
+ const policy = { policy: blockingOnly(chosen.policy) };
42
+ const [first, ...others] = protectedPathsInCommand(parsed.command, policy.policy);
43
+ if (first !== undefined)
44
+ return { kind: 'refuse', path: first[0], pattern: first[1], others: others.length, route: { kind: 'named' } };
45
+ const workingDirectory = parsed.cwd ?? this.#dependencies.workingDirectory;
46
+ // R20 holds for the walk too: whatever it meets on disk, a failure lets the command run and is said to the user,
47
+ // never an exception from a hook that runs before every shell command.
48
+ const place = { workingDirectory, home: this.#dependencies.home };
49
+ const reach = await protectedFileReached(parsed.command, policy.policy, place, this.#dependencies.directories).catch(() => ({ kind: 'too-large' }));
50
+ if (reach === undefined)
51
+ return { kind: 'allow' };
52
+ if (reach.kind === 'too-large')
53
+ return { kind: 'not-checked', reason: 'search' };
54
+ const route = reach.kind === 'glob' ? { kind: 'glob', word: reach.word } : { kind: 'search' };
55
+ return { kind: 'refuse', path: reach.path, pattern: reach.pattern, others: 0, route };
56
+ }
57
+ /**
58
+ * CK3: Codex runs its hook in the session's folder, which can lie below the project, and names the project nowhere
59
+ * (CKB6). A relative settings path is read in the project: the nearest folder, at or above `folder`, that holds the
60
+ * `.codex/hooks.json` this hook is written in. None found is `undefined`: the command runs, and is said to be unchecked.
61
+ */
62
+ async #inCodexProject(choice, folder) {
63
+ const relative = choice.settingsPath;
64
+ if (relative === undefined || isAbsolute(relative))
65
+ return choice;
66
+ for (let at = folder, depth = 0; depth < MAX_PROJECT_DEPTH; depth += 1) {
67
+ if (await this.#holds(join(at, PROJECT_HOOKS.directory, PROJECT_HOOKS.file)))
68
+ return { ...choice, settingsPath: join(at, relative) };
69
+ const up = dirname(at);
70
+ if (up === at)
71
+ return undefined;
72
+ at = up;
73
+ }
74
+ return undefined;
75
+ }
76
+ /** Whether a file is there to read; a folder or anything unreadable is not. */
77
+ async #holds(path) {
78
+ try {
79
+ await this.#dependencies.files.readText(path);
80
+ return true;
81
+ }
82
+ catch (error) {
83
+ if (error instanceof FileAccessError)
84
+ return false;
85
+ throw error;
86
+ }
87
+ }
88
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * A continuation request, so the refusal is said in the conversation by Codex, in the user's language (CK13). Codex's
3
+ * VS Code chat folds the hook's own words into the turn's collapsed steps, so the reply is the one place a person sees
4
+ * agentwhy there: it is asked to lead with agentwhy's name. The person reads this request too - the VS Code chat shows
5
+ * it as "Hook feedback" and the terminal as "Blocked by hook" (CKB14) - so it is three short sentences in the page's
6
+ * words (guidelines §7): what happened, what to say, and what not to do. It gives no text to copy.
7
+ */
8
+ export function codexStopInstruction(refusals) {
9
+ const paths = [...new Set(refusals.map((refusal) => refusal.path))];
10
+ const named = paths.slice(0, 3).map((path) => JSON.stringify(path));
11
+ if (paths.length > 3)
12
+ named.push(`${paths.length - 3} more`);
13
+ const listed = named.length === 1 ? named[0] : `${named.slice(0, -1).join(', ')} and ${named.at(-1)}`;
14
+ const one = refusals.length === 1;
15
+ const [files, them] = paths.length === 1 ? ['file', 'it'] : ['files', 'them'];
16
+ return [
17
+ `agentwhy stopped ${one ? 'a command' : 'commands'} that would have read the private ${files} ${listed}, so ${one ? 'it' : 'they'} did not run.`,
18
+ `Say so to the user in one short message in their language, starting with **agentwhy**, and add that they can open the ${files} in their editor.`,
19
+ `Don't read ${them} another way or ask for what's in ${them}.`,
20
+ ].join(' ');
21
+ }
@@ -0,0 +1,34 @@
1
+ import { HOOK_OUTPUT } from '../../adapter/claude-code/contract/hooks.js';
2
+ const NOT_CHECKED = {
3
+ arguments: 'agentwhy refuse was given arguments it does not recognise, so this command was not checked.',
4
+ input: 'agentwhy refuse could not read the hook input, so this command was not checked.',
5
+ policy: 'agentwhy refuse could not read the policy it was given, so this command was not checked.',
6
+ search: 'agentwhy refuse could not look through everything this search reaches, so this command was not checked.',
7
+ project: 'agentwhy refuse found no .codex/hooks.json in this folder or above it, so it could not read the project\'s rules and this command was not checked.',
8
+ };
9
+ /** Said to the user, as a hook's JSON on stdout, when a command ran without being checked (R20). */
10
+ export function notCheckedMessage(reason) {
11
+ return JSON.stringify({ [HOOK_OUTPUT.systemMessage]: NOT_CHECKED[reason] });
12
+ }
13
+ /**
14
+ * What the agent is told when a command is refused (R19). A named path is the one the agent just wrote, so naming it
15
+ * tells the model nothing new. A path reached through a glob or a search is one the agent did not write: its name is
16
+ * given - a listing of the directory would show it anyway - and never anything from inside it (R21a). No other route
17
+ * is suggested. The person can inspect the file locally without putting its contents in the conversation.
18
+ */
19
+ export function refusalReason(path, pattern, others, route) {
20
+ const more = others === 0 ? '' : `, and ${others} more protected ${others === 1 ? 'path' : 'paths'}`;
21
+ return (`agentwhy refused this command: ${howItReaches(route, path)}, which this project's policy protects (${pattern})${more}. ` +
22
+ "Protected files are kept out of the agent's reach. Tell the user agentwhy blocked the command. " +
23
+ "Do not ask them to paste this file or a secret value into the chat; they can inspect it in their IDE.\n");
24
+ }
25
+ function howItReaches(route, path) {
26
+ switch (route.kind) {
27
+ case 'named':
28
+ return `it names ${path}`;
29
+ case 'glob':
30
+ return `${route.word} expands to ${path}`;
31
+ case 'search':
32
+ return `this search would read ${path}`;
33
+ }
34
+ }