@ahmed-g-gad/apothem 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (674) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/LICENSE +21 -0
  3. package/LICENSES/MIT.txt +18 -0
  4. package/LICENSES/PSF-2.0.txt +47 -0
  5. package/README.md +549 -0
  6. package/bin/README.md +37 -0
  7. package/bin/apothem.mjs +78 -0
  8. package/package.json +75 -0
  9. package/pyproject.toml +347 -0
  10. package/src/apothem/README.md +52 -0
  11. package/src/apothem/__init__.py +66 -0
  12. package/src/apothem/__main__.py +28 -0
  13. package/src/apothem/_vendor/.keep +0 -0
  14. package/src/apothem/_vendor/__init__.py +25 -0
  15. package/src/apothem/_vendor/attr/__init__.py +104 -0
  16. package/src/apothem/_vendor/attr/__init__.pyi +389 -0
  17. package/src/apothem/_vendor/attr/_cmp.py +160 -0
  18. package/src/apothem/_vendor/attr/_cmp.pyi +13 -0
  19. package/src/apothem/_vendor/attr/_compat.py +99 -0
  20. package/src/apothem/_vendor/attr/_config.py +31 -0
  21. package/src/apothem/_vendor/attr/_funcs.py +497 -0
  22. package/src/apothem/_vendor/attr/_make.py +3406 -0
  23. package/src/apothem/_vendor/attr/_next_gen.py +674 -0
  24. package/src/apothem/_vendor/attr/_typing_compat.pyi +15 -0
  25. package/src/apothem/_vendor/attr/_version_info.py +89 -0
  26. package/src/apothem/_vendor/attr/_version_info.pyi +9 -0
  27. package/src/apothem/_vendor/attr/converters.py +162 -0
  28. package/src/apothem/_vendor/attr/converters.pyi +19 -0
  29. package/src/apothem/_vendor/attr/exceptions.py +95 -0
  30. package/src/apothem/_vendor/attr/exceptions.pyi +17 -0
  31. package/src/apothem/_vendor/attr/filters.py +72 -0
  32. package/src/apothem/_vendor/attr/filters.pyi +6 -0
  33. package/src/apothem/_vendor/attr/py.typed +0 -0
  34. package/src/apothem/_vendor/attr/setters.py +79 -0
  35. package/src/apothem/_vendor/attr/setters.pyi +20 -0
  36. package/src/apothem/_vendor/attr/validators.py +750 -0
  37. package/src/apothem/_vendor/attr/validators.pyi +140 -0
  38. package/src/apothem/_vendor/attr.LICENSE +21 -0
  39. package/src/apothem/_vendor/attrs/__init__.py +72 -0
  40. package/src/apothem/_vendor/attrs/__init__.pyi +314 -0
  41. package/src/apothem/_vendor/attrs/converters.py +3 -0
  42. package/src/apothem/_vendor/attrs/exceptions.py +3 -0
  43. package/src/apothem/_vendor/attrs/filters.py +3 -0
  44. package/src/apothem/_vendor/attrs/py.typed +0 -0
  45. package/src/apothem/_vendor/attrs/setters.py +3 -0
  46. package/src/apothem/_vendor/attrs/validators.py +3 -0
  47. package/src/apothem/_vendor/attrs.LICENSE +21 -0
  48. package/src/apothem/_vendor/jsonschema/__init__.py +120 -0
  49. package/src/apothem/_vendor/jsonschema/__main__.py +6 -0
  50. package/src/apothem/_vendor/jsonschema/_format.py +546 -0
  51. package/src/apothem/_vendor/jsonschema/_keywords.py +449 -0
  52. package/src/apothem/_vendor/jsonschema/_legacy_keywords.py +449 -0
  53. package/src/apothem/_vendor/jsonschema/_types.py +204 -0
  54. package/src/apothem/_vendor/jsonschema/_typing.py +29 -0
  55. package/src/apothem/_vendor/jsonschema/_utils.py +355 -0
  56. package/src/apothem/_vendor/jsonschema/benchmarks/__init__.py +5 -0
  57. package/src/apothem/_vendor/jsonschema/benchmarks/const_vs_enum.py +30 -0
  58. package/src/apothem/_vendor/jsonschema/benchmarks/contains.py +28 -0
  59. package/src/apothem/_vendor/jsonschema/benchmarks/import_benchmark.py +31 -0
  60. package/src/apothem/_vendor/jsonschema/benchmarks/issue232/issue.json +2653 -0
  61. package/src/apothem/_vendor/jsonschema/benchmarks/issue232.py +25 -0
  62. package/src/apothem/_vendor/jsonschema/benchmarks/json_schema_test_suite.py +12 -0
  63. package/src/apothem/_vendor/jsonschema/benchmarks/nested_schemas.py +56 -0
  64. package/src/apothem/_vendor/jsonschema/benchmarks/subcomponents.py +42 -0
  65. package/src/apothem/_vendor/jsonschema/benchmarks/unused_registry.py +35 -0
  66. package/src/apothem/_vendor/jsonschema/benchmarks/useless_applicator_schemas.py +106 -0
  67. package/src/apothem/_vendor/jsonschema/benchmarks/useless_keywords.py +32 -0
  68. package/src/apothem/_vendor/jsonschema/benchmarks/validator_creation.py +14 -0
  69. package/src/apothem/_vendor/jsonschema/cli.py +292 -0
  70. package/src/apothem/_vendor/jsonschema/exceptions.py +490 -0
  71. package/src/apothem/_vendor/jsonschema/protocols.py +230 -0
  72. package/src/apothem/_vendor/jsonschema/validators.py +1410 -0
  73. package/src/apothem/_vendor/jsonschema.LICENSE +19 -0
  74. package/src/apothem/_vendor/jsonschema_specifications/__init__.py +12 -0
  75. package/src/apothem/_vendor/jsonschema_specifications/_core.py +38 -0
  76. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft201909/metaschema.json +42 -0
  77. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft201909/vocabularies/applicator +56 -0
  78. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft201909/vocabularies/content +17 -0
  79. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft201909/vocabularies/core +57 -0
  80. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft201909/vocabularies/format +14 -0
  81. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft201909/vocabularies/meta-data +37 -0
  82. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft201909/vocabularies/validation +98 -0
  83. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/metaschema.json +58 -0
  84. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/applicator +48 -0
  85. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/content +17 -0
  86. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/core +51 -0
  87. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/format-annotation +14 -0
  88. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/format-assertion +14 -0
  89. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/meta-data +37 -0
  90. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/unevaluated +15 -0
  91. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/validation +98 -0
  92. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft3/metaschema.json +172 -0
  93. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft4/metaschema.json +149 -0
  94. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft6/metaschema.json +153 -0
  95. package/src/apothem/_vendor/jsonschema_specifications/schemas/draft7/metaschema.json +166 -0
  96. package/src/apothem/_vendor/jsonschema_specifications.LICENSE +19 -0
  97. package/src/apothem/_vendor/referencing/__init__.py +7 -0
  98. package/src/apothem/_vendor/referencing/_attrs.py +31 -0
  99. package/src/apothem/_vendor/referencing/_attrs.pyi +21 -0
  100. package/src/apothem/_vendor/referencing/_core.py +739 -0
  101. package/src/apothem/_vendor/referencing/exceptions.py +165 -0
  102. package/src/apothem/_vendor/referencing/jsonschema.py +642 -0
  103. package/src/apothem/_vendor/referencing/py.typed +0 -0
  104. package/src/apothem/_vendor/referencing/retrieval.py +94 -0
  105. package/src/apothem/_vendor/referencing/typing.py +61 -0
  106. package/src/apothem/_vendor/referencing.LICENSE +19 -0
  107. package/src/apothem/_vendor/rpds/__init__.py +251 -0
  108. package/src/apothem/_vendor/typing_extensions.LICENSE +279 -0
  109. package/src/apothem/_vendor/typing_extensions.py +4317 -0
  110. package/src/apothem/_vendor/vendor.txt +22 -0
  111. package/src/apothem/_vendor/yaml/__init__.py +389 -0
  112. package/src/apothem/_vendor/yaml/composer.py +138 -0
  113. package/src/apothem/_vendor/yaml/constructor.py +748 -0
  114. package/src/apothem/_vendor/yaml/cyaml.py +100 -0
  115. package/src/apothem/_vendor/yaml/dumper.py +61 -0
  116. package/src/apothem/_vendor/yaml/emitter.py +1137 -0
  117. package/src/apothem/_vendor/yaml/error.py +74 -0
  118. package/src/apothem/_vendor/yaml/events.py +85 -0
  119. package/src/apothem/_vendor/yaml/loader.py +63 -0
  120. package/src/apothem/_vendor/yaml/nodes.py +48 -0
  121. package/src/apothem/_vendor/yaml/parser.py +588 -0
  122. package/src/apothem/_vendor/yaml/reader.py +185 -0
  123. package/src/apothem/_vendor/yaml/representer.py +388 -0
  124. package/src/apothem/_vendor/yaml/resolver.py +226 -0
  125. package/src/apothem/_vendor/yaml/scanner.py +1435 -0
  126. package/src/apothem/_vendor/yaml/serializer.py +110 -0
  127. package/src/apothem/_vendor/yaml/tokens.py +103 -0
  128. package/src/apothem/_vendor/yaml.LICENSE +20 -0
  129. package/src/apothem/agents/README.md +60 -0
  130. package/src/apothem/agents/codebase-explorer.md +91 -0
  131. package/src/apothem/agents/convention-auditor.md +93 -0
  132. package/src/apothem/agents/dependency-auditor.md +97 -0
  133. package/src/apothem/agents/fact-checker.md +84 -0
  134. package/src/apothem/agents/mcp-builder.md +86 -0
  135. package/src/apothem/agents/memory-auditor.md +93 -0
  136. package/src/apothem/agents/prompt-evaluator.md +87 -0
  137. package/src/apothem/agents/quality-gate.md +103 -0
  138. package/src/apothem/agents/refactor-surgeon.md +74 -0
  139. package/src/apothem/agents/research-scout.md +73 -0
  140. package/src/apothem/agents/security-scanner.md +83 -0
  141. package/src/apothem/agents/test-runner.md +84 -0
  142. package/src/apothem/audit/README.md +73 -0
  143. package/src/apothem/audit/_scan_lib.py +182 -0
  144. package/src/apothem/audit/analyze_graph.py +260 -0
  145. package/src/apothem/audit/build_capability_graph.py +607 -0
  146. package/src/apothem/audit/build_inventory.py +657 -0
  147. package/src/apothem/audit/build_plans_provenance.py +997 -0
  148. package/src/apothem/audit/check_links.py +389 -0
  149. package/src/apothem/audit/classify_artifacts.py +381 -0
  150. package/src/apothem/audit/deprecated-tokens.txt +10 -0
  151. package/src/apothem/audit/execute_plans_migration.py +491 -0
  152. package/src/apothem/audit/known-projects.txt +15 -0
  153. package/src/apothem/audit/render_capability_index.py +467 -0
  154. package/src/apothem/audit/render_inventory.py +405 -0
  155. package/src/apothem/audit/scan_ai_surfaces.py +1125 -0
  156. package/src/apothem/audit/scan_ai_surfaces_coarse.py +261 -0
  157. package/src/apothem/audit/scan_drift_features.py +143 -0
  158. package/src/apothem/audit/scan_frontmatter.py +293 -0
  159. package/src/apothem/audit/scan_header_coverage.py +1134 -0
  160. package/src/apothem/audit/scan_plan_leakage.py +540 -0
  161. package/src/apothem/audit/scan_plans_discipline.py +188 -0
  162. package/src/apothem/audit/scan_secrets_pii.py +245 -0
  163. package/src/apothem/audit/scan_stale_tokens.py +296 -0
  164. package/src/apothem/audit/synthesize_drift.py +205 -0
  165. package/src/apothem/benchmarks/README.md +33 -0
  166. package/src/apothem/benchmarks/__init__.py +3 -0
  167. package/src/apothem/benchmarks/bench_agents.py +63 -0
  168. package/src/apothem/benchmarks/bench_hooks.py +93 -0
  169. package/src/apothem/benchmarks/bench_install.py +58 -0
  170. package/src/apothem/benchmarks/bench_tests.py +93 -0
  171. package/src/apothem/benchmarks/bench_validate_ecosystem.py +84 -0
  172. package/src/apothem/cli/README.md +33 -0
  173. package/src/apothem/cli/__init__.py +229 -0
  174. package/src/apothem/cli/_cmd_completion.py +88 -0
  175. package/src/apothem/cli/_cmd_diff.py +181 -0
  176. package/src/apothem/cli/_cmd_doctor.py +143 -0
  177. package/src/apothem/cli/_cmd_harnesses.py +167 -0
  178. package/src/apothem/cli/_cmd_install.py +327 -0
  179. package/src/apothem/cli/_cmd_migrate_workspace.py +143 -0
  180. package/src/apothem/cli/_cmd_profile.py +341 -0
  181. package/src/apothem/cli/_cmd_status.py +180 -0
  182. package/src/apothem/cli/_cmd_uninstall.py +215 -0
  183. package/src/apothem/cli/_cmd_update.py +397 -0
  184. package/src/apothem/cli/_cmd_verify.py +194 -0
  185. package/src/apothem/cli/_common_flags.py +90 -0
  186. package/src/apothem/cli/_epilogs.py +296 -0
  187. package/src/apothem/cli/_helpers.py +857 -0
  188. package/src/apothem/cli/_json_formatter.py +21 -0
  189. package/src/apothem/cli/_materialize.py +376 -0
  190. package/src/apothem/cli/completions/apothem.bash +30 -0
  191. package/src/apothem/cli/completions/apothem.fish +19 -0
  192. package/src/apothem/cli/completions/apothem.ps1 +27 -0
  193. package/src/apothem/cli/completions/apothem.zsh +42 -0
  194. package/src/apothem/cli/reference_export.py +126 -0
  195. package/src/apothem/commands/README.md +125 -0
  196. package/src/apothem/commands/a11y-audit.md +203 -0
  197. package/src/apothem/commands/architecture-review.md +194 -0
  198. package/src/apothem/commands/audit.md +165 -0
  199. package/src/apothem/commands/code-audit.md +218 -0
  200. package/src/apothem/commands/code-review.md +193 -0
  201. package/src/apothem/commands/dependency-audit.md +209 -0
  202. package/src/apothem/commands/docs-review.md +199 -0
  203. package/src/apothem/commands/elevate.md +285 -0
  204. package/src/apothem/commands/eval.md +149 -0
  205. package/src/apothem/commands/fortress.md +172 -0
  206. package/src/apothem/commands/freshify.md +168 -0
  207. package/src/apothem/commands/github-deploy-fresh.md +178 -0
  208. package/src/apothem/commands/github-deploy-next.md +167 -0
  209. package/src/apothem/commands/perf-audit.md +198 -0
  210. package/src/apothem/commands/plan-amend.md +104 -0
  211. package/src/apothem/commands/plan-audit.md +127 -0
  212. package/src/apothem/commands/plan-design.md +257 -0
  213. package/src/apothem/commands/plan-execute.md +495 -0
  214. package/src/apothem/commands/plan-generate.md +351 -0
  215. package/src/apothem/commands/plan-review.md +555 -0
  216. package/src/apothem/commands/plan-spec.md +359 -0
  217. package/src/apothem/commands/plan-status.md +222 -0
  218. package/src/apothem/commands/plan.md +173 -0
  219. package/src/apothem/commands/projectify.md +142 -0
  220. package/src/apothem/commands/release-readiness.md +142 -0
  221. package/src/apothem/commands/research-analysis.md +241 -0
  222. package/src/apothem/commands/research-design.md +231 -0
  223. package/src/apothem/commands/research-disseminate.md +225 -0
  224. package/src/apothem/commands/research-experiment.md +232 -0
  225. package/src/apothem/commands/research-ideate.md +213 -0
  226. package/src/apothem/commands/research-paper.md +252 -0
  227. package/src/apothem/commands/research-proposal.md +220 -0
  228. package/src/apothem/commands/research-publish.md +255 -0
  229. package/src/apothem/commands/research-review.md +251 -0
  230. package/src/apothem/commands/research-sources.md +266 -0
  231. package/src/apothem/commands/research-spec.md +255 -0
  232. package/src/apothem/commands/research-synthesis.md +233 -0
  233. package/src/apothem/commands/research-theory.md +218 -0
  234. package/src/apothem/commands/research.md +181 -0
  235. package/src/apothem/commands/security-audit.md +196 -0
  236. package/src/apothem/commands/supply-chain-audit.md +192 -0
  237. package/src/apothem/commands/test-suite.md +146 -0
  238. package/src/apothem/commands/threat-model-audit.md +199 -0
  239. package/src/apothem/commands/ux-review.md +202 -0
  240. package/src/apothem/commands/workflow.md +162 -0
  241. package/src/apothem/conformity/README.md +173 -0
  242. package/src/apothem/conformity/__init__.py +1 -0
  243. package/src/apothem/conformity/_grep_base.py +93 -0
  244. package/src/apothem/conformity/agent_capability_grep.py +306 -0
  245. package/src/apothem/conformity/agents_md_coverage_grep.py +382 -0
  246. package/src/apothem/conformity/agnosticism_grep.py +311 -0
  247. package/src/apothem/conformity/always_on_budget_grep.py +318 -0
  248. package/src/apothem/conformity/bare_except_grep.py +115 -0
  249. package/src/apothem/conformity/binding_reciprocity_grep.py +151 -0
  250. package/src/apothem/conformity/brand_mark_grep.py +272 -0
  251. package/src/apothem/conformity/commented_out_code_grep.py +176 -0
  252. package/src/apothem/conformity/completion_claim_grep.py +169 -0
  253. package/src/apothem/conformity/conventional_commit_grep.py +319 -0
  254. package/src/apothem/conformity/copilot_instructions_presence_grep.py +324 -0
  255. package/src/apothem/conformity/cross_platform_matrix_grep.py +297 -0
  256. package/src/apothem/conformity/determinism_grep.py +306 -0
  257. package/src/apothem/conformity/diagram_staleness_grep.py +154 -0
  258. package/src/apothem/conformity/dynamism_grep.py +284 -0
  259. package/src/apothem/conformity/editorconfig_presence_grep.py +281 -0
  260. package/src/apothem/conformity/file_header_grep.py +502 -0
  261. package/src/apothem/conformity/freshness_token_grep.py +233 -0
  262. package/src/apothem/conformity/frontmatter_grep.py +274 -0
  263. package/src/apothem/conformity/frontmatter_value_grep.py +386 -0
  264. package/src/apothem/conformity/gate.py +1386 -0
  265. package/src/apothem/conformity/gitattributes_presence_grep.py +238 -0
  266. package/src/apothem/conformity/harden_runner_grep.py +320 -0
  267. package/src/apothem/conformity/hedging_grep.py +129 -0
  268. package/src/apothem/conformity/license_author_consistency_grep.py +204 -0
  269. package/src/apothem/conformity/link_check.py +327 -0
  270. package/src/apothem/conformity/magic_number_grep.py +182 -0
  271. package/src/apothem/conformity/multi_surface_coherence_grep.py +620 -0
  272. package/src/apothem/conformity/naming_grep.py +224 -0
  273. package/src/apothem/conformity/no_global_plans_grep.py +339 -0
  274. package/src/apothem/conformity/no_toplevel_docs_grep.py +120 -0
  275. package/src/apothem/conformity/oidc_trusted_publishing_grep.py +291 -0
  276. package/src/apothem/conformity/option_annotation_grep.py +352 -0
  277. package/src/apothem/conformity/orphan_output_grep.py +206 -0
  278. package/src/apothem/conformity/permissions_minimum_scope_grep.py +299 -0
  279. package/src/apothem/conformity/plain_language_grep.py +559 -0
  280. package/src/apothem/conformity/plan_next_step_consistency_grep.py +450 -0
  281. package/src/apothem/conformity/plan_suite_structure_grep.py +534 -0
  282. package/src/apothem/conformity/plans_discipline_language_grep.py +245 -0
  283. package/src/apothem/conformity/production_ready_pr_grep.py +200 -0
  284. package/src/apothem/conformity/recommend_next_step_grep.py +250 -0
  285. package/src/apothem/conformity/redundancy_grep.py +401 -0
  286. package/src/apothem/conformity/reference_token_grep.py +230 -0
  287. package/src/apothem/conformity/registry_capability_consistency_grep.py +368 -0
  288. package/src/apothem/conformity/secret_leak_grep.py +193 -0
  289. package/src/apothem/conformity/semver_stability_grep.py +358 -0
  290. package/src/apothem/conformity/smoke_install_grep.py +194 -0
  291. package/src/apothem/conformity/static_version_grep.py +284 -0
  292. package/src/apothem/conformity/token_efficiency_grep.py +185 -0
  293. package/src/apothem/conformity/unpinned_action_grep.py +115 -0
  294. package/src/apothem/conformity/user_confirm_grep.py +74 -0
  295. package/src/apothem/conformity/workflow_concurrency_grep.py +283 -0
  296. package/src/apothem/harnesses/README.md +63 -0
  297. package/src/apothem/harnesses/__init__.py +16 -0
  298. package/src/apothem/harnesses/_shared/README.md +36 -0
  299. package/src/apothem/harnesses/_shared/__init__.py +12 -0
  300. package/src/apothem/harnesses/_shared/install_driver.py +281 -0
  301. package/src/apothem/harnesses/_shared/install_driver_apply.py +612 -0
  302. package/src/apothem/harnesses/_shared/install_driver_backup.py +535 -0
  303. package/src/apothem/harnesses/_shared/install_driver_converters.py +310 -0
  304. package/src/apothem/harnesses/_shared/install_driver_lifecycle.py +495 -0
  305. package/src/apothem/harnesses/_shared/install_driver_materialize.py +675 -0
  306. package/src/apothem/harnesses/_shared/install_driver_merge.py +656 -0
  307. package/src/apothem/harnesses/_shared/install_driver_pathsafety.py +137 -0
  308. package/src/apothem/harnesses/_shared/install_driver_planvalidation.py +240 -0
  309. package/src/apothem/harnesses/_shared/install_driver_removal.py +366 -0
  310. package/src/apothem/harnesses/_shared/install_driver_treeops.py +248 -0
  311. package/src/apothem/harnesses/_shared/install_driver_types.py +330 -0
  312. package/src/apothem/harnesses/_shared/wrapper_factories.py +448 -0
  313. package/src/apothem/harnesses/antigravity/STANDARD-CONVENTION-PIN.md +91 -0
  314. package/src/apothem/harnesses/antigravity/__init__.py +70 -0
  315. package/src/apothem/harnesses/antigravity/capabilities.yml +40 -0
  316. package/src/apothem/harnesses/antigravity/install.py +63 -0
  317. package/src/apothem/harnesses/antigravity/templates/GEMINI.md +40 -0
  318. package/src/apothem/harnesses/antigravity/templates/plugin.json +5 -0
  319. package/src/apothem/harnesses/antigravity/uninstall.py +22 -0
  320. package/src/apothem/harnesses/antigravity/update.py +10 -0
  321. package/src/apothem/harnesses/antigravity/verify.py +11 -0
  322. package/src/apothem/harnesses/claude_code/STANDARD-CONVENTION-PIN.md +65 -0
  323. package/src/apothem/harnesses/claude_code/__init__.py +107 -0
  324. package/src/apothem/harnesses/claude_code/capabilities.yml +42 -0
  325. package/src/apothem/harnesses/claude_code/install.py +147 -0
  326. package/src/apothem/harnesses/claude_code/templates/settings.json +351 -0
  327. package/src/apothem/harnesses/claude_code/uninstall.py +23 -0
  328. package/src/apothem/harnesses/claude_code/update.py +10 -0
  329. package/src/apothem/harnesses/claude_code/verify.py +11 -0
  330. package/src/apothem/harnesses/codebuddy/STANDARD-CONVENTION-PIN.md +74 -0
  331. package/src/apothem/harnesses/codebuddy/__init__.py +49 -0
  332. package/src/apothem/harnesses/codebuddy/capabilities.yml +34 -0
  333. package/src/apothem/harnesses/codebuddy/install.py +40 -0
  334. package/src/apothem/harnesses/codebuddy/templates/apothem-rules.md +37 -0
  335. package/src/apothem/harnesses/codebuddy/uninstall.py +25 -0
  336. package/src/apothem/harnesses/codebuddy/update.py +10 -0
  337. package/src/apothem/harnesses/codebuddy/verify.py +11 -0
  338. package/src/apothem/harnesses/codex/STANDARD-CONVENTION-PIN.md +79 -0
  339. package/src/apothem/harnesses/codex/__init__.py +72 -0
  340. package/src/apothem/harnesses/codex/capabilities.yml +40 -0
  341. package/src/apothem/harnesses/codex/install.py +69 -0
  342. package/src/apothem/harnesses/codex/templates/AGENTS.md +40 -0
  343. package/src/apothem/harnesses/codex/templates/hooks.json +127 -0
  344. package/src/apothem/harnesses/codex/uninstall.py +23 -0
  345. package/src/apothem/harnesses/codex/update.py +10 -0
  346. package/src/apothem/harnesses/codex/verify.py +11 -0
  347. package/src/apothem/harnesses/cursor/STANDARD-CONVENTION-PIN.md +79 -0
  348. package/src/apothem/harnesses/cursor/__init__.py +48 -0
  349. package/src/apothem/harnesses/cursor/capabilities.yml +42 -0
  350. package/src/apothem/harnesses/cursor/install.py +38 -0
  351. package/src/apothem/harnesses/cursor/templates/apothem-rules.mdc +40 -0
  352. package/src/apothem/harnesses/cursor/uninstall.py +25 -0
  353. package/src/apothem/harnesses/cursor/update.py +10 -0
  354. package/src/apothem/harnesses/cursor/verify.py +11 -0
  355. package/src/apothem/harnesses/gemini_cli/STANDARD-CONVENTION-PIN.md +102 -0
  356. package/src/apothem/harnesses/gemini_cli/__init__.py +52 -0
  357. package/src/apothem/harnesses/gemini_cli/capabilities.yml +43 -0
  358. package/src/apothem/harnesses/gemini_cli/install.py +43 -0
  359. package/src/apothem/harnesses/gemini_cli/templates/GEMINI.md +38 -0
  360. package/src/apothem/harnesses/gemini_cli/uninstall.py +25 -0
  361. package/src/apothem/harnesses/gemini_cli/update.py +10 -0
  362. package/src/apothem/harnesses/gemini_cli/verify.py +11 -0
  363. package/src/apothem/harnesses/github_copilot/STANDARD-CONVENTION-PIN.md +84 -0
  364. package/src/apothem/harnesses/github_copilot/__init__.py +47 -0
  365. package/src/apothem/harnesses/github_copilot/capabilities.yml +42 -0
  366. package/src/apothem/harnesses/github_copilot/install.py +40 -0
  367. package/src/apothem/harnesses/github_copilot/templates/copilot-instructions.md +33 -0
  368. package/src/apothem/harnesses/github_copilot/uninstall.py +25 -0
  369. package/src/apothem/harnesses/github_copilot/update.py +10 -0
  370. package/src/apothem/harnesses/github_copilot/verify.py +11 -0
  371. package/src/apothem/harnesses/glm/STANDARD-CONVENTION-PIN.md +77 -0
  372. package/src/apothem/harnesses/glm/__init__.py +56 -0
  373. package/src/apothem/harnesses/glm/capabilities.yml +33 -0
  374. package/src/apothem/harnesses/glm/install.py +45 -0
  375. package/src/apothem/harnesses/glm/templates/glm.toml +58 -0
  376. package/src/apothem/harnesses/glm/uninstall.py +25 -0
  377. package/src/apothem/harnesses/glm/update.py +10 -0
  378. package/src/apothem/harnesses/glm/verify.py +11 -0
  379. package/src/apothem/harnesses/hermes/STANDARD-CONVENTION-PIN.md +57 -0
  380. package/src/apothem/harnesses/hermes/__init__.py +33 -0
  381. package/src/apothem/harnesses/hermes/capabilities.yml +36 -0
  382. package/src/apothem/harnesses/hermes/install.py +17 -0
  383. package/src/apothem/harnesses/hermes/materializer.py +35 -0
  384. package/src/apothem/harnesses/hermes/uninstall.py +33 -0
  385. package/src/apothem/harnesses/hermes/update.py +10 -0
  386. package/src/apothem/harnesses/hermes/verify.py +11 -0
  387. package/src/apothem/harnesses/kimi_code/STANDARD-CONVENTION-PIN.md +128 -0
  388. package/src/apothem/harnesses/kimi_code/__init__.py +59 -0
  389. package/src/apothem/harnesses/kimi_code/capabilities.yml +40 -0
  390. package/src/apothem/harnesses/kimi_code/install.py +42 -0
  391. package/src/apothem/harnesses/kimi_code/templates/AGENTS.md +43 -0
  392. package/src/apothem/harnesses/kimi_code/uninstall.py +27 -0
  393. package/src/apothem/harnesses/kimi_code/update.py +10 -0
  394. package/src/apothem/harnesses/kimi_code/verify.py +11 -0
  395. package/src/apothem/harnesses/kiro/STANDARD-CONVENTION-PIN.md +77 -0
  396. package/src/apothem/harnesses/kiro/__init__.py +49 -0
  397. package/src/apothem/harnesses/kiro/capabilities.yml +36 -0
  398. package/src/apothem/harnesses/kiro/install.py +39 -0
  399. package/src/apothem/harnesses/kiro/templates/apothem-rules.md +36 -0
  400. package/src/apothem/harnesses/kiro/uninstall.py +25 -0
  401. package/src/apothem/harnesses/kiro/update.py +10 -0
  402. package/src/apothem/harnesses/kiro/verify.py +11 -0
  403. package/src/apothem/harnesses/open_claw/STANDARD-CONVENTION-PIN.md +62 -0
  404. package/src/apothem/harnesses/open_claw/__init__.py +35 -0
  405. package/src/apothem/harnesses/open_claw/capabilities.yml +35 -0
  406. package/src/apothem/harnesses/open_claw/install.py +17 -0
  407. package/src/apothem/harnesses/open_claw/materializer.py +36 -0
  408. package/src/apothem/harnesses/open_claw/uninstall.py +32 -0
  409. package/src/apothem/harnesses/open_claw/update.py +10 -0
  410. package/src/apothem/harnesses/open_claw/verify.py +11 -0
  411. package/src/apothem/harnesses/opencode/STANDARD-CONVENTION-PIN.md +76 -0
  412. package/src/apothem/harnesses/opencode/__init__.py +35 -0
  413. package/src/apothem/harnesses/opencode/capabilities.yml +43 -0
  414. package/src/apothem/harnesses/opencode/install.py +17 -0
  415. package/src/apothem/harnesses/opencode/materializer.py +31 -0
  416. package/src/apothem/harnesses/opencode/uninstall.py +34 -0
  417. package/src/apothem/harnesses/opencode/update.py +10 -0
  418. package/src/apothem/harnesses/opencode/verify.py +11 -0
  419. package/src/apothem/harnesses/qwen_code/STANDARD-CONVENTION-PIN.md +87 -0
  420. package/src/apothem/harnesses/qwen_code/__init__.py +37 -0
  421. package/src/apothem/harnesses/qwen_code/capabilities.yml +43 -0
  422. package/src/apothem/harnesses/qwen_code/install.py +19 -0
  423. package/src/apothem/harnesses/qwen_code/materializer.py +174 -0
  424. package/src/apothem/harnesses/qwen_code/templates/QWEN.md +30 -0
  425. package/src/apothem/harnesses/qwen_code/uninstall.py +34 -0
  426. package/src/apothem/harnesses/qwen_code/update.py +10 -0
  427. package/src/apothem/harnesses/qwen_code/verify.py +11 -0
  428. package/src/apothem/harnesses/trae/STANDARD-CONVENTION-PIN.md +70 -0
  429. package/src/apothem/harnesses/trae/__init__.py +49 -0
  430. package/src/apothem/harnesses/trae/capabilities.yml +34 -0
  431. package/src/apothem/harnesses/trae/install.py +38 -0
  432. package/src/apothem/harnesses/trae/templates/apothem-rules.md +37 -0
  433. package/src/apothem/harnesses/trae/uninstall.py +25 -0
  434. package/src/apothem/harnesses/trae/update.py +10 -0
  435. package/src/apothem/harnesses/trae/verify.py +11 -0
  436. package/src/apothem/harnesses/windsurf/STANDARD-CONVENTION-PIN.md +91 -0
  437. package/src/apothem/harnesses/windsurf/__init__.py +52 -0
  438. package/src/apothem/harnesses/windsurf/capabilities.yml +40 -0
  439. package/src/apothem/harnesses/windsurf/install.py +41 -0
  440. package/src/apothem/harnesses/windsurf/templates/apothem-rules.md +37 -0
  441. package/src/apothem/harnesses/windsurf/uninstall.py +25 -0
  442. package/src/apothem/harnesses/windsurf/update.py +10 -0
  443. package/src/apothem/harnesses/windsurf/verify.py +11 -0
  444. package/src/apothem/harnesses/zed/STANDARD-CONVENTION-PIN.md +92 -0
  445. package/src/apothem/harnesses/zed/__init__.py +57 -0
  446. package/src/apothem/harnesses/zed/capabilities.yml +38 -0
  447. package/src/apothem/harnesses/zed/install.py +41 -0
  448. package/src/apothem/harnesses/zed/templates/apothem-rules.md +32 -0
  449. package/src/apothem/harnesses/zed/uninstall.py +28 -0
  450. package/src/apothem/harnesses/zed/update.py +10 -0
  451. package/src/apothem/harnesses/zed/verify.py +11 -0
  452. package/src/apothem/hooks/README.md +81 -0
  453. package/src/apothem/hooks/__init__.py +24 -0
  454. package/src/apothem/hooks/askuserquestion_validator.py +380 -0
  455. package/src/apothem/hooks/dispatch.py +296 -0
  456. package/src/apothem/hooks/emit_hook_context.py +444 -0
  457. package/src/apothem/hooks/hooks.json +318 -0
  458. package/src/apothem/hooks/lib/README.md +39 -0
  459. package/src/apothem/hooks/lib/__init__.py +18 -0
  460. package/src/apothem/hooks/lib/bootstrap.ps1 +129 -0
  461. package/src/apothem/hooks/lib/bootstrap.sh +103 -0
  462. package/src/apothem/hooks/lib/events.py +51 -0
  463. package/src/apothem/hooks/lib/find-pwsh.ps1 +78 -0
  464. package/src/apothem/hooks/lib/find-pwsh.sh +76 -0
  465. package/src/apothem/hooks/lib/find-python.ps1 +63 -0
  466. package/src/apothem/hooks/lib/find-python.sh +97 -0
  467. package/src/apothem/hooks/lib/log.py +43 -0
  468. package/src/apothem/hooks/lib/resolve_root.py +264 -0
  469. package/src/apothem/hooks/messages/postcompact.md +14 -0
  470. package/src/apothem/hooks/messages/posttooluse-proactive-compaction.md +46 -0
  471. package/src/apothem/hooks/messages/precompact.md +14 -0
  472. package/src/apothem/hooks/messages/pretooluse-askuserquestion-recommended.md +65 -0
  473. package/src/apothem/hooks/messages/pretooluse-bash-plan-guard.md +97 -0
  474. package/src/apothem/hooks/messages/pretooluse-bash.md +39 -0
  475. package/src/apothem/hooks/messages/pretooluse-conformity.md +70 -0
  476. package/src/apothem/hooks/messages/pretooluse-dependency-guard.md +21 -0
  477. package/src/apothem/hooks/messages/pretooluse-edit-header-guard.md +61 -0
  478. package/src/apothem/hooks/messages/pretooluse-edit.md +21 -0
  479. package/src/apothem/hooks/messages/pretooluse-eval-guard.md +39 -0
  480. package/src/apothem/hooks/messages/pretooluse-notebookedit.md +11 -0
  481. package/src/apothem/hooks/messages/pretooluse-write-header-guard.md +45 -0
  482. package/src/apothem/hooks/messages/pretooluse-write-plan-guard.md +72 -0
  483. package/src/apothem/hooks/messages/pretooluse-write.md +21 -0
  484. package/src/apothem/hooks/messages/sessionstart.md +15 -0
  485. package/src/apothem/hooks/messages/stop.md +27 -0
  486. package/src/apothem/hooks/proactive_compaction_tracker.py +327 -0
  487. package/src/apothem/hooks/session_start_bootstrap.py +472 -0
  488. package/src/apothem/lib/README.md +42 -0
  489. package/src/apothem/lib/__init__.py +13 -0
  490. package/src/apothem/lib/atomic_io.py +189 -0
  491. package/src/apothem/lib/auditor.py +687 -0
  492. package/src/apothem/lib/clean_slate.py +396 -0
  493. package/src/apothem/lib/contexts.py +352 -0
  494. package/src/apothem/lib/data_home.py +255 -0
  495. package/src/apothem/lib/frontmatter.py +101 -0
  496. package/src/apothem/lib/harness_materializer.py +213 -0
  497. package/src/apothem/lib/harness_protocol.py +59 -0
  498. package/src/apothem/lib/harness_registry.py +282 -0
  499. package/src/apothem/lib/harness_registry_data.py +843 -0
  500. package/src/apothem/lib/install_ledger.py +347 -0
  501. package/src/apothem/lib/learning.py +540 -0
  502. package/src/apothem/lib/memory.py +347 -0
  503. package/src/apothem/lib/parallel_sweep.py +234 -0
  504. package/src/apothem/lib/plan_tiers.py +200 -0
  505. package/src/apothem/lib/plugin_bootstrap.py +132 -0
  506. package/src/apothem/lib/plugin_tree.py +599 -0
  507. package/src/apothem/lib/profile.py +755 -0
  508. package/src/apothem/lib/profile_projection.py +198 -0
  509. package/src/apothem/lib/propagation-manifest.yaml +878 -0
  510. package/src/apothem/lib/propagation.py +220 -0
  511. package/src/apothem/lib/python_resolver.py +189 -0
  512. package/src/apothem/lib/reporter.py +62 -0
  513. package/src/apothem/lib/workspace_migration.py +323 -0
  514. package/src/apothem/output-styles/README.md +41 -0
  515. package/src/apothem/output-styles/concise-engineer.md +49 -0
  516. package/src/apothem/output-styles/default-architect.md +52 -0
  517. package/src/apothem/output-styles/default.md +113 -0
  518. package/src/apothem/output-styles/forensic-auditor.md +63 -0
  519. package/src/apothem/py.typed +0 -0
  520. package/src/apothem/rules/README.md +121 -0
  521. package/src/apothem/rules/agent-capability-discipline-matrix.md +89 -0
  522. package/src/apothem/rules/agent-capability-discipline.md +78 -0
  523. package/src/apothem/rules/agent-orchestration-patterns.md +144 -0
  524. package/src/apothem/rules/agent-orchestration.md +65 -0
  525. package/src/apothem/rules/agents-md-convention.md +86 -0
  526. package/src/apothem/rules/agile-sprints-elements.md +135 -0
  527. package/src/apothem/rules/agile-sprints.md +64 -0
  528. package/src/apothem/rules/agnostic-posture-checklist.md +47 -0
  529. package/src/apothem/rules/agnostic-posture.md +48 -0
  530. package/src/apothem/rules/authoritative-referencing-quotation.md +50 -0
  531. package/src/apothem/rules/authoritative-referencing.md +66 -0
  532. package/src/apothem/rules/authority-inquiry-categories.md +58 -0
  533. package/src/apothem/rules/authority-inquiry.md +54 -0
  534. package/src/apothem/rules/auto-memory-topic-files.md +86 -0
  535. package/src/apothem/rules/auto-memory.md +67 -0
  536. package/src/apothem/rules/bidirectional-binding.md +123 -0
  537. package/src/apothem/rules/canonical-layout-reporting-tiers.md +212 -0
  538. package/src/apothem/rules/canonical-layout.md +60 -0
  539. package/src/apothem/rules/clean-architecture-layers.md +186 -0
  540. package/src/apothem/rules/clean-room-generation-protocols.md +124 -0
  541. package/src/apothem/rules/clean-room-generation.md +59 -0
  542. package/src/apothem/rules/code-craft-conventions.md +101 -0
  543. package/src/apothem/rules/code-craft-markdown.md +138 -0
  544. package/src/apothem/rules/code-craft-python.md +154 -0
  545. package/src/apothem/rules/code-craft-shell.md +192 -0
  546. package/src/apothem/rules/cognitive-identity-techniques.md +180 -0
  547. package/src/apothem/rules/cognitive-identity.md +81 -0
  548. package/src/apothem/rules/context-management-budget.md +46 -0
  549. package/src/apothem/rules/context-management-protocol.md +161 -0
  550. package/src/apothem/rules/context-management-scratch.md +128 -0
  551. package/src/apothem/rules/context-management.md +85 -0
  552. package/src/apothem/rules/definitiveness-virtues.md +67 -0
  553. package/src/apothem/rules/definitiveness.md +58 -0
  554. package/src/apothem/rules/determinism.md +81 -0
  555. package/src/apothem/rules/disclosure-ledger-markers.md +58 -0
  556. package/src/apothem/rules/disclosure-ledger.md +52 -0
  557. package/src/apothem/rules/dynamism.md +38 -0
  558. package/src/apothem/rules/etc-extension.md +57 -0
  559. package/src/apothem/rules/expertise-posture-elements.md +68 -0
  560. package/src/apothem/rules/expertise-posture.md +54 -0
  561. package/src/apothem/rules/freshness-facade.md +64 -0
  562. package/src/apothem/rules/harness-adapter-shape-schemas.md +162 -0
  563. package/src/apothem/rules/harness-adapter-shape.md +42 -0
  564. package/src/apothem/rules/host-discovery-manifests.md +50 -0
  565. package/src/apothem/rules/host-discovery.md +56 -0
  566. package/src/apothem/rules/i18n-discipline-locale-cohorts.md +120 -0
  567. package/src/apothem/rules/i18n-discipline.md +70 -0
  568. package/src/apothem/rules/interactive-questions-canonical-shapes.md +590 -0
  569. package/src/apothem/rules/interactive-questions-detail.md +41 -0
  570. package/src/apothem/rules/interactive-questions-sweep-matchers.md +184 -0
  571. package/src/apothem/rules/interactive-questions.md +89 -0
  572. package/src/apothem/rules/large-file-generation.md +112 -0
  573. package/src/apothem/rules/large-file-reading.md +59 -0
  574. package/src/apothem/rules/living-docs.md +85 -0
  575. package/src/apothem/rules/multi-agent-workflow.md +57 -0
  576. package/src/apothem/rules/operational-mandates-expanded.md +78 -0
  577. package/src/apothem/rules/operational-mandates.md +88 -0
  578. package/src/apothem/rules/option-annotation-form.md +60 -0
  579. package/src/apothem/rules/option-annotation.md +45 -0
  580. package/src/apothem/rules/own-voice-reimplementation.md +86 -0
  581. package/src/apothem/rules/performance-discipline.md +91 -0
  582. package/src/apothem/rules/persistent-conventions-vigilance-checklist.md +54 -0
  583. package/src/apothem/rules/persistent-conventions-vigilance.md +61 -0
  584. package/src/apothem/rules/plain-language.md +56 -0
  585. package/src/apothem/rules/planning-techniques.md +130 -0
  586. package/src/apothem/rules/pre-emission-gate-bars.md +86 -0
  587. package/src/apothem/rules/pre-emission-gate.md +54 -0
  588. package/src/apothem/rules/production-ready-prs-surfaces.md +162 -0
  589. package/src/apothem/rules/production-ready-prs.md +83 -0
  590. package/src/apothem/rules/propagation.md +63 -0
  591. package/src/apothem/rules/recommend-next-step.md +106 -0
  592. package/src/apothem/rules/refactoring-discipline.md +76 -0
  593. package/src/apothem/rules/session-closure.md +44 -0
  594. package/src/apothem/rules/sota-elevation-exemplars.md +76 -0
  595. package/src/apothem/rules/sota-elevation.md +52 -0
  596. package/src/apothem/rules/source-accessibility.md +58 -0
  597. package/src/apothem/rules/surgical-manipulation.md +48 -0
  598. package/src/apothem/rules/systemic-participation-relations.md +108 -0
  599. package/src/apothem/rules/systemic-participation.md +70 -0
  600. package/src/apothem/rules/ten-dimension-check-dimensions.md +52 -0
  601. package/src/apothem/rules/ten-dimension-check.md +59 -0
  602. package/src/apothem/rules/token-budget-discipline.md +81 -0
  603. package/src/apothem/rules/token-efficiency-rewrite-protocol.md +79 -0
  604. package/src/apothem/rules/token-efficiency-rewrite.md +77 -0
  605. package/src/apothem/rules/tool-use-discipline.md +48 -0
  606. package/src/apothem/rules/visual-leverage.md +102 -0
  607. package/src/apothem/schemas/NOTICE.md +9 -0
  608. package/src/apothem/schemas/README.md +104 -0
  609. package/src/apothem/schemas/__init__.py +176 -0
  610. package/src/apothem/schemas/advisory-finding.schema.json +111 -0
  611. package/src/apothem/schemas/agent.schema.json +106 -0
  612. package/src/apothem/schemas/authorship-header.txt +1 -0
  613. package/src/apothem/schemas/cohort-manifest.yaml +248 -0
  614. package/src/apothem/schemas/cohort-metadata-vocabulary.yaml +168 -0
  615. package/src/apothem/schemas/cohort.schema.json +113 -0
  616. package/src/apothem/schemas/command.schema.json +68 -0
  617. package/src/apothem/schemas/compatibility-matrix.yaml +432 -0
  618. package/src/apothem/schemas/context-fragment.schema.json +64 -0
  619. package/src/apothem/schemas/freshness-token-denylist.txt +51 -0
  620. package/src/apothem/schemas/handoff-manifest.yaml +353 -0
  621. package/src/apothem/schemas/header-exceptions.txt +141 -0
  622. package/src/apothem/schemas/header-visibility.yaml +39 -0
  623. package/src/apothem/schemas/learning-signal.schema.json +46 -0
  624. package/src/apothem/schemas/memory-record.schema.json +61 -0
  625. package/src/apothem/schemas/output-style.schema.json +40 -0
  626. package/src/apothem/schemas/plan.schema.json +51 -0
  627. package/src/apothem/schemas/plugin.schema.json +83 -0
  628. package/src/apothem/schemas/profile.example.yaml +70 -0
  629. package/src/apothem/schemas/profile.minimal.yaml +6 -0
  630. package/src/apothem/schemas/profile.schema.json +396 -0
  631. package/src/apothem/schemas/reference-token-denylist.txt +25 -0
  632. package/src/apothem/schemas/skill.schema.json +75 -0
  633. package/src/apothem/skills/README.md +93 -0
  634. package/src/apothem/skills/dependency-upgrade/SKILL.md +105 -0
  635. package/src/apothem/skills/dev-toolkit/SKILL.md +120 -0
  636. package/src/apothem/skills/diagram-authoring/SKILL.md +113 -0
  637. package/src/apothem/skills/document-authoring/SKILL.md +118 -0
  638. package/src/apothem/skills/ecosystem-audit/SKILL.md +108 -0
  639. package/src/apothem/skills/ecosystem-audit/references/audit-fortress.md +85 -0
  640. package/src/apothem/skills/ecosystem-audit/references/procedure.md +162 -0
  641. package/src/apothem/skills/eval-harness/SKILL.md +88 -0
  642. package/src/apothem/skills/incident-runbook/SKILL.md +92 -0
  643. package/src/apothem/skills/multi-source-research/SKILL.md +90 -0
  644. package/src/apothem/skills/plan-suite/SKILL.md +118 -0
  645. package/src/apothem/skills/plan-suite/master_template.md +1324 -0
  646. package/src/apothem/skills/projectify/SKILL.md +117 -0
  647. package/src/apothem/skills/prompt-engineering/SKILL.md +122 -0
  648. package/src/apothem/skills/refactor-extract/SKILL.md +85 -0
  649. package/src/apothem/skills/research-suite/SKILL.md +170 -0
  650. package/src/apothem/skills/research-suite/references/directory-structure.md +47 -0
  651. package/src/apothem/skills/research-suite/references/lifecycle.md +67 -0
  652. package/src/apothem/skills/research-suite/references/principal-investigator-framework.md +37 -0
  653. package/src/apothem/skills/research-suite/references/rigor-mandates.md +30 -0
  654. package/src/apothem/skills/research-suite/research_template.md +476 -0
  655. package/src/apothem/skills/secret-rotation/SKILL.md +87 -0
  656. package/src/apothem/skills/source-synthesis/SKILL.md +92 -0
  657. package/src/apothem/skills/surgical-guard/SKILL.md +118 -0
  658. package/src/apothem/skills/test-authoring/SKILL.md +85 -0
  659. package/src/apothem/skills/vuln-triage/SKILL.md +91 -0
  660. package/src/apothem/skills/workflow/SKILL.md +139 -0
  661. package/src/apothem/statuslines/README.md +26 -0
  662. package/src/apothem/statuslines/__init__.py +20 -0
  663. package/src/apothem/statuslines/conformity.json +5 -0
  664. package/src/apothem/statuslines/render.py +334 -0
  665. package/src/apothem/statuslines/statusline.md +50 -0
  666. package/src/apothem/templates/README.md +43 -0
  667. package/src/apothem/templates/agents-md-template.md +80 -0
  668. package/src/apothem/templates/consideration-log.md +39 -0
  669. package/src/apothem/templates/expertise-gap-log.md +56 -0
  670. package/src/apothem/templates/master-index-template.md +93 -0
  671. package/src/apothem/templates/potency-map.md +53 -0
  672. package/src/apothem/templates/preservation-audit.md +60 -0
  673. package/src/apothem/templates/question-resolution-audit.md +52 -0
  674. package/src/apothem/templates/trace-matrix-template.md +77 -0
