@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,63 @@
1
+ # SPDX-License-Identifier: MIT
2
+
3
+ """Install logic for the antigravity harness adapter.
4
+
5
+ Installs the apothem convention surface into the Antigravity CLI harness
6
+ target. Antigravity reads ``~/.gemini/GEMINI.md`` as global context and
7
+ stores CLI customization under ``~/.gemini/antigravity-cli/``; Apothem
8
+ installs a named plugin at
9
+ ``~/.gemini/antigravity-cli/plugins/apothem/`` for cohorts that should not
10
+ collide with Gemini CLI project-local files.
11
+
12
+ The adapter is user-scope: it propagates under the harness root resolved
13
+ as ``output_path.parent`` (``~/.gemini/``). Its propagation contract is
14
+ declared in the canonical manifest at
15
+ ``src/apothem/lib/propagation-manifest.yaml`` under the ``antigravity``
16
+ key and applied by the shared driver at
17
+ ``apothem.harnesses._shared.install_driver``. Drift between the
18
+ propagation contract and the on-disk install is impossible by
19
+ construction: the manifest IS the contract.
20
+ """
21
+
22
+ from __future__ import annotations
23
+
24
+ from pathlib import Path
25
+ from typing import Any
26
+
27
+ from apothem.harnesses._shared import install_driver
28
+ from apothem.harnesses._shared.install_driver import MaterializationRun
29
+
30
+ # Manifest harness key for this adapter.
31
+ _HARNESS_NAME: str = "antigravity"
32
+
33
+
34
+ def install(output_path: Path, profile: dict[str, Any]) -> MaterializationRun:
35
+ """Install the apothem convention surface into the Antigravity harness.
36
+
37
+ The harness root is derived as ``output_path.parent`` — the
38
+ ``AntigravityAdapter`` resolves this to ``~/.gemini/``. The shared
39
+ ``profile`` is projected into the ``GEMINI.md`` instruction anchor as a
40
+ sentinel-delimited Apothem managed block (operator prose outside the
41
+ sentinels is preserved); the convention cohort dirs are raw template copies
42
+ and convention-dir flattening alongside it. All operations are
43
+ idempotent — re-running replaces previous content cleanly, eliminating
44
+ stale files from prior install layouts.
45
+ """
46
+ return install_driver.finalize_install(
47
+ install_driver.run_install(
48
+ _HARNESS_NAME, harness_root=output_path.parent, profile=profile
49
+ ),
50
+ root=output_path.parent,
51
+ )
52
+
53
+
54
+ def plan(output_path: Path) -> list[dict[str, str]]:
55
+ """Return the propagation plan for the configured harness without writing.
56
+
57
+ Each entry carries ``source`` (resolved on-disk path), ``target``
58
+ (resolved absolute path under ``output_path.parent``), and ``mode``
59
+ (the per-entry propagation mode declared in the manifest). The plan is the manifest's
60
+ install list materialized against the active harness root — the same
61
+ sequence ``install`` would apply, in declaration order.
62
+ """
63
+ return install_driver.build_plan(_HARNESS_NAME, harness_root=output_path.parent)
@@ -0,0 +1,40 @@
1
+ <!-- SPDX-License-Identifier: MIT -->
2
+
3
+ # Apothem — Antigravity Bootstrap
4
+
5
+ This file is the vendor-canonical instructions surface for Google
6
+ Antigravity (`~/.gemini/GEMINI.md`). Antigravity CLI customization lives
7
+ under `~/.gemini/antigravity-cli/`; Apothem installs its user-scope
8
+ convention cohort as the `apothem` plugin under
9
+ `~/.gemini/antigravity-cli/plugins/apothem/`.
10
+
11
+ ## Apothem Conventions
12
+
13
+ The Apothem-managed cohorts are propagated to:
14
+
15
+ - `~/.gemini/antigravity-cli/plugins/apothem/plugin.json` — plugin metadata.
16
+ - `~/.gemini/antigravity-cli/plugins/apothem/skills/` — reusable techniques
17
+ plus slash-command prompts converted into skills.
18
+ - `~/.gemini/antigravity-cli/plugins/apothem/rules/` — behavioral reference
19
+ rules.
20
+ - `~/.gemini/antigravity-cli/plugins/apothem/agents/` — local agent
21
+ definitions normalized from Apothem agents.
22
+ - `~/.gemini/antigravity-cli/plugins/apothem/apothem/templates/` — support
23
+ templates retained for prompts that cite reusable plan or audit assets.
24
+ - `~/.gemini/antigravity-cli/plugins/apothem/apothem/hooks/` — hook support
25
+ material retained as reference content; Apothem does not register
26
+ Antigravity hook events until the adapter owns the schema translation.
27
+
28
+ ## Project-Scope Surface
29
+
30
+ Project-specific instructions remain project-owned. This user-scope adapter
31
+ does not write workspace files unless the operator invokes a project-scope
32
+ harness adapter separately.
33
+
34
+ ## Operator Surface
35
+
36
+ Operators may extend this file with project-specific instructions. The
37
+ apothem install re-renders this template on every `apothem install
38
+ --harness antigravity` invocation; persistent operator content belongs in
39
+ project-scope `<workspace>/.agents/` or an operator-owned Antigravity plugin
40
+ instead of this file.
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "apothem",
3
+ "version": "0.1.0",
4
+ "description": "Apothem shared governance profile for Antigravity CLI."
5
+ }
@@ -0,0 +1,22 @@
1
+ # SPDX-License-Identifier: MIT
2
+
3
+ """Uninstall logic for the antigravity harness adapter."""
4
+
5
+ from __future__ import annotations
6
+
7
+ from pathlib import Path
8
+
9
+ from apothem.harnesses._shared import install_driver
10
+
11
+ _HARNESS_NAME: str = "antigravity"
12
+
13
+
14
+ def uninstall(output_path: Path) -> None:
15
+ """Remove Apothem-managed Antigravity targets surgically.
16
+
17
+ The GEMINI.md anchor is a ``sentinel_merge`` manifest target, so the shared
18
+ driver strips only Apothem's managed block (operator prose survives) and
19
+ backs the file up under the Apothem backup root — no whole-file ``.bak``
20
+ sibling is left beside the operator's file.
21
+ """
22
+ install_driver.run_uninstall(_HARNESS_NAME, harness_root=output_path.parent)
@@ -0,0 +1,10 @@
1
+ # SPDX-License-Identifier: MIT
2
+
3
+ """Update logic for the antigravity harness adapter."""
4
+
5
+ from __future__ import annotations
6
+
7
+ from apothem.harnesses._shared.wrapper_factories import make_update
8
+ from apothem.harnesses.antigravity.install import install
9
+
10
+ update = make_update(install)
@@ -0,0 +1,11 @@
1
+ # SPDX-License-Identifier: MIT
2
+
3
+ """Verify logic for the antigravity harness adapter."""
4
+
5
+ from __future__ import annotations
6
+
7
+ from apothem.harnesses._shared.wrapper_factories import make_verify_harness_root
8
+
9
+ _HARNESS_NAME: str = "antigravity"
10
+
11
+ verify = make_verify_harness_root(_HARNESS_NAME)
@@ -0,0 +1,65 @@
1
+ <!-- SPDX-License-Identifier: MIT -->
2
+
3
+ # Claude Code Standard Convention Pin
4
+
5
+ ## Snapshot
6
+
7
+ - Snapshot date: 2026-06-25
8
+ - Snapshot note: live re-verification against `code.claude.com` docs (hooks-guide, sdk-permissions) — the `code.claude.com` authority host, the `settings.json` hooks structure + permission tiers (allow / ask / deny, deny-first), and the hook-event taxonomy all confirmed current; no immutable pin (living MDX docs)
9
+ - Adapter source: `src/apothem/harnesses/claude_code/`
10
+ - Evidence level: adapter-local projection; no vendor-native UI claim is made here.
11
+ - Authority host: `code.claude.com` — the prior `docs.anthropic.com` / `docs.claude.com` hosts 301-redirect here (confirmed live 2026-05-31). The adapter pins no doc URLs in code, so no in-code URL change is required.
12
+
13
+ ## MCP and Permissions Surface Projection
14
+
15
+ - MCP: registered via `claude mcp add --scope local|project|user`. Storage is `~/.claude.json` (user/local scope) and project `.mcp.json` — **not** `settings.json` (confirmed live 2026-05-31; `settings.json` carries only managed allow/deny gates). Apothem authors no MCP server entries; the template `settings.json` carries no `mcpServers`.
16
+ - Permissions: `settings.json` `permissions` carries three tiers — `allow`, `ask`, `deny` — evaluated deny → ask → allow, first match wins. The Apothem template uses the `allow` and `deny` tiers; the `ask` tier is available but unused by default.
17
+ - Hook events: the vendor taxonomy has expanded to roughly 30 events. Apothem wires a current, valid subset — SessionStart, PreToolUse (Write/Edit/NotebookEdit/Bash matchers), PreCompact, PostCompact, Stop — all confirmed current 2026-05-31; no template change required.
18
+
19
+ ## Recommended Postfix Rendering
20
+
21
+ - Status: supported as plain text.
22
+ - Mechanism: Apothem emits the literal ` (Recommended)` suffix in the option label. Claude Code-facing prompts and rule text preserve that suffix as authored.
23
+ - Boundary: this pin does not claim a harness-native recommended-option widget. It only pins the text-rendered convention used by `rules/interactive-questions.md`.
24
+
25
+ ## Long Context and Compaction
26
+
27
+ - Status: profile-managed.
28
+ - Mechanism: Apothem keeps full-suite `/plan-execute` runs continuous by externalizing state to `.apothem/plans/`, compacting or restarting the harness session at phase boundaries as needed, and restoring via the Blind Bootstrap sequence.
29
+ - Boundary: this pin does not claim vendor-native autocompaction or a long-context size. It pins the adapter-local state handoff and compaction-restoration convention used by `rules/context-management.md`.
30
+
31
+ ## Large-Codebase Practice Projection
32
+
33
+ - Layered context: declared in `capabilities.yml` under `layered_context_surface`; no vendor-native hierarchy is claimed beyond the adapter's documented file/template surface.
34
+ - LSP symbol navigation: `tracked-gap` until a vendor-ratified plugin or tool surface is pinned.
35
+ - Hook learning capture: routed through the `persistent-conventions-vigilance` artifact-evolution cycle; pass-class hooks stay silent and recurring findings become rule, skill, hook, or documentation updates.
36
+
37
+ ## Web-Fetch / Browser-Retrieval Surface
38
+
39
+ - Capability: `web_fetch` = **yes**. The backing dimension for `rules/source-accessibility.md` step 1 ("retrieve through the host's browser / fetch capability").
40
+ - Vendor-confirmed: Claude Code ships built-in WebFetch and WebSearch tools (the CLI surface of the `web_fetch_*` / `web_search_*` server tools).
41
+ - Evidence: vendor-doc-url <https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool> (the prior `docs.claude.com` path 302-redirects here); snapshot-id living MDX (no immutable commit; living-docs host); snapshot-date 2026-06-21.
42
+
43
+ ## Plugin-alone Persistence
44
+
45
+ Claude Code is the one harness with a **full standalone plugin**:
46
+ `.claude-plugin/plugin.json` (installed via
47
+ `/plugin marketplace add ahmed-g-gad/apothem`) declares `commands`, `agents`,
48
+ `skills`, and `hooks` (`./src/apothem/hooks/hooks.json`, resolved against
49
+ `${CLAUDE_PLUGIN_ROOT}`). Installing the plugin *alone* — without running
50
+ `apothem install` — persists most of the cohort directly.
51
+
52
+ | Artifact class | Persists plugin-alone? | Mechanism / limit |
53
+ |---|---|---|
54
+ | Commands | Yes | The manifest `commands` array (46 entries — the 45 command files plus the `./commands/` default-directory entry) loads the 45 slash-commands from the plugin tree; the directory entry holds no `*.md` and loads no command — it addresses the Claude Code v2.1.140+ default-folder note so the explicit nested paths stay authoritative. |
55
+ | Agents | Yes | The manifest `agents` array (12 entries) loads sub-agents from the plugin tree. |
56
+ | Skills | Yes | The manifest `skills` reference loads the skill cohort from the plugin tree. |
57
+ | Hooks | Yes | The manifest `hooks` field points at the bundled `hooks.json`, wired with `${CLAUDE_PLUGIN_ROOT}`-relative dispatch — the PreToolUse/SessionStart/etc. pipeline fires from the plugin alone. |
58
+ | Rules | Degraded — requires `apothem install` for full reference tree | The plugin carries no rules-directory primitive; the embedded directives degrade to a SessionStart `additionalContext` pointer. The full `${HARNESS_ROOT}/rules/` reference tree lands only via the engine. |
59
+ | Settings / output-styles / gate matchers | No — requires `apothem install` | `settings.json` (managed allow/deny + statusline), `output-styles/`, and the conformity `gate.py` + `schemas/` ride beside the engine install, not the plugin package. |
60
+ | MCP | No — operator-owned | MCP servers register via `claude mcp add` into `~/.claude.json` / project `.mcp.json`; neither the plugin nor the engine authors entries. |
61
+
62
+ Bundle status: this is the reference plugin-alone implementation — commands,
63
+ agents, skills, and hooks persist from the plugin package directly; only the full
64
+ rules reference tree, settings, output-styles, and the gate engine need
65
+ `apothem install`.
@@ -0,0 +1,107 @@
1
+ # SPDX-License-Identifier: MIT
2
+
3
+ """Apothem harness adapter for claude-code — full-surface install.
4
+
5
+ Writes the canonical ``settings.json`` template and flattens the convention
6
+ dirs (agents/, commands/, rules/, skills/, statuslines/, output-styles/) at
7
+ the harness root. The install is self-contained: the hook dispatcher and the
8
+ conformity gate are materialized under the harness root (``apothem/hooks/``
9
+ and ``apothem/conformity/`` with the sibling ``apothem/schemas/`` fixtures)
10
+ and invoked by absolute path from ``settings.json``; no pip-installed
11
+ package is required. No ``src/apothem/`` mirror is produced; flat-copied
12
+ source trees found at the harness root are swept on every install per the
13
+ propagation manifest's stale-sweep list. The shared profile is projected into
14
+ ``~/.claude/CLAUDE.md`` as a sentinel-delimited Apothem managed block — operator
15
+ prose outside the sentinels is preserved verbatim — so the apothem governance
16
+ surface reaches Claude Code through that managed block, the propagated ``rules/``
17
+ tree, and the SessionStart hook. Delegates install logic to
18
+ :mod:`apothem.harnesses.claude_code.install`.
19
+
20
+ Plugin-alone capability
21
+ -----------------------
22
+
23
+ The Claude Code plugin can be installed alone via the marketplace, with no
24
+ separate ``python -m apothem install`` engine install. In that posture the
25
+ plugin's ``.claude-plugin/plugin.json`` ``hooks`` field points at a generated
26
+ ``hooks.json`` (see :func:`apothem.lib.plugin_tree.build_plugin_hooks_json`)
27
+ whose every command drives the shell bootstrap stub under
28
+ ``${CLAUDE_PLUGIN_ROOT}``. The stub self-locates a CPython interpreter and
29
+ execs the bundled dispatcher, so hooks fire without the engine install's
30
+ ``${PYTHON_BIN}`` / ``${HARNESS_ROOT}`` substitution. The honest capability
31
+ split:
32
+
33
+ * **Persists plugin-alone.** The SessionStart bootstrap (which now emits a
34
+ lean pointer to the bundled ``rules/`` plus a note that the mechanical hooks
35
+ are active), the PreToolUse write / edit / notebook / bash context guards
36
+ (authorship-header, plans-locality, base context nudges), and the
37
+ PreCompact / PostCompact / Stop handlers — every dispatch-routable hook event.
38
+ * **Degrades plugin-alone.** The behavioral ``rules/`` are bundled under the
39
+ plugin root but cannot load as always-on context; they degrade to the
40
+ SessionStart pointer plus the still-active mechanical hooks. The conformity
41
+ gate's ``gate.py --hook`` entry is NOT wired plugin-alone — the bootstrap
42
+ stub drives only the dispatcher, and the gate's scope default targets a
43
+ harness root (``~/.claude`` / ``~/.codex``) rather than a plugin-alone
44
+ project write; full conformity-gate enforcement needs the engine install.
45
+ * **Needs the engine install.** The materialized ``settings.json``
46
+ (permissions allow / deny floor), the ``output-styles/`` and
47
+ ``statuslines/`` cohorts, and the ``CLAUDE.md`` managed-block projection are
48
+ engine-install surfaces with no plugin manifest field.
49
+ * **Not shipped today.** No MCP server is bundled, so no MCP tools surface
50
+ from the plugin alone.
51
+ """
52
+
53
+ from __future__ import annotations
54
+
55
+ from pathlib import Path
56
+ from typing import Any
57
+
58
+ from apothem.harnesses._shared.install_driver import MaterializationRun
59
+ from apothem.harnesses.claude_code.install import install as _install
60
+ from apothem.harnesses.claude_code.install import plan as _plan
61
+ from apothem.harnesses.claude_code.uninstall import uninstall as _uninstall
62
+ from apothem.harnesses.claude_code.update import update as _update
63
+ from apothem.harnesses.claude_code.verify import verify as _verify
64
+
65
+
66
+ class ClaudeCodeAdapter:
67
+ """ClaudeCodeAdapter — implements :class:`~apothem.harnesses.HarnessAdapter`."""
68
+
69
+ @property
70
+ def name(self) -> str:
71
+ """Return the canonical kebab-case harness identifier."""
72
+ return "claude-code"
73
+
74
+ @property
75
+ def output_path(self) -> Path:
76
+ """Return the always-propagated singleton config file path.
77
+
78
+ The adapter resolves the harness root as ``output_path.parent``;
79
+ ``is_installed()`` / ``verify()`` resolve against this file. The
80
+ always-written ``settings.json`` is the singleton presence anchor; the
81
+ profile-projected ``CLAUDE.md`` managed block is written alongside it.
82
+ """
83
+ return Path.home() / ".claude/settings.json"
84
+
85
+ def install(self, profile: dict[str, Any]) -> MaterializationRun:
86
+ """Materialize the harness configuration from the shared profile."""
87
+ return _install(self.output_path, profile)
88
+
89
+ def update(self, profile: dict[str, Any]) -> MaterializationRun:
90
+ """Re-materialize the harness configuration from the updated profile."""
91
+ return _update(self.output_path, profile)
92
+
93
+ def plan(self, output_path: Path | None = None) -> list[dict[str, str]]:
94
+ """Return the manifest-driven propagation plan without writing."""
95
+ return _plan(output_path or self.output_path)
96
+
97
+ def uninstall(self) -> None:
98
+ """Remove the harness configuration file if present."""
99
+ _uninstall(self.output_path)
100
+
101
+ def is_installed(self) -> bool:
102
+ """Return True if the configuration file exists on disk."""
103
+ return self.output_path.exists()
104
+
105
+ def verify(self) -> bool:
106
+ """Return True if the installed configuration is valid."""
107
+ return _verify(self.output_path)
@@ -0,0 +1,42 @@
1
+ # SPDX-License-Identifier: MIT
2
+
3
+ # Per rules/agent-capability-discipline.md §1 / §3 / §7. The claude_code
4
+ # harness ratifies every cohort capability: MCP via `claude mcp add` into
5
+ # ~/.claude.json (user/local scope) + project-level .mcp.json — NOT
6
+ # settings.json (confirmed live 2026-05-31); sub-agents in ~/.claude/agents/;
7
+ # auto-memory at ~/.claude/projects/<project>/memory/; system-prompt projects
8
+ # through CLAUDE.md (operator-owned; adapter does not manage). Apothem names
9
+ # the native MCP surface but does not author MCP server entries.
10
+
11
+ mcp_servers:
12
+ - claude.json-user-local-scope-via-claude-mcp-add
13
+ - project-level-.mcp.json
14
+ # Operator-owned MCP surface: the adapter recognizes it but authors no entries.
15
+ mcp_servers_authored: false
16
+ sub_agent_dispatch: true
17
+ custom_command_support: "yes"
18
+ recommended_postfix_rendering: "plain-text"
19
+ long_context_compaction: "profile-managed"
20
+ context_ignore_surface: "settings.json permissions {allow, ask, deny}"
21
+ layered_context_surface: "CLAUDE.md hierarchy plus propagated convention dirs"
22
+ lsp_symbol_navigation: "tracked-gap-no-adapter-owned-LSP-surface"
23
+ hook_learning_capture: "artifact-evolution-cycle"
24
+ standard_convention_pin: "STANDARD-CONVENTION-PIN.md"
25
+ # web-fetch / browser-retrieval surface — the backing capability dimension for
26
+ # rules/source-accessibility.md step 1 ("retrieve through the host's browser /
27
+ # fetch capability"). Vendor-confirmed: Claude Code ships built-in WebFetch and
28
+ # WebSearch tools (the CLI surface of the `web_fetch_*` / `web_search_*` server
29
+ # tools). Evidence triple — vendor-doc-url:
30
+ # https://platform.claude.com/docs/en/agents-and-tools/tool-use/web-fetch-tool
31
+ # (the prior docs.claude.com path 302-redirects here); snapshot-id: living MDX
32
+ # (no immutable commit; living-docs host); snapshot-date: 2026-06-21. Canonical
33
+ # evidence home is STANDARD-CONVENTION-PIN.md per
34
+ # rules/agent-capability-discipline-matrix.md §1A; pin refresh tracked as a
35
+ # follow-up to fold this triple into the pin's evidence chain.
36
+ web_fetch: "yes"
37
+ tool_surface_restrictions:
38
+ - secrets-paths
39
+ - destructive-shell-ops
40
+ - network-write-unsigned
41
+ system_prompt_template_path: "n/a"
42
+ agent_memory_surface: "~/.claude/projects/<project>/memory/ (auto-memory) plus CLAUDE.md"
@@ -0,0 +1,147 @@
1
+ # SPDX-License-Identifier: MIT
2
+
3
+ """Install logic for the claude-code harness adapter.
4
+
5
+ Installs the Apothem convention surface — not the Python library
6
+ implementation — into the Claude Code harness target (``~/.claude/`` by
7
+ default). The convention surface is the set of artifacts that match
8
+ Claude Code's native discovery patterns (agents, commands, skills,
9
+ rules, output-styles, statusline). Command prompts are also wrapped as
10
+ skills so reusable workflows are visible through the current skill surface.
11
+ The hook dispatcher, conformity gate, and
12
+ their schema fixtures are materialized under the harness root
13
+ (``apothem/hooks/``, ``apothem/conformity/``, ``apothem/schemas/``)
14
+ so the settings.json hook entries invoke them by absolute script path
15
+ — no importable ``apothem`` package is required on the host. Each hook
16
+ entry's ``command`` carries a ``${PYTHON_BIN}`` placeholder the install
17
+ resolves to the absolute path of a real CPython >= 3.10 (per
18
+ ``apothem.lib.python_resolver``) so no entry invokes a bare ``python``
19
+ that a host PATH could resolve to a Microsoft Store WindowsApps launcher
20
+ stub.
21
+
22
+ The shared profile is projected into the user-scope ``CLAUDE.md`` instruction
23
+ anchor as a sentinel-delimited Apothem managed block (identity / preferences /
24
+ rules / seriousness / opted-in behaviors); operator prose outside the sentinels
25
+ is preserved verbatim. Per the ratified transport map, Claude Code MCP is
26
+ registered via ``claude mcp add`` into ``~/.claude.json`` / project ``.mcp.json``
27
+ — not a file Apothem authors — so this adapter projects no MCP entries and the
28
+ ``settings.json`` permissions/hooks template is left unchanged.
29
+
30
+ The adapter is user-scope: it propagates under the harness root resolved
31
+ as ``output_path.parent`` (``~/.claude/``). Its propagation contract —
32
+ the install list, exclude globs, stale-sweep entries, and per-directory
33
+ filename filter — is declared in the canonical manifest at
34
+ ``src/apothem/lib/propagation-manifest.yaml`` under the ``claude_code``
35
+ key and applied by the shared driver at
36
+ ``apothem.harnesses._shared.install_driver``. Drift between the
37
+ propagation contract and the on-disk install is impossible by
38
+ construction: the manifest IS the contract.
39
+ """
40
+
41
+ from __future__ import annotations
42
+
43
+ from pathlib import Path
44
+ from typing import Any
45
+
46
+ from apothem.harnesses._shared import install_driver
47
+ from apothem.harnesses._shared.install_driver import (
48
+ MaterializationResult,
49
+ MaterializationRun,
50
+ )
51
+ from apothem.lib import atomic_io
52
+ from apothem.lib.profile import coerce_profile
53
+ from apothem.lib.profile_projection import project
54
+ from apothem.lib.python_resolver import resolve_python_bin
55
+
56
+ # Manifest harness key for this adapter.
57
+ _HARNESS_NAME: str = "claude_code"
58
+ # Public adapter id used to resolve per-harness profile overrides.
59
+ _HARNESS_ID: str = "claude-code"
60
+ # Placeholder the settings.json template carries on every hook ``command``
61
+ # field; resolved to an absolute CPython path at install time so no hook
62
+ # entry invokes a bare ``python`` (which a host PATH can resolve to a
63
+ # Microsoft Store WindowsApps launcher stub).
64
+ _PYTHON_BIN_TOKEN: str = "${PYTHON_BIN}" # noqa: S105 — template placeholder token, not a secret
65
+
66
+
67
+ def _resolve_hook_interpreter(harness_root: Path) -> list[MaterializationResult]:
68
+ """Substitute ``${PYTHON_BIN}`` in the installed settings.json.
69
+
70
+ Reads the settings.json the manifest install just wrote, replaces every
71
+ ``${PYTHON_BIN}`` placeholder with the absolute path to a real CPython
72
+ >= 3.10 resolved per :func:`resolve_python_bin`, and rewrites the file
73
+ in place. The rewrite is a pure token substitution on the file the same
74
+ install just produced, so it is written atomically *without* a
75
+ backup-before-replace and *without* the JSON key-merge — both would
76
+ corrupt the substitution (the merge re-prefers the existing
77
+ ``${PYTHON_BIN}`` token, and the backup would capture the un-resolved
78
+ intermediate state as a stray sibling). Idempotent: the resolved path is
79
+ stable across installs on the same host, so re-running yields
80
+ byte-identical output. A settings.json with no placeholder (already
81
+ resolved, or an operator-stripped hooks block) is left untouched.
82
+ """
83
+ settings_path = harness_root / "settings.json"
84
+ if not settings_path.is_file():
85
+ return []
86
+ content = settings_path.read_text(encoding="utf-8")
87
+ if _PYTHON_BIN_TOKEN not in content:
88
+ return []
89
+ python_bin = resolve_python_bin().as_posix()
90
+ rendered = content.replace(_PYTHON_BIN_TOKEN, python_bin)
91
+ if rendered == content:
92
+ return []
93
+ atomic_io.write_bytes_atomically(settings_path, rendered.encode("utf-8"))
94
+ return [
95
+ MaterializationResult(
96
+ outcome="updated",
97
+ operation="resolve-python-bin",
98
+ path=str(settings_path),
99
+ message=f"resolved hook interpreter to {python_bin}",
100
+ source=None,
101
+ backup_path=None,
102
+ detail={"python_bin": python_bin},
103
+ )
104
+ ]
105
+
106
+
107
+ def install(output_path: Path, profile: dict[str, Any]) -> MaterializationRun:
108
+ """Install the apothem convention surface into the Claude Code harness.
109
+
110
+ The harness root is derived as ``output_path.parent`` — the
111
+ ``ClaudeCodeAdapter`` resolves this to ``~/.claude/``. The manifest-driven
112
+ convention surface (settings.json, agents/, commands→skills/, rules/,
113
+ skills/, support trees) is materialized first, then the shared *profile* is
114
+ projected into the user-scope ``CLAUDE.md`` instruction anchor as a
115
+ sentinel-delimited managed block (identity / preferences / rules /
116
+ seriousness / opted-in behaviors). Operator prose outside the sentinels is
117
+ preserved verbatim. All operations are idempotent — re-running with the same
118
+ profile yields byte-identical output and preserves unrelated
119
+ operator-authored discovery entries.
120
+ """
121
+ harness_root = output_path.parent
122
+ run = install_driver.run_install(_HARNESS_NAME, harness_root=harness_root)
123
+ for_harness = coerce_profile(profile).for_harness(_HARNESS_ID)
124
+ surfaces = project(for_harness, _HARNESS_ID)
125
+ anchor_result = install_driver.apply_managed_block_anchor(
126
+ harness_root / "CLAUDE.md",
127
+ surfaces.managed_block_body,
128
+ install_root=harness_root,
129
+ harness_name=_HARNESS_NAME,
130
+ allowed_root=harness_root.parent,
131
+ )
132
+ interpreter_results = _resolve_hook_interpreter(harness_root)
133
+ return install_driver.finalize_install(
134
+ run.extend([anchor_result, *interpreter_results]), root=harness_root
135
+ )
136
+
137
+
138
+ def plan(output_path: Path) -> list[dict[str, str]]:
139
+ """Return the propagation plan for the configured harness without writing.
140
+
141
+ Each entry carries ``source`` (resolved on-disk path), ``target``
142
+ (resolved absolute path under ``output_path.parent``), and ``mode``
143
+ (``write_text``, a tree mode, or a conversion mode). The plan is the manifest's
144
+ install list materialized against the active harness root — the same
145
+ sequence ``install`` would apply, in declaration order.
146
+ """
147
+ return install_driver.build_plan(_HARNESS_NAME, harness_root=output_path.parent)