@paths.design/caws-cli 10.2.0 → 11.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (421) hide show
  1. package/README.md +125 -374
  2. package/dist/index.js +43 -785
  3. package/dist/shell/binding/resolve-binding.d.ts +4 -0
  4. package/dist/shell/binding/resolve-binding.d.ts.map +1 -0
  5. package/dist/shell/binding/resolve-binding.js +228 -0
  6. package/dist/shell/binding/resolve-binding.js.map +1 -0
  7. package/dist/shell/binding/types.d.ts +42 -0
  8. package/dist/shell/binding/types.d.ts.map +1 -0
  9. package/dist/shell/binding/types.js +21 -0
  10. package/dist/shell/binding/types.js.map +1 -0
  11. package/dist/shell/commands/claim.d.ts +14 -0
  12. package/dist/shell/commands/claim.d.ts.map +1 -0
  13. package/dist/shell/commands/claim.js +197 -0
  14. package/dist/shell/commands/claim.js.map +1 -0
  15. package/dist/shell/commands/doctor.d.ts +13 -0
  16. package/dist/shell/commands/doctor.d.ts.map +1 -0
  17. package/dist/shell/commands/doctor.js +97 -0
  18. package/dist/shell/commands/doctor.js.map +1 -0
  19. package/dist/shell/commands/evidence.d.ts +28 -0
  20. package/dist/shell/commands/evidence.d.ts.map +1 -0
  21. package/dist/shell/commands/evidence.js +166 -0
  22. package/dist/shell/commands/evidence.js.map +1 -0
  23. package/dist/shell/commands/gates.d.ts +19 -0
  24. package/dist/shell/commands/gates.d.ts.map +1 -0
  25. package/dist/shell/commands/gates.js +181 -0
  26. package/dist/shell/commands/gates.js.map +1 -0
  27. package/dist/shell/commands/init.d.ts +8 -0
  28. package/dist/shell/commands/init.d.ts.map +1 -0
  29. package/dist/shell/commands/init.js +64 -0
  30. package/dist/shell/commands/init.js.map +1 -0
  31. package/dist/shell/commands/scope.d.ts +11 -0
  32. package/dist/shell/commands/scope.d.ts.map +1 -0
  33. package/dist/shell/commands/scope.js +92 -0
  34. package/dist/shell/commands/scope.js.map +1 -0
  35. package/dist/shell/commands/status.d.ts +15 -0
  36. package/dist/shell/commands/status.d.ts.map +1 -0
  37. package/dist/shell/commands/status.js +106 -0
  38. package/dist/shell/commands/status.js.map +1 -0
  39. package/dist/shell/commands/waiver.d.ts +38 -0
  40. package/dist/shell/commands/waiver.d.ts.map +1 -0
  41. package/dist/shell/commands/waiver.js +240 -0
  42. package/dist/shell/commands/waiver.js.map +1 -0
  43. package/dist/shell/gates/disposition.d.ts +23 -0
  44. package/dist/shell/gates/disposition.d.ts.map +1 -0
  45. package/dist/shell/gates/disposition.js +87 -0
  46. package/dist/shell/gates/disposition.js.map +1 -0
  47. package/dist/shell/gates/gate-result-contract.d.ts +39 -0
  48. package/dist/shell/gates/gate-result-contract.d.ts.map +1 -0
  49. package/dist/shell/gates/gate-result-contract.js +150 -0
  50. package/dist/shell/gates/gate-result-contract.js.map +1 -0
  51. package/dist/shell/gates/quality-gates-adapter.d.ts +55 -0
  52. package/dist/shell/gates/quality-gates-adapter.d.ts.map +1 -0
  53. package/dist/shell/gates/quality-gates-adapter.js +161 -0
  54. package/dist/shell/gates/quality-gates-adapter.js.map +1 -0
  55. package/dist/shell/gates/waiver-filter.d.ts +58 -0
  56. package/dist/shell/gates/waiver-filter.d.ts.map +1 -0
  57. package/dist/shell/gates/waiver-filter.js +119 -0
  58. package/dist/shell/gates/waiver-filter.js.map +1 -0
  59. package/dist/shell/index.d.ts +50 -0
  60. package/dist/shell/index.d.ts.map +1 -0
  61. package/dist/shell/index.js +73 -0
  62. package/dist/shell/index.js.map +1 -0
  63. package/dist/shell/register.d.ts +11 -0
  64. package/dist/shell/register.d.ts.map +1 -0
  65. package/dist/shell/register.js +274 -0
  66. package/dist/shell/register.js.map +1 -0
  67. package/dist/shell/render/claim.d.ts +22 -0
  68. package/dist/shell/render/claim.d.ts.map +1 -0
  69. package/dist/shell/render/claim.js +75 -0
  70. package/dist/shell/render/claim.js.map +1 -0
  71. package/dist/shell/render/decision.d.ts +15 -0
  72. package/dist/shell/render/decision.d.ts.map +1 -0
  73. package/dist/shell/render/decision.js +66 -0
  74. package/dist/shell/render/decision.js.map +1 -0
  75. package/dist/shell/render/diagnostic.d.ts +19 -0
  76. package/dist/shell/render/diagnostic.d.ts.map +1 -0
  77. package/dist/shell/render/diagnostic.js +76 -0
  78. package/dist/shell/render/diagnostic.js.map +1 -0
  79. package/dist/shell/render/finding.d.ts +15 -0
  80. package/dist/shell/render/finding.d.ts.map +1 -0
  81. package/dist/shell/render/finding.js +57 -0
  82. package/dist/shell/render/finding.js.map +1 -0
  83. package/dist/shell/render/gates.d.ts +3 -0
  84. package/dist/shell/render/gates.d.ts.map +1 -0
  85. package/dist/shell/render/gates.js +56 -0
  86. package/dist/shell/render/gates.js.map +1 -0
  87. package/dist/shell/render/init.d.ts +11 -0
  88. package/dist/shell/render/init.d.ts.map +1 -0
  89. package/dist/shell/render/init.js +32 -0
  90. package/dist/shell/render/init.js.map +1 -0
  91. package/dist/shell/render/status.d.ts +26 -0
  92. package/dist/shell/render/status.d.ts.map +1 -0
  93. package/dist/shell/render/status.js +143 -0
  94. package/dist/shell/render/status.js.map +1 -0
  95. package/dist/shell/render/waiver.d.ts +21 -0
  96. package/dist/shell/render/waiver.d.ts.map +1 -0
  97. package/dist/shell/render/waiver.js +94 -0
  98. package/dist/shell/render/waiver.js.map +1 -0
  99. package/dist/shell/rules.d.ts +37 -0
  100. package/dist/shell/rules.d.ts.map +1 -0
  101. package/dist/shell/rules.js +51 -0
  102. package/dist/shell/rules.js.map +1 -0
  103. package/dist/shell/session/actor.d.ts +14 -0
  104. package/dist/shell/session/actor.d.ts.map +1 -0
  105. package/dist/shell/session/actor.js +34 -0
  106. package/dist/shell/session/actor.js.map +1 -0
  107. package/dist/shell/session/resolve-session.d.ts +5 -0
  108. package/dist/shell/session/resolve-session.d.ts.map +1 -0
  109. package/dist/shell/session/resolve-session.js +239 -0
  110. package/dist/shell/session/resolve-session.js.map +1 -0
  111. package/dist/shell/session/types.d.ts +56 -0
  112. package/dist/shell/session/types.d.ts.map +1 -0
  113. package/dist/shell/session/types.js +15 -0
  114. package/dist/shell/session/types.js.map +1 -0
  115. package/dist/store/agents-store.d.ts +3 -0
  116. package/dist/store/agents-store.d.ts.map +1 -0
  117. package/dist/store/agents-store.js +63 -0
  118. package/dist/store/agents-store.js.map +1 -0
  119. package/dist/store/apply-patch.d.ts +16 -0
  120. package/dist/store/apply-patch.d.ts.map +1 -0
  121. package/dist/store/apply-patch.js +191 -0
  122. package/dist/store/apply-patch.js.map +1 -0
  123. package/dist/store/atomic-write.d.ts +16 -0
  124. package/dist/store/atomic-write.d.ts.map +1 -0
  125. package/dist/store/atomic-write.js +132 -0
  126. package/dist/store/atomic-write.js.map +1 -0
  127. package/dist/store/doctor-snapshot.d.ts +20 -0
  128. package/dist/store/doctor-snapshot.d.ts.map +1 -0
  129. package/dist/store/doctor-snapshot.js +176 -0
  130. package/dist/store/doctor-snapshot.js.map +1 -0
  131. package/dist/store/events-store.d.ts +33 -0
  132. package/dist/store/events-store.d.ts.map +1 -0
  133. package/dist/store/events-store.js +297 -0
  134. package/dist/store/events-store.js.map +1 -0
  135. package/dist/store/index.d.ts +21 -0
  136. package/dist/store/index.d.ts.map +1 -0
  137. package/dist/store/index.js +47 -0
  138. package/dist/store/index.js.map +1 -0
  139. package/dist/store/init-store.d.ts +21 -0
  140. package/dist/store/init-store.d.ts.map +1 -0
  141. package/dist/store/init-store.js +295 -0
  142. package/dist/store/init-store.js.map +1 -0
  143. package/dist/store/json-store.d.ts +3 -0
  144. package/dist/store/json-store.d.ts.map +1 -0
  145. package/dist/store/json-store.js +65 -0
  146. package/dist/store/json-store.js.map +1 -0
  147. package/dist/store/policy-store.d.ts +3 -0
  148. package/dist/store/policy-store.d.ts.map +1 -0
  149. package/dist/store/policy-store.js +65 -0
  150. package/dist/store/policy-store.js.map +1 -0
  151. package/dist/store/repo-root.d.ts +46 -0
  152. package/dist/store/repo-root.d.ts.map +1 -0
  153. package/dist/store/repo-root.js +145 -0
  154. package/dist/store/repo-root.js.map +1 -0
  155. package/dist/store/rules.d.ts +53 -0
  156. package/dist/store/rules.d.ts.map +1 -0
  157. package/dist/store/rules.js +78 -0
  158. package/dist/store/rules.js.map +1 -0
  159. package/dist/store/specs-store.d.ts +3 -0
  160. package/dist/store/specs-store.d.ts.map +1 -0
  161. package/dist/store/specs-store.js +131 -0
  162. package/dist/store/specs-store.js.map +1 -0
  163. package/dist/store/types.d.ts +84 -0
  164. package/dist/store/types.d.ts.map +1 -0
  165. package/dist/store/types.js +14 -0
  166. package/dist/store/types.js.map +1 -0
  167. package/dist/store/waivers-store.d.ts +25 -0
  168. package/dist/store/waivers-store.d.ts.map +1 -0
  169. package/dist/store/waivers-store.js +232 -0
  170. package/dist/store/waivers-store.js.map +1 -0
  171. package/dist/store/worktrees-store.d.ts +3 -0
  172. package/dist/store/worktrees-store.d.ts.map +1 -0
  173. package/dist/store/worktrees-store.js +62 -0
  174. package/dist/store/worktrees-store.js.map +1 -0
  175. package/dist/store/yaml-store.d.ts +9 -0
  176. package/dist/store/yaml-store.d.ts.map +1 -0
  177. package/dist/store/yaml-store.js +121 -0
  178. package/dist/store/yaml-store.js.map +1 -0
  179. package/package.json +15 -13
  180. package/dist/budget-derivation.js +0 -751
  181. package/dist/cicd-optimizer.js +0 -504
  182. package/dist/commands/agents.js +0 -124
  183. package/dist/commands/archive.js +0 -500
  184. package/dist/commands/burnup.js +0 -198
  185. package/dist/commands/diagnose.js +0 -525
  186. package/dist/commands/evaluate.js +0 -314
  187. package/dist/commands/gates.js +0 -149
  188. package/dist/commands/init.js +0 -857
  189. package/dist/commands/iterate.js +0 -417
  190. package/dist/commands/mode.js +0 -269
  191. package/dist/commands/parallel.js +0 -242
  192. package/dist/commands/plan.js +0 -438
  193. package/dist/commands/provenance.js +0 -1143
  194. package/dist/commands/quality-monitor.js +0 -284
  195. package/dist/commands/scope.js +0 -264
  196. package/dist/commands/session.js +0 -312
  197. package/dist/commands/sidecar.js +0 -74
  198. package/dist/commands/specs.js +0 -1656
  199. package/dist/commands/status.js +0 -1172
  200. package/dist/commands/templates.js +0 -237
  201. package/dist/commands/tool.js +0 -136
  202. package/dist/commands/tutorial.js +0 -480
  203. package/dist/commands/validate.js +0 -357
  204. package/dist/commands/verify-acs.js +0 -443
  205. package/dist/commands/waivers.js +0 -599
  206. package/dist/commands/workflow.js +0 -243
  207. package/dist/commands/worktree.js +0 -502
  208. package/dist/config/lite-scope.js +0 -158
  209. package/dist/config/modes.js +0 -347
  210. package/dist/constants/spec-types.js +0 -65
  211. package/dist/gates/budget-limit.js +0 -121
  212. package/dist/gates/feedback.js +0 -260
  213. package/dist/gates/format.js +0 -179
  214. package/dist/gates/god-object.js +0 -117
  215. package/dist/gates/pipeline.js +0 -167
  216. package/dist/gates/scope-boundary.js +0 -112
  217. package/dist/gates/spec-completeness.js +0 -109
  218. package/dist/gates/todo-detection.js +0 -205
  219. package/dist/generators/jest-config-generator.js +0 -242
  220. package/dist/generators/working-spec.js +0 -237
  221. package/dist/minimal-cli.js +0 -88
  222. package/dist/parallel/parallel-manager.js +0 -433
  223. package/dist/policy/PolicyManager.js +0 -470
  224. package/dist/scaffold/claude-hooks.js +0 -443
  225. package/dist/scaffold/cursor-hooks.js +0 -177
  226. package/dist/scaffold/git-hooks.js +0 -928
  227. package/dist/scaffold/index.js +0 -794
  228. package/dist/session/session-manager.js +0 -653
  229. package/dist/sidecars/index.js +0 -33
  230. package/dist/sidecars/listeners.js +0 -40
  231. package/dist/sidecars/provenance-summary.js +0 -238
  232. package/dist/sidecars/quality-gaps.js +0 -258
  233. package/dist/sidecars/schema.js +0 -149
  234. package/dist/sidecars/spec-drift.js +0 -151
  235. package/dist/sidecars/waiver-draft.js +0 -176
  236. package/dist/spec/SpecFileManager.js +0 -419
  237. package/dist/templates/.caws/schemas/policy.schema.json +0 -117
  238. package/dist/templates/.caws/schemas/scope.schema.json +0 -52
  239. package/dist/templates/.caws/schemas/waivers.schema.json +0 -106
  240. package/dist/templates/.caws/schemas/working-spec.schema.json +0 -340
  241. package/dist/templates/.caws/schemas/worktrees.schema.json +0 -38
  242. package/dist/templates/.caws/templates/working-spec.template.yml +0 -80
  243. package/dist/templates/.caws/tools/README.md +0 -18
  244. package/dist/templates/.caws/tools/scope-guard.js +0 -203
  245. package/dist/templates/.caws/tools-allow.json +0 -331
  246. package/dist/templates/.caws/waivers.yml +0 -19
  247. package/dist/templates/.claude/README.md +0 -190
  248. package/dist/templates/.claude/hooks/audit.sh +0 -121
  249. package/dist/templates/.claude/hooks/block-dangerous.sh +0 -203
  250. package/dist/templates/.claude/hooks/classify_command.py +0 -592
  251. package/dist/templates/.claude/hooks/doc-frontmatter-check.sh +0 -173
  252. package/dist/templates/.claude/hooks/lite-sprawl-check.sh +0 -145
  253. package/dist/templates/.claude/hooks/naming-check.sh +0 -100
  254. package/dist/templates/.claude/hooks/protected-paths.sh +0 -39
  255. package/dist/templates/.claude/hooks/quality-check.sh +0 -81
  256. package/dist/templates/.claude/hooks/scan-secrets.sh +0 -85
  257. package/dist/templates/.claude/hooks/scope-guard.sh +0 -381
  258. package/dist/templates/.claude/hooks/session-caws-status.sh +0 -117
  259. package/dist/templates/.claude/hooks/session-log.sh +0 -634
  260. package/dist/templates/.claude/hooks/simplification-guard.sh +0 -92
  261. package/dist/templates/.claude/hooks/stop-worktree-check.sh +0 -46
  262. package/dist/templates/.claude/hooks/test_classify_command.py +0 -370
  263. package/dist/templates/.claude/hooks/test_wrapper_smoke.sh +0 -96
  264. package/dist/templates/.claude/hooks/validate-spec.sh +0 -76
  265. package/dist/templates/.claude/hooks/worktree-guard.sh +0 -220
  266. package/dist/templates/.claude/hooks/worktree-write-guard.sh +0 -190
  267. package/dist/templates/.claude/rules/git-safety.md +0 -26
  268. package/dist/templates/.claude/rules/worktree-isolation.md +0 -101
  269. package/dist/templates/.claude/settings.json +0 -141
  270. package/dist/templates/.cursor/README.md +0 -299
  271. package/dist/templates/.cursor/hooks/audit.sh +0 -55
  272. package/dist/templates/.cursor/hooks/block-dangerous.sh +0 -84
  273. package/dist/templates/.cursor/hooks/caws-quality-check.sh +0 -52
  274. package/dist/templates/.cursor/hooks/caws-scope-guard.sh +0 -130
  275. package/dist/templates/.cursor/hooks/format.sh +0 -38
  276. package/dist/templates/.cursor/hooks/naming-check.sh +0 -64
  277. package/dist/templates/.cursor/hooks/scan-secrets.sh +0 -51
  278. package/dist/templates/.cursor/hooks/scope-guard.sh +0 -52
  279. package/dist/templates/.cursor/hooks/session-log.sh +0 -924
  280. package/dist/templates/.cursor/hooks/validate-spec.sh +0 -83
  281. package/dist/templates/.cursor/hooks.json +0 -76
  282. package/dist/templates/.cursor/rules/00-claims-verification.mdc +0 -144
  283. package/dist/templates/.cursor/rules/01-working-style.mdc +0 -50
  284. package/dist/templates/.cursor/rules/02-quality-gates.mdc +0 -368
  285. package/dist/templates/.cursor/rules/03-naming-and-refactor.mdc +0 -33
  286. package/dist/templates/.cursor/rules/04-logging-language-style.mdc +0 -23
  287. package/dist/templates/.cursor/rules/05-safe-defaults-guards.mdc +0 -23
  288. package/dist/templates/.cursor/rules/06-typescript-conventions.mdc +0 -36
  289. package/dist/templates/.cursor/rules/07-process-ops.mdc +0 -20
  290. package/dist/templates/.cursor/rules/08-solid-and-architecture.mdc +0 -16
  291. package/dist/templates/.cursor/rules/09-docstrings.mdc +0 -89
  292. package/dist/templates/.cursor/rules/10-documentation-quality-standards.mdc +0 -385
  293. package/dist/templates/.cursor/rules/11-scope-management-waivers.mdc +0 -381
  294. package/dist/templates/.cursor/rules/12-implementation-completeness.mdc +0 -516
  295. package/dist/templates/.cursor/rules/13-language-agnostic-standards.mdc +0 -578
  296. package/dist/templates/.cursor/rules/README.md +0 -148
  297. package/dist/templates/.github/copilot-instructions.md +0 -82
  298. package/dist/templates/.idea/runConfigurations/CAWS_Evaluate.xml +0 -5
  299. package/dist/templates/.idea/runConfigurations/CAWS_Validate.xml +0 -5
  300. package/dist/templates/.junie/guidelines.md +0 -73
  301. package/dist/templates/.vscode/launch.json +0 -17
  302. package/dist/templates/.vscode/settings.json +0 -95
  303. package/dist/templates/.windsurf/rules/caws-quality-standards.md +0 -54
  304. package/dist/templates/.windsurf/workflows/caws-guided-development.md +0 -92
  305. package/dist/templates/CLAUDE.md +0 -196
  306. package/dist/templates/COMMIT_CONVENTIONS.md +0 -86
  307. package/dist/templates/OIDC_SETUP.md +0 -300
  308. package/dist/templates/agents.md +0 -171
  309. package/dist/templates/codemod/README.md +0 -1
  310. package/dist/templates/codemod/test.js +0 -93
  311. package/dist/templates/docs/README.md +0 -151
  312. package/dist/templates/scripts/new_feature.sh +0 -80
  313. package/dist/templates/scripts/quality-gates/check-god-objects.js +0 -146
  314. package/dist/templates/scripts/quality-gates/run-quality-gates.js +0 -50
  315. package/dist/templates/scripts/v3/analysis/todo_analyzer.py +0 -1997
  316. package/dist/test-analysis.js +0 -786
  317. package/dist/tool-interface.js +0 -314
  318. package/dist/tool-loader.js +0 -303
  319. package/dist/tool-validator.js +0 -393
  320. package/dist/utils/agent-display.js +0 -210
  321. package/dist/utils/agent-session.js +0 -344
  322. package/dist/utils/async-utils.js +0 -188
  323. package/dist/utils/command-wrapper.js +0 -200
  324. package/dist/utils/event-log.js +0 -584
  325. package/dist/utils/event-renderer.js +0 -521
  326. package/dist/utils/finalization.js +0 -230
  327. package/dist/utils/git-lock.js +0 -119
  328. package/dist/utils/gitignore-updater.js +0 -158
  329. package/dist/utils/ide-detection.js +0 -133
  330. package/dist/utils/lifecycle-events.js +0 -94
  331. package/dist/utils/project-analysis.js +0 -367
  332. package/dist/utils/promise-utils.js +0 -72
  333. package/dist/utils/quality-gates-errors.js +0 -520
  334. package/dist/utils/quality-gates-utils.js +0 -387
  335. package/dist/utils/schema-validator.js +0 -50
  336. package/dist/utils/spec-resolver.js +0 -711
  337. package/dist/utils/typescript-detector.js +0 -369
  338. package/dist/utils/working-state.js +0 -530
  339. package/dist/utils/yaml-validation.js +0 -156
  340. package/dist/validation/spec-validation.js +0 -924
  341. package/dist/waivers-manager.js +0 -732
  342. package/dist/worktree/worktree-manager.js +0 -1735
  343. package/templates/.caws/schemas/policy.schema.json +0 -117
  344. package/templates/.caws/schemas/scope.schema.json +0 -52
  345. package/templates/.caws/schemas/waivers.schema.json +0 -106
  346. package/templates/.caws/schemas/working-spec.schema.json +0 -340
  347. package/templates/.caws/schemas/worktrees.schema.json +0 -38
  348. package/templates/.caws/templates/working-spec.template.yml +0 -80
  349. package/templates/.caws/tools/README.md +0 -18
  350. package/templates/.caws/tools/scope-guard.js +0 -203
  351. package/templates/.caws/tools-allow.json +0 -331
  352. package/templates/.caws/waivers.yml +0 -19
  353. package/templates/.claude/README.md +0 -190
  354. package/templates/.claude/hooks/audit.sh +0 -121
  355. package/templates/.claude/hooks/block-dangerous.sh +0 -203
  356. package/templates/.claude/hooks/classify_command.py +0 -592
  357. package/templates/.claude/hooks/doc-frontmatter-check.sh +0 -173
  358. package/templates/.claude/hooks/lite-sprawl-check.sh +0 -145
  359. package/templates/.claude/hooks/naming-check.sh +0 -100
  360. package/templates/.claude/hooks/protected-paths.sh +0 -39
  361. package/templates/.claude/hooks/quality-check.sh +0 -81
  362. package/templates/.claude/hooks/scan-secrets.sh +0 -85
  363. package/templates/.claude/hooks/scope-guard.sh +0 -381
  364. package/templates/.claude/hooks/session-caws-status.sh +0 -117
  365. package/templates/.claude/hooks/session-log.sh +0 -634
  366. package/templates/.claude/hooks/simplification-guard.sh +0 -92
  367. package/templates/.claude/hooks/stop-worktree-check.sh +0 -46
  368. package/templates/.claude/hooks/test_classify_command.py +0 -370
  369. package/templates/.claude/hooks/test_wrapper_smoke.sh +0 -96
  370. package/templates/.claude/hooks/validate-spec.sh +0 -76
  371. package/templates/.claude/hooks/worktree-guard.sh +0 -220
  372. package/templates/.claude/hooks/worktree-write-guard.sh +0 -190
  373. package/templates/.claude/rules/git-safety.md +0 -26
  374. package/templates/.claude/rules/worktree-isolation.md +0 -101
  375. package/templates/.claude/settings.json +0 -141
  376. package/templates/.cursor/README.md +0 -299
  377. package/templates/.cursor/hooks/audit.sh +0 -55
  378. package/templates/.cursor/hooks/block-dangerous.sh +0 -84
  379. package/templates/.cursor/hooks/caws-quality-check.sh +0 -52
  380. package/templates/.cursor/hooks/caws-scope-guard.sh +0 -130
  381. package/templates/.cursor/hooks/format.sh +0 -38
  382. package/templates/.cursor/hooks/naming-check.sh +0 -64
  383. package/templates/.cursor/hooks/scan-secrets.sh +0 -51
  384. package/templates/.cursor/hooks/scope-guard.sh +0 -52
  385. package/templates/.cursor/hooks/session-log.sh +0 -924
  386. package/templates/.cursor/hooks/validate-spec.sh +0 -83
  387. package/templates/.cursor/hooks.json +0 -76
  388. package/templates/.cursor/rules/00-claims-verification.mdc +0 -144
  389. package/templates/.cursor/rules/01-working-style.mdc +0 -50
  390. package/templates/.cursor/rules/02-quality-gates.mdc +0 -368
  391. package/templates/.cursor/rules/03-naming-and-refactor.mdc +0 -33
  392. package/templates/.cursor/rules/04-logging-language-style.mdc +0 -23
  393. package/templates/.cursor/rules/05-safe-defaults-guards.mdc +0 -23
  394. package/templates/.cursor/rules/06-typescript-conventions.mdc +0 -36
  395. package/templates/.cursor/rules/07-process-ops.mdc +0 -20
  396. package/templates/.cursor/rules/08-solid-and-architecture.mdc +0 -16
  397. package/templates/.cursor/rules/09-docstrings.mdc +0 -89
  398. package/templates/.cursor/rules/10-documentation-quality-standards.mdc +0 -385
  399. package/templates/.cursor/rules/11-scope-management-waivers.mdc +0 -381
  400. package/templates/.cursor/rules/12-implementation-completeness.mdc +0 -516
  401. package/templates/.cursor/rules/13-language-agnostic-standards.mdc +0 -578
  402. package/templates/.cursor/rules/README.md +0 -148
  403. package/templates/.github/copilot-instructions.md +0 -82
  404. package/templates/.idea/runConfigurations/CAWS_Evaluate.xml +0 -5
  405. package/templates/.idea/runConfigurations/CAWS_Validate.xml +0 -5
  406. package/templates/.junie/guidelines.md +0 -73
  407. package/templates/.vscode/launch.json +0 -17
  408. package/templates/.vscode/settings.json +0 -95
  409. package/templates/.windsurf/rules/caws-quality-standards.md +0 -54
  410. package/templates/.windsurf/workflows/caws-guided-development.md +0 -92
  411. package/templates/CLAUDE.md +0 -196
  412. package/templates/COMMIT_CONVENTIONS.md +0 -86
  413. package/templates/OIDC_SETUP.md +0 -300
  414. package/templates/agents.md +0 -171
  415. package/templates/codemod/README.md +0 -1
  416. package/templates/codemod/test.js +0 -93
  417. package/templates/docs/README.md +0 -151
  418. package/templates/scripts/new_feature.sh +0 -80
  419. package/templates/scripts/quality-gates/check-god-objects.js +0 -146
  420. package/templates/scripts/quality-gates/run-quality-gates.js +0 -50
  421. package/templates/scripts/v3/analysis/todo_analyzer.py +0 -1997
