@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,93 @@
1
+ # SPDX-License-Identifier: MIT
2
+
3
+ """Hook-handler runtime benchmark per the per-event budgets in
4
+ `src/apothem/rules/performance-discipline.md` §1.
5
+
6
+ The script declares the canonical per-event budgets and provides a measurement
7
+ hook for the dispatcher's startup overhead. Representative event-fixture
8
+ invocation is operator-editorial: when no fixture is wired for a given event,
9
+ the script reports the budget and exits with the scaffold marker (return
10
+ code 0) so the verifier surface remains usable while detailed fixtures land.
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ import argparse
16
+ import subprocess
17
+ import sys
18
+ import time
19
+ from pathlib import Path
20
+ from typing import Final
21
+
22
+ _BUDGETS: Final[dict[str, float]] = {
23
+ "PreToolUse": 10.0,
24
+ "PostToolUse": 10.0,
25
+ "UserPromptSubmit": 10.0,
26
+ "Notification": 10.0,
27
+ "SessionStart": 30.0,
28
+ "PreCompact": 30.0,
29
+ "PostCompact": 30.0,
30
+ "Stop": 60.0,
31
+ }
32
+
33
+ # bench_hooks.py lives at <repo>/src/apothem/benchmarks/; four parents up is
34
+ # the repository root.
35
+ _REPO_ROOT: Final[Path] = Path(__file__).resolve().parents[3]
36
+ _DISPATCHER: Final[Path] = _REPO_ROOT / "src" / "apothem" / "hooks" / "dispatch.py"
37
+
38
+
39
+ def _measure_dispatcher_startup() -> float:
40
+ """Return wall-clock seconds for a no-op dispatcher invocation.
41
+
42
+ Invokes the dispatcher with ``--help`` (argparse exits 0) so the elapsed
43
+ wall-clock bounds the floor cost (interpreter spin-up + module import +
44
+ arg parse) for any hook handler. A non-zero return code means the
45
+ dispatcher could not be exercised; the caller raises rather than report a
46
+ spurious sub-budget reading from a process that never ran the real code.
47
+ """
48
+ start = time.monotonic()
49
+ completed = subprocess.run( # noqa: S603 — trusted invocation: literal argv against the in-repo dispatcher
50
+ [sys.executable, str(_DISPATCHER), "--help"],
51
+ check=False,
52
+ capture_output=True,
53
+ )
54
+ elapsed = time.monotonic() - start
55
+ if completed.returncode != 0:
56
+ raise RuntimeError(
57
+ f"dispatcher invocation failed (exit {completed.returncode}); "
58
+ f"target={_DISPATCHER} — a sub-budget reading here would be spurious"
59
+ )
60
+ return elapsed
61
+
62
+
63
+ def main(argv: list[str] | None = None) -> int:
64
+ parser = argparse.ArgumentParser(prog="bench_hooks")
65
+ parser.add_argument(
66
+ "--event",
67
+ required=True,
68
+ choices=sorted(_BUDGETS),
69
+ help="Hook event class to benchmark.",
70
+ )
71
+ args = parser.parse_args(argv)
72
+ budget = _BUDGETS[args.event]
73
+ if not _DISPATCHER.is_file():
74
+ print(f"ERROR: dispatcher target not found: {_DISPATCHER}", file=sys.stderr)
75
+ return 2
76
+ try:
77
+ elapsed = _measure_dispatcher_startup()
78
+ except RuntimeError as exc:
79
+ print(f"ERROR: {exc}", file=sys.stderr)
80
+ return 2
81
+ if elapsed <= budget:
82
+ print(
83
+ f"PASS: {args.event} dispatcher startup = {elapsed:.3f}s (budget {budget}s)"
84
+ )
85
+ return 0
86
+ print(
87
+ f"FAIL: {args.event} dispatcher startup = {elapsed:.3f}s exceeds budget {budget}s"
88
+ )
89
+ return 1
90
+
91
+
92
+ if __name__ == "__main__":
93
+ raise SystemExit(main())
@@ -0,0 +1,58 @@
1
+ # SPDX-License-Identifier: MIT
2
+
3
+ """Install-all resolution-sweep runtime benchmark per the per-class budget in
4
+ `src/apothem/rules/performance-discipline.md` §1.
5
+
6
+ Budget: 0.25 seconds for a dry-run install-all resolution sweep across every
7
+ registered adapter (propagation-rule resolution + capability projection, no
8
+ filesystem mutation).
9
+
10
+ The sweep resolves each adapter's propagation rules and capability-projection
11
+ warnings — the O(adapter-count) phase of an install-all that reads the shared
12
+ 27 KB propagation manifest. With the TR-1 manifest-parse cache
13
+ (``load_manifest``'s ``lru_cache``) in place the manifest is parsed once for the
14
+ whole sweep; with the cache reverted each adapter re-parses it, pushing the
15
+ sweep roughly two orders of magnitude over and tripping this budget — the
16
+ regression this benchmark exists to catch.
17
+ """
18
+
19
+ from __future__ import annotations
20
+
21
+ import argparse
22
+ import sys
23
+ import time
24
+ from typing import Final
25
+
26
+ from apothem.harnesses._shared import install_driver
27
+ from apothem.lib.harness_registry import HARNESS_REGISTRY
28
+
29
+ # Seconds for the full install-all resolution sweep. A cold process parses the
30
+ # manifest once (~tens of ms) plus per-adapter resolution; the cache keeps the
31
+ # whole sweep well under this budget while a reverted cache (one parse per
32
+ # adapter) blows past it.
33
+ _BUDGET: Final[float] = 0.25
34
+
35
+
36
+ def _time_resolution_sweep() -> float:
37
+ """Return wall-clock seconds to resolve rules + capabilities for all adapters."""
38
+ names = [entry.package_key for entry in HARNESS_REGISTRY]
39
+ start = time.monotonic()
40
+ for name in names:
41
+ install_driver.load_rules(name)
42
+ install_driver._capability_projection_results(name)
43
+ return time.monotonic() - start
44
+
45
+
46
+ def main(argv: list[str] | None = None) -> int:
47
+ argparse.ArgumentParser(prog="bench_install").parse_args(argv)
48
+ elapsed = _time_resolution_sweep()
49
+ label = f"install-all resolution sweep ({len(HARNESS_REGISTRY)} adapters)"
50
+ if elapsed <= _BUDGET:
51
+ print(f"PASS: {label} = {elapsed:.3f}s (budget {_BUDGET}s)")
52
+ return 0
53
+ print(f"FAIL: {label} = {elapsed:.3f}s exceeds budget {_BUDGET}s", file=sys.stderr)
54
+ return 1
55
+
56
+
57
+ if __name__ == "__main__":
58
+ raise SystemExit(main())
@@ -0,0 +1,93 @@
1
+ # SPDX-License-Identifier: MIT
2
+
3
+ """Test-suite runtime benchmark per the per-suite budgets in
4
+ `src/apothem/rules/performance-discipline.md` §1.
5
+
6
+ Full-suite budget: 60 seconds (pytest -n auto, post-xdist).
7
+ Per-test-module budget: 10 seconds.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import argparse
13
+ import subprocess
14
+ import sys
15
+ import time
16
+ from pathlib import Path
17
+ from typing import Final
18
+
19
+ _FULL_BUDGET: Final[float] = 60.0
20
+ _PER_MODULE_BUDGET: Final[float] = 10.0
21
+ # bench file lives at <repo>/src/apothem/benchmarks/; four parents up is root.
22
+ _REPO_ROOT: Final[Path] = Path(__file__).resolve().parents[3]
23
+ _TESTS_DIR: Final[Path] = _REPO_ROOT / "tests"
24
+
25
+
26
+ def _time_invocation(target: Path, *, single_module: bool) -> float:
27
+ """Return wall-clock seconds for a pytest invocation against ``target``.
28
+
29
+ The per-module path runs with ``-n0`` so the per-module budget measures the
30
+ module's own runtime rather than the xdist worker-pool startup that the
31
+ repository's ``-n auto`` default would otherwise charge to a single file.
32
+ The full-suite path keeps the configured ``-n auto`` parallelism the
33
+ full-suite budget assumes.
34
+ """
35
+ cmd = [sys.executable, "-m", "pytest", str(target), "-q"]
36
+ if single_module:
37
+ cmd.append("-n0")
38
+ start = time.monotonic()
39
+ completed = subprocess.run( # noqa: S603 — trusted invocation: literal argv against the host pytest module
40
+ cmd,
41
+ check=False,
42
+ capture_output=True,
43
+ cwd=_REPO_ROOT,
44
+ )
45
+ elapsed = time.monotonic() - start
46
+ # A non-zero pytest exit (test failure, collection error, no tests
47
+ # collected) means the measured run did not complete cleanly; a sub-budget
48
+ # reading for such a run would falsely attest budget compliance per the
49
+ # rule's "exit 0 attests budget compliance" contract. Raise rather than
50
+ # report a spurious PASS — mirrors bench_hooks' returncode guard.
51
+ if completed.returncode != 0:
52
+ raise RuntimeError(
53
+ f"pytest invocation failed (exit {completed.returncode}); "
54
+ "a sub-budget reading here would be spurious"
55
+ )
56
+ return elapsed
57
+
58
+
59
+ def main(argv: list[str] | None = None) -> int:
60
+ parser = argparse.ArgumentParser(prog="bench_tests")
61
+ parser.add_argument(
62
+ "--module",
63
+ default=None,
64
+ help="Path (relative to the repository root) of a per-module subset; "
65
+ "the per-module budget applies. When omitted, the full suite runs "
66
+ "under the full-suite budget.",
67
+ )
68
+ args = parser.parse_args(argv)
69
+
70
+ single_module = args.module is not None
71
+ target = _REPO_ROOT / args.module if args.module else _TESTS_DIR
72
+ budget = _PER_MODULE_BUDGET if single_module else _FULL_BUDGET
73
+ label = f"module {args.module}" if single_module else "full suite"
74
+ if single_module and not target.is_file():
75
+ print(f"ERROR: test module not found: {target}", file=sys.stderr)
76
+ return 2
77
+ if not single_module and not target.is_dir():
78
+ print(f"ERROR: tests directory not found: {target}", file=sys.stderr)
79
+ return 2
80
+ try:
81
+ elapsed = _time_invocation(target, single_module=single_module)
82
+ except RuntimeError as exc:
83
+ print(f"ERROR: {exc}", file=sys.stderr)
84
+ return 2
85
+ if elapsed <= budget:
86
+ print(f"PASS: pytest {label} = {elapsed:.3f}s (budget {budget}s)")
87
+ return 0
88
+ print(f"FAIL: pytest {label} = {elapsed:.3f}s exceeds budget {budget}s")
89
+ return 1
90
+
91
+
92
+ if __name__ == "__main__":
93
+ raise SystemExit(main())
@@ -0,0 +1,84 @@
1
+ # SPDX-License-Identifier: MIT
2
+
3
+ """Verify-ecosystem-sweep runtime benchmark per the per-check budgets in
4
+ `src/apothem/rules/performance-discipline.md` §1.
5
+
6
+ Composite budget: 30 seconds for the full sweep.
7
+ Per-check budget: 5 seconds for any single subcommand.
8
+
9
+ The script invokes the verifier under `--skip-hooks` to isolate the host-tool
10
+ runtime from the bundled hook validator delegation.
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ import argparse
16
+ import subprocess
17
+ import sys
18
+ import time
19
+ from pathlib import Path
20
+ from typing import Final
21
+
22
+ _COMPOSITE_BUDGET: Final[float] = 30.0
23
+ _PER_CHECK_BUDGET: Final[float] = 5.0
24
+ # bench file lives at <repo>/src/apothem/benchmarks/; four parents up is root.
25
+ _REPO_ROOT: Final[Path] = Path(__file__).resolve().parents[3]
26
+ _VALIDATOR: Final[Path] = _REPO_ROOT / "scripts" / "dev" / "validate_ecosystem.py"
27
+
28
+
29
+ def _time_invocation(extra: list[str]) -> float:
30
+ """Return wall-clock seconds for a verifier invocation.
31
+
32
+ A non-zero return code means the verifier never ran the real sweep (a
33
+ bogus ``--check`` argparse-errors in well under budget, for instance); the
34
+ caller raises rather than report a spurious sub-budget reading from a
35
+ process that never executed the measured work. Mirrors the returncode
36
+ guard in ``bench_hooks._measure_dispatcher_startup``.
37
+ """
38
+ start = time.monotonic()
39
+ completed = subprocess.run( # noqa: S603 — trusted invocation: literal argv against the in-repo verifier
40
+ [sys.executable, str(_VALIDATOR), "--skip-hooks", *extra],
41
+ check=False,
42
+ capture_output=True,
43
+ )
44
+ elapsed = time.monotonic() - start
45
+ if completed.returncode != 0:
46
+ raise RuntimeError(
47
+ f"verifier invocation failed (exit {completed.returncode}); "
48
+ "a sub-budget reading here would be spurious"
49
+ )
50
+ return elapsed
51
+
52
+
53
+ def main(argv: list[str] | None = None) -> int:
54
+ parser = argparse.ArgumentParser(prog="bench_validate_ecosystem")
55
+ parser.add_argument(
56
+ "--check",
57
+ default=None,
58
+ help="Restrict the benchmark to a single subcommand (per-check budget applies).",
59
+ )
60
+ args = parser.parse_args(argv)
61
+
62
+ if not _VALIDATOR.is_file():
63
+ print(f"ERROR: validator target not found: {_VALIDATOR}", file=sys.stderr)
64
+ return 2
65
+ extra = ["--check", args.check] if args.check else []
66
+ try:
67
+ elapsed = _time_invocation(extra)
68
+ except RuntimeError as exc:
69
+ print(f"ERROR: {exc}", file=sys.stderr)
70
+ return 2
71
+ # `--check all` is a full composite run, so it earns the composite budget,
72
+ # not the per-check budget — keying on the value, not merely arg presence.
73
+ per_check = args.check is not None and args.check != "all"
74
+ budget = _PER_CHECK_BUDGET if per_check else _COMPOSITE_BUDGET
75
+ label = f"--check {args.check}" if args.check else "composite sweep"
76
+ if elapsed <= budget:
77
+ print(f"PASS: validate_ecosystem {label} = {elapsed:.3f}s (budget {budget}s)")
78
+ return 0
79
+ print(f"FAIL: validate_ecosystem {label} = {elapsed:.3f}s exceeds budget {budget}s")
80
+ return 1
81
+
82
+
83
+ if __name__ == "__main__":
84
+ raise SystemExit(main())
@@ -0,0 +1,33 @@
1
+ <!-- SPDX-License-Identifier: MIT -->
2
+
3
+ # cli
4
+
5
+ > **Role.** The `apothem` command-line surface — the host-agnostic AI harness configuration manager. Reached via `python -m apothem` or the `apothem` console script declared in `pyproject.toml`.
6
+
7
+ ## Files
8
+
9
+ | File | Purpose |
10
+ |------|---------|
11
+ | `__init__.py` | The CLI command surface — defines the `apothem` command tree. |
12
+ | `_common_flags.py` | Shared Click options plus the console factory used across CLI commands. |
13
+ | `_json_formatter.py` | JSON-output helper for the CLI (machine-readable command output). |
14
+ | `reference_export.py` | Deterministic JSON exporter for source-generated documentation reference — introspects the CLI command tree and harness registry. Runnable via `python -m apothem.cli.reference_export <kind>`; spawned by `site/scripts/update-reference-inventory.mjs` and the docs-drift CI gate. |
15
+ | `completions/` | Shell completion scripts: `apothem.bash`, `apothem.zsh`, `apothem.fish`, `apothem.ps1`. |
16
+
17
+ ## Conventions
18
+
19
+ - The propagation domain model (`propagation.py` loader + `propagation-manifest.yaml` contract) lives in the shared [`lib/`](../lib/) package, not here — harness adapters consume it without importing the presentation-layer cli package.
20
+
21
+ ## Operating in this folder
22
+
23
+ - **Layer boundary.** The CLI consumes the propagation domain and the harness registry; it does not host them. New presentation-only helpers belong here; new domain logic belongs in the shared [`lib/`](../lib/) or per-harness packages.
24
+ - **Strict-typed surface.** This package sits inside the `mypy --strict` scope (`src/apothem/cli/`). Keep modern typing — `list[T]` / `dict[K, V]` / `X | None`, `typing.Protocol` for structural typing, `typing.cast()` to narrow `Any`.
25
+ - Snake_case modules; private/shared helpers use a leading underscore (the `_common_flags`, `_json_formatter` pattern). Ambiguity is surfaced through structured inquiry or a `TODO(clarify)` marker — never invented.
26
+ - **Adding a command/helper:** author it as a `.py` module under this package, wiring it into the command tree rather than as a free-standing script. Preserve the JSON-output path for any machine-readable command.
27
+ - **A documented public CLI surface change** (a command, a flag, an environment variable) updates its `site/content/docs/` page in the same change-set.
28
+ - Validate with `python -m ruff check` and `python -m ruff format`, `python -m mypy src/apothem/cli/`, then `python -m pytest`, then `python -m apothem.conformity.gate --all .`.
29
+
30
+ ## Related
31
+
32
+ - [`lib/`](../lib/) — the shared package hosting the propagation domain model + manifest.
33
+ - [`harnesses/`](../harnesses/) — the per-harness adapters that consume the propagation manifest via the shared install driver.
@@ -0,0 +1,229 @@
1
+ # SPDX-License-Identifier: MIT
2
+
3
+ """Apothem CLI — host-agnostic AI harness configuration manager.
4
+
5
+ Entry point: the Click group ``apothem.cli:main``. There is no
6
+ ``[project.scripts]`` console-script shim; the engine is invoked through
7
+ the module surface (``python -m apothem``) — the same surface the npm
8
+ shim (``npx @ahmed-g-gad/apothem``), the Claude Code plugin, and the
9
+ one-shot installers run. Uses Click for argument parsing and Rich for
10
+ terminal output.
11
+
12
+ The CLI surface provides continuous-form command aliases
13
+ (``Installing``/``Updating``/``Uninstalling`` plus lowercase
14
+ variants, hidden from ``--help`` but still resolvable), per-subcommand
15
+ epilog blocks, a standard cross-subcommand flag set, shell-completion
16
+ script emission (``apothem completion <shell>``), and a JSON output mode.
17
+
18
+ This module is the thin assembly layer: it defines the ``main`` group and
19
+ wires every command onto it by importing the per-command modules. The
20
+ helpers, epilogs, and command bodies live in sibling modules:
21
+
22
+ - ``_helpers`` — shared constants, the structured CLI-error type, the adapter
23
+ protocol + load helpers, profile read/write, lifecycle-envelope builders,
24
+ harness selection, project-root resolution, ``AliasedGroup``, and the
25
+ drift/plan helpers.
26
+ - ``_epilogs`` — the per-subcommand ``--help`` epilog strings.
27
+ - ``_materialize`` — the shared install/update materialization orchestrators.
28
+ - ``_cmd_*`` — one module per command / command-group.
29
+
30
+ The shared helpers are re-exported on this package namespace so that the
31
+ existing test seams (``patch("apothem.cli.NAME")`` /
32
+ ``monkeypatch.setattr(cli, "NAME", ...)``) keep landing: the command bodies
33
+ and orchestrators resolve those helpers through ``apothem.cli`` at call time.
34
+ """
35
+
36
+ from __future__ import annotations
37
+
38
+ import click
39
+
40
+ import apothem
41
+
42
+ # Re-export the shared helper surface on the package namespace. The command
43
+ # modules and orchestrators resolve the patchable helpers through this package
44
+ # (``apothem.cli.NAME``) at call time, so every name the test-suite patches or
45
+ # imports from ``apothem.cli`` must be bound here.
46
+ from apothem.cli._helpers import (
47
+ _ADAPTER_LOAD_ERRORS as _ADAPTER_LOAD_ERRORS,
48
+ )
49
+ from apothem.cli._helpers import (
50
+ _CONTEXT as _CONTEXT,
51
+ )
52
+ from apothem.cli._helpers import (
53
+ _EXIT_EXPECTED as _EXIT_EXPECTED,
54
+ )
55
+ from apothem.cli._helpers import (
56
+ _EXIT_PARTIAL as _EXIT_PARTIAL,
57
+ )
58
+ from apothem.cli._helpers import (
59
+ _PLACEHOLDER_IDENTITY as _PLACEHOLDER_IDENTITY,
60
+ )
61
+ from apothem.cli._helpers import (
62
+ AliasedGroup as AliasedGroup,
63
+ )
64
+ from apothem.cli._helpers import (
65
+ _Adapter as _Adapter,
66
+ )
67
+ from apothem.cli._helpers import (
68
+ _adapter_failure_result as _adapter_failure_result,
69
+ )
70
+ from apothem.cli._helpers import (
71
+ _adapter_requires_project as _adapter_requires_project,
72
+ )
73
+ from apothem.cli._helpers import (
74
+ _adapter_resolve_output_path as _adapter_resolve_output_path,
75
+ )
76
+ from apothem.cli._helpers import (
77
+ _all_adapters as _all_adapters,
78
+ )
79
+ from apothem.cli._helpers import (
80
+ _CliUserError as _CliUserError,
81
+ )
82
+ from apothem.cli._helpers import (
83
+ _complete_harness as _complete_harness,
84
+ )
85
+ from apothem.cli._helpers import (
86
+ _configure_stdio as _configure_stdio,
87
+ )
88
+ from apothem.cli._helpers import (
89
+ _drift_state as _drift_state,
90
+ )
91
+ from apothem.cli._helpers import (
92
+ _dry_run_plan as _dry_run_plan,
93
+ )
94
+ from apothem.cli._helpers import (
95
+ _emit_expected_error as _emit_expected_error,
96
+ )
97
+ from apothem.cli._helpers import (
98
+ _error_envelope as _error_envelope,
99
+ )
100
+ from apothem.cli._helpers import (
101
+ _format_error_plain as _format_error_plain,
102
+ )
103
+ from apothem.cli._helpers import (
104
+ _harness_roots as _harness_roots,
105
+ )
106
+ from apothem.cli._helpers import (
107
+ _invoke_with_project as _invoke_with_project,
108
+ )
109
+ from apothem.cli._helpers import (
110
+ _lifecycle_envelope as _lifecycle_envelope,
111
+ )
112
+ from apothem.cli._helpers import (
113
+ _load_adapter as _load_adapter,
114
+ )
115
+ from apothem.cli._helpers import (
116
+ _load_adapter_for_entry as _load_adapter_for_entry,
117
+ )
118
+ from apothem.cli._helpers import (
119
+ _load_profile as _load_profile,
120
+ )
121
+ from apothem.cli._helpers import (
122
+ _materialization_error as _materialization_error,
123
+ )
124
+ from apothem.cli._helpers import (
125
+ _parse_set_value as _parse_set_value,
126
+ )
127
+ from apothem.cli._helpers import (
128
+ _partition_blast_radius as _partition_blast_radius,
129
+ )
130
+ from apothem.cli._helpers import (
131
+ _path_is_within as _path_is_within,
132
+ )
133
+ from apothem.cli._helpers import (
134
+ _placeholder_advisory_entry as _placeholder_advisory_entry,
135
+ )
136
+ from apothem.cli._helpers import (
137
+ _placeholder_identity_fields as _placeholder_identity_fields,
138
+ )
139
+ from apothem.cli._helpers import (
140
+ _profile_error as _profile_error,
141
+ )
142
+ from apothem.cli._helpers import (
143
+ _profile_scaffold_text as _profile_scaffold_text,
144
+ )
145
+ from apothem.cli._helpers import (
146
+ _project_option as _project_option,
147
+ )
148
+ from apothem.cli._helpers import (
149
+ _render_blast_radius as _render_blast_radius,
150
+ )
151
+ from apothem.cli._helpers import (
152
+ _require_project_for_selection as _require_project_for_selection,
153
+ )
154
+ from apothem.cli._helpers import (
155
+ _require_project_if_needed as _require_project_if_needed,
156
+ )
157
+ from apothem.cli._helpers import (
158
+ _resolve_profile_path as _resolve_profile_path,
159
+ )
160
+ from apothem.cli._helpers import (
161
+ _resolve_project_root as _resolve_project_root,
162
+ )
163
+ from apothem.cli._helpers import (
164
+ _result_dicts as _result_dicts,
165
+ )
166
+ from apothem.cli._helpers import (
167
+ _selected_harness_ids as _selected_harness_ids,
168
+ )
169
+ from apothem.cli._helpers import (
170
+ _set_nested as _set_nested,
171
+ )
172
+ from apothem.cli._helpers import (
173
+ _stdin_is_interactive as _stdin_is_interactive,
174
+ )
175
+ from apothem.cli._helpers import (
176
+ _unknown_harness_error as _unknown_harness_error,
177
+ )
178
+ from apothem.cli._helpers import (
179
+ _warning_dicts as _warning_dicts,
180
+ )
181
+ from apothem.cli._helpers import (
182
+ _write_profile_text_safely as _write_profile_text_safely,
183
+ )
184
+ from apothem.cli._helpers import (
185
+ console as console,
186
+ )
187
+ from apothem.cli._materialize import (
188
+ _dry_run_materialization as _dry_run_materialization,
189
+ )
190
+ from apothem.cli._materialize import (
191
+ _materialize as _materialize,
192
+ )
193
+
194
+ # Harness-registry helpers used at call time through the package namespace.
195
+ from apothem.lib.harness_registry import get_harness_entry as get_harness_entry
196
+ from apothem.lib.harness_registry import iter_harness_entries as iter_harness_entries
197
+
198
+ # Single version source: the package root resolves the version tree-first
199
+ # (the co-located pyproject.toml), then installed metadata, then the
200
+ # explicit unknown sentinel.
201
+ _VERSION = apothem.__version__
202
+
203
+
204
+ # -----------------------------------------------------------------------
205
+ # Top-level group.
206
+ # -----------------------------------------------------------------------
207
+
208
+
209
+ @click.group(cls=AliasedGroup, context_settings=_CONTEXT)
210
+ @click.version_option(version=_VERSION, prog_name="Apothem")
211
+ def main() -> None:
212
+ """Apothem — host-agnostic AI harness configuration manager."""
213
+ _configure_stdio()
214
+
215
+
216
+ # Import every command module after ``main`` exists; each registers its
217
+ # command(s) / group(s) onto ``main`` via ``@main.command`` / ``@main.group``
218
+ # at import time. Imported for their registration side effects.
219
+ from apothem.cli import _cmd_completion as _cmd_completion # noqa: E402
220
+ from apothem.cli import _cmd_diff as _cmd_diff # noqa: E402
221
+ from apothem.cli import _cmd_doctor as _cmd_doctor # noqa: E402
222
+ from apothem.cli import _cmd_harnesses as _cmd_harnesses # noqa: E402
223
+ from apothem.cli import _cmd_install as _cmd_install # noqa: E402
224
+ from apothem.cli import _cmd_migrate_workspace as _cmd_migrate_workspace # noqa: E402
225
+ from apothem.cli import _cmd_profile as _cmd_profile # noqa: E402
226
+ from apothem.cli import _cmd_status as _cmd_status # noqa: E402
227
+ from apothem.cli import _cmd_uninstall as _cmd_uninstall # noqa: E402
228
+ from apothem.cli import _cmd_update as _cmd_update # noqa: E402
229
+ from apothem.cli import _cmd_verify as _cmd_verify # noqa: E402
@@ -0,0 +1,88 @@
1
+ # SPDX-License-Identifier: MIT
2
+
3
+ """``apothem completion`` — emit a sourceable shell-completion script."""
4
+
5
+ from __future__ import annotations
6
+
7
+ import click
8
+ from click.shell_completion import get_completion_class
9
+
10
+ from apothem.cli import main
11
+ from apothem.cli._epilogs import _EP_COMPLETION
12
+
13
+ _NATIVE_COMPLETION_SHELLS: tuple[str, ...] = ("bash", "zsh", "fish")
14
+
15
+
16
+ _COMPLETION_SHELLS: tuple[str, ...] = (*_NATIVE_COMPLETION_SHELLS, "powershell")
17
+
18
+
19
+ _COMPLETION_PROG_NAME = "apothem"
20
+
21
+
22
+ _COMPLETION_COMPLETE_VAR = "_APOTHEM_COMPLETE"
23
+
24
+
25
+ def _powershell_completion_snippet() -> str:
26
+ """Return a PowerShell ``Register-ArgumentCompleter`` snippet for apothem.
27
+
28
+ Click 8.x ships no PowerShell completion class, so this snippet bridges the
29
+ gap: it registers a native argument completer that shells out to Click's
30
+ env-var completion protocol (``_APOTHEM_COMPLETE=powershell_complete``),
31
+ parses the ``type,value`` lines Click emits, and surfaces them as
32
+ PowerShell ``CompletionResult`` objects. It is opt-in like the native
33
+ scripts — append it to ``$PROFILE`` to enable.
34
+ """
35
+ return f"""\
36
+ # Apothem shell completion for PowerShell.
37
+ # Append to your PowerShell profile ($PROFILE) to enable, then restart the shell:
38
+ # apothem completion powershell >> $PROFILE
39
+ Register-ArgumentCompleter -Native -CommandName {_COMPLETION_PROG_NAME} -ScriptBlock {{
40
+ param($wordToComplete, $commandAst, $cursorPosition)
41
+ $env:{_COMPLETION_COMPLETE_VAR} = "powershell_complete"
42
+ $env:COMP_WORDS = $commandAst.ToString()
43
+ $env:COMP_CWORD = $cursorPosition
44
+ try {{
45
+ {_COMPLETION_PROG_NAME} | ForEach-Object {{
46
+ $type, $value, $help = $_ -split ",", 3
47
+ if ($value) {{
48
+ [System.Management.Automation.CompletionResult]::new(
49
+ $value, $value, 'ParameterValue', ($help, $value -ne $null)[0]
50
+ )
51
+ }}
52
+ }}
53
+ }} finally {{
54
+ Remove-Item Env:{_COMPLETION_COMPLETE_VAR}
55
+ Remove-Item Env:COMP_WORDS
56
+ Remove-Item Env:COMP_CWORD
57
+ }}
58
+ }}
59
+ """
60
+
61
+
62
+ @main.command(epilog=_EP_COMPLETION)
63
+ @click.argument(
64
+ "shell",
65
+ type=click.Choice(_COMPLETION_SHELLS, case_sensitive=False),
66
+ )
67
+ def completion(shell: str) -> None:
68
+ """Print a shell-completion script for SHELL to stdout.
69
+
70
+ Supported shells: bash, zsh, fish, powershell. The emitted script is the one
71
+ Click's env-var completion protocol generates for the native shells; for
72
+ PowerShell (which Click does not generate natively) it is a documented
73
+ ``Register-ArgumentCompleter`` snippet that bridges to the same protocol.
74
+ Enabling completion is opt-in: this command only prints the script — pipe or
75
+ append it to the shell's completion file yourself (see ``--help``).
76
+ """
77
+ target = shell.lower()
78
+ if target == "powershell":
79
+ click.echo(_powershell_completion_snippet(), nl=False)
80
+ return
81
+ completion_cls = get_completion_class(target)
82
+ if completion_cls is None: # pragma: no cover - guarded by click.Choice
83
+ raise click.ClickException(
84
+ f"Completion is not supported for {shell!r}. "
85
+ f"Supported shells: {', '.join(_COMPLETION_SHELLS)}."
86
+ )
87
+ comp = completion_cls(main, {}, _COMPLETION_PROG_NAME, _COMPLETION_COMPLETE_VAR)
88
+ click.echo(comp.source())