@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
package/bin/apothem.mjs
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
|
|
4
|
+
// npx launcher for the apothem CLI.
|
|
5
|
+
//
|
|
6
|
+
// Locates a Python 3.10+ interpreter, points PYTHONPATH at the package's
|
|
7
|
+
// self-contained source tree (vendored dependencies first, then the engine),
|
|
8
|
+
// and executes `python -m apothem` with the caller's arguments. The engine
|
|
9
|
+
// requires the `click` and `rich` Python packages to be importable; every
|
|
10
|
+
// other runtime dependency ships vendored inside the tree.
|
|
11
|
+
|
|
12
|
+
import { spawnSync } from "node:child_process";
|
|
13
|
+
import { delimiter, join } from "node:path";
|
|
14
|
+
import { fileURLToPath } from "node:url";
|
|
15
|
+
|
|
16
|
+
const MIN_PYTHON = [3, 10];
|
|
17
|
+
|
|
18
|
+
const packageRoot = fileURLToPath(new URL("..", import.meta.url));
|
|
19
|
+
const vendorPath = join(packageRoot, "src", "apothem", "_vendor");
|
|
20
|
+
const sourcePath = join(packageRoot, "src");
|
|
21
|
+
|
|
22
|
+
const versionProbe =
|
|
23
|
+
"import sys; raise SystemExit(0 if sys.version_info[:2] >= " +
|
|
24
|
+
`(${MIN_PYTHON[0]}, ${MIN_PYTHON[1]}) else 1)`;
|
|
25
|
+
|
|
26
|
+
/** Interpreter candidates, ordered; each is [command, ...leading args]. */
|
|
27
|
+
const candidates = [];
|
|
28
|
+
if (process.env.APOTHEM_PYTHON) {
|
|
29
|
+
candidates.push([process.env.APOTHEM_PYTHON]);
|
|
30
|
+
}
|
|
31
|
+
candidates.push(["python3"], ["python"], ["py", "-3"]);
|
|
32
|
+
|
|
33
|
+
function probe(candidate) {
|
|
34
|
+
const [command, ...lead] = candidate;
|
|
35
|
+
const result = spawnSync(command, [...lead, "-c", versionProbe], {
|
|
36
|
+
stdio: "ignore",
|
|
37
|
+
});
|
|
38
|
+
return result.status === 0;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const interpreter = candidates.find(probe);
|
|
42
|
+
if (!interpreter) {
|
|
43
|
+
process.stderr.write(
|
|
44
|
+
"apothem: Python " +
|
|
45
|
+
`${MIN_PYTHON[0]}.${MIN_PYTHON[1]}+` +
|
|
46
|
+
" is required but no suitable interpreter was found.\n" +
|
|
47
|
+
"Install Python from https://www.python.org/downloads/ or point the\n" +
|
|
48
|
+
"APOTHEM_PYTHON environment variable at an interpreter, then retry.\n",
|
|
49
|
+
);
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const [command, ...lead] = interpreter;
|
|
54
|
+
const env = {
|
|
55
|
+
...process.env,
|
|
56
|
+
PYTHONPATH: [vendorPath, sourcePath, process.env.PYTHONPATH]
|
|
57
|
+
.filter(Boolean)
|
|
58
|
+
.join(delimiter),
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const depsProbe = spawnSync(command, [...lead, "-c", "import click, rich"], {
|
|
62
|
+
stdio: "ignore",
|
|
63
|
+
env,
|
|
64
|
+
});
|
|
65
|
+
if (depsProbe.status !== 0) {
|
|
66
|
+
process.stderr.write(
|
|
67
|
+
"apothem: missing runtime dependencies: click rich\n" +
|
|
68
|
+
"Make the click and rich Python packages importable for " +
|
|
69
|
+
`'${command}', then retry.\n`,
|
|
70
|
+
);
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const run = spawnSync(command, [...lead, "-m", "apothem", ...process.argv.slice(2)], {
|
|
75
|
+
stdio: "inherit",
|
|
76
|
+
env,
|
|
77
|
+
});
|
|
78
|
+
process.exit(run.status ?? 1);
|
package/package.json
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ahmed-g-gad/apothem",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Host-agnostic AI-harness configuration manager: one shared profile materializes native configs for seventeen AI assistant harnesses, syncing rules, skills, slash-commands, hooks, and MCP servers behind a conformity governance gate and signed releases.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"agent",
|
|
7
|
+
"agnostic",
|
|
8
|
+
"ai",
|
|
9
|
+
"ai-assistant",
|
|
10
|
+
"ai-harness",
|
|
11
|
+
"antigravity",
|
|
12
|
+
"apothem",
|
|
13
|
+
"automation",
|
|
14
|
+
"claude-code",
|
|
15
|
+
"code-assistant",
|
|
16
|
+
"codebuddy",
|
|
17
|
+
"codex",
|
|
18
|
+
"config-manager",
|
|
19
|
+
"configuration-management",
|
|
20
|
+
"conformity",
|
|
21
|
+
"cursor",
|
|
22
|
+
"developer-tools",
|
|
23
|
+
"dotfiles",
|
|
24
|
+
"ecosystem",
|
|
25
|
+
"gemini-cli",
|
|
26
|
+
"github-copilot",
|
|
27
|
+
"glm",
|
|
28
|
+
"governance",
|
|
29
|
+
"harness",
|
|
30
|
+
"hermes",
|
|
31
|
+
"hooks",
|
|
32
|
+
"host-agnostic",
|
|
33
|
+
"kimi-code",
|
|
34
|
+
"kiro",
|
|
35
|
+
"llm",
|
|
36
|
+
"mcp",
|
|
37
|
+
"open-claw",
|
|
38
|
+
"opencode",
|
|
39
|
+
"orchestration",
|
|
40
|
+
"qwen-code",
|
|
41
|
+
"skills",
|
|
42
|
+
"slash-commands",
|
|
43
|
+
"trae",
|
|
44
|
+
"windsurf",
|
|
45
|
+
"zed"
|
|
46
|
+
],
|
|
47
|
+
"homepage": "https://apothem.ahmedgad.com",
|
|
48
|
+
"bugs": "https://github.com/Ahmed-G-Gad/apothem/issues",
|
|
49
|
+
"repository": {
|
|
50
|
+
"type": "git",
|
|
51
|
+
"url": "git+https://github.com/Ahmed-G-Gad/apothem.git"
|
|
52
|
+
},
|
|
53
|
+
"license": "MIT",
|
|
54
|
+
"author": "Ahmed G. Gad <me@ahmedgad.com> (https://github.com/Ahmed-G-Gad)",
|
|
55
|
+
"type": "module",
|
|
56
|
+
"bin": {
|
|
57
|
+
"apothem": "bin/apothem.mjs"
|
|
58
|
+
},
|
|
59
|
+
"files": [
|
|
60
|
+
"bin/",
|
|
61
|
+
"src/apothem/",
|
|
62
|
+
"pyproject.toml",
|
|
63
|
+
"LICENSE",
|
|
64
|
+
"LICENSES/",
|
|
65
|
+
"README.md",
|
|
66
|
+
"CHANGELOG.md"
|
|
67
|
+
],
|
|
68
|
+
"engines": {
|
|
69
|
+
"node": ">=18"
|
|
70
|
+
},
|
|
71
|
+
"publishConfig": {
|
|
72
|
+
"access": "public",
|
|
73
|
+
"provenance": true
|
|
74
|
+
}
|
|
75
|
+
}
|
package/pyproject.toml
ADDED
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
[build-system]
|
|
4
|
+
requires = ["setuptools>=68.0", "wheel"]
|
|
5
|
+
build-backend = "setuptools.build_meta"
|
|
6
|
+
|
|
7
|
+
[project]
|
|
8
|
+
name = "apothem"
|
|
9
|
+
version = "0.1.1"
|
|
10
|
+
description = "Host-agnostic AI-harness configuration manager: one shared profile materializes native configs for seventeen AI assistant harnesses, syncing rules, skills, slash-commands, hooks, and MCP servers behind a conformity governance gate and signed releases."
|
|
11
|
+
requires-python = ">=3.10"
|
|
12
|
+
readme = "README.md"
|
|
13
|
+
license = "MIT"
|
|
14
|
+
license-files = ["LICENSE", "LICENSES/MIT.txt"]
|
|
15
|
+
dependencies = [
|
|
16
|
+
# Pinned exactly: the CLI shell-completion scripts are Click-generated, and
|
|
17
|
+
# the byte-identical behavior-diff golden (completion-fish.json) is only
|
|
18
|
+
# stable against a fixed Click — 8.4.1 and 8.4.2 emit different `string
|
|
19
|
+
# split` delimiters. Relax once the behavior-diff oracle normalizes the
|
|
20
|
+
# Click-generated completion blocks.
|
|
21
|
+
"click==8.4.2",
|
|
22
|
+
"rich>=15.0.0",
|
|
23
|
+
"pyyaml>=6.0.3",
|
|
24
|
+
"jsonschema>=4.26.0",
|
|
25
|
+
]
|
|
26
|
+
authors = [
|
|
27
|
+
{ name = "Ahmed G. Gad", email = "me@ahmedgad.com" },
|
|
28
|
+
]
|
|
29
|
+
maintainers = [
|
|
30
|
+
{ name = "Ahmed G. Gad", email = "me@ahmedgad.com" },
|
|
31
|
+
]
|
|
32
|
+
keywords = ["agent", "agnostic", "ai", "ai-assistant", "ai-harness", "antigravity", "apothem", "automation", "claude-code", "code-assistant", "codebuddy", "codex", "config-manager", "configuration-management", "conformity", "cursor", "developer-tools", "dotfiles", "ecosystem", "gemini-cli", "github-copilot", "glm", "governance", "harness", "hermes", "hooks", "host-agnostic", "kimi-code", "kiro", "llm", "mcp", "open-claw", "opencode", "orchestration", "qwen-code", "skills", "slash-commands", "trae", "windsurf", "zed"]
|
|
33
|
+
classifiers = [
|
|
34
|
+
"Development Status :: 3 - Alpha",
|
|
35
|
+
"Intended Audience :: Developers",
|
|
36
|
+
"Operating System :: OS Independent",
|
|
37
|
+
"Operating System :: POSIX :: Linux",
|
|
38
|
+
"Operating System :: MacOS",
|
|
39
|
+
"Operating System :: Microsoft :: Windows",
|
|
40
|
+
"Programming Language :: Python :: 3",
|
|
41
|
+
"Programming Language :: Python :: 3.10",
|
|
42
|
+
"Programming Language :: Python :: 3.11",
|
|
43
|
+
"Programming Language :: Python :: 3.12",
|
|
44
|
+
"Programming Language :: Python :: 3.13",
|
|
45
|
+
"Programming Language :: Python :: 3.14",
|
|
46
|
+
"Topic :: Software Development",
|
|
47
|
+
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
48
|
+
"Topic :: Software Development :: Quality Assurance",
|
|
49
|
+
"Topic :: Utilities",
|
|
50
|
+
"Environment :: Console",
|
|
51
|
+
]
|
|
52
|
+
|
|
53
|
+
[project.urls]
|
|
54
|
+
# Homepage points at the marketing landing of the comprehensive project
|
|
55
|
+
# website. Documentation points at the website's documentation section
|
|
56
|
+
# (day-to-day user guides). Source / Issues / Discussions / Changelog /
|
|
57
|
+
# Security route at the canonical GitHub surfaces.
|
|
58
|
+
Homepage = "https://apothem.ahmedgad.com/"
|
|
59
|
+
Documentation = "https://apothem.ahmedgad.com/docs/usage/"
|
|
60
|
+
Reference = "https://apothem.ahmedgad.com/docs/reference/"
|
|
61
|
+
Architecture = "https://apothem.ahmedgad.com/docs/architecture/"
|
|
62
|
+
Repository = "https://github.com/ahmed-g-gad/apothem"
|
|
63
|
+
Issues = "https://github.com/ahmed-g-gad/apothem/issues"
|
|
64
|
+
Discussions = "https://github.com/ahmed-g-gad/apothem/discussions"
|
|
65
|
+
Changelog = "https://github.com/ahmed-g-gad/apothem/blob/main/CHANGELOG.md"
|
|
66
|
+
Security = "https://github.com/ahmed-g-gad/apothem/security"
|
|
67
|
+
Brand = "https://apothem.ahmedgad.com/docs/brand/"
|
|
68
|
+
|
|
69
|
+
# Console scripts are intentionally absent: apothem installs as a per-harness
|
|
70
|
+
# plugin and runs directly on the system Python interpreter. The engine CLI
|
|
71
|
+
# is invoked through the module surface (`python -m apothem`), and harness
|
|
72
|
+
# hook entries invoke the materialized dispatcher and conformity gate by
|
|
73
|
+
# absolute script path under the harness root, so no console-script shims
|
|
74
|
+
# or importable site-packages install are required on the host.
|
|
75
|
+
|
|
76
|
+
[project.entry-points."apothem.harnesses"]
|
|
77
|
+
claude-code = "apothem.harnesses.claude_code:ClaudeCodeAdapter"
|
|
78
|
+
cursor = "apothem.harnesses.cursor:CursorAdapter"
|
|
79
|
+
gemini-cli = "apothem.harnesses.gemini_cli:GeminiCliAdapter"
|
|
80
|
+
github-copilot = "apothem.harnesses.github_copilot:GitHubCopilotAdapter"
|
|
81
|
+
codex = "apothem.harnesses.codex:CodexAdapter"
|
|
82
|
+
windsurf = "apothem.harnesses.windsurf:WindsurfAdapter"
|
|
83
|
+
opencode = "apothem.harnesses.opencode:OpenCodeAdapter"
|
|
84
|
+
antigravity = "apothem.harnesses.antigravity:AntigravityAdapter"
|
|
85
|
+
open-claw = "apothem.harnesses.open_claw:OpenClawAdapter"
|
|
86
|
+
hermes = "apothem.harnesses.hermes:HermesAdapter"
|
|
87
|
+
qwen-code = "apothem.harnesses.qwen_code:QwenCodeAdapter"
|
|
88
|
+
kimi-code = "apothem.harnesses.kimi_code:KimiCodeAdapter"
|
|
89
|
+
codebuddy = "apothem.harnesses.codebuddy:CodeBuddyAdapter"
|
|
90
|
+
kiro = "apothem.harnesses.kiro:KiroAdapter"
|
|
91
|
+
trae = "apothem.harnesses.trae:TraeAdapter"
|
|
92
|
+
zed = "apothem.harnesses.zed:ZedAdapter"
|
|
93
|
+
glm = "apothem.harnesses.glm:GlmAdapter"
|
|
94
|
+
|
|
95
|
+
[tool.setuptools.packages.find]
|
|
96
|
+
where = ["src"]
|
|
97
|
+
|
|
98
|
+
# Single source of truth for the project version: the ``[project] version``
|
|
99
|
+
# field above (per ``rules/dynamism.md`` §f + §Single-Source). Every other
|
|
100
|
+
# version-bearing surface derives from it dynamically: the runtime
|
|
101
|
+
# ``apothem.__version__`` resolves it via ``importlib.metadata.version`` at
|
|
102
|
+
# import time, README badges via the shields.io GitHub-release endpoint, and
|
|
103
|
+
# the docs site via its build-time export. A prior ``dynamic = ["version"]`` + ``attr =
|
|
104
|
+
# "apothem.__version__"`` wiring was circular (the build attribute pointed at
|
|
105
|
+
# a runtime ``importlib.metadata`` lookup that is unresolvable in an isolated
|
|
106
|
+
# build env, producing ``0.0.0+unknown`` artifacts).
|
|
107
|
+
|
|
108
|
+
[tool.setuptools.package-data]
|
|
109
|
+
# Bundle non-Python schema and fixture files with the wheel so runtime
|
|
110
|
+
# consumers can resolve them via importlib.resources regardless of the
|
|
111
|
+
# install location.
|
|
112
|
+
"apothem.schemas" = ["*.json", "*.yaml", "*.txt", "*.md"]
|
|
113
|
+
# Hook library ships cross-platform shell stubs alongside the Python
|
|
114
|
+
# dispatcher (bootstrap.{sh,ps1}, find-python.{sh,ps1}, find-pwsh.{sh,ps1})
|
|
115
|
+
# plus the per-event Markdown context fixtures consumed by the dispatcher.
|
|
116
|
+
"apothem.hooks" = ["lib/*.sh", "lib/*.ps1", "messages/*.md"]
|
|
117
|
+
# Statusline renderer ships the shell shims plus the conformity-posture
|
|
118
|
+
# data file and the operator-facing reference Markdown.
|
|
119
|
+
"apothem.statuslines" = ["*.sh", "*.ps1", "*.md", "*.json"]
|
|
120
|
+
# Shared lib package ships the propagation manifest YAML so harness adapters
|
|
121
|
+
# can load it via importlib.resources regardless of install location.
|
|
122
|
+
"apothem.lib" = ["*.yaml"]
|
|
123
|
+
# Vendored runtime data (critical C5). The jsonschema validator loads the
|
|
124
|
+
# meta-schemas at runtime to validate the profile schema: the per-draft
|
|
125
|
+
# metaschema.json AND the EXTENSIONLESS vocabulary files under
|
|
126
|
+
# schemas/<draft>/vocabularies/ (e.g. .../draft202012/vocabularies/core). Both
|
|
127
|
+
# the recursive `schemas/**/*` glob and these globs reach the non-package
|
|
128
|
+
# `schemas/` subtree from its parent package, so a built wheel/sdist ships them
|
|
129
|
+
# — without them a manual `pip install <wheel>` crashes on first profile
|
|
130
|
+
# validation. Upstream LICENSE files and typing stubs ship alongside for
|
|
131
|
+
# license compliance and type completeness.
|
|
132
|
+
"apothem._vendor" = ["*.LICENSE", ".keep"]
|
|
133
|
+
"apothem._vendor.jsonschema_specifications" = ["schemas/**/*"]
|
|
134
|
+
"apothem._vendor.jsonschema" = ["benchmarks/**/*.json"]
|
|
135
|
+
"apothem._vendor.attr" = ["*.pyi", "py.typed"]
|
|
136
|
+
"apothem._vendor.attrs" = ["*.pyi", "py.typed"]
|
|
137
|
+
"apothem._vendor.referencing" = ["*.pyi", "py.typed"]
|
|
138
|
+
# Harness adapter packages ship registry payloads beside their Python modules:
|
|
139
|
+
# templates for render/write sources, capabilities.yml for the capability
|
|
140
|
+
# matrix, and STANDARD-CONVENTION-PIN.md for convention evidence. These MUST
|
|
141
|
+
# bundle in both wheel and sdist artifacts so install, verify, docs, and
|
|
142
|
+
# release-readiness checks operate from the same registry-backed payload set.
|
|
143
|
+
"apothem.harnesses.antigravity" = ["capabilities.yml", "STANDARD-CONVENTION-PIN.md", "templates/*"]
|
|
144
|
+
"apothem.harnesses.claude_code" = ["capabilities.yml", "STANDARD-CONVENTION-PIN.md", "templates/*"]
|
|
145
|
+
"apothem.harnesses.codex" = ["capabilities.yml", "STANDARD-CONVENTION-PIN.md", "templates/*"]
|
|
146
|
+
"apothem.harnesses.cursor" = ["capabilities.yml", "STANDARD-CONVENTION-PIN.md", "templates/*"]
|
|
147
|
+
"apothem.harnesses.gemini_cli" = ["capabilities.yml", "STANDARD-CONVENTION-PIN.md", "templates/*"]
|
|
148
|
+
"apothem.harnesses.github_copilot" = ["capabilities.yml", "STANDARD-CONVENTION-PIN.md", "templates/*"]
|
|
149
|
+
"apothem.harnesses.hermes" = ["capabilities.yml", "STANDARD-CONVENTION-PIN.md"]
|
|
150
|
+
"apothem.harnesses.open_claw" = ["capabilities.yml", "STANDARD-CONVENTION-PIN.md"]
|
|
151
|
+
"apothem.harnesses.opencode" = ["capabilities.yml", "STANDARD-CONVENTION-PIN.md"]
|
|
152
|
+
"apothem.harnesses.qwen_code" = ["capabilities.yml", "STANDARD-CONVENTION-PIN.md", "templates/*"]
|
|
153
|
+
"apothem.harnesses.kimi_code" = ["capabilities.yml", "STANDARD-CONVENTION-PIN.md", "templates/*"]
|
|
154
|
+
"apothem.harnesses.windsurf" = ["capabilities.yml", "STANDARD-CONVENTION-PIN.md", "templates/*"]
|
|
155
|
+
"apothem.harnesses.codebuddy" = ["capabilities.yml", "STANDARD-CONVENTION-PIN.md", "templates/*"]
|
|
156
|
+
"apothem.harnesses.kiro" = ["capabilities.yml", "STANDARD-CONVENTION-PIN.md", "templates/*"]
|
|
157
|
+
"apothem.harnesses.trae" = ["capabilities.yml", "STANDARD-CONVENTION-PIN.md", "templates/*"]
|
|
158
|
+
"apothem.harnesses.zed" = ["capabilities.yml", "STANDARD-CONVENTION-PIN.md", "templates/*"]
|
|
159
|
+
"apothem.harnesses.glm" = ["capabilities.yml", "STANDARD-CONVENTION-PIN.md", "templates/*"]
|
|
160
|
+
# The top-level content directories — agents, slash-commands, behavioral
|
|
161
|
+
# rules, skills, output styles, and plan-suite templates — are Markdown
|
|
162
|
+
# payloads with no __init__.py, so they bundle under the `apothem`
|
|
163
|
+
# package key with directory-relative globs rather than as sub-packages.
|
|
164
|
+
"apothem" = [
|
|
165
|
+
# PEP 561 inline-type marker: apothem is type-checked under mypy --strict,
|
|
166
|
+
# so the wheel/sdist ships py.typed to surface its types to importers.
|
|
167
|
+
"py.typed",
|
|
168
|
+
"agents/*.md",
|
|
169
|
+
"commands/*.md",
|
|
170
|
+
"commands/**/*.md",
|
|
171
|
+
"rules/*.md",
|
|
172
|
+
"skills/**/*.md",
|
|
173
|
+
"output-styles/*.md",
|
|
174
|
+
"templates/*.md",
|
|
175
|
+
]
|
|
176
|
+
|
|
177
|
+
[project.optional-dependencies]
|
|
178
|
+
dev = [
|
|
179
|
+
"ruff>=0.15.14",
|
|
180
|
+
"mypy>=2.1.0",
|
|
181
|
+
"types-PyYAML>=6.0.12.20260518",
|
|
182
|
+
"types-jsonschema>=4.26.0.20260518",
|
|
183
|
+
"pytest>=9.0.3",
|
|
184
|
+
"pytest-cov>=7.1.0",
|
|
185
|
+
"pytest-xdist>=3.8.0",
|
|
186
|
+
# Hypothesis ratifies the property-test surface that feeds the OpenSSF
|
|
187
|
+
# Scorecard Fuzzing check. Property tests at tests/property/ exercise
|
|
188
|
+
# invariants (round-trip, idempotence, schema-validity) across
|
|
189
|
+
# auto-generated inputs across the search space.
|
|
190
|
+
"hypothesis>=6.152.9",
|
|
191
|
+
]
|
|
192
|
+
security = [
|
|
193
|
+
"bandit[toml]>=1.9.4",
|
|
194
|
+
"pip-audit>=2.10.0",
|
|
195
|
+
]
|
|
196
|
+
release = [
|
|
197
|
+
"build>=1.5.0",
|
|
198
|
+
"twine>=6.2.0",
|
|
199
|
+
]
|
|
200
|
+
|
|
201
|
+
[tool.bandit]
|
|
202
|
+
# Project-wide bandit policy. Skips the heuristic findings whose
|
|
203
|
+
# patterns are intrinsic to admin-tooling work and not actual security
|
|
204
|
+
# concerns: assert statements (pytest idiom), subprocess calls with
|
|
205
|
+
# locally-constructed argv, partial-path executable lookup (`git`,
|
|
206
|
+
# `python`), fail-open try/except/pass in the dispatcher.
|
|
207
|
+
exclude_dirs = ["tests", ".plans", ".apothem", "projects", "memory", "examples", "backups", "src/apothem/_vendor", "*/_vendor/*"]
|
|
208
|
+
skips = [
|
|
209
|
+
"B101", # assert_used — covered by ruff S101 + per-file ignores
|
|
210
|
+
"B110", # try_except_pass — fail-open dispatcher pattern (intentional)
|
|
211
|
+
"B112", # try_except_continue — fail-open per-matcher isolation (intentional, mirrors B110)
|
|
212
|
+
"B404", # blacklist_subprocess_import — admin tooling needs subprocess
|
|
213
|
+
"B603", # subprocess_without_shell_equals_true — argv is locally-constructed
|
|
214
|
+
"B607", # start_process_with_partial_path — `git`, `python` resolved by PATH
|
|
215
|
+
]
|
|
216
|
+
|
|
217
|
+
[tool.ruff]
|
|
218
|
+
line-length = 88
|
|
219
|
+
target-version = "py310"
|
|
220
|
+
extend-exclude = [
|
|
221
|
+
"backups",
|
|
222
|
+
"cache",
|
|
223
|
+
"debug",
|
|
224
|
+
"downloads",
|
|
225
|
+
"file-history",
|
|
226
|
+
"ide",
|
|
227
|
+
".plans",
|
|
228
|
+
".apothem",
|
|
229
|
+
"plugins",
|
|
230
|
+
"projects",
|
|
231
|
+
"session-env",
|
|
232
|
+
"sessions",
|
|
233
|
+
"shell-snapshots",
|
|
234
|
+
"statsig",
|
|
235
|
+
"todos",
|
|
236
|
+
"tests/conformity-scenarios/fixtures",
|
|
237
|
+
# The install_driver behavior-diff golden corpus is a frozen, generated
|
|
238
|
+
# oracle (rendered native config copies + ledger/plan snapshots); it is
|
|
239
|
+
# captured verbatim, not apothem-authored source, so it is not linted.
|
|
240
|
+
"tests/fixtures/behavior-diff",
|
|
241
|
+
# Vendored upstream trees ship verbatim into the plugin runtime; they are
|
|
242
|
+
# not apothem-authored source, so they are excluded from linting.
|
|
243
|
+
"src/apothem/_vendor",
|
|
244
|
+
]
|
|
245
|
+
|
|
246
|
+
[tool.ruff.lint]
|
|
247
|
+
select = ["E", "F", "W", "I", "UP", "B", "SIM", "N", "S", "C4", "ANN", "PT", "FA", "PTH", "RET", "RUF"]
|
|
248
|
+
ignore = ["E501"]
|
|
249
|
+
|
|
250
|
+
[tool.ruff.lint.per-file-ignores]
|
|
251
|
+
# Pytest's expected idiom: assertions are the test harness's primary
|
|
252
|
+
# verification mechanism, so suppress the security-rule that flags
|
|
253
|
+
# them as "use of assert". The S603 entry covers test-side subprocess
|
|
254
|
+
# invocations of locally-resolved scripts via sys.executable; the
|
|
255
|
+
# argv vectors are constructed in-test from fixed paths. The S607 entry
|
|
256
|
+
# covers test-side `git` invocations resolved via PATH (the no-global-
|
|
257
|
+
# plans-grep self-tests use `git init` / `git config` / `git add` /
|
|
258
|
+
# `git commit` against ephemeral tmp_path repos).
|
|
259
|
+
"tests/**/*.py" = ["S101", "S603", "S607", "ANN001", "ANN002", "ANN201", "ANN202", "N802"]
|
|
260
|
+
# Conformity fixtures intentionally exhibit the patterns the
|
|
261
|
+
# corresponding mechanical greps detect (bare-except, hard-coded
|
|
262
|
+
# sentinel literals, fail-open swallow). The fixture files are
|
|
263
|
+
# the test surface for the validators; the rules are observed
|
|
264
|
+
# in the fixture's pass/fail counterparts, not authored in
|
|
265
|
+
# real source.
|
|
266
|
+
"tests/conformity/**" = ["E722", "S105", "S110", "F841", "BLE001"]
|
|
267
|
+
# The hook dispatcher and emit_hook_context.py manipulate sys.path
|
|
268
|
+
# before importing local helpers, so import-sort and module-import-
|
|
269
|
+
# at-top rules cannot apply uniformly. The fail-open try/except/pass
|
|
270
|
+
# is intentional per the dispatcher's contract: hook context is
|
|
271
|
+
# advisory and must never block the underlying tool call.
|
|
272
|
+
"src/apothem/hooks/dispatch.py" = ["E402", "I001", "S110"]
|
|
273
|
+
"src/apothem/hooks/emit_hook_context.py" = ["E402", "I001"]
|
|
274
|
+
# Tooling scripts invoke subprocesses with controlled, internally-
|
|
275
|
+
# constructed argument vectors. The S603 / S607 security rules
|
|
276
|
+
# generalize to "untrusted input" but the inputs here are always
|
|
277
|
+
# locally-derived paths and python interpreter discovery results.
|
|
278
|
+
"scripts/dev/audit_all.py" = ["S603"]
|
|
279
|
+
"scripts/dev/auto_update.py" = ["S603", "S607"]
|
|
280
|
+
"scripts/dev/chaos_pass.py" = ["S603"]
|
|
281
|
+
"src/apothem/conformity/production_ready_pr_grep.py" = ["S603"]
|
|
282
|
+
"src/apothem/conformity/semver_stability_grep.py" = ["S603", "S607"]
|
|
283
|
+
"src/apothem/conformity/agents_md_coverage_grep.py" = ["S603", "S607"]
|
|
284
|
+
# `_PASS` is a label string ("[PASS]"), not a credential. The
|
|
285
|
+
# heuristic security-rule pattern-matches on the variable name.
|
|
286
|
+
"src/apothem/lib/reporter.py" = ["S105"]
|
|
287
|
+
|
|
288
|
+
[tool.ruff.format]
|
|
289
|
+
quote-style = "double"
|
|
290
|
+
|
|
291
|
+
[tool.pytest.ini_options]
|
|
292
|
+
testpaths = ["tests"]
|
|
293
|
+
python_files = ["test_*.py"]
|
|
294
|
+
# import-mode = importlib + consider_namespace_packages lets sibling test
|
|
295
|
+
# directories reuse the same test_NAME.py basenames (e.g., the validator
|
|
296
|
+
# self-tests at tests/conformity/file-header/ and the injector self-tests
|
|
297
|
+
# at tests/scripts/inject-header/ both ship a test_exempt_*.py). Without
|
|
298
|
+
# consider_namespace_packages the duplicate basenames collide under
|
|
299
|
+
# parallel (-n auto) collection and crash an xdist worker.
|
|
300
|
+
addopts = "-ra --strict-markers --import-mode=importlib -n auto"
|
|
301
|
+
consider_namespace_packages = true
|
|
302
|
+
|
|
303
|
+
[tool.mypy]
|
|
304
|
+
python_version = "3.10"
|
|
305
|
+
strict = true
|
|
306
|
+
files = ["src/apothem/cli", "src/apothem/harnesses", "src/apothem/lib", "src/apothem/conformity"]
|
|
307
|
+
mypy_path = "src"
|
|
308
|
+
explicit_package_bases = true
|
|
309
|
+
exclude = ["tests/conformity", "src/apothem/_vendor"]
|
|
310
|
+
|
|
311
|
+
# Tests use pytest fixtures and dynamic monkeypatching; strict typing would
|
|
312
|
+
# produce excessive false positives without adding safety. We still type-check
|
|
313
|
+
# them with relaxed settings so obvious regressions are caught.
|
|
314
|
+
[[tool.mypy.overrides]]
|
|
315
|
+
module = "tests.*"
|
|
316
|
+
disallow_untyped_defs = false
|
|
317
|
+
disallow_incomplete_defs = false
|
|
318
|
+
check_untyped_defs = true
|
|
319
|
+
warn_return_any = false
|
|
320
|
+
|
|
321
|
+
[tool.coverage.run]
|
|
322
|
+
# Engine-scoped: the runtime surface the tool actually executes (CLI + the 15
|
|
323
|
+
# harness adapters + the lib core + the hook/statusline runtime). Conformity
|
|
324
|
+
# matchers and the audit/reference dev-tools are deliberately out of scope so the
|
|
325
|
+
# coverage figure is the honest engine signal, not one inflated by the
|
|
326
|
+
# heavily-fixtured conformity self-test corpora.
|
|
327
|
+
source = [
|
|
328
|
+
"src/apothem/cli",
|
|
329
|
+
"src/apothem/harnesses",
|
|
330
|
+
"src/apothem/lib",
|
|
331
|
+
"src/apothem/hooks",
|
|
332
|
+
"src/apothem/statuslines",
|
|
333
|
+
]
|
|
334
|
+
branch = true
|
|
335
|
+
omit = [
|
|
336
|
+
"*/benchmarks/*",
|
|
337
|
+
"*/_vendor/*",
|
|
338
|
+
]
|
|
339
|
+
|
|
340
|
+
[tool.coverage.report]
|
|
341
|
+
fail_under = 80
|
|
342
|
+
show_missing = true
|
|
343
|
+
exclude_lines = [
|
|
344
|
+
"raise NotImplementedError",
|
|
345
|
+
"if TYPE_CHECKING:",
|
|
346
|
+
"\\.\\.\\.",
|
|
347
|
+
]
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
<!-- SPDX-License-Identifier: MIT -->
|
|
2
|
+
|
|
3
|
+
# apothem
|
|
4
|
+
|
|
5
|
+
> **Role.** `apothem` is a harness-agnostic AI-configuration manager. It maintains one shared corpus of rules, agents, commands, skills, output-styles, and templates, and materializes that corpus into each AI tool's native configuration directory through a per-harness adapter. Author the conventions once; `apothem` propagates them to every harness the operator runs.
|
|
6
|
+
|
|
7
|
+
## Package Map
|
|
8
|
+
|
|
9
|
+
### Code subpackages
|
|
10
|
+
|
|
11
|
+
| Child | Holds |
|
|
12
|
+
|-------|-------|
|
|
13
|
+
| [`audit/`](audit/) | Inventory and drift scanners that map the ecosystem and surface staleness, leakage, and convention findings. |
|
|
14
|
+
| [`benchmarks/`](benchmarks/) | Per-class performance benchmark drivers (hooks, tests, agents, ecosystem sweep). |
|
|
15
|
+
| [`cli/`](cli/) | The `apothem` command-line surface, shared flags, JSON formatter, propagation loader, and shell completions. |
|
|
16
|
+
| [`conformity/`](conformity/) | Pre-emission conformity validators — the gate orchestrator plus mechanical `*_grep` matchers and the link checker. |
|
|
17
|
+
| [`harnesses/`](harnesses/) | Per-harness adapter subpackages implementing the `HarnessAdapter` protocol — one per supported AI tool. |
|
|
18
|
+
| [`hooks/`](hooks/) | The hook dispatcher, bootstrap stubs, event vocabulary, and per-event Markdown context messages. |
|
|
19
|
+
| [`lib/`](lib/) | Shared internal helpers (frontmatter probing, materializer building blocks, parallel sweep, reporting). |
|
|
20
|
+
| [`statuslines/`](statuslines/) | The conformity-posture statusline renderer plus shell shims and reference docs. |
|
|
21
|
+
|
|
22
|
+
### Content / asset directories
|
|
23
|
+
|
|
24
|
+
| Child | Holds |
|
|
25
|
+
|-------|-------|
|
|
26
|
+
| `agents/` | Persistent agent definitions (mission, deliverable, constraints) materialized into harness agent dirs. |
|
|
27
|
+
| `commands/` | Slash-command definitions — the `/plan` pipeline and the audit/review commands. |
|
|
28
|
+
| `rules/` | The shared behavioral rule corpus (always-on and path-filtered `.md` rules). |
|
|
29
|
+
| `skills/` | Folder skills, each with a `SKILL.md` entry point. |
|
|
30
|
+
| `output-styles/` | Output-style definitions controlling response shape. |
|
|
31
|
+
| `templates/` | Scaffolding templates consumed by the planning workflow and renderers. |
|
|
32
|
+
| `schemas/` | Schema fixtures used by validators and tests. |
|
|
33
|
+
|
|
34
|
+
### Package files
|
|
35
|
+
|
|
36
|
+
| File | Holds |
|
|
37
|
+
|------|-------|
|
|
38
|
+
| `__init__.py` | Package marker and version surface for `apothem`. |
|
|
39
|
+
| `__main__.py` | Module entry point — `python -m apothem` dispatches to the [`cli/`](cli/) command surface. |
|
|
40
|
+
|
|
41
|
+
## Conventions
|
|
42
|
+
|
|
43
|
+
- Code subpackages are importable Python modules; content directories are corpora the harness adapters propagate.
|
|
44
|
+
- The `claude_code` harness consumes the full surface (code directories travel with the bundled plugin tree, convention directories flatten into the harness config root); the other harnesses receive a materialized native config and, where the native format differs, converted cohorts per their adapter.
|
|
45
|
+
- The code-vs-content split is load-bearing: an adapter subpackage in `harnesses/` is named by its catalog slug, never privileged by a brand phrase, and content corpora carry no executable Python.
|
|
46
|
+
|
|
47
|
+
## Operating in this folder
|
|
48
|
+
|
|
49
|
+
- **Self-contained run model.** The engine runs from source via `PYTHONPATH=src python -m apothem ...` with its dependencies vendored under `_vendor/`; do not assume an installed entry point when verifying changes here. `_vendor/` is a vendored tree an agent does not hand-edit.
|
|
50
|
+
- Add or modify code inside the owning subpackage rather than at this root; add corpus artifacts inside the owning content directory.
|
|
51
|
+
- After any change, validate with `python -m ruff check . --fix`, then `python -m mypy src/apothem/cli/ src/apothem/harnesses/` (strict scope is `cli` + `harnesses`), then `python -m pytest`, then `python -m apothem.conformity.gate --all .`.
|
|
52
|
+
- A new harness adapter touches several coupled surfaces beyond its subpackage (registry, manifest, golden fixtures, profile schema, tests) — consult `harnesses/README.md` before adding one.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
"""Apothem — host-agnostic AI harness configuration manager."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import importlib.metadata
|
|
8
|
+
import re
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
#: How many ancestor directories to inspect for the source tree's manifest.
|
|
12
|
+
#: ``src/apothem/__init__.py`` sits two levels below the tree root, so three
|
|
13
|
+
#: levels covers the repository checkout, the npm package tree, and one
|
|
14
|
+
#: nesting layer of slack without ever walking into unrelated projects.
|
|
15
|
+
_MANIFEST_SEARCH_DEPTH = 3
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _version_from_source_tree() -> str | None:
|
|
19
|
+
"""Read the version from the ``pyproject.toml`` co-located with this tree.
|
|
20
|
+
|
|
21
|
+
The self-contained runtime ships its source tree (a repository checkout,
|
|
22
|
+
the npm package, or an installer-managed copy) without installed package
|
|
23
|
+
metadata, so the co-located manifest is the authoritative version source.
|
|
24
|
+
The manifest is accepted only when it declares ``name = "apothem"`` so a
|
|
25
|
+
foreign ``pyproject.toml`` higher up the filesystem is never captured.
|
|
26
|
+
|
|
27
|
+
Returns:
|
|
28
|
+
The declared version, or ``None`` when no apothem manifest is found
|
|
29
|
+
within the bounded ancestor walk.
|
|
30
|
+
"""
|
|
31
|
+
for parent in Path(__file__).resolve().parents[:_MANIFEST_SEARCH_DEPTH]:
|
|
32
|
+
candidate = parent / "pyproject.toml"
|
|
33
|
+
if not candidate.is_file():
|
|
34
|
+
continue
|
|
35
|
+
try:
|
|
36
|
+
text = candidate.read_text(encoding="utf-8")
|
|
37
|
+
except OSError:
|
|
38
|
+
return None
|
|
39
|
+
if re.search(r'^\s*name\s*=\s*["\']apothem["\']', text, flags=re.MULTILINE):
|
|
40
|
+
match = re.search(
|
|
41
|
+
r'^\s*version\s*=\s*["\']([^"\']+)["\']', text, flags=re.MULTILINE
|
|
42
|
+
)
|
|
43
|
+
return match.group(1) if match else None
|
|
44
|
+
return None
|
|
45
|
+
return None
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _resolve_version() -> str:
|
|
49
|
+
"""Resolve the package version: source tree first, then installed metadata.
|
|
50
|
+
|
|
51
|
+
Precedence: the co-located ``pyproject.toml`` (the self-contained runtime's
|
|
52
|
+
single source of truth, also authoritative for editable checkouts where
|
|
53
|
+
stale installed metadata can shadow the tree), then ``importlib.metadata``
|
|
54
|
+
for wheel installs, then the explicit unknown sentinel.
|
|
55
|
+
"""
|
|
56
|
+
declared = _version_from_source_tree()
|
|
57
|
+
if declared is not None:
|
|
58
|
+
return declared
|
|
59
|
+
try:
|
|
60
|
+
return importlib.metadata.version(__name__)
|
|
61
|
+
except importlib.metadata.PackageNotFoundError:
|
|
62
|
+
return "0.0.0+unknown"
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
__version__ = _resolve_version()
|
|
66
|
+
__author__ = "Ahmed G. Gad"
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
"""Module entry point: ``python -m apothem``.
|
|
4
|
+
|
|
5
|
+
``python -m apothem`` is the canonical invocation surface — apothem ships
|
|
6
|
+
no ``[project.scripts]`` console-script shim. The npm shim
|
|
7
|
+
(``npx @ahmed-g-gad/apothem``), the Claude Code plugin, and the one-shot
|
|
8
|
+
installers all run this same module surface; the installers additionally
|
|
9
|
+
place a thin ``apothem`` shell shim on ``PATH`` that forwards here. This
|
|
10
|
+
module makes the package directly executable so a fresh checkout, CI
|
|
11
|
+
sandbox, or isolated virtualenv resolves the identical entry point with
|
|
12
|
+
nothing installed.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from apothem.cli import _configure_stdio, main
|
|
16
|
+
|
|
17
|
+
if __name__ == "__main__":
|
|
18
|
+
# Force UTF-8 stdio (Windows) before Click parses anything. Click emits
|
|
19
|
+
# ``--help`` / ``--version`` from eager-option handling, and usage errors
|
|
20
|
+
# from argument parsing, *before* the group callback body runs — so a
|
|
21
|
+
# reconfigure inside that callback (apothem/cli/__init__.py) never reaches
|
|
22
|
+
# those surfaces. Doing it here, at the invocation entry and never at
|
|
23
|
+
# import (this block runs only under ``python -m apothem``), makes every
|
|
24
|
+
# Click surface inherit UTF-8 on a legacy-codepage host when stdout is a
|
|
25
|
+
# pipe or redirect. The group-callback call remains as defense-in-depth
|
|
26
|
+
# for a direct ``apothem.cli.main`` import that bypasses this entry.
|
|
27
|
+
_configure_stdio()
|
|
28
|
+
raise SystemExit(main())
|
|
File without changes
|