@@ -1,190 +0,0 @@
1
- # Claude Code Integration for CAWS
2
-
3
- This directory contains Claude Code hooks and configuration for CAWS (Coding Agent Working Standard) integration.
4
-
5
- ## Overview
6
-
7
- CAWS hooks for Claude Code provide:
8
-
9
- - **Safety Gates**: Block dangerous commands and scan for secrets
10
- - **Quality Gates**: Run CAWS quality checks after file edits
11
- - **Scope Guards**: Validate edits against the working spec's scope
12
- - **Audit Logging**: Track agent actions for compliance
13
-
14
- ## Directory Structure
15
-
16
- ```
17
- .claude/
18
- ├── settings.json # Claude Code settings with hooks configuration
19
- ├── hooks/ # Hook scripts
20
- │ ├── audit.sh # Session and action logging
21
- │ ├── block-dangerous.sh # Block destructive commands
22
- │ ├── scan-secrets.sh # Warn when reading sensitive files
23
- │ ├── quality-check.sh # Run CAWS quality gates
24
- │ ├── validate-spec.sh # Validate spec files
25
- │ ├── scope-guard.sh # Check scope boundaries
26
- │ └── naming-check.sh # Validate file naming conventions
27
- ├── logs/ # Audit logs (gitignored)
28
- └── README.md # This file
29
- ```
30
-
31
- ## Hook Events
32
-
33
- ### PreToolUse Hooks
34
-
35
- Run before Claude executes a tool:
36
-
37
- | Hook | Matcher | Purpose |
38
- |------|---------|---------|
39
- | `block-dangerous.sh` | `Bash` | Block destructive shell commands |
40
- | `scan-secrets.sh` | `Read` | Warn when reading sensitive files |
41
- | `scope-guard.sh` | `Write\|Edit` | Check scope boundaries before edits (use `caws scope show` to diagnose blocks) |
42
-
43
- ### PostToolUse Hooks
44
-
45
- Run after Claude executes a tool:
46
-
47
- | Hook | Matcher | Purpose |
48
- |------|---------|---------|
49
- | `quality-check.sh` | `Write\|Edit` | Run CAWS quality gates |
50
- | `validate-spec.sh` | `Write\|Edit` | Validate spec file changes |
51
- | `naming-check.sh` | `Write` | Check file naming conventions |
52
- | `audit.sh` | `Write\|Edit\|Bash` | Log tool usage |
53
-
54
- ### Session Hooks
55
-
56
- | Hook | Event | Purpose |
57
- |------|-------|---------|
58
- | `audit.sh session-start` | `SessionStart` | Log session start |
59
- | `audit.sh stop` | `Stop` | Log session end |
60
-
61
- ## Configuration
62
-
63
- ### Enable/Disable Hooks
64
-
65
- Edit `settings.json` to enable or disable specific hooks. Remove entries from the `hooks` object to disable them.
66
-
67
- ### Hook Levels
68
-
69
- The scaffold supports four hook levels:
70
-
71
- - **safety**: Block dangerous commands, scan for secrets
72
- - **quality**: Run quality gates on file edits
73
- - **scope**: Validate edits against spec scope
74
- - **audit**: Log all agent actions
75
-
76
- Run `caws init --hooks=safety,quality` to enable specific levels.
77
-
78
- ## Audit Logs
79
-
80
- Audit logs are written to `.claude/logs/`:
81
-
82
- - `audit.log` - All-time log (appended)
83
- - `audit-YYYY-MM-DD.log` - Daily logs
84
-
85
- Logs are JSON-formatted for easy parsing:
86
-
87
- ```json
88
- {
89
- "timestamp": "2024-01-15T10:30:00Z",
90
- "session_id": "abc123",
91
- "event": "tool_use",
92
- "tool": "Write",
93
- "file": "src/index.ts",
94
- "cwd": "/project"
95
- }
96
- ```
97
-
98
- ## Customization
99
-
100
- ### Adding Custom Hooks
101
-
102
- 1. Create a new script in `.claude/hooks/`
103
- 2. Make it executable: `chmod +x .claude/hooks/my-hook.sh`
104
- 3. Add it to `settings.json`:
105
-
106
- ```json
107
- {
108
- "hooks": {
109
- "PostToolUse": [
110
- {
111
- "matcher": "Write|Edit",
112
- "hooks": [
113
- {
114
- "type": "command",
115
- "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/my-hook.sh",
116
- "timeout": 10
117
- }
118
- ]
119
- }
120
- ]
121
- }
122
- }
123
- ```
124
-
125
- ### Hook Input/Output
126
-
127
- Hooks receive JSON input via stdin:
128
-
129
- ```json
130
- {
131
- "session_id": "abc123",
132
- "hook_event_name": "PostToolUse",
133
- "tool_name": "Write",
134
- "tool_input": {
135
- "file_path": "/path/to/file.ts",
136
- "content": "..."
137
- },
138
- "tool_response": { "success": true }
139
- }
140
- ```
141
-
142
- Hooks can output JSON to control Claude's behavior:
143
-
144
- ```json
145
- {
146
- "decision": "block",
147
- "reason": "Quality gate failed: ..."
148
- }
149
- ```
150
-
151
- Or add context:
152
-
153
- ```json
154
- {
155
- "hookSpecificOutput": {
156
- "hookEventName": "PostToolUse",
157
- "additionalContext": "Remember to update the tests."
158
- }
159
- }
160
- ```
161
-
162
- ## Troubleshooting
163
-
164
- ### Hooks Not Running
165
-
166
- 1. Check `settings.json` syntax: `cat .claude/settings.json | jq .`
167
- 2. Verify scripts are executable: `ls -la .claude/hooks/`
168
- 3. Test hooks manually: `echo '{}' | .claude/hooks/audit.sh`
169
-
170
- ### Permission Errors
171
-
172
- Make all hook scripts executable:
173
-
174
- ```bash
175
- chmod +x .claude/hooks/*.sh
176
- ```
177
-
178
- ### Debug Hooks
179
-
180
- Run Claude Code with `--debug` to see hook execution details:
181
-
182
- ```bash
183
- claude --debug
184
- ```
185
-
186
- ## Further Reading
187
-
188
- - [Claude Code Hooks Documentation](https://code.claude.com/docs/en/hooks)
189
- - [CAWS Quality Gates](../../docs/quality-gates.md)
190
- - [CAWS Scope Management](../../docs/scope-management.md)
@@ -1,121 +0,0 @@
1
- #!/bin/bash
2
- # CAWS Audit Hook for Claude Code
3
- # Logs agent actions for compliance and debugging
4
- # @author @darianrosebrook
5
-
6
- set -euo pipefail
7
-
8
- # Get event type from argument or input
9
- EVENT_TYPE="${1:-tool-use}"
10
-
11
- # Read JSON input from stdin
12
- INPUT=$(cat)
13
-
14
- # Parse common fields from Claude Code hook input
15
- SESSION_ID=$(echo "$INPUT" | jq -r '.session_id // "unknown"')
16
- CWD=$(echo "$INPUT" | jq -r '.cwd // "."')
17
- HOOK_EVENT=$(echo "$INPUT" | jq -r '.hook_event_name // "unknown"')
18
- TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // ""')
19
- PERMISSION_MODE=$(echo "$INPUT" | jq -r '.permission_mode // "default"')
20
-
21
- # Ensure log directory exists
22
- LOG_DIR="${CLAUDE_PROJECT_DIR:-.}/.claude/logs"
23
- mkdir -p "$LOG_DIR"
24
-
25
- # Log file path
26
- LOG_FILE="$LOG_DIR/audit.log"
27
- DATE_LOG_FILE="$LOG_DIR/audit-$(date +%Y-%m-%d).log"
28
-
29
- # Timestamp
30
- TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
31
-
32
- # Build log entry based on event type
33
- case "$EVENT_TYPE" in
34
- session-start)
35
- SOURCE=$(echo "$INPUT" | jq -r '.source // "unknown"')
36
- MODEL=$(echo "$INPUT" | jq -r '.model // "unknown"')
37
- LOG_ENTRY=$(jq -n \
38
- --arg ts "$TIMESTAMP" \
39
- --arg sid "$SESSION_ID" \
40
- --arg event "session_start" \
41
- --arg source "$SOURCE" \
42
- --arg model "$MODEL" \
43
- --arg cwd "$CWD" \
44
- '{timestamp: $ts, session_id: $sid, event: $event, source: $source, model: $model, cwd: $cwd}')
45
- ;;
46
-
47
- stop)
48
- STOP_HOOK_ACTIVE=$(echo "$INPUT" | jq -r '.stop_hook_active // false')
49
- LOG_ENTRY=$(jq -n \
50
- --arg ts "$TIMESTAMP" \
51
- --arg sid "$SESSION_ID" \
52
- --arg event "session_stop" \
53
- --arg cwd "$CWD" \
54
- --argjson hook_active "$STOP_HOOK_ACTIVE" \
55
- '{timestamp: $ts, session_id: $sid, event: $event, cwd: $cwd, stop_hook_active: $hook_active}')
56
- ;;
57
-
58
- tool-use)
59
- # Extract tool-specific info
60
- TOOL_INPUT=$(echo "$INPUT" | jq -c '.tool_input // {}')
61
- TOOL_RESPONSE=$(echo "$INPUT" | jq -c '.tool_response // {}')
62
- TOOL_USE_ID=$(echo "$INPUT" | jq -r '.tool_use_id // ""')
63
-
64
- # For file operations, extract the path
65
- FILE_PATH=$(echo "$TOOL_INPUT" | jq -r '.file_path // ""')
66
- COMMAND=$(echo "$TOOL_INPUT" | jq -r '.command // ""')
67
-
68
- LOG_ENTRY=$(jq -n \
69
- --arg ts "$TIMESTAMP" \
70
- --arg sid "$SESSION_ID" \
71
- --arg event "tool_use" \
72
- --arg tool "$TOOL_NAME" \
73
- --arg file "$FILE_PATH" \
74
- --arg cmd "$COMMAND" \
75
- --arg cwd "$CWD" \
76
- --arg mode "$PERMISSION_MODE" \
77
- '{timestamp: $ts, session_id: $sid, event: $event, tool: $tool, file: $file, command: $cmd, cwd: $cwd, permission_mode: $mode}')
78
- ;;
79
-
80
- *)
81
- LOG_ENTRY=$(jq -n \
82
- --arg ts "$TIMESTAMP" \
83
- --arg sid "$SESSION_ID" \
84
- --arg event "$EVENT_TYPE" \
85
- --arg hook "$HOOK_EVENT" \
86
- --arg cwd "$CWD" \
87
- '{timestamp: $ts, session_id: $sid, event: $event, hook_event: $hook, cwd: $cwd}')
88
- ;;
89
- esac
90
-
91
- # --- Log rotation ---
92
- # Keep main audit.log under 10MB; keep date-logs for 30 days
93
- rotate_logs() {
94
- # Rotate main audit.log at 10MB
95
- if [[ -f "$LOG_FILE" ]]; then
96
- local size
97
- size=$(wc -c < "$LOG_FILE" 2>/dev/null | tr -d ' ')
98
- if [[ "$size" -gt 10485760 ]]; then
99
- # Keep last rotated copy, discard older
100
- [[ -f "${LOG_FILE}.1" ]] && rm -f "${LOG_FILE}.1"
101
- mv "$LOG_FILE" "${LOG_FILE}.1"
102
- fi
103
- fi
104
-
105
- # Prune date-based logs older than 30 days
106
- if [[ -d "$LOG_DIR" ]]; then
107
- find "$LOG_DIR" -name 'audit-*.log' -type f -mtime +30 -delete 2>/dev/null || true
108
- fi
109
- }
110
-
111
- # Run rotation check ~1% of the time (avoid stat overhead on every tool call)
112
- if [[ $(( RANDOM % 100 )) -eq 0 ]]; then
113
- rotate_logs
114
- fi
115
-
116
- # Append to log files
117
- echo "$LOG_ENTRY" >> "$LOG_FILE"
118
- echo "$LOG_ENTRY" >> "$DATE_LOG_FILE"
119
-
120
- # Success - allow operation to continue
121
- exit 0
@@ -1,203 +0,0 @@
1
- #!/bin/bash
2
- # CAWS Command Safety Gate for Claude Code
3
- # Delegates to classify_command.py for robust command parsing and classification.
4
- # Falls back to bash pattern matching if Python is unavailable.
5
- #
6
- # The Python classifier handles:
7
- # - Heredoc-aware parsing (won't false-positive on quoted dangerous commands)
8
- # - Quoted-region stripping (echo "git reset --hard" is safe)
9
- # - Pipeline-aware dangers (curl | sh)
10
- # - Context-aware rm classification (safe prefixes vs dangerous targets)
11
- # - Proper shell segmentation (&&, ||, ;, |)
12
- #
13
- # @author @darianrosebrook
14
-
15
- set -euo pipefail
16
-
17
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
18
-
19
- # Read JSON input from Claude Code
20
- INPUT=$(cat)
21
-
22
- # Extract tool info
23
- TOOL_NAME=$(printf '%s' "$INPUT" | jq -r '.tool_name // ""')
24
- COMMAND=$(printf '%s' "$INPUT" | jq -r '.tool_input.command // ""')
25
-
26
- # Only check Bash tool
27
- if [[ "$TOOL_NAME" != "Bash" ]] || [[ -z "$COMMAND" ]]; then
28
- exit 0
29
- fi
30
-
31
- # --- Try Python classifier first (preferred) ---
32
- CLASSIFIER="$SCRIPT_DIR/classify_command.py"
33
- if [[ -f "$CLASSIFIER" ]] && command -v python3 >/dev/null 2>&1; then
34
- REPO_ROOT="${CLAUDE_PROJECT_DIR:-.}"
35
- CLASSIFIER_STDERR=$(mktemp)
36
- RESULT=$(printf '%s' "$COMMAND" | python3 "$CLASSIFIER" \
37
- --repo-root "$REPO_ROOT" \
38
- --home "$HOME" \
39
- --cwd "$(pwd)" 2>"$CLASSIFIER_STDERR") || {
40
- DIAG=$(head -c 200 "$CLASSIFIER_STDERR" 2>/dev/null || true)
41
- rm -f "$CLASSIFIER_STDERR"
42
- RESULT="{\"decision\":\"ask\",\"reason\":\"command classifier failed: ${DIAG:-unknown error}\"}"
43
- }
44
- rm -f "$CLASSIFIER_STDERR"
45
-
46
- DECISION=$(printf '%s' "$RESULT" | jq -r '.decision // "ask"')
47
- REASON=$(printf '%s' "$RESULT" | jq -r '.reason // "unknown"')
48
-
49
- case "$DECISION" in
50
- allow)
51
- exit 0
52
- ;;
53
- deny)
54
- echo "BLOCKED: $REASON" >&2
55
- echo "Command was: $COMMAND" >&2
56
- exit 2
57
- ;;
58
- ask)
59
- echo "WARNING: $REASON" >&2
60
- echo "Command was: $COMMAND" >&2
61
- exit 1
62
- ;;
63
- esac
64
- fi
65
-
66
- # --- Fallback: bash pattern matching (less precise, no heredoc/quote awareness) ---
67
-
68
- DANGEROUS_PATTERNS=(
69
- # Destructive file operations
70
- 'rm -rf /'
71
- 'rm -rf ~'
72
- 'rm -rf \*'
73
- 'rm -rf \.'
74
- 'rm -rf /\*'
75
- 'dd if=/dev/zero'
76
- 'dd if=/dev/random'
77
- 'mkfs\.'
78
- 'fdisk'
79
- '> /dev/sd'
80
-
81
- # Fork bombs and resource exhaustion
82
- ':\(\)\{:\|:\&\};:'
83
- 'while true.*fork'
84
-
85
- # Credential/secret exposure
86
- 'cat.*\.env'
87
- 'cat.*/etc/passwd'
88
- 'cat.*/etc/shadow'
89
- 'cat.*id_rsa'
90
- 'cat.*\.ssh/'
91
- 'cat.*credentials'
92
- 'cat.*\.aws/'
93
-
94
- # Network exfiltration
95
- 'curl.*\|.*sh'
96
- 'wget.*\|.*sh'
97
- 'curl.*\|.*bash'
98
- 'wget.*\|.*bash'
99
-
100
- # Permission escalation
101
- 'chmod 777'
102
- 'chmod -R 777'
103
- 'chmod.*\+s'
104
-
105
- # History manipulation
106
- 'history -c'
107
- 'rm.*\.bash_history'
108
- 'rm.*\.zsh_history'
109
-
110
- # System modification
111
- 'shutdown'
112
- 'reboot'
113
- 'init 0'
114
- 'init 6'
115
-
116
- # Git destructive operations
117
- 'git init'
118
- 'git reset --hard'
119
- 'git push --force'
120
- 'git push -f '
121
- 'git push --force-with-lease'
122
- 'git clean -f'
123
- 'git checkout \.'
124
- 'git restore \.'
125
- '(^|&&|\|\||;|\|)\s*git rebase'
126
- '(^|&&|\|\||;|\|)\s*git cherry-pick'
127
-
128
- # Virtual environment creation (prevents venv sprawl)
129
- 'python -m venv'
130
- 'python3 -m venv'
131
- 'virtualenv '
132
- 'conda create'
133
- )
134
-
135
- # Check command against dangerous patterns
136
- for pattern in "${DANGEROUS_PATTERNS[@]}"; do
137
- if echo "$COMMAND" | grep -qiE "$pattern"; then
138
- # Allow git init in worktree context
139
- if [[ "$pattern" == "git init" ]] && [[ "${CAWS_WORKTREE_CONTEXT:-0}" == "1" ]]; then
140
- continue
141
- fi
142
-
143
- # Allow git rebase/cherry-pick only when no worktrees are active
144
- if [[ "$pattern" == *"git rebase"* ]] || [[ "$pattern" == *"git cherry-pick"* ]]; then
145
- PROJECT_DIR="${CLAUDE_PROJECT_DIR:-.}"
146
- if command -v git >/dev/null 2>&1; then
147
- GIT_COMMON=$(cd "$PROJECT_DIR" && git rev-parse --git-common-dir 2>/dev/null || echo "")
148
- if [[ -n "$GIT_COMMON" ]] && [[ "$GIT_COMMON" != ".git" ]]; then
149
- CANDIDATE=$(cd "$PROJECT_DIR" && cd "$GIT_COMMON/.." 2>/dev/null && pwd || echo "")
150
- if [[ -n "$CANDIDATE" ]] && [[ -d "$CANDIDATE/.caws" ]]; then
151
- PROJECT_DIR="$CANDIDATE"
152
- fi
153
- fi
154
- fi
155
- WT_FILE="$PROJECT_DIR/.caws/worktrees.json"
156
- if [[ -f "$WT_FILE" ]] && command -v node >/dev/null 2>&1; then
157
- ACTIVE_COUNT=$(node -e "
158
- try {
159
- var r = JSON.parse(require('fs').readFileSync('$WT_FILE','utf8'));
160
- var c = Object.values(r.worktrees||{}).filter(function(w){return w.status==='active';}).length;
161
- console.log(c);
162
- } catch(e) { console.log(0); }
163
- " 2>/dev/null || echo "0")
164
- if [[ "$ACTIVE_COUNT" -gt 0 ]]; then
165
- GIT_SUBCMD="git operation"
166
- [[ "$pattern" == *"git rebase"* ]] && GIT_SUBCMD="git rebase"
167
- [[ "$pattern" == *"git cherry-pick"* ]] && GIT_SUBCMD="git cherry-pick"
168
- echo "BLOCKED: $GIT_SUBCMD is forbidden while $ACTIVE_COUNT worktree(s) are active." >&2
169
- echo "This can replay or rewrite commits across worktree boundaries." >&2
170
- echo "Command was: $COMMAND" >&2
171
- exit 2
172
- fi
173
- fi
174
- continue
175
- fi
176
-
177
- # Allow venv commands if target matches designated venv path from scope.json
178
- if echo "$pattern" | grep -qE '(python.*venv|virtualenv|conda create)'; then
179
- PROJECT_DIR="${CLAUDE_PROJECT_DIR:-.}"
180
- SCOPE_FILE="$PROJECT_DIR/.caws/scope.json"
181
- if [[ -f "$SCOPE_FILE" ]] && command -v node >/dev/null 2>&1; then
182
- DESIGNATED_VENV=$(node -e "try { const s = JSON.parse(require('fs').readFileSync('$SCOPE_FILE','utf8')); console.log(s.designatedVenvPath || ''); } catch(e) { console.log(''); }" 2>/dev/null || echo "")
183
- if [[ -n "$DESIGNATED_VENV" ]] && echo "$COMMAND" | grep -qF "$DESIGNATED_VENV"; then
184
- continue
185
- fi
186
- fi
187
- fi
188
-
189
- echo "BLOCKED: Command matches dangerous pattern: $pattern" >&2
190
- echo "Command was: $COMMAND" >&2
191
- exit 2
192
- fi
193
- done
194
-
195
- # Check for sudo without specific allowed commands
196
- if echo "$COMMAND" | grep -qE '^sudo\s' && ! echo "$COMMAND" | grep -qE 'sudo (npm|yarn|pnpm|brew|apt-get|apt|dnf|yum)'; then
197
- echo "BLOCKED: sudo commands require explicit approval" >&2
198
- echo "If this command is safe, please run it manually in your terminal" >&2
199
- exit 2
200
- fi
201
-
202
- # Allow the command
203
- exit 0