@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,139 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "workflow"
|
|
3
|
+
version: "0.1.0"
|
|
4
|
+
updated: "2026-06-14"
|
|
5
|
+
description: "General-purpose workflow-harnessing skill — matched when the operator states a mission via '/goal <<mission>>', asks to 'harness a workflow', 'run a multi-agent workflow', 'orchestrate agents', 'fan out and verify', 'critique and remediate', 'maximally elevate' a target, or otherwise hands off a non-trivial multi-step mission whose accomplishment benefits from genuinely-independent parallel work plus adversarial verification. Decomposes the mission, dispatches independent agents under named return contracts (non-overlapping scope, isolation where parallel writes collide, single-message parallel launch), subjects every load-bearing finding to an EXTREMELY-CRITIQUE refute-by-default verification pass (N independent critics per finding, default 3, distinct lenses — correctness/security/reproducibility/regression — survival only on non-refute majority) before it survives, is granted to identify and remediate defects beyond the literal mission (each disclosed per rules/disclosure-ledger.md), self-augments from current authoritative SOTA sources rather than memory alone, and emits a deterministic, byte-stable result. Multi-agent dispatch and continuous auto-execution are opt-in / confirmation-gated, never default-on — the canonical home for the '/goal <<mission>>' entry pattern. A single-step request that one direct tool call resolves is below this skill's threshold."
|
|
6
|
+
archetype: "orchestration-template"
|
|
7
|
+
userInvocable: true
|
|
8
|
+
argument-hint: "[<<mission>>] [--autonomous] [--verify-panel N]"
|
|
9
|
+
disable-model-invocation: true
|
|
10
|
+
allowed-tools: "Read, Write, Edit, Glob, Grep, Bash, Agent, WebSearch, WebFetch, TodoWrite"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
<!-- SPDX-License-Identifier: MIT -->
|
|
14
|
+
|
|
15
|
+
## Purpose
|
|
16
|
+
|
|
17
|
+
Harness a non-trivial mission into a disciplined multi-agent workflow: decompose it, dispatch genuinely-independent agents under named return contracts, subject every finding to an adversarial refute-by-default verification pass, remediate the mission plus any defect expertise reveals along the way (disclosing each amendment), and emit a deterministic result with a single recommended next move. The skill is the operator's general-purpose orchestration surface — the canonical home for the `/goal <<mission>>` entry pattern — and it honors apothem's agnostic posture: the heavy machinery engages only when the operator opts in.
|
|
18
|
+
|
|
19
|
+
## Detection Signal
|
|
20
|
+
|
|
21
|
+
The operator states a mission through `/goal <<mission>>`, or asks to "harness a workflow", "run a multi-agent workflow", "orchestrate agents", "fan out and verify", "critique and remediate", or "maximally elevate" a target — any non-trivial, multi-step mission whose accomplishment benefits from independent parallel work plus adversarial verification.
|
|
22
|
+
|
|
23
|
+
**Falsifiable counter-signal.** A single-step request that one direct tool call resolves is below this skill's threshold — it routes to the direct tool, not the harness.
|
|
24
|
+
|
|
25
|
+
## Non-Goals
|
|
26
|
+
|
|
27
|
+
The skill is NOT:
|
|
28
|
+
|
|
29
|
+
- **A default-on autonomy switch.** Multi-agent dispatch and continuous auto-execution engage only under `--autonomous` (or an explicit in-conversation opt-in / the profile's `enforcement` flag), per `rules/agnostic-posture.md`. A clean invocation plans the workflow and confirms before committing irreversible or outward-facing steps.
|
|
30
|
+
- **A replacement for the specialized pipelines.** Plan-suite work routes to the `/plan-<stage>` cohort and the `/plan` orchestrator; audit work routes to the audit-fortress commands; research routes to `/research`. This skill harnesses general missions and dispatches those surfaces where they fit — it does not reimplement them.
|
|
31
|
+
- **A memory-only operator.** Every load-bearing technical decision consults current authoritative sources (Conformity Posture below); the skill never asserts a SOTA convention from training memory alone when the live source is reachable.
|
|
32
|
+
- **A silent-scope-widener.** Remediation beyond the literal mission is granted but never silent — every beyond-mission amendment is disclosed per `rules/disclosure-ledger.md`.
|
|
33
|
+
|
|
34
|
+
## Foundational Stanzas
|
|
35
|
+
|
|
36
|
+
The four standing surfaces every operator inherits per the canonical project voice at `AGENTS.md` plus the active harness mirror.
|
|
37
|
+
|
|
38
|
+
### Refusal & Escalation
|
|
39
|
+
|
|
40
|
+
REFUSE any step that exceeds the operator's stated mission AND its disclosed beyond-mission remediation grant — name what was refused, name the boundary crossed, and surface an escalation option through the structured-inquiry channel per `rules/interactive-questions.md` (canonical channel; three-segment option annotation; never free-form prose as primary input). REFUSE engaging autonomous multi-agent dispatch when the operator has not opted in. REFUSE an irreversible or outward-facing step (deletion, publish, force-push, machine-state mutation) without per-action confirmation per the destructive-op floor. When two verification agents return contradictory verdicts on the same finding, REFUSE silent reconciliation — surface both with evidence.
|
|
41
|
+
|
|
42
|
+
### Output Surface
|
|
43
|
+
|
|
44
|
+
Workflow outputs land at their domain-natural locations under the host project per `rules/host-discovery.md` (code at source paths; plan artifacts inside the active suite per the suite-locality invariant at `rules/context-management.md` §2.6.1). Per `rules/operational-mandates.md` CM-7, codebase artifacts carry natural domain language — zero workflow-internal or plan-internal scaffolding. NEVER write a plan artifact to a global plans directory under any harness's config root from a downstream-project context, and NEVER write to any other global-ecosystem location.
|
|
45
|
+
|
|
46
|
+
### File-Authoring Contract
|
|
47
|
+
|
|
48
|
+
Every NEW codebase file the workflow creates routes through `scripts/inject-header.{sh,py}` so the canonical `SPDX-License-Identifier` `MIT` banner is injected at the head in the comment family matching the filetype; the injector is idempotent and detects the variant from the byte-exact fixture at `src/apothem/schemas/authorship-header.txt`. Exempt classes are enumerated at `src/apothem/schemas/header-exceptions.txt`. Edits to existing files preserve any existing banner; the header-inject-guard hook enforces the contract at every Write / Edit.
|
|
49
|
+
|
|
50
|
+
### Structured Inquiry on Ambiguity
|
|
51
|
+
|
|
52
|
+
When uncertain about any of the seven authoritative-data categories per `rules/authority-inquiry.md` — identity, scope direction, preference, security, naming of public surfaces, infrastructure, version pins — and the host is silent, route the resolution through the structured-inquiry channel with the three-segment option annotation per `rules/interactive-questions.md` §3 (rationale / recommendation / default-pointer). NEVER fabricate authoritative data. Every destructive operation routes per-file through the canonical destructive-op option sets at `rules/interactive-questions.md` §6 — one invocation per file, `default-pointer: no-default: user decision required`.
|
|
53
|
+
|
|
54
|
+
## Conformity Posture
|
|
55
|
+
|
|
56
|
+
**Discover-don't-assume preamble (M1).** Before any substantive decision, walk the host's ratified source-of-truth files for the surface under work per `rules/host-discovery.md`; anchor verdicts to the host's actual state, never to assumed conventions.
|
|
57
|
+
|
|
58
|
+
**Current-SOTA source-consultation mandate (M5).** The workflow self-augments from current authoritative sources, not memory alone, per `rules/sota-elevation.md`. The enumerated source classes — extend comprehensively beyond this list as the mission warrants:
|
|
59
|
+
|
|
60
|
+
- **Official vendor documentation** for any tool, framework, platform, or harness in scope (the authoritative current API / convention / limit).
|
|
61
|
+
- **Standards and specifications** — RFCs, W3C / WHATWG, language standards, ECMA, IEEE, the relevant normative spec.
|
|
62
|
+
- **Peer-reviewed and authoritative references** — primary literature, official reference works, canonical texts.
|
|
63
|
+
- **Current SOTA tool documentation** — the live docs of the present best-in-class tool for the task, version-pinned where behavior shifts.
|
|
64
|
+
|
|
65
|
+
A SOTA claim cites at least one source class with a retrievable pointer; an unsourced "best practice" is downgraded or routed to inquiry per `rules/option-annotation.md`.
|
|
66
|
+
|
|
67
|
+
**Authority inquiry surface (M5).** Per the Structured Inquiry on Ambiguity stanza; binds the seven-category catalog at `rules/authority-inquiry.md`.
|
|
68
|
+
|
|
69
|
+
## Procedure
|
|
70
|
+
|
|
71
|
+
Six numbered steps. Steps 3–5 engage the heavy machinery only under opt-in; step 1, 2, and 6 run on every invocation.
|
|
72
|
+
|
|
73
|
+
### 1. Frame the Mission
|
|
74
|
+
|
|
75
|
+
Read the mission in full. Extract intent — not literal text alone — per `rules/expertise-posture.md`. Resolve scope ambiguity through the structured-inquiry channel before dispatch. State the mission as an outcome (testable at close), and record the beyond-mission remediation grant's scope. Apply the Obvious Purge (Filter 1 per `rules/cognitive-identity.md`): discard the first approach; find the structurally superior decomposition.
|
|
76
|
+
|
|
77
|
+
### 2. Decompose & Plan the Dispatch
|
|
78
|
+
|
|
79
|
+
Decompose the mission into independent work-items per `rules/agent-orchestration.md`. Choose the team pattern (Research / Audit / Implementation / Generation / Quality / Documentation) and the agent type per `rules/agent-orchestration-patterns.md` §2. Assign each agent a non-overlapping scope, a named return contract (format + max size + required fields + fallback shape), and isolation where parallel writes would collide. Deploy when 3+ independent operations, multi-path exploration, heavy reads, or multi-dimension verification justify it; skip for tightly-coupled or sub-threshold work.
|
|
80
|
+
|
|
81
|
+
### 3. Dispatch (opt-in gated)
|
|
82
|
+
|
|
83
|
+
Under opt-in (`--autonomous` / in-conversation opt-in / profile flag), launch independent agents in waves sized to the host's reliable concurrency (size the wave to avoid throttle; cap and sequence, never burst). Without opt-in, present the dispatch plan and confirm. Honor the single-message parallel-launch invariant for genuinely independent agents; group dependent agents into waves. The main loop never duplicates work an agent is performing.
|
|
84
|
+
|
|
85
|
+
### 4. EXTREMELY-CRITIQUE Adversarial Verification
|
|
86
|
+
|
|
87
|
+
Every load-bearing finding faces an independent refute-by-default verification pass before it survives (the judge-panel + adversarial-verify pattern, `rules/agent-orchestration-patterns.md` §Quality patterns):
|
|
88
|
+
|
|
89
|
+
- Spawn N independent critics per finding (default 3; `--verify-panel N`), each prompted to **refute** the finding and to default to "refuted" under uncertainty.
|
|
90
|
+
- A finding survives only on a non-refute majority; a majority-refute kills it.
|
|
91
|
+
- Where a finding can fail in more than one way, give each critic a distinct lens (correctness / security / reproducibility / regression), not N identical refuters.
|
|
92
|
+
- Contradictory verdicts surface to the operator with evidence — never silently reconciled.
|
|
93
|
+
|
|
94
|
+
### 5. Remediate (mission + disclosed beyond-mission)
|
|
95
|
+
|
|
96
|
+
Apply the surviving findings. Remediate root causes, not symptoms. Where expertise reveals a defect beyond the literal mission, remediate it and disclose the amendment per `rules/disclosure-ledger.md` (`[Amendment]` / `[Extension]` / `[Refinement]` with cited rationale). Integrating, correctness-critical edits stay in the main loop; independent fan-out stays in the agents.
|
|
97
|
+
|
|
98
|
+
### 6. Synthesize & Self-Check
|
|
99
|
+
|
|
100
|
+
Collect agent results in one pass, verify mutual consistency, synthesize a compact result, and release raw agent output from active context. The procedure keeps the main thread lean: raw agent output is released after this single-pass synthesis, so only the synthesized verified findings persist in the conversation per `rules/multi-agent-workflow.md` §4. Run the fifteen-bar pre-emission gate per `rules/pre-emission-gate.md` against every emitted artifact; iterate on any failing bar until it passes. Record the attestation.
|
|
101
|
+
|
|
102
|
+
## Autonomy Posture
|
|
103
|
+
|
|
104
|
+
| Mode | Trigger | Behavior |
|
|
105
|
+
|------|---------|----------|
|
|
106
|
+
| **Planned (default)** | clean invocation | Decompose + plan + present; confirm before committing irreversible or outward-facing steps. |
|
|
107
|
+
| **Autonomous** | `--autonomous`, explicit in-conversation opt-in, or the profile `enforcement` flag | Dispatch + verify + remediate + advance continuously; every irreversible / outward-facing step still per-action confirmation-gated. |
|
|
108
|
+
|
|
109
|
+
Autonomy is opt-in, never the shipped default, per `rules/agnostic-posture.md`. De-enforced machinery is preserved, not removed: the opt-in path restores it intact.
|
|
110
|
+
|
|
111
|
+
## Arguments
|
|
112
|
+
|
|
113
|
+
- `<<mission>>` — the mission / task / requirement in natural language (the `/goal <<mission>>` entry form).
|
|
114
|
+
- `--autonomous` — opt into continuous multi-agent dispatch + advancement (default: planned, confirm-before-commit).
|
|
115
|
+
- `--verify-panel N` — critics per finding in the adversarial-verify pass (default: 3).
|
|
116
|
+
|
|
117
|
+
## Return Contract
|
|
118
|
+
|
|
119
|
+
A deterministic result surface:
|
|
120
|
+
|
|
121
|
+
- The **mission outcome** (testable against the framing at step 1).
|
|
122
|
+
- The **surviving (verified) findings** with evidence.
|
|
123
|
+
- The **disclosure ledger** of every beyond-mission amendment.
|
|
124
|
+
- The **fifteen-bar gate attestation** per `rules/pre-emission-gate.md`.
|
|
125
|
+
- A single `## Recommended Next Step`.
|
|
126
|
+
|
|
127
|
+
Output shape is byte-stable for identical inputs per `rules/determinism.md`; any non-determinism is declared with its source named. When an agent wave fails or returns partial coverage, the orchestrator records the coverage gap, never silently dropping the dimension.
|
|
128
|
+
|
|
129
|
+
## Recommended Next Step
|
|
130
|
+
|
|
131
|
+
**State your mission as `/goal <<mission>>`** (add `--autonomous` to opt into continuous multi-agent dispatch); the harness frames it, decomposes the dispatch, runs the adversarial-verify pass, and returns the verified result with a single forward move. Begin in planned mode and opt into autonomy only once the dispatch plan reads correctly.
|
|
132
|
+
|
|
133
|
+
## Bindings (§0.j five-direction)
|
|
134
|
+
|
|
135
|
+
- **Drives →** ● Every operator mission handed off via `/goal <<mission>>` (the skill is user-invocable; the orchestration surface for general missions). ● Every adversarial-verify pass that gates a finding before it survives. ● Every beyond-mission amendment disclosed through the ledger. ◐ The opt-in autonomy path that restores continuous multi-agent dispatch.
|
|
136
|
+
- **Satisfies →** ● `CLAUDE.md` Source Layout row "workflow" (skills/ class). ● The multi-agent independent-critique / synthesis / lean-thread capability declared at `rules/multi-agent-workflow.md`. ● The deterministic-output contract at `rules/determinism.md`. ● The agnostic default-off posture at `rules/agnostic-posture.md`.
|
|
137
|
+
- **Established by ↑** ● `rules/agent-orchestration.md` (the team patterns + dispatch discipline this skill orchestrates). ● `rules/agent-orchestration-patterns.md` §Quality patterns (the judge-panel + adversarial-verify pattern). ● `rules/agnostic-posture.md` (the opt-in default-off frame). ● `rules/multi-agent-workflow.md` (the rule that declares this independent-critique / synthesis / lean-thread capability available and opt-in; this skill is the procedure that realizes it).
|
|
138
|
+
- **Gated by ←** ● The harness's Agent + structured-inquiry + Edit + Write + WebSearch + WebFetch tool surface. ● The operator's opt-in for autonomous dispatch. ● The destructive-op floor for irreversible / outward-facing steps.
|
|
139
|
+
- **Cross-bound with ↔** ↔ `commands/workflow.md` (the `/workflow` command entry point that drives this skill). ↔ `rules/multi-agent-workflow.md` (the rule declares the independent-critique / synthesis / lean-thread capability; this skill is the procedure that realizes it — the rule names it, the skill runs it). ↔ `rules/agent-orchestration.md` + `rules/agent-orchestration-patterns.md` (the orchestration discipline). ↔ `rules/determinism.md` (the deterministic-output contract). ↔ `rules/disclosure-ledger.md` (every beyond-mission amendment recorded). ↔ `rules/agnostic-posture.md` (opt-in autonomy). ↔ `rules/interactive-questions.md` (the structured-inquiry channel + destructive-op floor). ↔ `rules/authority-inquiry.md` (the SOTA-source + seven-category inquiry catalog). ↔ `skills/projectify/SKILL.md` (sibling deterministic-SOTA elicitation skill).
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<!-- SPDX-License-Identifier: MIT -->
|
|
2
|
+
|
|
3
|
+
# statuslines
|
|
4
|
+
|
|
5
|
+
> **Role.** The conformity operating-posture statusline — a single renderer that surfaces the ecosystem's operating posture (active phase pointer, sprint goal, unresolved-inquiry count) in the harness statusline.
|
|
6
|
+
|
|
7
|
+
## Files
|
|
8
|
+
|
|
9
|
+
| File | Purpose |
|
|
10
|
+
|------|---------|
|
|
11
|
+
| `render.py` | The statusline renderer. Reads the harness statusline JSON on stdin (only `workspace.project_dir`), locates the project-local `.apothem/plans/` tree (legacy `.plans/` honored as a fallback), and emits `[<phase> \| <sprint-goal> \| <N> inquiries]`. |
|
|
12
|
+
| `conformity.json` | The harness statusline-config snippet — a `type: command` entry whose command invokes `render.py` through the `${HARNESS_ROOT}` token. It wires the renderer into the harness statusline hook; `render.py` never reads it. |
|
|
13
|
+
| `statusline.md` | Reference documentation for the renderer's input contract, output shape, and degradation modes. |
|
|
14
|
+
| `__init__.py` | Package marker. |
|
|
15
|
+
|
|
16
|
+
## Operating in this folder
|
|
17
|
+
|
|
18
|
+
- **`render.py` is the single renderer.** There is one statusline product, and the harness exposes one statusline slot. Changing the rendered output means editing `render.py` and updating `statusline.md` + this README in the same change-set.
|
|
19
|
+
- **Harness-agnostic, project-local paths.** The plans root resolves from the `LLM_PLAN_SUITES_DIR` operator override, then the stdin payload's `workspace.project_dir` joined with `.apothem/plans/` (legacy `.plans/` as a fallback), then the working directory's `.apothem/plans/` (same legacy fallback). No harness config path is ever hardcoded — privilege no one harness.
|
|
20
|
+
- **Changing the wiring:** edit `conformity.json` (the `type: command` snippet the installer ships). The harness pipes its statusline JSON to the command's stdin; the renderer consumes only `workspace.project_dir`.
|
|
21
|
+
- Python follows the repo coding conventions (3.10+ syntax, `pathlib.Path`, strict-scoped typing).
|
|
22
|
+
- Validate a change with `python -m apothem.conformity.gate --all .`, `python -m pytest tests/unit/test_statuslines_render.py`, and `python -m ruff check`; the renderer is in CLI/harness-adjacent scope, so run the scoped `mypy` where it applies.
|
|
23
|
+
|
|
24
|
+
## Related
|
|
25
|
+
|
|
26
|
+
- [`conformity/`](../conformity/) — the conformity validators whose posture this statusline surfaces.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
"""Statusline renderer and conformity-posture surface.
|
|
4
|
+
|
|
5
|
+
This package carries the single operator-visible statusline renderer. The
|
|
6
|
+
runtime surfaces are:
|
|
7
|
+
|
|
8
|
+
* ``apothem.statuslines.render`` — the renderer, invoked through
|
|
9
|
+
``python -m apothem.statuslines.render``. The harness pipes its
|
|
10
|
+
statusline JSON payload on stdin; the renderer reads only
|
|
11
|
+
``workspace.project_dir`` to locate the project-local plans tree, then
|
|
12
|
+
emits the operating-posture line (active phase pointer, sprint goal,
|
|
13
|
+
unresolved-inquiry count) the harness surfaces in its status bar.
|
|
14
|
+
* ``conformity.json`` — the harness statusline-config snippet (a
|
|
15
|
+
``type: command`` entry whose command invokes ``render.py`` through the
|
|
16
|
+
``${HARNESS_ROOT}`` token). It wires the renderer into the harness's
|
|
17
|
+
statusline hook; the renderer never reads it.
|
|
18
|
+
* ``statusline.md`` — the operator-facing reference Markdown documenting
|
|
19
|
+
the renderer's input contract, output shape, and degradation modes.
|
|
20
|
+
"""
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
{
|
|
2
|
+
"type": "command",
|
|
3
|
+
"command": "python3 \"${HARNESS_ROOT}/statuslines/render.py\"",
|
|
4
|
+
"description": "Operating-posture statusline: active sprint goal, unresolved inquiry count, current phase / sub-phase pointer. Agnostic — values are read from the operating agent's working trace (the most recently-touched plan suite's PROGRESS.md), never hardcoded."
|
|
5
|
+
}
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
"""Render the conformity operating-posture statusline.
|
|
4
|
+
|
|
5
|
+
The statusline surfaces three values from the operating agent's working
|
|
6
|
+
trace: the active sprint goal, the unresolved inquiry count, and the
|
|
7
|
+
current phase / sub-phase pointer. It is agnostic — every value is
|
|
8
|
+
read from the most-recently-touched plan suite's PROGRESS.md, never
|
|
9
|
+
hardcoded.
|
|
10
|
+
|
|
11
|
+
This is the single statusline renderer. The harness wires it through the
|
|
12
|
+
``conformity.json`` statusline-config snippet (a ``type: command`` entry
|
|
13
|
+
whose command invokes this module). The harness pipes its statusline
|
|
14
|
+
JSON payload on stdin; the renderer consumes only ``workspace.project_dir``
|
|
15
|
+
to locate the project-local plans tree, and ignores the session-context
|
|
16
|
+
fields (model / cost / duration) that the harness surfaces natively.
|
|
17
|
+
|
|
18
|
+
Output shape — single line on stdout:
|
|
19
|
+
|
|
20
|
+
[<phase-pointer> | <sprint-goal-truncated> | <inquiry-count> inquir(y|ies)]
|
|
21
|
+
|
|
22
|
+
Separators are ASCII pipes so the statusline renders identically across
|
|
23
|
+
PowerShell, bash, and IDE harness terminals regardless of code-page.
|
|
24
|
+
|
|
25
|
+
Plans-root resolution (harness-agnostic, no harness path hardcoded):
|
|
26
|
+
|
|
27
|
+
1. ``$LLM_PLAN_SUITES_DIR`` when set — the operator override.
|
|
28
|
+
2. ``<workspace.project_dir>/.apothem/plans/`` from the stdin payload — the
|
|
29
|
+
canonical project-local plans tree per the plans-locality discipline,
|
|
30
|
+
falling back to the legacy ``<workspace.project_dir>/.plans/`` when the
|
|
31
|
+
canonical tree is absent (dual-read compatibility window).
|
|
32
|
+
3. ``<cwd>/.apothem/plans/`` when no payload is supplied — the interactive
|
|
33
|
+
fallback, with the same legacy ``<cwd>/.plans/`` fallback.
|
|
34
|
+
|
|
35
|
+
Degradation modes:
|
|
36
|
+
|
|
37
|
+
* No plan suite under the resolved plans root → ``[no active suite]``.
|
|
38
|
+
* Suite present but PROGRESS.md unparseable → goal / pointer segments omitted.
|
|
39
|
+
* Sprint Goal absent in active phase's PHASE.md → goal segment omitted.
|
|
40
|
+
|
|
41
|
+
The renderer never raises to stdout. Any unexpected exception is caught
|
|
42
|
+
at the outermost boundary and a degraded one-line marker is emitted so
|
|
43
|
+
the harness's statusline rendering never breaks.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
from __future__ import annotations
|
|
47
|
+
|
|
48
|
+
import json
|
|
49
|
+
import os
|
|
50
|
+
import re
|
|
51
|
+
import sys
|
|
52
|
+
from dataclasses import dataclass
|
|
53
|
+
from pathlib import Path
|
|
54
|
+
from typing import Final
|
|
55
|
+
|
|
56
|
+
from apothem.lib.data_home import plans_root
|
|
57
|
+
|
|
58
|
+
# Cap on the rendered sprint-goal substring so the statusline stays
|
|
59
|
+
# bounded across narrow terminal widths. PHASE.md Sprint Goal sentences
|
|
60
|
+
# regularly exceed 200 characters; the truncation preserves enough
|
|
61
|
+
# context for the operator to recognize the goal without dominating the
|
|
62
|
+
# statusline.
|
|
63
|
+
_SPRINT_GOAL_CHARLIMIT: Final[int] = 80
|
|
64
|
+
|
|
65
|
+
# Cap on the active-phase pointer substring. Phase headings include
|
|
66
|
+
# zero-padded numbers and kebab-case topics; 60 characters is the
|
|
67
|
+
# observed upper bound across active plan suites without truncation.
|
|
68
|
+
_PHASE_POINTER_CHARLIMIT: Final[int] = 60
|
|
69
|
+
|
|
70
|
+
# Environment override for the plans root. When set, it wins over the
|
|
71
|
+
# stdin payload's project-local resolution — the operator escape hatch.
|
|
72
|
+
_PLANS_DIR_ENV: Final[str] = "LLM_PLAN_SUITES_DIR"
|
|
73
|
+
|
|
74
|
+
_ACTIVE_PHASE_FIELD = re.compile(
|
|
75
|
+
r"^-\s+\*\*Active phase:\*\*\s+(.+?)(?=\s+—|\s+-\s|$)",
|
|
76
|
+
re.MULTILINE,
|
|
77
|
+
)
|
|
78
|
+
_PHASE_IN_PROGRESS_FIELD = re.compile(
|
|
79
|
+
r"^-\s+\*\*Phase in progress:\*\*\s+(.+?)(?=\s+—|\s+-\s|$)",
|
|
80
|
+
re.MULTILINE,
|
|
81
|
+
)
|
|
82
|
+
_SPRINT_GOAL_LINE = re.compile(
|
|
83
|
+
r"^>\s+\*\*Sprint Goal\.\*\*\s+(.+)$",
|
|
84
|
+
re.MULTILINE,
|
|
85
|
+
)
|
|
86
|
+
# Match concrete placeholders only. Payload contains no nested brackets
|
|
87
|
+
# AND no ellipsis (Unicode `…` or ASCII `..`+). The negative lookaheads
|
|
88
|
+
# exclude template citations such as `<USER-CONFIRM:id=<id>>`,
|
|
89
|
+
# `<USER-CONFIRM:…>`, and `<USER-CONFIRM:kind=...; ...>` that appear in
|
|
90
|
+
# design-source and rule prose discussing the placeholder syntax itself.
|
|
91
|
+
_USER_CONFIRM_PLACEHOLDER = re.compile(r"<USER-CONFIRM:(?![^>]*(?:\.\.|…))[^<>]+>")
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
@dataclass(frozen=True)
|
|
95
|
+
class StatuslineParts:
|
|
96
|
+
"""The three values rendered on the statusline.
|
|
97
|
+
|
|
98
|
+
Attributes:
|
|
99
|
+
phase_pointer: Active phase / sub-phase identifier, or ``None``
|
|
100
|
+
when absent.
|
|
101
|
+
sprint_goal: The active phase's Sprint Goal sentence,
|
|
102
|
+
truncated to ``_SPRINT_GOAL_CHARLIMIT``, or ``None`` when
|
|
103
|
+
absent.
|
|
104
|
+
inquiry_count: Total `<USER-CONFIRM:…>` placeholders detected
|
|
105
|
+
across the active suite's ecosystem-emitted artifacts.
|
|
106
|
+
"""
|
|
107
|
+
|
|
108
|
+
phase_pointer: str | None
|
|
109
|
+
sprint_goal: str | None
|
|
110
|
+
inquiry_count: int
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def _most_recent_suite(plans_dir: Path) -> Path | None:
|
|
114
|
+
"""Return the most-recently-modified suite folder under ``plans_dir``."""
|
|
115
|
+
|
|
116
|
+
if not plans_dir.is_dir():
|
|
117
|
+
return None
|
|
118
|
+
candidates = [p for p in plans_dir.iterdir() if p.is_dir()]
|
|
119
|
+
if not candidates:
|
|
120
|
+
return None
|
|
121
|
+
return max(candidates, key=lambda p: p.stat().st_mtime)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def _extract_phase_pointer(progress_text: str) -> str | None:
|
|
125
|
+
"""Extract the active-phase pointer from PROGRESS.md text."""
|
|
126
|
+
|
|
127
|
+
for pattern in (_ACTIVE_PHASE_FIELD, _PHASE_IN_PROGRESS_FIELD):
|
|
128
|
+
match = pattern.search(progress_text)
|
|
129
|
+
if match:
|
|
130
|
+
pointer = match.group(1).strip()
|
|
131
|
+
if len(pointer) > _PHASE_POINTER_CHARLIMIT:
|
|
132
|
+
pointer = pointer[: _PHASE_POINTER_CHARLIMIT - 1] + "…"
|
|
133
|
+
return pointer
|
|
134
|
+
return None
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def _extract_sprint_goal(suite_root: Path, phase_pointer: str | None) -> str | None:
|
|
138
|
+
"""Read the active phase's PHASE.md and return its Sprint Goal."""
|
|
139
|
+
|
|
140
|
+
if phase_pointer is None:
|
|
141
|
+
return None
|
|
142
|
+
phase_id_match = re.match(r"Phase\s+(\d+[A-Z]?)", phase_pointer)
|
|
143
|
+
if not phase_id_match:
|
|
144
|
+
return None
|
|
145
|
+
phase_id = phase_id_match.group(1).lower()
|
|
146
|
+
phases_dir = suite_root / "phases"
|
|
147
|
+
if not phases_dir.is_dir():
|
|
148
|
+
return None
|
|
149
|
+
matches = [
|
|
150
|
+
p
|
|
151
|
+
for p in phases_dir.iterdir()
|
|
152
|
+
if p.is_dir() and p.name.startswith(f"{phase_id}-")
|
|
153
|
+
]
|
|
154
|
+
if not matches:
|
|
155
|
+
return None
|
|
156
|
+
phase_md = matches[0] / "PHASE.md"
|
|
157
|
+
if not phase_md.is_file():
|
|
158
|
+
return None
|
|
159
|
+
try:
|
|
160
|
+
text = phase_md.read_text(encoding="utf-8")
|
|
161
|
+
except OSError:
|
|
162
|
+
return None
|
|
163
|
+
match = _SPRINT_GOAL_LINE.search(text)
|
|
164
|
+
if not match:
|
|
165
|
+
return None
|
|
166
|
+
goal = match.group(1).strip()
|
|
167
|
+
if len(goal) > _SPRINT_GOAL_CHARLIMIT:
|
|
168
|
+
goal = goal[: _SPRINT_GOAL_CHARLIMIT - 1] + "…"
|
|
169
|
+
return goal
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def _count_unresolved_inquiries(suite_root: Path) -> int:
|
|
173
|
+
"""Return the count of `<USER-CONFIRM:…>` placeholders in the suite."""
|
|
174
|
+
|
|
175
|
+
total = 0
|
|
176
|
+
for path in suite_root.rglob("*.md"):
|
|
177
|
+
try:
|
|
178
|
+
text = path.read_text(encoding="utf-8")
|
|
179
|
+
except OSError:
|
|
180
|
+
continue
|
|
181
|
+
total += len(_USER_CONFIRM_PLACEHOLDER.findall(text))
|
|
182
|
+
return total
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def _parse_payload(raw: str) -> dict[str, object]:
|
|
186
|
+
"""Parse the harness statusline JSON payload, tolerating malformed input."""
|
|
187
|
+
|
|
188
|
+
if not raw.strip():
|
|
189
|
+
return {}
|
|
190
|
+
try:
|
|
191
|
+
obj = json.loads(raw)
|
|
192
|
+
except (json.JSONDecodeError, ValueError):
|
|
193
|
+
return {}
|
|
194
|
+
return obj if isinstance(obj, dict) else {}
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def _read_payload() -> dict[str, object]:
|
|
198
|
+
"""Read and parse the harness statusline JSON payload from stdin.
|
|
199
|
+
|
|
200
|
+
Returns an empty mapping when stdin is a terminal (interactive run with
|
|
201
|
+
no piped payload) or when the read / parse fails. The renderer then
|
|
202
|
+
falls back to the working-directory plans tree.
|
|
203
|
+
"""
|
|
204
|
+
|
|
205
|
+
if sys.stdin.isatty():
|
|
206
|
+
return {}
|
|
207
|
+
try:
|
|
208
|
+
raw = sys.stdin.read()
|
|
209
|
+
except (OSError, ValueError):
|
|
210
|
+
return {}
|
|
211
|
+
return _parse_payload(raw)
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
def _payload_project_dir(payload: dict[str, object]) -> str | None:
|
|
215
|
+
"""Extract ``workspace.project_dir`` from the harness payload, or None."""
|
|
216
|
+
|
|
217
|
+
workspace = payload.get("workspace")
|
|
218
|
+
if isinstance(workspace, dict):
|
|
219
|
+
project_dir = workspace.get("project_dir")
|
|
220
|
+
if isinstance(project_dir, str) and project_dir:
|
|
221
|
+
return project_dir
|
|
222
|
+
return None
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
def _resolve_plans_dir(payload: dict[str, object]) -> Path:
|
|
226
|
+
"""Resolve the plans root, harness-agnostic and project-local.
|
|
227
|
+
|
|
228
|
+
Resolution order: the ``LLM_PLAN_SUITES_DIR`` operator override, then the
|
|
229
|
+
payload's ``workspace.project_dir`` resolved to the canonical
|
|
230
|
+
``.apothem/plans`` tree, then the current working directory resolved the
|
|
231
|
+
same way as the interactive fallback. The canonical project-local plans
|
|
232
|
+
home is ``<project-root>/.apothem/plans``; an operator with a legacy
|
|
233
|
+
``.plans`` tree upgrades it via ``apothem migrate-workspace``. No harness
|
|
234
|
+
config path is ever hardcoded.
|
|
235
|
+
"""
|
|
236
|
+
|
|
237
|
+
override = os.environ.get(_PLANS_DIR_ENV)
|
|
238
|
+
if override:
|
|
239
|
+
return Path(override)
|
|
240
|
+
project_dir = _payload_project_dir(payload)
|
|
241
|
+
base = Path(project_dir) if project_dir else Path.cwd()
|
|
242
|
+
return plans_root(base=base)
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
def gather(plans_dir: Path) -> StatuslineParts | None:
|
|
246
|
+
"""Walk the plans tree at ``plans_dir`` and assemble the statusline values."""
|
|
247
|
+
|
|
248
|
+
suite = _most_recent_suite(plans_dir)
|
|
249
|
+
if suite is None:
|
|
250
|
+
return None
|
|
251
|
+
progress_md = suite / "PROGRESS.md"
|
|
252
|
+
if not progress_md.is_file():
|
|
253
|
+
return StatuslineParts(phase_pointer=None, sprint_goal=None, inquiry_count=0)
|
|
254
|
+
try:
|
|
255
|
+
progress_text = progress_md.read_text(encoding="utf-8")
|
|
256
|
+
except OSError:
|
|
257
|
+
return StatuslineParts(phase_pointer=None, sprint_goal=None, inquiry_count=0)
|
|
258
|
+
phase_pointer = _extract_phase_pointer(progress_text)
|
|
259
|
+
sprint_goal = _extract_sprint_goal(suite, phase_pointer)
|
|
260
|
+
inquiry_count = _count_unresolved_inquiries(suite)
|
|
261
|
+
return StatuslineParts(
|
|
262
|
+
phase_pointer=phase_pointer,
|
|
263
|
+
sprint_goal=sprint_goal,
|
|
264
|
+
inquiry_count=inquiry_count,
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
# Transliterations applied during ASCII normalization. Each mapping
|
|
269
|
+
# preserves the surrounding sentence's intent while staying within the
|
|
270
|
+
# 7-bit ASCII intersection so the statusline renders the same bytes on
|
|
271
|
+
# Windows console, POSIX terminals, and IDE harnesses. Keys use
|
|
272
|
+
# Unicode escape sequences so the source itself is ASCII-clean.
|
|
273
|
+
_ASCII_TRANSLIT: Final[dict[str, str]] = {
|
|
274
|
+
chr(0x00A7): "S", # U+00A7 SECTION SIGN
|
|
275
|
+
chr(0x2014): "-", # U+2014 EM DASH
|
|
276
|
+
chr(0x2013): "-", # U+2013 EN DASH
|
|
277
|
+
chr(0x00B7): "*", # U+00B7 MIDDLE DOT
|
|
278
|
+
chr(0x2026): "...", # U+2026 HORIZONTAL ELLIPSIS
|
|
279
|
+
chr(0x2018): "'", # U+2018 LEFT SINGLE QUOTATION MARK
|
|
280
|
+
chr(0x2019): "'", # U+2019 RIGHT SINGLE QUOTATION MARK
|
|
281
|
+
chr(0x201C): '"', # U+201C LEFT DOUBLE QUOTATION MARK
|
|
282
|
+
chr(0x201D): '"', # U+201D RIGHT DOUBLE QUOTATION MARK
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
def _ascii_safe(text: str) -> str:
|
|
287
|
+
"""Return an ASCII-only rendering of ``text``.
|
|
288
|
+
|
|
289
|
+
Common typographic characters get transliterated; any remaining
|
|
290
|
+
non-ASCII character is dropped. The output is safe for any
|
|
291
|
+
terminal code-page without depending on stdout reconfiguration.
|
|
292
|
+
"""
|
|
293
|
+
|
|
294
|
+
for src, dst in _ASCII_TRANSLIT.items():
|
|
295
|
+
text = text.replace(src, dst)
|
|
296
|
+
return text.encode("ascii", errors="ignore").decode("ascii")
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
def render(parts: StatuslineParts | None) -> str:
|
|
300
|
+
"""Compose the single-line statusline string."""
|
|
301
|
+
|
|
302
|
+
if parts is None:
|
|
303
|
+
return "[no active suite]"
|
|
304
|
+
segments: list[str] = []
|
|
305
|
+
if parts.phase_pointer:
|
|
306
|
+
segments.append(_ascii_safe(parts.phase_pointer))
|
|
307
|
+
if parts.sprint_goal:
|
|
308
|
+
segments.append(_ascii_safe(parts.sprint_goal))
|
|
309
|
+
inquiry_word = "inquiry" if parts.inquiry_count == 1 else "inquiries"
|
|
310
|
+
segments.append(f"{parts.inquiry_count} {inquiry_word}")
|
|
311
|
+
if not segments:
|
|
312
|
+
return "[no readable state]"
|
|
313
|
+
return "[" + " | ".join(segments) + "]"
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
def main() -> int:
|
|
317
|
+
"""Print the rendered statusline to stdout. Always exits 0."""
|
|
318
|
+
|
|
319
|
+
try:
|
|
320
|
+
payload = _read_payload()
|
|
321
|
+
plans_dir = _resolve_plans_dir(payload)
|
|
322
|
+
parts = gather(plans_dir)
|
|
323
|
+
sys.stdout.write(render(parts) + "\n")
|
|
324
|
+
except Exception as exc:
|
|
325
|
+
# Outermost boundary. The harness reads stdout as the rendered
|
|
326
|
+
# statusline; never leak a traceback or non-zero exit. Emit a
|
|
327
|
+
# degraded marker naming the failure class so the operator can
|
|
328
|
+
# diagnose without losing the statusline surface.
|
|
329
|
+
sys.stdout.write(f"[statusline error: {type(exc).__name__}]\n")
|
|
330
|
+
return 0
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
if __name__ == "__main__":
|
|
334
|
+
sys.exit(main())
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
<!-- SPDX-License-Identifier: MIT -->
|
|
2
|
+
|
|
3
|
+
# Statusline — Working Definition
|
|
4
|
+
|
|
5
|
+
> **Role.** The single conformity operating-posture statusline, emitted at the top of every harness session. Minimal, glanceable, cross-platform; surfaces the active plan suite's operating posture and documents the input it consumes and its degradation modes.
|
|
6
|
+
|
|
7
|
+
The renderer is [`render.py`](./render.py); the harness wires it in through the [`conformity.json`](./conformity.json) `type: command` snippet.
|
|
8
|
+
|
|
9
|
+
## Input Contract — JSON on stdin
|
|
10
|
+
|
|
11
|
+
The harness pipes a JSON object the renderer reads from stdin. The renderer consumes **one** field; every other field the harness reports (model, cost, duration, version) is ignored, because those session-context values are the harness's own native statusline territory.
|
|
12
|
+
|
|
13
|
+
| Field | Type | Description |
|
|
14
|
+
|-------|------|-------------|
|
|
15
|
+
| `workspace.project_dir` | string | Absolute path to the project root. Joined with `.apothem/plans/` (legacy `.plans/` as a fallback) to locate the project-local plans tree. |
|
|
16
|
+
|
|
17
|
+
The plans root resolves in this order:
|
|
18
|
+
|
|
19
|
+
1. `LLM_PLAN_SUITES_DIR` environment variable, when set — the operator override.
|
|
20
|
+
2. `<workspace.project_dir>/.apothem/plans/` from the stdin payload — the canonical project-local tree per the plans-locality discipline, with a legacy `<workspace.project_dir>/.plans/` fallback.
|
|
21
|
+
3. `<cwd>/.apothem/plans/` — the interactive fallback when no payload is supplied (the legacy `<cwd>/.plans/` is honored too).
|
|
22
|
+
|
|
23
|
+
No harness configuration path is ever hardcoded; the renderer privileges no one harness. An absent payload or absent field degrades to the working-directory fallback, never to a harness-specific default.
|
|
24
|
+
|
|
25
|
+
## Output Contract — One Line on stdout
|
|
26
|
+
|
|
27
|
+
The renderer emits exactly one line to stdout, composed from the most-recently-touched plan suite under the resolved plans root:
|
|
28
|
+
|
|
29
|
+
```text
|
|
30
|
+
[<phase-pointer> | <sprint-goal> | <N> inquir(y|ies)]
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
1. The active phase / sub-phase pointer, read from the suite's `PROGRESS.md`.
|
|
34
|
+
2. The active phase's Sprint Goal sentence, read from its `PHASE.md` (truncated to a bounded width).
|
|
35
|
+
3. The count of unresolved `<USER-CONFIRM:…>` placeholders across the suite (`inquiry` / `inquiries` pluralized).
|
|
36
|
+
|
|
37
|
+
Segments that are absent are omitted; the inquiry count is always present. The rendering is plain text — no ANSI color codes, no decorative ASCII, no emojis — and is normalized to 7-bit ASCII so it renders identically across PowerShell, bash, and IDE harness terminals regardless of code-page. Glanceable, cross-platform, screen-reader-friendly.
|
|
38
|
+
|
|
39
|
+
### Example Render
|
|
40
|
+
|
|
41
|
+
```text
|
|
42
|
+
[03A-discovery | Ship the signed release. | 2 inquiries]
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Degradation Modes
|
|
46
|
+
|
|
47
|
+
- No plan suite under the resolved plans root → `[no active suite]`.
|
|
48
|
+
- Suite present but `PROGRESS.md` unparseable → the phase / goal segments are omitted; the inquiry count still renders.
|
|
49
|
+
- Sprint Goal absent in the active phase's `PHASE.md` → the goal segment is omitted.
|
|
50
|
+
- Any unexpected internal error → a single degraded marker `[statusline error: <ErrorClass>]`; the renderer never raises to stdout and never exits non-zero, so the harness statusline never breaks.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
<!-- SPDX-License-Identifier: MIT -->
|
|
2
|
+
|
|
3
|
+
# Templates
|
|
4
|
+
|
|
5
|
+
Plan-suite and ledger templates — the canonical starting shapes the planning pipeline and ledger-keeping disciplines materialize into concrete artifacts. A template is read, copied, and filled; it is never the live artifact itself.
|
|
6
|
+
|
|
7
|
+
## Plan-suite indexing & traceability
|
|
8
|
+
|
|
9
|
+
| Template | Purpose |
|
|
10
|
+
|----------|---------|
|
|
11
|
+
| [`master-index-template.md`](master-index-template.md) | Suite-root index for **medium+ tier** plan suites (≥50 phases or ≥100 spec sections / constraints per `../rules/canonical-layout.md` §7). The queryable surface a fresh session or `/plan-review` cycle reads to navigate the suite without scanning every PHASE.md linearly. |
|
|
12
|
+
| [`trace-matrix-template.md`](trace-matrix-template.md) | Bidirectional traceability matrix mapping every spec requirement to the phase(s) that satisfy it and back. Closes the all-tier drift-prevention invariant; at small tier a narrative trace table substitutes. |
|
|
13
|
+
|
|
14
|
+
## Per-folder documentation
|
|
15
|
+
|
|
16
|
+
| Template | Purpose |
|
|
17
|
+
|----------|---------|
|
|
18
|
+
| [`agents-md-template.md`](agents-md-template.md) | Folder-parameterizable starting shape for a per-folder `AGENTS.md` companion per `../rules/agents-md-convention.md`. Copied into a meaningful folder beside its `README.md`; orients an agent to the folder's purpose, artifacts, conventions, and safe-operation guidance. |
|
|
19
|
+
|
|
20
|
+
## `/plan-spec` discipline ledgers
|
|
21
|
+
|
|
22
|
+
Deliverables of the four operational disciplines (D1–D4) plus the Phase-6 Question-Resolution Sweep audit (D5, from the separate Phase-6 ten-discipline namespace) inside [`../commands/plan-spec.md`](../commands/plan-spec.md). Each is the audit surface proving its discipline executed in full; a skeletal or sham ledger fires a gate and blocks emission.
|
|
23
|
+
|
|
24
|
+
| Template | Discipline | Records |
|
|
25
|
+
|----------|------------|---------|
|
|
26
|
+
| [`consideration-log.md`](consideration-log.md) | D1 Meticulous Consideration | Every consideration item surfaced during the prose-to-spec transformation — directives, intentions, rationales, adjacent-domain scans, second-order consequences, contradictions. |
|
|
27
|
+
| [`potency-map.md`](potency-map.md) | D2 EXTREME Potency | Every preserved prose element paired with its potent operational form. |
|
|
28
|
+
| [`preservation-audit.md`](preservation-audit.md) | D3 STRICT Preservation | Per-clause verdicts at all three preservation levels — syntactic, semantic, tonal. |
|
|
29
|
+
| [`expertise-gap-log.md`](expertise-gap-log.md) | D4 Extensive Expertise | Which of the seven axs of breadth applied per transformation, which were not-applicable-with-rationale, which surfaced an expertise-envelope limit. |
|
|
30
|
+
| [`question-resolution-audit.md`](question-resolution-audit.md) | D5 Question-Resolution Audit | Every structured-inquiry invocation across the six mandatory gate points G0–G5 — proof no question was suppressed and no default was silent. |
|
|
31
|
+
|
|
32
|
+
## Conventions
|
|
33
|
+
|
|
34
|
+
- Markdown templates carry the canonical single-line SPDX license header and an explanatory preamble naming the template's consumer and the gate it feeds.
|
|
35
|
+
- A template is copied and filled into a concrete artifact at the canonical layout — never edited as the live artifact in place.
|
|
36
|
+
- Tier thresholds and traceability discipline are specified in `../rules/canonical-layout.md`.
|
|
37
|
+
|
|
38
|
+
## Operating in this folder
|
|
39
|
+
|
|
40
|
+
- **A template is never the live artifact.** It is copied and filled into a concrete artifact at the canonical layout per `../rules/canonical-layout.md`; do not edit a template in place as though it were the materialized output, and never delete the template's placeholders or guidance comments in the source-of-truth file here.
|
|
41
|
+
- **Do not fork the thresholds.** Tier thresholds (which plan-suite tier materializes which template) and traceability discipline are specified in `../rules/canonical-layout.md` — do not restate or fork those thresholds here.
|
|
42
|
+
- **Adding a template:** author the new shape with its SPDX header and consumer/gate preamble, then register it in the matching class table above. **Modifying a template** updates every consumer's expectations in the same change-set.
|
|
43
|
+
- Validate a change with `python -m apothem.conformity.gate --all .`, `python -m pytest`, and `python -m ruff check`.
|