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