@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.
- package/CHANGELOG.md +60 -0
- package/LICENSE +21 -0
- package/LICENSES/MIT.txt +18 -0
- package/LICENSES/PSF-2.0.txt +47 -0
- package/README.md +549 -0
- package/bin/README.md +37 -0
- package/bin/apothem.mjs +78 -0
- package/package.json +75 -0
- package/pyproject.toml +347 -0
- package/src/apothem/README.md +52 -0
- package/src/apothem/__init__.py +66 -0
- package/src/apothem/__main__.py +28 -0
- package/src/apothem/_vendor/.keep +0 -0
- package/src/apothem/_vendor/__init__.py +25 -0
- package/src/apothem/_vendor/attr/__init__.py +104 -0
- package/src/apothem/_vendor/attr/__init__.pyi +389 -0
- package/src/apothem/_vendor/attr/_cmp.py +160 -0
- package/src/apothem/_vendor/attr/_cmp.pyi +13 -0
- package/src/apothem/_vendor/attr/_compat.py +99 -0
- package/src/apothem/_vendor/attr/_config.py +31 -0
- package/src/apothem/_vendor/attr/_funcs.py +497 -0
- package/src/apothem/_vendor/attr/_make.py +3406 -0
- package/src/apothem/_vendor/attr/_next_gen.py +674 -0
- package/src/apothem/_vendor/attr/_typing_compat.pyi +15 -0
- package/src/apothem/_vendor/attr/_version_info.py +89 -0
- package/src/apothem/_vendor/attr/_version_info.pyi +9 -0
- package/src/apothem/_vendor/attr/converters.py +162 -0
- package/src/apothem/_vendor/attr/converters.pyi +19 -0
- package/src/apothem/_vendor/attr/exceptions.py +95 -0
- package/src/apothem/_vendor/attr/exceptions.pyi +17 -0
- package/src/apothem/_vendor/attr/filters.py +72 -0
- package/src/apothem/_vendor/attr/filters.pyi +6 -0
- package/src/apothem/_vendor/attr/py.typed +0 -0
- package/src/apothem/_vendor/attr/setters.py +79 -0
- package/src/apothem/_vendor/attr/setters.pyi +20 -0
- package/src/apothem/_vendor/attr/validators.py +750 -0
- package/src/apothem/_vendor/attr/validators.pyi +140 -0
- package/src/apothem/_vendor/attr.LICENSE +21 -0
- package/src/apothem/_vendor/attrs/__init__.py +72 -0
- package/src/apothem/_vendor/attrs/__init__.pyi +314 -0
- package/src/apothem/_vendor/attrs/converters.py +3 -0
- package/src/apothem/_vendor/attrs/exceptions.py +3 -0
- package/src/apothem/_vendor/attrs/filters.py +3 -0
- package/src/apothem/_vendor/attrs/py.typed +0 -0
- package/src/apothem/_vendor/attrs/setters.py +3 -0
- package/src/apothem/_vendor/attrs/validators.py +3 -0
- package/src/apothem/_vendor/attrs.LICENSE +21 -0
- package/src/apothem/_vendor/jsonschema/__init__.py +120 -0
- package/src/apothem/_vendor/jsonschema/__main__.py +6 -0
- package/src/apothem/_vendor/jsonschema/_format.py +546 -0
- package/src/apothem/_vendor/jsonschema/_keywords.py +449 -0
- package/src/apothem/_vendor/jsonschema/_legacy_keywords.py +449 -0
- package/src/apothem/_vendor/jsonschema/_types.py +204 -0
- package/src/apothem/_vendor/jsonschema/_typing.py +29 -0
- package/src/apothem/_vendor/jsonschema/_utils.py +355 -0
- package/src/apothem/_vendor/jsonschema/benchmarks/__init__.py +5 -0
- package/src/apothem/_vendor/jsonschema/benchmarks/const_vs_enum.py +30 -0
- package/src/apothem/_vendor/jsonschema/benchmarks/contains.py +28 -0
- package/src/apothem/_vendor/jsonschema/benchmarks/import_benchmark.py +31 -0
- package/src/apothem/_vendor/jsonschema/benchmarks/issue232/issue.json +2653 -0
- package/src/apothem/_vendor/jsonschema/benchmarks/issue232.py +25 -0
- package/src/apothem/_vendor/jsonschema/benchmarks/json_schema_test_suite.py +12 -0
- package/src/apothem/_vendor/jsonschema/benchmarks/nested_schemas.py +56 -0
- package/src/apothem/_vendor/jsonschema/benchmarks/subcomponents.py +42 -0
- package/src/apothem/_vendor/jsonschema/benchmarks/unused_registry.py +35 -0
- package/src/apothem/_vendor/jsonschema/benchmarks/useless_applicator_schemas.py +106 -0
- package/src/apothem/_vendor/jsonschema/benchmarks/useless_keywords.py +32 -0
- package/src/apothem/_vendor/jsonschema/benchmarks/validator_creation.py +14 -0
- package/src/apothem/_vendor/jsonschema/cli.py +292 -0
- package/src/apothem/_vendor/jsonschema/exceptions.py +490 -0
- package/src/apothem/_vendor/jsonschema/protocols.py +230 -0
- package/src/apothem/_vendor/jsonschema/validators.py +1410 -0
- package/src/apothem/_vendor/jsonschema.LICENSE +19 -0
- package/src/apothem/_vendor/jsonschema_specifications/__init__.py +12 -0
- package/src/apothem/_vendor/jsonschema_specifications/_core.py +38 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft201909/metaschema.json +42 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft201909/vocabularies/applicator +56 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft201909/vocabularies/content +17 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft201909/vocabularies/core +57 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft201909/vocabularies/format +14 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft201909/vocabularies/meta-data +37 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft201909/vocabularies/validation +98 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/metaschema.json +58 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/applicator +48 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/content +17 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/core +51 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/format-annotation +14 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/format-assertion +14 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/meta-data +37 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/unevaluated +15 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft202012/vocabularies/validation +98 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft3/metaschema.json +172 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft4/metaschema.json +149 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft6/metaschema.json +153 -0
- package/src/apothem/_vendor/jsonschema_specifications/schemas/draft7/metaschema.json +166 -0
- package/src/apothem/_vendor/jsonschema_specifications.LICENSE +19 -0
- package/src/apothem/_vendor/referencing/__init__.py +7 -0
- package/src/apothem/_vendor/referencing/_attrs.py +31 -0
- package/src/apothem/_vendor/referencing/_attrs.pyi +21 -0
- package/src/apothem/_vendor/referencing/_core.py +739 -0
- package/src/apothem/_vendor/referencing/exceptions.py +165 -0
- package/src/apothem/_vendor/referencing/jsonschema.py +642 -0
- package/src/apothem/_vendor/referencing/py.typed +0 -0
- package/src/apothem/_vendor/referencing/retrieval.py +94 -0
- package/src/apothem/_vendor/referencing/typing.py +61 -0
- package/src/apothem/_vendor/referencing.LICENSE +19 -0
- package/src/apothem/_vendor/rpds/__init__.py +251 -0
- package/src/apothem/_vendor/typing_extensions.LICENSE +279 -0
- package/src/apothem/_vendor/typing_extensions.py +4317 -0
- package/src/apothem/_vendor/vendor.txt +22 -0
- package/src/apothem/_vendor/yaml/__init__.py +389 -0
- package/src/apothem/_vendor/yaml/composer.py +138 -0
- package/src/apothem/_vendor/yaml/constructor.py +748 -0
- package/src/apothem/_vendor/yaml/cyaml.py +100 -0
- package/src/apothem/_vendor/yaml/dumper.py +61 -0
- package/src/apothem/_vendor/yaml/emitter.py +1137 -0
- package/src/apothem/_vendor/yaml/error.py +74 -0
- package/src/apothem/_vendor/yaml/events.py +85 -0
- package/src/apothem/_vendor/yaml/loader.py +63 -0
- package/src/apothem/_vendor/yaml/nodes.py +48 -0
- package/src/apothem/_vendor/yaml/parser.py +588 -0
- package/src/apothem/_vendor/yaml/reader.py +185 -0
- package/src/apothem/_vendor/yaml/representer.py +388 -0
- package/src/apothem/_vendor/yaml/resolver.py +226 -0
- package/src/apothem/_vendor/yaml/scanner.py +1435 -0
- package/src/apothem/_vendor/yaml/serializer.py +110 -0
- package/src/apothem/_vendor/yaml/tokens.py +103 -0
- package/src/apothem/_vendor/yaml.LICENSE +20 -0
- package/src/apothem/agents/README.md +60 -0
- package/src/apothem/agents/codebase-explorer.md +91 -0
- package/src/apothem/agents/convention-auditor.md +93 -0
- package/src/apothem/agents/dependency-auditor.md +97 -0
- package/src/apothem/agents/fact-checker.md +84 -0
- package/src/apothem/agents/mcp-builder.md +86 -0
- package/src/apothem/agents/memory-auditor.md +93 -0
- package/src/apothem/agents/prompt-evaluator.md +87 -0
- package/src/apothem/agents/quality-gate.md +103 -0
- package/src/apothem/agents/refactor-surgeon.md +74 -0
- package/src/apothem/agents/research-scout.md +73 -0
- package/src/apothem/agents/security-scanner.md +83 -0
- package/src/apothem/agents/test-runner.md +84 -0
- package/src/apothem/audit/README.md +73 -0
- package/src/apothem/audit/_scan_lib.py +182 -0
- package/src/apothem/audit/analyze_graph.py +260 -0
- package/src/apothem/audit/build_capability_graph.py +607 -0
- package/src/apothem/audit/build_inventory.py +657 -0
- package/src/apothem/audit/build_plans_provenance.py +997 -0
- package/src/apothem/audit/check_links.py +389 -0
- package/src/apothem/audit/classify_artifacts.py +381 -0
- package/src/apothem/audit/deprecated-tokens.txt +10 -0
- package/src/apothem/audit/execute_plans_migration.py +491 -0
- package/src/apothem/audit/known-projects.txt +15 -0
- package/src/apothem/audit/render_capability_index.py +467 -0
- package/src/apothem/audit/render_inventory.py +405 -0
- package/src/apothem/audit/scan_ai_surfaces.py +1125 -0
- package/src/apothem/audit/scan_ai_surfaces_coarse.py +261 -0
- package/src/apothem/audit/scan_drift_features.py +143 -0
- package/src/apothem/audit/scan_frontmatter.py +293 -0
- package/src/apothem/audit/scan_header_coverage.py +1134 -0
- package/src/apothem/audit/scan_plan_leakage.py +540 -0
- package/src/apothem/audit/scan_plans_discipline.py +188 -0
- package/src/apothem/audit/scan_secrets_pii.py +245 -0
- package/src/apothem/audit/scan_stale_tokens.py +296 -0
- package/src/apothem/audit/synthesize_drift.py +205 -0
- package/src/apothem/benchmarks/README.md +33 -0
- package/src/apothem/benchmarks/__init__.py +3 -0
- package/src/apothem/benchmarks/bench_agents.py +63 -0
- package/src/apothem/benchmarks/bench_hooks.py +93 -0
- package/src/apothem/benchmarks/bench_install.py +58 -0
- package/src/apothem/benchmarks/bench_tests.py +93 -0
- package/src/apothem/benchmarks/bench_validate_ecosystem.py +84 -0
- package/src/apothem/cli/README.md +33 -0
- package/src/apothem/cli/__init__.py +229 -0
- package/src/apothem/cli/_cmd_completion.py +88 -0
- package/src/apothem/cli/_cmd_diff.py +181 -0
- package/src/apothem/cli/_cmd_doctor.py +143 -0
- package/src/apothem/cli/_cmd_harnesses.py +167 -0
- package/src/apothem/cli/_cmd_install.py +327 -0
- package/src/apothem/cli/_cmd_migrate_workspace.py +143 -0
- package/src/apothem/cli/_cmd_profile.py +341 -0
- package/src/apothem/cli/_cmd_status.py +180 -0
- package/src/apothem/cli/_cmd_uninstall.py +215 -0
- package/src/apothem/cli/_cmd_update.py +397 -0
- package/src/apothem/cli/_cmd_verify.py +194 -0
- package/src/apothem/cli/_common_flags.py +90 -0
- package/src/apothem/cli/_epilogs.py +296 -0
- package/src/apothem/cli/_helpers.py +857 -0
- package/src/apothem/cli/_json_formatter.py +21 -0
- package/src/apothem/cli/_materialize.py +376 -0
- package/src/apothem/cli/completions/apothem.bash +30 -0
- package/src/apothem/cli/completions/apothem.fish +19 -0
- package/src/apothem/cli/completions/apothem.ps1 +27 -0
- package/src/apothem/cli/completions/apothem.zsh +42 -0
- package/src/apothem/cli/reference_export.py +126 -0
- package/src/apothem/commands/README.md +125 -0
- package/src/apothem/commands/a11y-audit.md +203 -0
- package/src/apothem/commands/architecture-review.md +194 -0
- package/src/apothem/commands/audit.md +165 -0
- package/src/apothem/commands/code-audit.md +218 -0
- package/src/apothem/commands/code-review.md +193 -0
- package/src/apothem/commands/dependency-audit.md +209 -0
- package/src/apothem/commands/docs-review.md +199 -0
- package/src/apothem/commands/elevate.md +285 -0
- package/src/apothem/commands/eval.md +149 -0
- package/src/apothem/commands/fortress.md +172 -0
- package/src/apothem/commands/freshify.md +168 -0
- package/src/apothem/commands/github-deploy-fresh.md +178 -0
- package/src/apothem/commands/github-deploy-next.md +167 -0
- package/src/apothem/commands/perf-audit.md +198 -0
- package/src/apothem/commands/plan-amend.md +104 -0
- package/src/apothem/commands/plan-audit.md +127 -0
- package/src/apothem/commands/plan-design.md +257 -0
- package/src/apothem/commands/plan-execute.md +495 -0
- package/src/apothem/commands/plan-generate.md +351 -0
- package/src/apothem/commands/plan-review.md +555 -0
- package/src/apothem/commands/plan-spec.md +359 -0
- package/src/apothem/commands/plan-status.md +222 -0
- package/src/apothem/commands/plan.md +173 -0
- package/src/apothem/commands/projectify.md +142 -0
- package/src/apothem/commands/release-readiness.md +142 -0
- package/src/apothem/commands/research-analysis.md +241 -0
- package/src/apothem/commands/research-design.md +231 -0
- package/src/apothem/commands/research-disseminate.md +225 -0
- package/src/apothem/commands/research-experiment.md +232 -0
- package/src/apothem/commands/research-ideate.md +213 -0
- package/src/apothem/commands/research-paper.md +252 -0
- package/src/apothem/commands/research-proposal.md +220 -0
- package/src/apothem/commands/research-publish.md +255 -0
- package/src/apothem/commands/research-review.md +251 -0
- package/src/apothem/commands/research-sources.md +266 -0
- package/src/apothem/commands/research-spec.md +255 -0
- package/src/apothem/commands/research-synthesis.md +233 -0
- package/src/apothem/commands/research-theory.md +218 -0
- package/src/apothem/commands/research.md +181 -0
- package/src/apothem/commands/security-audit.md +196 -0
- package/src/apothem/commands/supply-chain-audit.md +192 -0
- package/src/apothem/commands/test-suite.md +146 -0
- package/src/apothem/commands/threat-model-audit.md +199 -0
- package/src/apothem/commands/ux-review.md +202 -0
- package/src/apothem/commands/workflow.md +162 -0
- package/src/apothem/conformity/README.md +173 -0
- package/src/apothem/conformity/__init__.py +1 -0
- package/src/apothem/conformity/_grep_base.py +93 -0
- package/src/apothem/conformity/agent_capability_grep.py +306 -0
- package/src/apothem/conformity/agents_md_coverage_grep.py +382 -0
- package/src/apothem/conformity/agnosticism_grep.py +311 -0
- package/src/apothem/conformity/always_on_budget_grep.py +318 -0
- package/src/apothem/conformity/bare_except_grep.py +115 -0
- package/src/apothem/conformity/binding_reciprocity_grep.py +151 -0
- package/src/apothem/conformity/brand_mark_grep.py +272 -0
- package/src/apothem/conformity/commented_out_code_grep.py +176 -0
- package/src/apothem/conformity/completion_claim_grep.py +169 -0
- package/src/apothem/conformity/conventional_commit_grep.py +319 -0
- package/src/apothem/conformity/copilot_instructions_presence_grep.py +324 -0
- package/src/apothem/conformity/cross_platform_matrix_grep.py +297 -0
- package/src/apothem/conformity/determinism_grep.py +306 -0
- package/src/apothem/conformity/diagram_staleness_grep.py +154 -0
- package/src/apothem/conformity/dynamism_grep.py +284 -0
- package/src/apothem/conformity/editorconfig_presence_grep.py +281 -0
- package/src/apothem/conformity/file_header_grep.py +502 -0
- package/src/apothem/conformity/freshness_token_grep.py +233 -0
- package/src/apothem/conformity/frontmatter_grep.py +274 -0
- package/src/apothem/conformity/frontmatter_value_grep.py +386 -0
- package/src/apothem/conformity/gate.py +1386 -0
- package/src/apothem/conformity/gitattributes_presence_grep.py +238 -0
- package/src/apothem/conformity/harden_runner_grep.py +320 -0
- package/src/apothem/conformity/hedging_grep.py +129 -0
- package/src/apothem/conformity/license_author_consistency_grep.py +204 -0
- package/src/apothem/conformity/link_check.py +327 -0
- package/src/apothem/conformity/magic_number_grep.py +182 -0
- package/src/apothem/conformity/multi_surface_coherence_grep.py +620 -0
- package/src/apothem/conformity/naming_grep.py +224 -0
- package/src/apothem/conformity/no_global_plans_grep.py +339 -0
- package/src/apothem/conformity/no_toplevel_docs_grep.py +120 -0
- package/src/apothem/conformity/oidc_trusted_publishing_grep.py +291 -0
- package/src/apothem/conformity/option_annotation_grep.py +352 -0
- package/src/apothem/conformity/orphan_output_grep.py +206 -0
- package/src/apothem/conformity/permissions_minimum_scope_grep.py +299 -0
- package/src/apothem/conformity/plain_language_grep.py +559 -0
- package/src/apothem/conformity/plan_next_step_consistency_grep.py +450 -0
- package/src/apothem/conformity/plan_suite_structure_grep.py +534 -0
- package/src/apothem/conformity/plans_discipline_language_grep.py +245 -0
- package/src/apothem/conformity/production_ready_pr_grep.py +200 -0
- package/src/apothem/conformity/recommend_next_step_grep.py +250 -0
- package/src/apothem/conformity/redundancy_grep.py +401 -0
- package/src/apothem/conformity/reference_token_grep.py +230 -0
- package/src/apothem/conformity/registry_capability_consistency_grep.py +368 -0
- package/src/apothem/conformity/secret_leak_grep.py +193 -0
- package/src/apothem/conformity/semver_stability_grep.py +358 -0
- package/src/apothem/conformity/smoke_install_grep.py +194 -0
- package/src/apothem/conformity/static_version_grep.py +284 -0
- package/src/apothem/conformity/token_efficiency_grep.py +185 -0
- package/src/apothem/conformity/unpinned_action_grep.py +115 -0
- package/src/apothem/conformity/user_confirm_grep.py +74 -0
- package/src/apothem/conformity/workflow_concurrency_grep.py +283 -0
- package/src/apothem/harnesses/README.md +63 -0
- package/src/apothem/harnesses/__init__.py +16 -0
- package/src/apothem/harnesses/_shared/README.md +36 -0
- package/src/apothem/harnesses/_shared/__init__.py +12 -0
- package/src/apothem/harnesses/_shared/install_driver.py +281 -0
- package/src/apothem/harnesses/_shared/install_driver_apply.py +612 -0
- package/src/apothem/harnesses/_shared/install_driver_backup.py +535 -0
- package/src/apothem/harnesses/_shared/install_driver_converters.py +310 -0
- package/src/apothem/harnesses/_shared/install_driver_lifecycle.py +495 -0
- package/src/apothem/harnesses/_shared/install_driver_materialize.py +675 -0
- package/src/apothem/harnesses/_shared/install_driver_merge.py +656 -0
- package/src/apothem/harnesses/_shared/install_driver_pathsafety.py +137 -0
- package/src/apothem/harnesses/_shared/install_driver_planvalidation.py +240 -0
- package/src/apothem/harnesses/_shared/install_driver_removal.py +366 -0
- package/src/apothem/harnesses/_shared/install_driver_treeops.py +248 -0
- package/src/apothem/harnesses/_shared/install_driver_types.py +330 -0
- package/src/apothem/harnesses/_shared/wrapper_factories.py +448 -0
- package/src/apothem/harnesses/antigravity/STANDARD-CONVENTION-PIN.md +91 -0
- package/src/apothem/harnesses/antigravity/__init__.py +70 -0
- package/src/apothem/harnesses/antigravity/capabilities.yml +40 -0
- package/src/apothem/harnesses/antigravity/install.py +63 -0
- package/src/apothem/harnesses/antigravity/templates/GEMINI.md +40 -0
- package/src/apothem/harnesses/antigravity/templates/plugin.json +5 -0
- package/src/apothem/harnesses/antigravity/uninstall.py +22 -0
- package/src/apothem/harnesses/antigravity/update.py +10 -0
- package/src/apothem/harnesses/antigravity/verify.py +11 -0
- package/src/apothem/harnesses/claude_code/STANDARD-CONVENTION-PIN.md +65 -0
- package/src/apothem/harnesses/claude_code/__init__.py +107 -0
- package/src/apothem/harnesses/claude_code/capabilities.yml +42 -0
- package/src/apothem/harnesses/claude_code/install.py +147 -0
- package/src/apothem/harnesses/claude_code/templates/settings.json +351 -0
- package/src/apothem/harnesses/claude_code/uninstall.py +23 -0
- package/src/apothem/harnesses/claude_code/update.py +10 -0
- package/src/apothem/harnesses/claude_code/verify.py +11 -0
- package/src/apothem/harnesses/codebuddy/STANDARD-CONVENTION-PIN.md +74 -0
- package/src/apothem/harnesses/codebuddy/__init__.py +49 -0
- package/src/apothem/harnesses/codebuddy/capabilities.yml +34 -0
- package/src/apothem/harnesses/codebuddy/install.py +40 -0
- package/src/apothem/harnesses/codebuddy/templates/apothem-rules.md +37 -0
- package/src/apothem/harnesses/codebuddy/uninstall.py +25 -0
- package/src/apothem/harnesses/codebuddy/update.py +10 -0
- package/src/apothem/harnesses/codebuddy/verify.py +11 -0
- package/src/apothem/harnesses/codex/STANDARD-CONVENTION-PIN.md +79 -0
- package/src/apothem/harnesses/codex/__init__.py +72 -0
- package/src/apothem/harnesses/codex/capabilities.yml +40 -0
- package/src/apothem/harnesses/codex/install.py +69 -0
- package/src/apothem/harnesses/codex/templates/AGENTS.md +40 -0
- package/src/apothem/harnesses/codex/templates/hooks.json +127 -0
- package/src/apothem/harnesses/codex/uninstall.py +23 -0
- package/src/apothem/harnesses/codex/update.py +10 -0
- package/src/apothem/harnesses/codex/verify.py +11 -0
- package/src/apothem/harnesses/cursor/STANDARD-CONVENTION-PIN.md +79 -0
- package/src/apothem/harnesses/cursor/__init__.py +48 -0
- package/src/apothem/harnesses/cursor/capabilities.yml +42 -0
- package/src/apothem/harnesses/cursor/install.py +38 -0
- package/src/apothem/harnesses/cursor/templates/apothem-rules.mdc +40 -0
- package/src/apothem/harnesses/cursor/uninstall.py +25 -0
- package/src/apothem/harnesses/cursor/update.py +10 -0
- package/src/apothem/harnesses/cursor/verify.py +11 -0
- package/src/apothem/harnesses/gemini_cli/STANDARD-CONVENTION-PIN.md +102 -0
- package/src/apothem/harnesses/gemini_cli/__init__.py +52 -0
- package/src/apothem/harnesses/gemini_cli/capabilities.yml +43 -0
- package/src/apothem/harnesses/gemini_cli/install.py +43 -0
- package/src/apothem/harnesses/gemini_cli/templates/GEMINI.md +38 -0
- package/src/apothem/harnesses/gemini_cli/uninstall.py +25 -0
- package/src/apothem/harnesses/gemini_cli/update.py +10 -0
- package/src/apothem/harnesses/gemini_cli/verify.py +11 -0
- package/src/apothem/harnesses/github_copilot/STANDARD-CONVENTION-PIN.md +84 -0
- package/src/apothem/harnesses/github_copilot/__init__.py +47 -0
- package/src/apothem/harnesses/github_copilot/capabilities.yml +42 -0
- package/src/apothem/harnesses/github_copilot/install.py +40 -0
- package/src/apothem/harnesses/github_copilot/templates/copilot-instructions.md +33 -0
- package/src/apothem/harnesses/github_copilot/uninstall.py +25 -0
- package/src/apothem/harnesses/github_copilot/update.py +10 -0
- package/src/apothem/harnesses/github_copilot/verify.py +11 -0
- package/src/apothem/harnesses/glm/STANDARD-CONVENTION-PIN.md +77 -0
- package/src/apothem/harnesses/glm/__init__.py +56 -0
- package/src/apothem/harnesses/glm/capabilities.yml +33 -0
- package/src/apothem/harnesses/glm/install.py +45 -0
- package/src/apothem/harnesses/glm/templates/glm.toml +58 -0
- package/src/apothem/harnesses/glm/uninstall.py +25 -0
- package/src/apothem/harnesses/glm/update.py +10 -0
- package/src/apothem/harnesses/glm/verify.py +11 -0
- package/src/apothem/harnesses/hermes/STANDARD-CONVENTION-PIN.md +57 -0
- package/src/apothem/harnesses/hermes/__init__.py +33 -0
- package/src/apothem/harnesses/hermes/capabilities.yml +36 -0
- package/src/apothem/harnesses/hermes/install.py +17 -0
- package/src/apothem/harnesses/hermes/materializer.py +35 -0
- package/src/apothem/harnesses/hermes/uninstall.py +33 -0
- package/src/apothem/harnesses/hermes/update.py +10 -0
- package/src/apothem/harnesses/hermes/verify.py +11 -0
- package/src/apothem/harnesses/kimi_code/STANDARD-CONVENTION-PIN.md +128 -0
- package/src/apothem/harnesses/kimi_code/__init__.py +59 -0
- package/src/apothem/harnesses/kimi_code/capabilities.yml +40 -0
- package/src/apothem/harnesses/kimi_code/install.py +42 -0
- package/src/apothem/harnesses/kimi_code/templates/AGENTS.md +43 -0
- package/src/apothem/harnesses/kimi_code/uninstall.py +27 -0
- package/src/apothem/harnesses/kimi_code/update.py +10 -0
- package/src/apothem/harnesses/kimi_code/verify.py +11 -0
- package/src/apothem/harnesses/kiro/STANDARD-CONVENTION-PIN.md +77 -0
- package/src/apothem/harnesses/kiro/__init__.py +49 -0
- package/src/apothem/harnesses/kiro/capabilities.yml +36 -0
- package/src/apothem/harnesses/kiro/install.py +39 -0
- package/src/apothem/harnesses/kiro/templates/apothem-rules.md +36 -0
- package/src/apothem/harnesses/kiro/uninstall.py +25 -0
- package/src/apothem/harnesses/kiro/update.py +10 -0
- package/src/apothem/harnesses/kiro/verify.py +11 -0
- package/src/apothem/harnesses/open_claw/STANDARD-CONVENTION-PIN.md +62 -0
- package/src/apothem/harnesses/open_claw/__init__.py +35 -0
- package/src/apothem/harnesses/open_claw/capabilities.yml +35 -0
- package/src/apothem/harnesses/open_claw/install.py +17 -0
- package/src/apothem/harnesses/open_claw/materializer.py +36 -0
- package/src/apothem/harnesses/open_claw/uninstall.py +32 -0
- package/src/apothem/harnesses/open_claw/update.py +10 -0
- package/src/apothem/harnesses/open_claw/verify.py +11 -0
- package/src/apothem/harnesses/opencode/STANDARD-CONVENTION-PIN.md +76 -0
- package/src/apothem/harnesses/opencode/__init__.py +35 -0
- package/src/apothem/harnesses/opencode/capabilities.yml +43 -0
- package/src/apothem/harnesses/opencode/install.py +17 -0
- package/src/apothem/harnesses/opencode/materializer.py +31 -0
- package/src/apothem/harnesses/opencode/uninstall.py +34 -0
- package/src/apothem/harnesses/opencode/update.py +10 -0
- package/src/apothem/harnesses/opencode/verify.py +11 -0
- package/src/apothem/harnesses/qwen_code/STANDARD-CONVENTION-PIN.md +87 -0
- package/src/apothem/harnesses/qwen_code/__init__.py +37 -0
- package/src/apothem/harnesses/qwen_code/capabilities.yml +43 -0
- package/src/apothem/harnesses/qwen_code/install.py +19 -0
- package/src/apothem/harnesses/qwen_code/materializer.py +174 -0
- package/src/apothem/harnesses/qwen_code/templates/QWEN.md +30 -0
- package/src/apothem/harnesses/qwen_code/uninstall.py +34 -0
- package/src/apothem/harnesses/qwen_code/update.py +10 -0
- package/src/apothem/harnesses/qwen_code/verify.py +11 -0
- package/src/apothem/harnesses/trae/STANDARD-CONVENTION-PIN.md +70 -0
- package/src/apothem/harnesses/trae/__init__.py +49 -0
- package/src/apothem/harnesses/trae/capabilities.yml +34 -0
- package/src/apothem/harnesses/trae/install.py +38 -0
- package/src/apothem/harnesses/trae/templates/apothem-rules.md +37 -0
- package/src/apothem/harnesses/trae/uninstall.py +25 -0
- package/src/apothem/harnesses/trae/update.py +10 -0
- package/src/apothem/harnesses/trae/verify.py +11 -0
- package/src/apothem/harnesses/windsurf/STANDARD-CONVENTION-PIN.md +91 -0
- package/src/apothem/harnesses/windsurf/__init__.py +52 -0
- package/src/apothem/harnesses/windsurf/capabilities.yml +40 -0
- package/src/apothem/harnesses/windsurf/install.py +41 -0
- package/src/apothem/harnesses/windsurf/templates/apothem-rules.md +37 -0
- package/src/apothem/harnesses/windsurf/uninstall.py +25 -0
- package/src/apothem/harnesses/windsurf/update.py +10 -0
- package/src/apothem/harnesses/windsurf/verify.py +11 -0
- package/src/apothem/harnesses/zed/STANDARD-CONVENTION-PIN.md +92 -0
- package/src/apothem/harnesses/zed/__init__.py +57 -0
- package/src/apothem/harnesses/zed/capabilities.yml +38 -0
- package/src/apothem/harnesses/zed/install.py +41 -0
- package/src/apothem/harnesses/zed/templates/apothem-rules.md +32 -0
- package/src/apothem/harnesses/zed/uninstall.py +28 -0
- package/src/apothem/harnesses/zed/update.py +10 -0
- package/src/apothem/harnesses/zed/verify.py +11 -0
- package/src/apothem/hooks/README.md +81 -0
- package/src/apothem/hooks/__init__.py +24 -0
- package/src/apothem/hooks/askuserquestion_validator.py +380 -0
- package/src/apothem/hooks/dispatch.py +296 -0
- package/src/apothem/hooks/emit_hook_context.py +444 -0
- package/src/apothem/hooks/hooks.json +318 -0
- package/src/apothem/hooks/lib/README.md +39 -0
- package/src/apothem/hooks/lib/__init__.py +18 -0
- package/src/apothem/hooks/lib/bootstrap.ps1 +129 -0
- package/src/apothem/hooks/lib/bootstrap.sh +103 -0
- package/src/apothem/hooks/lib/events.py +51 -0
- package/src/apothem/hooks/lib/find-pwsh.ps1 +78 -0
- package/src/apothem/hooks/lib/find-pwsh.sh +76 -0
- package/src/apothem/hooks/lib/find-python.ps1 +63 -0
- package/src/apothem/hooks/lib/find-python.sh +97 -0
- package/src/apothem/hooks/lib/log.py +43 -0
- package/src/apothem/hooks/lib/resolve_root.py +264 -0
- package/src/apothem/hooks/messages/postcompact.md +14 -0
- package/src/apothem/hooks/messages/posttooluse-proactive-compaction.md +46 -0
- package/src/apothem/hooks/messages/precompact.md +14 -0
- package/src/apothem/hooks/messages/pretooluse-askuserquestion-recommended.md +65 -0
- package/src/apothem/hooks/messages/pretooluse-bash-plan-guard.md +97 -0
- package/src/apothem/hooks/messages/pretooluse-bash.md +39 -0
- package/src/apothem/hooks/messages/pretooluse-conformity.md +70 -0
- package/src/apothem/hooks/messages/pretooluse-dependency-guard.md +21 -0
- package/src/apothem/hooks/messages/pretooluse-edit-header-guard.md +61 -0
- package/src/apothem/hooks/messages/pretooluse-edit.md +21 -0
- package/src/apothem/hooks/messages/pretooluse-eval-guard.md +39 -0
- package/src/apothem/hooks/messages/pretooluse-notebookedit.md +11 -0
- package/src/apothem/hooks/messages/pretooluse-write-header-guard.md +45 -0
- package/src/apothem/hooks/messages/pretooluse-write-plan-guard.md +72 -0
- package/src/apothem/hooks/messages/pretooluse-write.md +21 -0
- package/src/apothem/hooks/messages/sessionstart.md +15 -0
- package/src/apothem/hooks/messages/stop.md +27 -0
- package/src/apothem/hooks/proactive_compaction_tracker.py +327 -0
- package/src/apothem/hooks/session_start_bootstrap.py +472 -0
- package/src/apothem/lib/README.md +42 -0
- package/src/apothem/lib/__init__.py +13 -0
- package/src/apothem/lib/atomic_io.py +189 -0
- package/src/apothem/lib/auditor.py +687 -0
- package/src/apothem/lib/clean_slate.py +396 -0
- package/src/apothem/lib/contexts.py +352 -0
- package/src/apothem/lib/data_home.py +255 -0
- package/src/apothem/lib/frontmatter.py +101 -0
- package/src/apothem/lib/harness_materializer.py +213 -0
- package/src/apothem/lib/harness_protocol.py +59 -0
- package/src/apothem/lib/harness_registry.py +282 -0
- package/src/apothem/lib/harness_registry_data.py +843 -0
- package/src/apothem/lib/install_ledger.py +347 -0
- package/src/apothem/lib/learning.py +540 -0
- package/src/apothem/lib/memory.py +347 -0
- package/src/apothem/lib/parallel_sweep.py +234 -0
- package/src/apothem/lib/plan_tiers.py +200 -0
- package/src/apothem/lib/plugin_bootstrap.py +132 -0
- package/src/apothem/lib/plugin_tree.py +599 -0
- package/src/apothem/lib/profile.py +755 -0
- package/src/apothem/lib/profile_projection.py +198 -0
- package/src/apothem/lib/propagation-manifest.yaml +878 -0
- package/src/apothem/lib/propagation.py +220 -0
- package/src/apothem/lib/python_resolver.py +189 -0
- package/src/apothem/lib/reporter.py +62 -0
- package/src/apothem/lib/workspace_migration.py +323 -0
- package/src/apothem/output-styles/README.md +41 -0
- package/src/apothem/output-styles/concise-engineer.md +49 -0
- package/src/apothem/output-styles/default-architect.md +52 -0
- package/src/apothem/output-styles/default.md +113 -0
- package/src/apothem/output-styles/forensic-auditor.md +63 -0
- package/src/apothem/py.typed +0 -0
- package/src/apothem/rules/README.md +121 -0
- package/src/apothem/rules/agent-capability-discipline-matrix.md +89 -0
- package/src/apothem/rules/agent-capability-discipline.md +78 -0
- package/src/apothem/rules/agent-orchestration-patterns.md +144 -0
- package/src/apothem/rules/agent-orchestration.md +65 -0
- package/src/apothem/rules/agents-md-convention.md +86 -0
- package/src/apothem/rules/agile-sprints-elements.md +135 -0
- package/src/apothem/rules/agile-sprints.md +64 -0
- package/src/apothem/rules/agnostic-posture-checklist.md +47 -0
- package/src/apothem/rules/agnostic-posture.md +48 -0
- package/src/apothem/rules/authoritative-referencing-quotation.md +50 -0
- package/src/apothem/rules/authoritative-referencing.md +66 -0
- package/src/apothem/rules/authority-inquiry-categories.md +58 -0
- package/src/apothem/rules/authority-inquiry.md +54 -0
- package/src/apothem/rules/auto-memory-topic-files.md +86 -0
- package/src/apothem/rules/auto-memory.md +67 -0
- package/src/apothem/rules/bidirectional-binding.md +123 -0
- package/src/apothem/rules/canonical-layout-reporting-tiers.md +212 -0
- package/src/apothem/rules/canonical-layout.md +60 -0
- package/src/apothem/rules/clean-architecture-layers.md +186 -0
- package/src/apothem/rules/clean-room-generation-protocols.md +124 -0
- package/src/apothem/rules/clean-room-generation.md +59 -0
- package/src/apothem/rules/code-craft-conventions.md +101 -0
- package/src/apothem/rules/code-craft-markdown.md +138 -0
- package/src/apothem/rules/code-craft-python.md +154 -0
- package/src/apothem/rules/code-craft-shell.md +192 -0
- package/src/apothem/rules/cognitive-identity-techniques.md +180 -0
- package/src/apothem/rules/cognitive-identity.md +81 -0
- package/src/apothem/rules/context-management-budget.md +46 -0
- package/src/apothem/rules/context-management-protocol.md +161 -0
- package/src/apothem/rules/context-management-scratch.md +128 -0
- package/src/apothem/rules/context-management.md +85 -0
- package/src/apothem/rules/definitiveness-virtues.md +67 -0
- package/src/apothem/rules/definitiveness.md +58 -0
- package/src/apothem/rules/determinism.md +81 -0
- package/src/apothem/rules/disclosure-ledger-markers.md +58 -0
- package/src/apothem/rules/disclosure-ledger.md +52 -0
- package/src/apothem/rules/dynamism.md +38 -0
- package/src/apothem/rules/etc-extension.md +57 -0
- package/src/apothem/rules/expertise-posture-elements.md +68 -0
- package/src/apothem/rules/expertise-posture.md +54 -0
- package/src/apothem/rules/freshness-facade.md +64 -0
- package/src/apothem/rules/harness-adapter-shape-schemas.md +162 -0
- package/src/apothem/rules/harness-adapter-shape.md +42 -0
- package/src/apothem/rules/host-discovery-manifests.md +50 -0
- package/src/apothem/rules/host-discovery.md +56 -0
- package/src/apothem/rules/i18n-discipline-locale-cohorts.md +120 -0
- package/src/apothem/rules/i18n-discipline.md +70 -0
- package/src/apothem/rules/interactive-questions-canonical-shapes.md +590 -0
- package/src/apothem/rules/interactive-questions-detail.md +41 -0
- package/src/apothem/rules/interactive-questions-sweep-matchers.md +184 -0
- package/src/apothem/rules/interactive-questions.md +89 -0
- package/src/apothem/rules/large-file-generation.md +112 -0
- package/src/apothem/rules/large-file-reading.md +59 -0
- package/src/apothem/rules/living-docs.md +85 -0
- package/src/apothem/rules/multi-agent-workflow.md +57 -0
- package/src/apothem/rules/operational-mandates-expanded.md +78 -0
- package/src/apothem/rules/operational-mandates.md +88 -0
- package/src/apothem/rules/option-annotation-form.md +60 -0
- package/src/apothem/rules/option-annotation.md +45 -0
- package/src/apothem/rules/own-voice-reimplementation.md +86 -0
- package/src/apothem/rules/performance-discipline.md +91 -0
- package/src/apothem/rules/persistent-conventions-vigilance-checklist.md +54 -0
- package/src/apothem/rules/persistent-conventions-vigilance.md +61 -0
- package/src/apothem/rules/plain-language.md +56 -0
- package/src/apothem/rules/planning-techniques.md +130 -0
- package/src/apothem/rules/pre-emission-gate-bars.md +86 -0
- package/src/apothem/rules/pre-emission-gate.md +54 -0
- package/src/apothem/rules/production-ready-prs-surfaces.md +162 -0
- package/src/apothem/rules/production-ready-prs.md +83 -0
- package/src/apothem/rules/propagation.md +63 -0
- package/src/apothem/rules/recommend-next-step.md +106 -0
- package/src/apothem/rules/refactoring-discipline.md +76 -0
- package/src/apothem/rules/session-closure.md +44 -0
- package/src/apothem/rules/sota-elevation-exemplars.md +76 -0
- package/src/apothem/rules/sota-elevation.md +52 -0
- package/src/apothem/rules/source-accessibility.md +58 -0
- package/src/apothem/rules/surgical-manipulation.md +48 -0
- package/src/apothem/rules/systemic-participation-relations.md +108 -0
- package/src/apothem/rules/systemic-participation.md +70 -0
- package/src/apothem/rules/ten-dimension-check-dimensions.md +52 -0
- package/src/apothem/rules/ten-dimension-check.md +59 -0
- package/src/apothem/rules/token-budget-discipline.md +81 -0
- package/src/apothem/rules/token-efficiency-rewrite-protocol.md +79 -0
- package/src/apothem/rules/token-efficiency-rewrite.md +77 -0
- package/src/apothem/rules/tool-use-discipline.md +48 -0
- package/src/apothem/rules/visual-leverage.md +102 -0
- package/src/apothem/schemas/NOTICE.md +9 -0
- package/src/apothem/schemas/README.md +104 -0
- package/src/apothem/schemas/__init__.py +176 -0
- package/src/apothem/schemas/advisory-finding.schema.json +111 -0
- package/src/apothem/schemas/agent.schema.json +106 -0
- package/src/apothem/schemas/authorship-header.txt +1 -0
- package/src/apothem/schemas/cohort-manifest.yaml +248 -0
- package/src/apothem/schemas/cohort-metadata-vocabulary.yaml +168 -0
- package/src/apothem/schemas/cohort.schema.json +113 -0
- package/src/apothem/schemas/command.schema.json +68 -0
- package/src/apothem/schemas/compatibility-matrix.yaml +432 -0
- package/src/apothem/schemas/context-fragment.schema.json +64 -0
- package/src/apothem/schemas/freshness-token-denylist.txt +51 -0
- package/src/apothem/schemas/handoff-manifest.yaml +353 -0
- package/src/apothem/schemas/header-exceptions.txt +141 -0
- package/src/apothem/schemas/header-visibility.yaml +39 -0
- package/src/apothem/schemas/learning-signal.schema.json +46 -0
- package/src/apothem/schemas/memory-record.schema.json +61 -0
- package/src/apothem/schemas/output-style.schema.json +40 -0
- package/src/apothem/schemas/plan.schema.json +51 -0
- package/src/apothem/schemas/plugin.schema.json +83 -0
- package/src/apothem/schemas/profile.example.yaml +70 -0
- package/src/apothem/schemas/profile.minimal.yaml +6 -0
- package/src/apothem/schemas/profile.schema.json +396 -0
- package/src/apothem/schemas/reference-token-denylist.txt +25 -0
- package/src/apothem/schemas/skill.schema.json +75 -0
- package/src/apothem/skills/README.md +93 -0
- package/src/apothem/skills/dependency-upgrade/SKILL.md +105 -0
- package/src/apothem/skills/dev-toolkit/SKILL.md +120 -0
- package/src/apothem/skills/diagram-authoring/SKILL.md +113 -0
- package/src/apothem/skills/document-authoring/SKILL.md +118 -0
- package/src/apothem/skills/ecosystem-audit/SKILL.md +108 -0
- package/src/apothem/skills/ecosystem-audit/references/audit-fortress.md +85 -0
- package/src/apothem/skills/ecosystem-audit/references/procedure.md +162 -0
- package/src/apothem/skills/eval-harness/SKILL.md +88 -0
- package/src/apothem/skills/incident-runbook/SKILL.md +92 -0
- package/src/apothem/skills/multi-source-research/SKILL.md +90 -0
- package/src/apothem/skills/plan-suite/SKILL.md +118 -0
- package/src/apothem/skills/plan-suite/master_template.md +1324 -0
- package/src/apothem/skills/projectify/SKILL.md +117 -0
- package/src/apothem/skills/prompt-engineering/SKILL.md +122 -0
- package/src/apothem/skills/refactor-extract/SKILL.md +85 -0
- package/src/apothem/skills/research-suite/SKILL.md +170 -0
- package/src/apothem/skills/research-suite/references/directory-structure.md +47 -0
- package/src/apothem/skills/research-suite/references/lifecycle.md +67 -0
- package/src/apothem/skills/research-suite/references/principal-investigator-framework.md +37 -0
- package/src/apothem/skills/research-suite/references/rigor-mandates.md +30 -0
- package/src/apothem/skills/research-suite/research_template.md +476 -0
- package/src/apothem/skills/secret-rotation/SKILL.md +87 -0
- package/src/apothem/skills/source-synthesis/SKILL.md +92 -0
- package/src/apothem/skills/surgical-guard/SKILL.md +118 -0
- package/src/apothem/skills/test-authoring/SKILL.md +85 -0
- package/src/apothem/skills/vuln-triage/SKILL.md +91 -0
- package/src/apothem/skills/workflow/SKILL.md +139 -0
- package/src/apothem/statuslines/README.md +26 -0
- package/src/apothem/statuslines/__init__.py +20 -0
- package/src/apothem/statuslines/conformity.json +5 -0
- package/src/apothem/statuslines/render.py +334 -0
- package/src/apothem/statuslines/statusline.md +50 -0
- package/src/apothem/templates/README.md +43 -0
- package/src/apothem/templates/agents-md-template.md +80 -0
- package/src/apothem/templates/consideration-log.md +39 -0
- package/src/apothem/templates/expertise-gap-log.md +56 -0
- package/src/apothem/templates/master-index-template.md +93 -0
- package/src/apothem/templates/potency-map.md +53 -0
- package/src/apothem/templates/preservation-audit.md +60 -0
- package/src/apothem/templates/question-resolution-audit.md +52 -0
- 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,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)
|