@@ -0,0 +1,318 @@
1
+ {
2
+ "hooks": {
3
+ "SessionStart": [
4
+ {
5
+ "matcher": "*",
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.sh\" SessionStart",
10
+ "timeout": 30,
11
+ "shell": "bash"
12
+ },
13
+ {
14
+ "type": "command",
15
+ "command": "pwsh -NoProfile -File \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.ps1\" SessionStart",
16
+ "timeout": 30,
17
+ "shell": "powershell"
18
+ }
19
+ ]
20
+ }
21
+ ],
22
+ "PreToolUse": [
23
+ {
24
+ "matcher": "Write",
25
+ "hooks": [
26
+ {
27
+ "type": "command",
28
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.sh\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-write.md\"",
29
+ "timeout": 10,
30
+ "shell": "bash"
31
+ },
32
+ {
33
+ "type": "command",
34
+ "command": "pwsh -NoProfile -File \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.ps1\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-write.md\"",
35
+ "timeout": 10,
36
+ "shell": "powershell"
37
+ },
38
+ {
39
+ "type": "command",
40
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.sh\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-write-header-guard.md\"",
41
+ "timeout": 10,
42
+ "shell": "bash"
43
+ },
44
+ {
45
+ "type": "command",
46
+ "command": "pwsh -NoProfile -File \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.ps1\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-write-header-guard.md\"",
47
+ "timeout": 10,
48
+ "shell": "powershell"
49
+ },
50
+ {
51
+ "type": "command",
52
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.sh\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-write-plan-guard.md\"",
53
+ "timeout": 10,
54
+ "shell": "bash"
55
+ },
56
+ {
57
+ "type": "command",
58
+ "command": "pwsh -NoProfile -File \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.ps1\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-write-plan-guard.md\"",
59
+ "timeout": 10,
60
+ "shell": "powershell"
61
+ },
62
+ {
63
+ "type": "command",
64
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.sh\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-dependency-guard.md\"",
65
+ "timeout": 10,
66
+ "shell": "bash"
67
+ },
68
+ {
69
+ "type": "command",
70
+ "command": "pwsh -NoProfile -File \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.ps1\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-dependency-guard.md\"",
71
+ "timeout": 10,
72
+ "shell": "powershell"
73
+ },
74
+ {
75
+ "type": "command",
76
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.sh\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-eval-guard.md\"",
77
+ "timeout": 10,
78
+ "shell": "bash"
79
+ },
80
+ {
81
+ "type": "command",
82
+ "command": "pwsh -NoProfile -File \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.ps1\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-eval-guard.md\"",
83
+ "timeout": 10,
84
+ "shell": "powershell"
85
+ }
86
+ ]
87
+ },
88
+ {
89
+ "matcher": "Edit",
90
+ "hooks": [
91
+ {
92
+ "type": "command",
93
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.sh\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-edit.md\"",
94
+ "timeout": 10,
95
+ "shell": "bash"
96
+ },
97
+ {
98
+ "type": "command",
99
+ "command": "pwsh -NoProfile -File \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.ps1\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-edit.md\"",
100
+ "timeout": 10,
101
+ "shell": "powershell"
102
+ },
103
+ {
104
+ "type": "command",
105
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.sh\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-edit-header-guard.md\"",
106
+ "timeout": 10,
107
+ "shell": "bash"
108
+ },
109
+ {
110
+ "type": "command",
111
+ "command": "pwsh -NoProfile -File \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.ps1\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-edit-header-guard.md\"",
112
+ "timeout": 10,
113
+ "shell": "powershell"
114
+ },
115
+ {
116
+ "type": "command",
117
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.sh\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-write-plan-guard.md\"",
118
+ "timeout": 10,
119
+ "shell": "bash"
120
+ },
121
+ {
122
+ "type": "command",
123
+ "command": "pwsh -NoProfile -File \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.ps1\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-write-plan-guard.md\"",
124
+ "timeout": 10,
125
+ "shell": "powershell"
126
+ },
127
+ {
128
+ "type": "command",
129
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.sh\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-dependency-guard.md\"",
130
+ "timeout": 10,
131
+ "shell": "bash"
132
+ },
133
+ {
134
+ "type": "command",
135
+ "command": "pwsh -NoProfile -File \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.ps1\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-dependency-guard.md\"",
136
+ "timeout": 10,
137
+ "shell": "powershell"
138
+ },
139
+ {
140
+ "type": "command",
141
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.sh\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-eval-guard.md\"",
142
+ "timeout": 10,
143
+ "shell": "bash"
144
+ },
145
+ {
146
+ "type": "command",
147
+ "command": "pwsh -NoProfile -File \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.ps1\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-eval-guard.md\"",
148
+ "timeout": 10,
149
+ "shell": "powershell"
150
+ }
151
+ ]
152
+ },
153
+ {
154
+ "matcher": "NotebookEdit",
155
+ "hooks": [
156
+ {
157
+ "type": "command",
158
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.sh\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-notebookedit.md\"",
159
+ "timeout": 10,
160
+ "shell": "bash"
161
+ },
162
+ {
163
+ "type": "command",
164
+ "command": "pwsh -NoProfile -File \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.ps1\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-notebookedit.md\"",
165
+ "timeout": 10,
166
+ "shell": "powershell"
167
+ },
168
+ {
169
+ "type": "command",
170
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.sh\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-write-plan-guard.md\"",
171
+ "timeout": 10,
172
+ "shell": "bash"
173
+ },
174
+ {
175
+ "type": "command",
176
+ "command": "pwsh -NoProfile -File \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.ps1\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-write-plan-guard.md\"",
177
+ "timeout": 10,
178
+ "shell": "powershell"
179
+ }
180
+ ]
181
+ },
182
+ {
183
+ "matcher": "Bash",
184
+ "hooks": [
185
+ {
186
+ "type": "command",
187
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.sh\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-bash.md\"",
188
+ "timeout": 10,
189
+ "shell": "bash"
190
+ },
191
+ {
192
+ "type": "command",
193
+ "command": "pwsh -NoProfile -File \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.ps1\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-bash.md\"",
194
+ "timeout": 10,
195
+ "shell": "powershell"
196
+ },
197
+ {
198
+ "type": "command",
199
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.sh\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-bash-plan-guard.md\"",
200
+ "timeout": 10,
201
+ "shell": "bash"
202
+ },
203
+ {
204
+ "type": "command",
205
+ "command": "pwsh -NoProfile -File \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.ps1\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-bash-plan-guard.md\"",
206
+ "timeout": 10,
207
+ "shell": "powershell"
208
+ },
209
+ {
210
+ "type": "command",
211
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.sh\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-eval-guard.md\"",
212
+ "timeout": 10,
213
+ "shell": "bash"
214
+ },
215
+ {
216
+ "type": "command",
217
+ "command": "pwsh -NoProfile -File \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.ps1\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-eval-guard.md\"",
218
+ "timeout": 10,
219
+ "shell": "powershell"
220
+ }
221
+ ]
222
+ },
223
+ {
224
+ "matcher": "AskUserQuestion",
225
+ "hooks": [
226
+ {
227
+ "type": "command",
228
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.sh\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-askuserquestion-recommended.md\"",
229
+ "timeout": 10,
230
+ "shell": "bash"
231
+ },
232
+ {
233
+ "type": "command",
234
+ "command": "pwsh -NoProfile -File \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.ps1\" PreToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/pretooluse-askuserquestion-recommended.md\"",
235
+ "timeout": 10,
236
+ "shell": "powershell"
237
+ }
238
+ ]
239
+ }
240
+ ],
241
+ "PostToolUse": [
242
+ {
243
+ "matcher": "*",
244
+ "hooks": [
245
+ {
246
+ "type": "command",
247
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.sh\" PostToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/posttooluse-proactive-compaction.md\"",
248
+ "timeout": 10,
249
+ "shell": "bash"
250
+ },
251
+ {
252
+ "type": "command",
253
+ "command": "pwsh -NoProfile -File \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.ps1\" PostToolUse \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/posttooluse-proactive-compaction.md\"",
254
+ "timeout": 10,
255
+ "shell": "powershell"
256
+ }
257
+ ]
258
+ }
259
+ ],
260
+ "PreCompact": [
261
+ {
262
+ "matcher": "*",
263
+ "hooks": [
264
+ {
265
+ "type": "command",
266
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.sh\" PreCompact \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/precompact.md\"",
267
+ "timeout": 30,
268
+ "shell": "bash"
269
+ },
270
+ {
271
+ "type": "command",
272
+ "command": "pwsh -NoProfile -File \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.ps1\" PreCompact \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/precompact.md\"",
273
+ "timeout": 30,
274
+ "shell": "powershell"
275
+ }
276
+ ]
277
+ }
278
+ ],
279
+ "PostCompact": [
280
+ {
281
+ "matcher": "*",
282
+ "hooks": [
283
+ {
284
+ "type": "command",
285
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.sh\" PostCompact \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/postcompact.md\"",
286
+ "timeout": 30,
287
+ "shell": "bash"
288
+ },
289
+ {
290
+ "type": "command",
291
+ "command": "pwsh -NoProfile -File \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.ps1\" PostCompact \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/postcompact.md\"",
292
+ "timeout": 30,
293
+ "shell": "powershell"
294
+ }
295
+ ]
296
+ }
297
+ ],
298
+ "Stop": [
299
+ {
300
+ "matcher": "*",
301
+ "hooks": [
302
+ {
303
+ "type": "command",
304
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.sh\" Stop \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/stop.md\"",
305
+ "timeout": 60,
306
+ "shell": "bash"
307
+ },
308
+ {
309
+ "type": "command",
310
+ "command": "pwsh -NoProfile -File \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/lib/bootstrap.ps1\" Stop \"${CLAUDE_PLUGIN_ROOT}/src/apothem/hooks/messages/stop.md\"",
311
+ "timeout": 60,
312
+ "shell": "powershell"
313
+ }
314
+ ]
315
+ }
316
+ ]
317
+ }
318
+ }
@@ -0,0 +1,39 @@
1
+ <!-- SPDX-License-Identifier: MIT -->
2
+
3
+ # hooks/lib
4
+
5
+ > **Role.** Dispatcher support — the shell stubs that locate an interpreter and
6
+ > hand off to the dispatcher, plus the shared Python helpers the hook scripts
7
+ > import.
8
+
9
+ The bootstrap stubs are the documented shell entry path; the Claude Code
10
+ `settings.json` hook entries instead invoke an install-resolved absolute
11
+ interpreter on `../dispatch.py` directly (the `${PYTHON_BIN}` placeholder is
12
+ substituted at install time), so the bootstrap stubs are not on that harness's
13
+ `settings.json` critical path.
14
+
15
+ ## Files
16
+
17
+ | File | Purpose |
18
+ |------|---------|
19
+ | `bootstrap.sh` / `bootstrap.ps1` | Shell bootstrap stubs — resolve the project root, source the interpreter locator, and `exec` the dispatcher. The documented shell entry path. |
20
+ | `find-python.sh` / `find-python.ps1` | Python interpreter locators — find a real interpreter on PATH (rejecting zero-byte Store launcher shims, enforcing the version floor). |
21
+ | `find-pwsh.sh` / `find-pwsh.ps1` | PowerShell interpreter locators. |
22
+ | `events.py` | Single source of truth for the supported hook-event vocabulary, imported by the dispatcher and handlers. |
23
+ | `log.py` | Shared logger factory for the hook scripts. |
24
+ | `resolve_root.py` | Project-root resolution for the apothem ecosystem. |
25
+ | `__init__.py` | Package marker. |
26
+
27
+ ## Operating in this folder
28
+
29
+ - **Fail-open on the critical path.** The stubs use `set -u` (not `-euo pipefail`) and an `ERR` trap that emits a JSON diagnostic envelope and exits 0, so a missing interpreter or dispatcher never stalls the harness. Preserve every explicit diagnostic-envelope branch; `-e` would short-circuit them.
30
+ - **Stubs are paired across `.sh` and `.ps1`.** A change to one shell family's stub is mirrored in its counterpart in the same change so behavior does not diverge by platform.
31
+ - **Per-platform startup budgets bound the stubs:** the POSIX-bash stub carries the tightest budget; the PowerShell stub and the Windows Git-Bash/mingw64 path carry a wider budget because their interpreter startup dominates; the interpreter locator sits inside the stub budget. Keep stub work minimal — resolve, locate, `exec`; do not add per-invocation overhead.
32
+ - **The event vocabulary lives in `events.py`** and is imported, never duplicated, by the dispatcher and handlers.
33
+ - Shell files open with `#!/usr/bin/env bash` then the hash-form single-line SPDX license header; Python files carry the same hash-form header.
34
+ - Validate shell changes with `shellcheck hooks/lib/*.sh` and `Invoke-ScriptAnalyzer` over the `.ps1` stubs; validate Python helpers with `python -m ruff check`, `python -m mypy`, and `python -m pytest`. Surface any unresolved decision as `TODO(clarify): ...`.
35
+
36
+ ## Related
37
+
38
+ - [`../`](../) — the hook runtime (`dispatch.py`, handlers, `messages/`) these stubs and helpers support.
39
+ - [`../../benchmarks/bench_hooks.py`](../../benchmarks/bench_hooks.py) — the per-event runtime benchmark whose budget the stub startup sits inside.
@@ -0,0 +1,18 @@
1
+ # SPDX-License-Identifier: MIT
2
+
3
+ """Shared helpers consumed by the hook dispatcher and per-event emitters.
4
+
5
+ Modules:
6
+
7
+ * ``events`` — canonical hook-event taxonomy plus per-event metadata.
8
+ * ``log`` — structured-logging surface used across the hook pipeline.
9
+ * ``resolve_root`` — ecosystem-root resolution from the dispatcher's
10
+ invocation context (``CLAUDE_PROJECT_DIR`` / ``LLM_PROJECT_DIR`` /
11
+ fallback heuristics).
12
+
13
+ The cross-platform shell stubs (``bootstrap.sh``, ``bootstrap.ps1``,
14
+ ``find-python.sh``, ``find-python.ps1``, ``find-pwsh.sh``,
15
+ ``find-pwsh.ps1``) live in this directory as data files; they are
16
+ invoked by the harness's ``settings.json`` ``command:`` field at
17
+ hook-fire time, not imported as Python modules.
18
+ """
@@ -0,0 +1,129 @@
1
+ # SPDX-License-Identifier: MIT
2
+
3
+ # Purpose: PowerShell bootstrap stub for apothem hook events. Resolves
4
+ # the project root, locates a real CPython >= 3.10 via find-python.ps1,
5
+ # then invokes hooks/dispatch.py with the event name (and optional
6
+ # context-file relative to project root).
7
+ # Contract: stdout passthrough; exit 0 always (fail-open) so hook failures
8
+ # never stall the host harness; missing interpreter or dispatcher emits a JSON
9
+ # diagnostic envelope on stdout.
10
+ # Sibling files in hooks/lib/: bootstrap.sh (POSIX counterpart),
11
+ # find-python.ps1 (interpreter locator this stub dot-sources),
12
+ # find-python.sh (POSIX counterpart of the locator).
13
+ #
14
+ # Invocation contract (event name + optional context file are positional; the
15
+ # event also binds via -HookEvent, with -Event retained as an alias):
16
+ # powershell -NoProfile -ExecutionPolicy Bypass -File `
17
+ # "<root>\hooks\lib\bootstrap.ps1" <event> [<context-file>]
18
+ #
19
+ # Root discovery order:
20
+ # 1. $env:CLAUDE_PROJECT_DIR if it points at a directory containing hooks\.
21
+ # 2. $env:LLM_PROJECT_DIR (vendor-neutral alias) if it points at a
22
+ # directory containing hooks\.
23
+ # 3. Upward walk from $PWD looking for hooks\dispatch.py.
24
+ # 4. The directory two levels above this script (i.e. $HOME\.claude when
25
+ # this lives at $HOME\.claude\hooks\lib\bootstrap.ps1).
26
+ # 5. $HOME\.claude as final fallback (Claude Code harness root).
27
+
28
+ [CmdletBinding()]
29
+ param(
30
+ # Renamed away from the PowerShell automatic Event variable (populated
31
+ # inside event/job scriptblocks) for collision-safety, and to match the
32
+ # POSIX bootstrap.sh's neutral `event`. The -Event alias preserves the
33
+ # documented flag form; the canonical hooks.json invocation passes the
34
+ # event positionally, which binds here regardless of the parameter name.
35
+ [Parameter(Mandatory = $true)]
36
+ [Alias('Event')]
37
+ [string]$HookEvent,
38
+ [Parameter(Mandatory = $false)][string]$ContextFile
39
+ )
40
+
41
+ # Why 'Continue' (not 'Stop'): the dispatch contract is fail-open — any
42
+ # blocking error must surface as a JSON envelope on stdout with exit 0 so
43
+ # the host harness never stalls. 'Stop' would short-circuit the explicit
44
+ # diagnostic-envelope branches below before they can render. The trap on
45
+ # the next line catches truly unexpected exceptions and routes them
46
+ # through the same envelope path.
47
+ $ErrorActionPreference = 'Continue'
48
+
49
+ function Write-DiagnosticEnvelope {
50
+ param([string]$Message)
51
+ $payload = @{ systemMessage = $Message } | ConvertTo-Json -Compress
52
+ Write-Output $payload
53
+ }
54
+
55
+ trap {
56
+ # The JSON envelope is the hook-runtime contract and goes to STDOUT
57
+ # (matching bootstrap.sh and this stub's stated stdout contract); stderr
58
+ # is reserved for the human-readable diagnostic line only. The script line
59
+ # number mirrors bootstrap.sh's `at line $LINENO` for canonical-pair
60
+ # diagnostic parity; the exception message is the platform-available detail.
61
+ $line = $_.InvocationInfo.ScriptLineNumber
62
+ $message = "hook bootstrap: unexpected error at line ${line}: $($_.Exception.Message)"
63
+ Write-DiagnosticEnvelope -Message $message
64
+ [Console]::Error.WriteLine($message)
65
+ exit 0
66
+ }
67
+
68
+ # --- Resolve project root ----------------------------------------------------
69
+ $root = $env:CLAUDE_PROJECT_DIR
70
+ if (-not $root -or -not (Test-Path -LiteralPath (Join-Path $root 'hooks'))) {
71
+ $root = $env:LLM_PROJECT_DIR
72
+ }
73
+ if (-not $root -or -not (Test-Path -LiteralPath (Join-Path $root 'hooks'))) {
74
+ $cursor = $PWD.Path
75
+ $root = $null
76
+ while ($cursor) {
77
+ if (Test-Path -LiteralPath (Join-Path $cursor 'hooks\dispatch.py')) {
78
+ $root = $cursor
79
+ break
80
+ }
81
+ $parent = Split-Path -Parent $cursor
82
+ if (-not $parent -or $parent -eq $cursor) { break }
83
+ $cursor = $parent
84
+ }
85
+ }
86
+ if (-not $root) {
87
+ $scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
88
+ $candidate = Resolve-Path (Join-Path $scriptDir '..\..') -ErrorAction SilentlyContinue
89
+ if ($candidate -and (Test-Path -LiteralPath (Join-Path $candidate.Path 'hooks\dispatch.py'))) {
90
+ $root = $candidate.Path
91
+ }
92
+ }
93
+ if (-not $root) {
94
+ $root = Join-Path $HOME '.claude'
95
+ }
96
+
97
+ # --- Locate Python via the locator stub --------------------------------------
98
+ $locator = Join-Path $root 'hooks\lib\find-python.ps1'
99
+ if (-not (Test-Path -LiteralPath $locator)) {
100
+ Write-DiagnosticEnvelope -Message ("hook {0} skipped: locator stub missing at {1}" -f $HookEvent, $locator)
101
+ exit 0
102
+ }
103
+ . $locator
104
+
105
+ $py = $null
106
+ try {
107
+ $py = Find-RealPython
108
+ } catch {
109
+ Write-DiagnosticEnvelope -Message ("hook {0} skipped: locator raised {1}" -f $HookEvent, $_.Exception.Message)
110
+ exit 0
111
+ }
112
+ if (-not $py) {
113
+ Write-DiagnosticEnvelope -Message ("hook {0} skipped: no Python interpreter found" -f $HookEvent)
114
+ exit 0
115
+ }
116
+
117
+ $dispatch = Join-Path $root 'hooks\dispatch.py'
118
+ if (-not (Test-Path -LiteralPath $dispatch)) {
119
+ Write-DiagnosticEnvelope -Message ("hook {0} skipped: dispatch missing at {1}" -f $HookEvent, $dispatch)
120
+ exit 0
121
+ }
122
+
123
+ # --- Hand off to dispatch.py -------------------------------------------------
124
+ if ($ContextFile) {
125
+ & $py $dispatch --event-name $HookEvent --context-file $ContextFile
126
+ } else {
127
+ & $py $dispatch --event-name $HookEvent
128
+ }
129
+ exit $LASTEXITCODE
@@ -0,0 +1,103 @@
1
+ #!/usr/bin/env bash
2
+ # SPDX-License-Identifier: MIT
3
+
4
+ # Purpose: POSIX bootstrap stub for apothem hook events. Resolves the
5
+ # project root, locates a real CPython >= 3.10 via find-python.sh, then
6
+ # execs hooks/dispatch.py with the event name (and optional context-file
7
+ # relative to project root).
8
+ # Contract: stdin/stdout passthrough; exit 0 always (fail-open) so hook
9
+ # failures never stall the host harness; missing interpreter or dispatcher
10
+ # emits a JSON diagnostic envelope on stdout.
11
+ # Sibling files in hooks/lib/: bootstrap.ps1 (PowerShell counterpart),
12
+ # find-python.sh (interpreter locator this stub sources), find-python.ps1
13
+ # (PowerShell counterpart of the locator).
14
+ #
15
+ # Root discovery order:
16
+ # 1. $CLAUDE_PROJECT_DIR if it points at a directory containing hooks/.
17
+ # 2. $LLM_PROJECT_DIR (vendor-neutral alias) if it points at a directory
18
+ # containing hooks/.
19
+ # 3. Upward walk from $PWD looking for hooks/dispatch.py.
20
+ # 4. The directory two levels above this script (i.e. $HOME/.claude when
21
+ # this lives at $HOME/.claude/hooks/lib/bootstrap.sh).
22
+ # 5. $HOME/.claude as final fallback (Claude Code harness root).
23
+
24
+ # Why `-u` only (not `-euo pipefail`): the dispatch contract is fail-open —
25
+ # any blocking error must surface as a JSON envelope on stdout with exit 0
26
+ # so the host harness never stalls. `-e` would short-circuit the explicit
27
+ # diagnostic-envelope branches below; `pipefail` is unused since no
28
+ # pipelines run in this script. `-u` catches typos in variable names,
29
+ # which is the one failure mode worth aborting on.
30
+ set -u
31
+
32
+ # Trap unexpected errors: emit a JSON envelope and exit 0 so the hook
33
+ # runtime sees a valid envelope rather than an unhandled non-zero exit.
34
+ trap 'printf "{\"systemMessage\":\"hook bootstrap: unexpected error at line %s\"}\n" "${LINENO}"; exit 0' ERR
35
+
36
+ event="${1:-}"
37
+ context_file="${2:-}"
38
+
39
+ if [ -z "$event" ]; then
40
+ printf '{"systemMessage":"hook bootstrap: missing event name"}\n'
41
+ exit 0
42
+ fi
43
+
44
+ # --- Resolve project root ----------------------------------------------------
45
+ root="${CLAUDE_PROJECT_DIR:-}"
46
+ if [ -z "$root" ] || [ ! -d "$root/hooks" ]; then
47
+ root="${LLM_PROJECT_DIR:-}"
48
+ fi
49
+ if [ -z "$root" ] || [ ! -d "$root/hooks" ]; then
50
+ cursor="$PWD"
51
+ root=""
52
+ while [ -n "$cursor" ]; do
53
+ if [ -f "$cursor/hooks/dispatch.py" ]; then
54
+ root="$cursor"
55
+ break
56
+ fi
57
+ parent="$(dirname "$cursor")"
58
+ [ "$parent" = "$cursor" ] && break
59
+ cursor="$parent"
60
+ done
61
+ fi
62
+ if [ -z "$root" ]; then
63
+ script_dir="$(cd "$(dirname "$0")" && pwd)"
64
+ candidate="$(cd "$script_dir/../.." && pwd)"
65
+ if [ -f "$candidate/hooks/dispatch.py" ]; then
66
+ root="$candidate"
67
+ fi
68
+ fi
69
+ [ -z "$root" ] && root="$HOME/.claude"
70
+
71
+ # --- Locate Python via the locator stub --------------------------------------
72
+ locator="$root/hooks/lib/find-python.sh"
73
+ if [ ! -f "$locator" ]; then
74
+ printf '{"systemMessage":"hook %s skipped: locator stub missing at %s"}\n' \
75
+ "$event" "$locator"
76
+ exit 0
77
+ fi
78
+ # shellcheck source=find-python.sh disable=SC1091
79
+ . "$locator"
80
+
81
+ # Guard the command substitution so the ERR trap does NOT fire on the
82
+ # expected no-interpreter path. `if ! winner=$(...)` consumes the locator's
83
+ # non-zero exit as a tested condition rather than an uncaught error, so a
84
+ # host with no real CPython sees the intended "no Python interpreter found"
85
+ # envelope, not the trap's "unexpected error at line N" line.
86
+ if ! py="$(find_real_python 2>/dev/null)" || [ -z "$py" ]; then
87
+ printf '{"systemMessage":"hook %s skipped: no Python interpreter found"}\n' "$event"
88
+ exit 0
89
+ fi
90
+
91
+ dispatch="$root/hooks/dispatch.py"
92
+ if [ ! -f "$dispatch" ]; then
93
+ printf '{"systemMessage":"hook %s skipped: dispatch missing at %s"}\n' \
94
+ "$event" "$dispatch"
95
+ exit 0
96
+ fi
97
+
98
+ # --- Hand off to dispatch.py -------------------------------------------------
99
+ if [ -n "$context_file" ]; then
100
+ exec "$py" "$dispatch" --event-name "$event" --context-file "$context_file"
101
+ else
102
+ exec "$py" "$dispatch" --event-name "$event"
103
+ fi
@@ -0,0 +1,51 @@
1
+ # SPDX-License-Identifier: MIT
2
+
3
+ """Single source of truth for the supported hook-event vocabulary.
4
+
5
+ Both ``hooks/dispatch.py`` and ``hooks/emit_hook_context.py`` import
6
+ their event-vocabulary sets from this module. Future event additions
7
+ land here only; both consumers re-derive at import time.
8
+
9
+ Two sets are exposed:
10
+
11
+ * ``SUPPORTED_EVENTS`` — the whitelist of every hook event the
12
+ dispatcher accepts. Adding an event here makes it routable; removing
13
+ it forces a ``ValueError`` on dispatch attempt. Events listed here
14
+ that are not yet wired in a harness settings file are accepted for
15
+ forward compatibility — the dispatcher routes them the moment a
16
+ settings entry materializes.
17
+
18
+ * ``HOOK_SPECIFIC_OUTPUT_EVENTS`` — the subset of ``SUPPORTED_EVENTS``
19
+ whose envelope schema accepts the ``hookSpecificOutput`` shape.
20
+ Events outside this subset (currently ``PreCompact`` and
21
+ ``PostCompact``) fail strict schema validation on that shape and
22
+ must use the top-level ``systemMessage`` field instead.
23
+ """
24
+
25
+ from __future__ import annotations
26
+
27
+ from typing import Final
28
+
29
+ SUPPORTED_EVENTS: Final[frozenset[str]] = frozenset(
30
+ {
31
+ "SessionStart",
32
+ "PreCompact",
33
+ "PostCompact",
34
+ "Stop",
35
+ "PreToolUse",
36
+ "PostToolUse",
37
+ "UserPromptSubmit",
38
+ "Notification",
39
+ }
40
+ )
41
+
42
+ HOOK_SPECIFIC_OUTPUT_EVENTS: Final[frozenset[str]] = frozenset(
43
+ {
44
+ "SessionStart",
45
+ "Stop",
46
+ "PreToolUse",
47
+ "PostToolUse",
48
+ "UserPromptSubmit",
49
+ "Notification",
50
+ }
51
+ )