@event4u/agent-config 3.3.0 → 4.2.0
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/.agent-src/README.md +2 -2
- package/.agent-src/commands/agent-handoff.md +31 -2
- package/.agent-src/commands/agent-status.md +5 -5
- package/.agent-src/commands/agents/audit.md +8 -8
- package/.agent-src/commands/agents/init.md +25 -1
- package/.agent-src/commands/agents/optimize.md +3 -3
- package/.agent-src/commands/agents/user.md +1 -1
- package/.agent-src/commands/agents.md +1 -1
- package/.agent-src/commands/analyze-reference-repo.md +1 -1
- package/.agent-src/commands/check-current-md.md +8 -8
- package/.agent-src/commands/{compress.md → condense.md} +55 -55
- package/.agent-src/commands/context/create.md +7 -4
- package/.agent-src/commands/context/refactor.md +3 -1
- package/.agent-src/commands/feature/dev.md +1 -1
- package/.agent-src/commands/feature/explore.md +1 -1
- package/.agent-src/commands/feature/plan.md +10 -8
- package/.agent-src/commands/feature/refactor.md +3 -1
- package/.agent-src/commands/feature/roadmap.md +7 -4
- package/.agent-src/commands/fix/portability.md +3 -3
- package/.agent-src/commands/fix/refs.md +4 -4
- package/.agent-src/commands/ghostwriter.md +2 -2
- package/.agent-src/commands/memory/learn-low-impact.md +3 -3
- package/.agent-src/commands/module/explore.md +34 -8
- package/.agent-src/commands/optimize/agents-dir.md +9 -7
- package/.agent-src/commands/optimize/augmentignore.md +2 -2
- package/.agent-src/commands/optimize/skills.md +9 -9
- package/.agent-src/commands/post-as.md +1 -1
- package/.agent-src/commands/project-analyze.md +2 -2
- package/.agent-src/commands/project-health.md +3 -2
- package/.agent-src/commands/research/deep.md +1 -1
- package/.agent-src/commands/research/report.md +1 -1
- package/.agent-src/commands/research.md +1 -1
- package/.agent-src/commands/roadmap/ai-council.md +1 -1
- package/.agent-src/commands/roadmap/create.md +9 -4
- package/.agent-src/commands/rule-compliance-audit.md +1 -1
- package/.agent-src/commands/upstream-contribute.md +14 -14
- package/.agent-src/commands/video/from-script.md +1 -1
- package/.agent-src/commands/video/scene.md +1 -1
- package/.agent-src/commands/video/stitch.md +1 -1
- package/.agent-src/commands/video/storyboard.md +1 -1
- package/.agent-src/commands/video.md +1 -1
- package/.agent-src/contexts/augment-infrastructure.md +1 -1
- package/.agent-src/contexts/authority/commit-mechanics.md +15 -0
- package/.agent-src/contexts/authority/kernel-rule-edits.md +3 -3
- package/.agent-src/contexts/authority/scope-mechanics.md +1 -1
- package/.agent-src/contexts/communication/rules-auto/augment-source-of-truth-mechanics.md +28 -28
- package/.agent-src/contexts/communication/rules-auto/skill-quality-mechanics.md +4 -4
- package/.agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +2 -2
- package/.agent-src/contexts/contracts/artifact-engagement-flow.md +6 -6
- package/.agent-src/contexts/contracts/command-suggestion-flow.md +3 -3
- package/.agent-src/contexts/contracts/emergency-triage-block.md +4 -4
- package/.agent-src/contexts/contracts/frugality-charter.md +3 -3
- package/.agent-src/contexts/documentation-hierarchy.md +14 -7
- package/.agent-src/contexts/execution/autonomy-examples.md +1 -1
- package/.agent-src/contexts/execution/cheap-question-mechanics.md +39 -2
- package/.agent-src/contexts/execution/roadmap-process-loop.md +28 -5
- package/.agent-src/contexts/override-system.md +5 -5
- package/.agent-src/ghostwriter/fictional-fixture-v1.md +1 -1
- package/.agent-src/personas/advisors/first-principles.md +1 -1
- package/.agent-src/personas/hollywood-director.md +1 -1
- package/.agent-src/rules/architecture.md +5 -1
- package/.agent-src/rules/augment-edit-discipline.md +5 -5
- package/.agent-src/rules/augment-source-of-truth.md +15 -15
- package/.agent-src/rules/commit-conventions.md +1 -1
- package/.agent-src/rules/commit-policy.md +10 -0
- package/.agent-src/rules/domain-adoption-policy.md +3 -3
- package/.agent-src/rules/fast-path-marker-visibility.md +3 -3
- package/.agent-src/rules/finance-safety-floor.md +1 -1
- package/.agent-src/rules/framework-neutrality-in-generic-skills.md +8 -8
- package/.agent-src/rules/git-history-discipline.md +1 -1
- package/.agent-src/rules/improve-before-implement.md +2 -2
- package/.agent-src/rules/language-and-tone.md +2 -2
- package/.agent-src/rules/media-governance-routing.md +5 -5
- package/.agent-src/rules/no-attribution-footers.md +1 -0
- package/.agent-src/rules/no-cheap-questions.md +3 -0
- package/.agent-src/rules/no-decorative-emojis-in-git-surfaces.md +111 -0
- package/.agent-src/rules/no-pr-progress-comments.md +118 -0
- package/.agent-src/rules/no-roadmap-references.md +3 -3
- package/.agent-src/rules/non-destructive-by-default.md +1 -1
- package/.agent-src/rules/persona-governance.md +3 -3
- package/.agent-src/rules/preservation-guard.md +15 -15
- package/.agent-src/rules/roadmap-ci-steps-policy.md +7 -3
- package/.agent-src/rules/rule-type-governance.md +1 -1
- package/.agent-src/rules/skill-quality.md +1 -1
- package/.agent-src/rules/{caveman-speak.md → telegraph-speak.md} +15 -15
- package/.agent-src/rules/token-optimizer-maintenance.md +6 -6
- package/.agent-src/skills/agent-docs-writing/SKILL.md +17 -11
- package/.agent-src/skills/agents-md-thin-root/SKILL.md +9 -9
- package/.agent-src/skills/check-refs/SKILL.md +2 -2
- package/.agent-src/skills/code-refactoring/SKILL.md +2 -2
- package/.agent-src/skills/command-writing/SKILL.md +19 -19
- package/.agent-src/skills/comp-banding/SKILL.md +1 -1
- package/.agent-src/skills/condense-memory/SKILL.md +131 -0
- package/.agent-src/skills/context-authoring/SKILL.md +2 -2
- package/.agent-src/skills/context-document/SKILL.md +5 -3
- package/.agent-src/skills/copilot-agents-optimization/SKILL.md +3 -3
- package/.agent-src/skills/description-assist/SKILL.md +2 -2
- package/.agent-src/skills/git-workflow/SKILL.md +1 -1
- package/.agent-src/skills/guideline-writing/SKILL.md +5 -5
- package/.agent-src/skills/learning-to-rule-or-skill/SKILL.md +4 -4
- package/.agent-src/skills/lint-skills/SKILL.md +3 -3
- package/.agent-src/skills/md-language-check/SKILL.md +2 -2
- package/.agent-src/skills/module-detect-on-the-fly/SKILL.md +138 -0
- package/.agent-src/skills/module-management/SKILL.md +166 -94
- package/.agent-src/skills/override-management/SKILL.md +1 -1
- package/.agent-src/skills/persona-writing/SKILL.md +5 -5
- package/.agent-src/skills/positioning-strategy/SKILL.md +1 -1
- package/.agent-src/skills/project-docs/SKILL.md +6 -4
- package/.agent-src/skills/readme-reviewer/SKILL.md +2 -2
- package/.agent-src/skills/roadmap-management/SKILL.md +13 -1
- package/.agent-src/skills/roadmap-writing/SKILL.md +4 -2
- package/.agent-src/skills/rule-refactor/SKILL.md +5 -5
- package/.agent-src/skills/rule-writing/SKILL.md +18 -18
- package/.agent-src/skills/script-writing/SKILL.md +1 -1
- package/.agent-src/skills/skill-improvement-pipeline/SKILL.md +6 -6
- package/.agent-src/skills/skill-management/SKILL.md +21 -21
- package/.agent-src/skills/skill-reviewer/SKILL.md +2 -2
- package/.agent-src/skills/skill-writing/SKILL.md +8 -8
- package/.agent-src/skills/skill-writing/evals/triggers.json +1 -1
- package/.agent-src/skills/token-optimizer/SKILL.md +4 -4
- package/.agent-src/skills/unit-economics-modeling/SKILL.md +1 -1
- package/.agent-src/skills/upstream-contribute/SKILL.md +17 -17
- package/.agent-src/templates/AGENTS.md +1 -0
- package/.agent-src/templates/agent-settings.md +24 -13
- package/.agent-src/templates/agents/agent-project-settings.example.yml +61 -2
- package/.agent-src/templates/command.md +5 -5
- package/.agent-src/templates/contexts.md +1 -1
- package/.agent-src/templates/copilot-instructions.md +8 -8
- package/.agent-src/templates/features.md +1 -1
- package/.agent-src/templates/hooks/pre-commit-frontmatter +2 -2
- package/.agent-src/templates/hooks/pre-commit-roadmap-progress +3 -3
- package/.agent-src/templates/persona.md +2 -2
- package/.agent-src/templates/roadmaps.md +1 -1
- package/.agent-src/templates/rule.md +13 -13
- package/.agent-src/templates/scripts/memory_lookup.py +1 -1
- package/.agent-src/templates/scripts/memory_status.py +2 -2
- package/.agent-src/templates/scripts/work_engine/_lib/agent_settings.py +195 -1
- package/.agent-src/templates/scripts/work_engine/orchestration.py +1 -1
- package/.agent-src/templates/skill-archive-note.md +5 -5
- package/.agent-src/templates/skill.md +1 -1
- package/.claude-plugin/marketplace.json +4 -4
- package/AGENTS.md +16 -17
- package/CHANGELOG.md +216 -3
- package/CONTRIBUTING.md +31 -12
- package/README.md +21 -12
- package/config/agent-settings.template.yml +22 -2
- package/config/discovery/unassigned-artefacts.yml +24 -24
- package/config/profiles/full.ini +1 -1
- package/dist/cli/agent-config.js +52 -3
- package/dist/cli/agent-config.js.map +1 -1
- package/dist/cli/commands/uiServe.js +9 -0
- package/dist/cli/commands/uiServe.js.map +1 -1
- package/dist/cli/registry.js +2 -1
- package/dist/cli/registry.js.map +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +649 -606
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +4 -4
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +439 -437
- package/dist/discovery/trust-report.md +5 -5
- package/dist/discovery/workspaces.json +450 -448
- package/dist/install/atomic.js +92 -0
- package/dist/install/atomic.js.map +1 -0
- package/dist/install/conflict.js +196 -0
- package/dist/install/conflict.js.map +1 -0
- package/dist/install/detect.js +218 -0
- package/dist/install/detect.js.map +1 -0
- package/dist/install/paths.js +82 -0
- package/dist/install/paths.js.map +1 -0
- package/dist/install/plan.js +157 -0
- package/dist/install/plan.js.map +1 -0
- package/dist/install/txlog.js +140 -0
- package/dist/install/txlog.js.map +1 -0
- package/dist/install/types.js +19 -0
- package/dist/install/types.js.map +1 -0
- package/dist/install/wizard-plan.js +184 -0
- package/dist/install/wizard-plan.js.map +1 -0
- package/dist/mcp/registry-manifest.json +4 -4
- package/dist/router.json +67 -19
- package/dist/server/app.js +6 -0
- package/dist/server/app.js.map +1 -1
- package/dist/server/routes/install.js +358 -0
- package/dist/server/routes/install.js.map +1 -0
- package/dist/server/routes/wizard.js +468 -32
- package/dist/server/routes/wizard.js.map +1 -1
- package/dist/server/routes/workspace.js +396 -0
- package/dist/server/routes/workspace.js.map +1 -0
- package/dist/server/schemas/settings.js +5 -3
- package/dist/server/schemas/settings.js.map +1 -1
- package/dist/ui/assets/index-BDAhhpDV.js +40 -0
- package/dist/ui/assets/index-BDAhhpDV.js.map +1 -0
- package/dist/ui/assets/index-BXZILUxe.css +1 -0
- package/dist/ui/index.html +2 -2
- package/docs/MIGRATION.md +1 -1
- package/docs/adrs/cost/0001-hard-stop-hook.md +1 -1
- package/docs/adrs/router/0001-three-tier-routing.md +4 -4
- package/docs/adrs/schema/0001-json-schema-frontmatter.md +1 -1
- package/docs/adrs/smoke/0001-per-tier-smoke-scripts.md +4 -4
- package/docs/adrs/{caveman → telegraph}/0001-default-off-until-bench.md +9 -9
- package/docs/adrs/telegraph/README.md +9 -0
- package/docs/architecture/augment-projection.md +4 -4
- package/docs/architecture/claude-bundle.md +1 -1
- package/docs/architecture/current-onboard-baseline.md +3 -3
- package/docs/architecture/multi-tool-projection.md +10 -10
- package/docs/architecture/source-projection.md +27 -27
- package/docs/architecture.md +19 -15
- package/docs/archive/CHANGELOG-pre-2.11.0.md +2 -2
- package/docs/archive/CHANGELOG-pre-2.15.0.md +3 -3
- package/docs/archive/CHANGELOG-pre-2.16.0.md +1 -1
- package/docs/archive/CHANGELOG-pre-2.2.0.md +70 -70
- package/docs/archive/CHANGELOG-pre-2.20.0.md +2 -2
- package/docs/archive/CHANGELOG-pre-2.25.0.md +15 -15
- package/docs/archive/CHANGELOG-pre-3.0.0.md +4 -4
- package/docs/archive/CHANGELOG-pre-3.1.0.md +2 -2
- package/docs/archive/CHANGELOG-pre-3.2.0.md +3 -3
- package/docs/benchmark.md +65 -0
- package/docs/benchmarks.md +16 -16
- package/docs/catalog.md +17 -15
- package/docs/contracts/CHANGELOG-conventions.md +1 -1
- package/docs/contracts/STABILITY.md +2 -2
- package/docs/contracts/adoption-signal-floor.md +110 -0
- package/docs/contracts/adr-chat-history-split.md +4 -4
- package/docs/contracts/adr-command-suggestion.md +4 -4
- package/docs/contracts/adr-gtm-context-spine.md +1 -1
- package/docs/contracts/adr-implement-ticket-runtime.md +4 -4
- package/docs/contracts/adr-install-user-type-axis.md +1 -1
- package/docs/contracts/adr-layout.md +2 -2
- package/docs/contracts/adr-product-ui-track.md +10 -10
- package/docs/contracts/adr-user-types-axis.md +3 -3
- package/docs/contracts/adr-wing4-context-spine.md +1 -1
- package/docs/contracts/agent-memory-contract.md +3 -3
- package/docs/contracts/agents-md-tech-stack.md +2 -2
- package/docs/contracts/ai-council-config.md +2 -2
- package/docs/contracts/at-rest-encryption.md +4 -0
- package/docs/contracts/audit-log-v1.md +1 -1
- package/docs/contracts/benchmark-ab-contract.md +101 -0
- package/docs/contracts/benchmark-corpus-spec.md +1 -1
- package/docs/contracts/branch-protection-policy.md +98 -0
- package/docs/contracts/ci-cost-budget.md +106 -0
- package/docs/contracts/ci-green-floor.md +141 -0
- package/docs/contracts/command-clusters.md +6 -6
- package/docs/contracts/command-surface-tiers.md +2 -2
- package/docs/contracts/command-taxonomy.md +2 -2
- package/docs/contracts/{compression-default-kill-criterion.md → condensation-default-kill-criterion.md} +29 -29
- package/docs/contracts/config-presets.md +1 -1
- package/docs/contracts/context-paths.md +3 -3
- package/docs/contracts/context-spine.md +1 -1
- package/docs/contracts/cost-summary-schema.md +12 -12
- package/docs/contracts/cross-wing-handoff.md +4 -4
- package/docs/contracts/daily-workspace.md +4 -0
- package/docs/contracts/decision-trace-v1.md +2 -2
- package/docs/contracts/discovery-manifest.md +4 -4
- package/docs/contracts/explain-modes.md +4 -0
- package/docs/contracts/file-ownership-matrix.json +3493 -3318
- package/docs/contracts/file-ownership-matrix.md +3 -3
- package/docs/contracts/frontmatter-contract.md +4 -4
- package/docs/contracts/ghostwriter-schema.md +3 -3
- package/docs/contracts/gui-wizard.md +110 -97
- package/docs/contracts/harness-expectations.md +123 -0
- package/docs/contracts/host-agent-protocol.md +4 -0
- package/docs/contracts/implement-ticket-flow.md +9 -9
- package/docs/contracts/install-scopes.md +77 -0
- package/docs/contracts/iron-law-overrides.txt +1 -1
- package/docs/contracts/kernel-membership.md +26 -26
- package/docs/contracts/linear-ai-rules-inclusion.md +1 -1
- package/docs/contracts/linter-structural-model.md +2 -2
- package/docs/contracts/load-context-budget-model.md +4 -4
- package/docs/contracts/load-context-schema.md +13 -13
- package/docs/contracts/local-analytics.md +4 -0
- package/docs/contracts/local-knowledge-ingestion.md +1 -1
- package/docs/contracts/mcp-cloud-scope.md +2 -2
- package/docs/contracts/mcp-phase-1-scope.md +3 -3
- package/docs/contracts/measurement-baseline.md +5 -5
- package/docs/contracts/mental-models.md +30 -30
- package/docs/contracts/multi-tool-projection-fidelity.md +4 -4
- package/docs/contracts/namespace.md +4 -4
- package/docs/contracts/orchestration-dsl-v1.md +7 -7
- package/docs/contracts/package-self-orientation.md +12 -12
- package/docs/contracts/persona-schema.md +6 -6
- package/docs/contracts/pilot/language-and-tone.md +1 -1
- package/docs/contracts/plain-language-surface.md +117 -0
- package/docs/contracts/profile-system.md +3 -3
- package/docs/contracts/release-pr-gating.md +103 -0
- package/docs/contracts/role-experience.md +3 -3
- package/docs/contracts/rule-classification.md +13 -13
- package/docs/contracts/rule-interactions.md +4 -4
- package/docs/contracts/rule-interactions.yml +30 -30
- package/docs/contracts/rule-priority-hierarchy.md +13 -13
- package/docs/contracts/rule-router.md +2 -2
- package/docs/contracts/safety-model.md +1 -1
- package/docs/contracts/skill-distribution-channels.md +61 -0
- package/docs/contracts/skill-domains.md +2 -2
- package/docs/contracts/smoke-contracts.md +5 -5
- package/docs/contracts/telegraph-telemetry.md +83 -0
- package/docs/contracts/trust-and-safety.md +5 -5
- package/docs/contracts/ui-stack-extension.md +7 -7
- package/docs/contracts/ui-track-flow.md +9 -9
- package/docs/contracts/user-type-schema.md +4 -4
- package/docs/contracts/workflow-packs.md +4 -4
- package/docs/contracts/workspace-documents.md +4 -0
- package/docs/customization.md +28 -8
- package/docs/decisions/ADR-001-kernel-swap-deferred.md +6 -6
- package/docs/decisions/ADR-002-kernel-bucket-overrides.md +11 -11
- package/docs/decisions/ADR-003-flat-cluster-subs-and-colon-syntax.md +2 -2
- package/docs/decisions/ADR-004-rule-governance-pruning.md +4 -4
- package/docs/decisions/ADR-005-subagent-worktrees.md +7 -7
- package/docs/decisions/ADR-011-domain-pack-readiness.md +6 -6
- package/docs/decisions/ADR-013-discovery-frontmatter-contract.md +3 -3
- package/docs/decisions/ADR-015-discovery-manifest-contract.md +3 -3
- package/docs/decisions/ADR-017-monorepo-physical-layout.md +10 -10
- package/docs/decisions/ADR-018-trust-and-safety-layer.md +6 -6
- package/docs/decisions/ADR-019-router-json-dist-location.md +2 -2
- package/docs/decisions/ADR-020-global-only-consumer-scope.md +2 -2
- package/docs/decisions/ADR-021-deployment-shape.md +3 -3
- package/docs/decisions/ADR-022-daily-workspace-decomposition.md +1 -1
- package/docs/decisions/ADR-027-changelog-machine-vs-manual.md +2 -2
- package/docs/decisions/ADR-028-root-layout.md +7 -7
- package/docs/decisions/ADR-029-multi-workspace-deferred.md +2 -2
- package/docs/decisions/ADR-rule-kernel-and-router.md +5 -5
- package/docs/deploy/connector-setup.md +2 -2
- package/docs/deploy/policy-cookbook.md +2 -2
- package/docs/deploy/team-deployment-posture.md +20 -0
- package/docs/development.md +17 -17
- package/docs/distribution/registries.md +32 -0
- package/docs/distribution/registry-submissions.md +85 -0
- package/docs/distribution/telemetry-schema.md +1 -1
- package/docs/getting-started-by-role.md +45 -3
- package/docs/getting-started.md +2 -2
- package/docs/guidelines/agent-infra/5w2h-analysis.md +3 -3
- package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +1 -1
- package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +3 -3
- package/docs/guidelines/agent-infra/carve-out-predicates.md +3 -3
- package/docs/guidelines/agent-infra/critical-thinking.md +4 -4
- package/docs/guidelines/agent-infra/direct-answers-demos.md +1 -1
- package/docs/guidelines/agent-infra/first-principles.md +2 -2
- package/docs/guidelines/agent-infra/inversion-thinking.md +5 -5
- package/docs/guidelines/agent-infra/layered-settings.md +56 -2
- package/docs/guidelines/agent-infra/mental-models.md +3 -3
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +2 -2
- package/docs/guidelines/agent-infra/rule-type-governance.md +1 -1
- package/docs/guidelines/agent-infra/scqa-framework.md +5 -5
- package/docs/guidelines/agent-infra/self-improvement-pipeline.md +2 -2
- package/docs/guidelines/agent-infra/six-hats.md +3 -3
- package/docs/guidelines/agent-infra/skill-quality-checklist.md +5 -5
- package/docs/guidelines/agent-infra/systems-thinking.md +1 -1
- package/docs/guidelines/agent-infra/verify-before-complete-demos.md +1 -1
- package/docs/guidelines/augment-portability-patterns.md +4 -4
- package/docs/guidelines/cross-role-handoff.md +2 -2
- package/docs/guidelines/php/php-coding-patterns.md +1 -1
- package/docs/guidelines/prompt-templates.md +6 -6
- package/docs/maintainers/dev-mode.md +1 -1
- package/docs/mcp.md +1 -1
- package/docs/parity/bench.json +3 -3
- package/docs/parity/ruflo.md +2 -2
- package/docs/profiles.md +11 -11
- package/docs/quality.md +11 -11
- package/docs/safety.md +3 -3
- package/docs/setup/mcp-client-config.md +1 -1
- package/docs/setup/mcp-r2-bootstrap.md +1 -1
- package/docs/setup/mcp-server-docker.md +3 -3
- package/docs/setup/per-ide/windsurf.md +1 -1
- package/docs/skills-catalog.md +8 -7
- package/docs/troubleshooting.md +1 -1
- package/docs/walkthroughs/daily-workspace-a11y.md +87 -0
- package/llms.txt +7 -6
- package/package.json +1 -1
- package/scripts/__pycache__/validate_frontmatter.cpython-312.pyc +0 -0
- package/scripts/_archive/README.md +2 -2
- package/scripts/_archive/_backfill_skill_domains.py +3 -3
- package/scripts/_archive/_bootstrap_tier_frontmatter.py +3 -3
- package/scripts/_archive/_p43_bodies.py +10 -10
- package/scripts/_archive/{_p43_compress.py → _p43_condense.py} +5 -5
- package/scripts/_archive/_p4_migrate.py +7 -7
- package/scripts/_archive/_phase2_shim_helper.py +1 -1
- package/scripts/_archive/_pilot_council_question.py +5 -5
- package/scripts/_cli/explain_last/inputs.py +1 -1
- package/scripts/_lib/__pycache__/__init__.cpython-312.pyc +0 -0
- package/scripts/_lib/__pycache__/agent_src.cpython-312.pyc +0 -0
- package/scripts/_lib/agent_settings.py +195 -1
- package/scripts/_lib/agent_src.py +19 -19
- package/scripts/_lib/bench_ab_cache.py +162 -0
- package/scripts/_lib/bench_ab_scoring.py +209 -0
- package/scripts/_lib/{bench_caveman.py → bench_telegraph.py} +21 -21
- package/scripts/_lib/{bench_caveman_report.py → bench_telegraph_report.py} +21 -21
- package/scripts/_lib/claude_desktop_bundler.py +5 -5
- package/scripts/_lib/module_detection.py +223 -0
- package/scripts/_lib/scope_guard.sh +162 -0
- package/scripts/_phase4_bucket.py +3 -3
- package/scripts/_pilot_measure.py +4 -4
- package/scripts/_tmp_scan_framework_leakage.py +1 -1
- package/scripts/adoption_report.py +195 -0
- package/scripts/adoption_snapshot.py +219 -0
- package/scripts/adoption_status.py +166 -0
- package/scripts/ai-video/lib/parse-blueprint.sh +1 -1
- package/scripts/ai_council/advisors.py +5 -5
- package/scripts/ai_council/compile_corpus.py +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_budget_v2_audit.py +3 -3
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_context_layer_v1_review.py +2 -2
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_inject_quiet_flag.py +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_measure_v2.sh +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_measure_verbosity.sh +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_nondestructive_inline_audit.py +3 -3
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_per_task.sh +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_phase6_trigger_jaccard.py +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_phase_2a_budget_rebalance.py +6 -6
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_rebalancing_audit.py +1 -1
- package/scripts/ai_council/one_off_archive/2026-05/_one_off_tier_retrofit.py +6 -6
- package/scripts/annotate_discovery.py +13 -13
- package/scripts/apply_modules_config.py +290 -0
- package/scripts/audit_adr_coverage.py +2 -2
- package/scripts/audit_auto_rules.py +2 -2
- package/scripts/audit_cloud_compatibility.py +3 -3
- package/scripts/audit_command_surface.py +9 -9
- package/scripts/audit_likelihood.py +2 -2
- package/scripts/audit_user_type_axis.py +2 -2
- package/scripts/bench_ab_cache_dispatch.py +68 -0
- package/scripts/bench_ab_clone.py +170 -0
- package/scripts/bench_ab_diff.py +227 -0
- package/scripts/bench_ab_integrity.py +143 -0
- package/scripts/bench_ab_run.py +235 -0
- package/scripts/bench_ab_task_runner.py +369 -0
- package/scripts/bench_ab_tracka_run.py +202 -0
- package/scripts/{bench_compress_memory.py → bench_condense_memory.py} +16 -16
- package/scripts/bench_run.py +33 -33
- package/scripts/bench_runner.py +2 -2
- package/scripts/bootstrap.sh +99 -0
- package/scripts/build_cloud_bundle.py +6 -6
- package/scripts/build_discovery_manifest.py +7 -7
- package/scripts/build_linear_digest.py +3 -3
- package/scripts/build_rule_trigger_matrix.py +8 -8
- package/scripts/chat_history.py +5 -5
- package/scripts/check_always_budget.py +11 -5
- package/scripts/check_augment_description_cap.py +3 -3
- package/scripts/check_cluster_patterns.py +2 -2
- package/scripts/check_command_count_messaging.py +3 -3
- package/scripts/{check_compression.py → check_condensation.py} +34 -34
- package/scripts/{check_compressed_paths.py → check_condensed_paths.py} +8 -8
- package/scripts/check_context_paths.py +7 -7
- package/scripts/check_council_layout.py +2 -2
- package/scripts/check_council_references.py +9 -9
- package/scripts/check_iron_law_prominence.py +2 -2
- package/scripts/check_kernel_rule_bundle.py +2 -2
- package/scripts/check_module_management_neutral.py +149 -0
- package/scripts/check_no_roadmap_refs.py +9 -9
- package/scripts/check_portability.py +3 -3
- package/scripts/check_public_catalog_links.py +4 -4
- package/scripts/check_references.py +7 -6
- package/scripts/check_release_pr_shape.py +112 -0
- package/scripts/check_reply_consistency.py +3 -3
- package/scripts/check_safety_floor_untouched.py +1 -1
- package/scripts/check_template_pin_drift.py +5 -5
- package/scripts/check_token_optimizer_freshness.py +3 -3
- package/scripts/ci_status.py +301 -0
- package/scripts/ci_time_ratio.py +1 -1
- package/scripts/cleanup_other_scope.sh +146 -0
- package/scripts/compile_router.py +10 -10
- package/scripts/{compress.py → condense.py} +64 -64
- package/scripts/condense.sh +18 -0
- package/scripts/{compress_memory.py → condense_memory.py} +33 -33
- package/scripts/config/presets.py +2 -2
- package/scripts/config/profiles.py +1 -1
- package/scripts/cost_by_conversation.py +3 -3
- package/scripts/cost_summary.py +7 -7
- package/scripts/count_token_optimizer_usage.sh +1 -1
- package/scripts/gen_discovery_baseline.py +5 -5
- package/scripts/generate_index.py +6 -6
- package/scripts/generate_ownership_matrix.py +10 -10
- package/scripts/generate_pack_manifests.py +1 -1
- package/scripts/ghostwriter_fixture_allowlist.txt +1 -1
- package/scripts/install +3 -3
- package/scripts/install-hooks.sh +6 -6
- package/scripts/install.py +273 -45
- package/scripts/install.sh +187 -1
- package/scripts/inventory_frontmatter.py +2 -2
- package/scripts/iron_law_sha.py +3 -3
- package/scripts/lint_agents_layout.py +14 -7
- package/scripts/lint_agents_md.py +4 -4
- package/scripts/lint_archived_skills.py +3 -3
- package/scripts/lint_artefact_frontmatter.py +2 -2
- package/scripts/lint_bench_ab.py +172 -0
- package/scripts/lint_bench_corpus.py +1 -1
- package/scripts/lint_command_tiers.py +5 -5
- package/scripts/lint_context_spine_usage.py +1 -1
- package/scripts/lint_framework_leakage.py +7 -7
- package/scripts/lint_framework_leakage_allowlist.json +152 -84
- package/scripts/lint_ghostwriter_source.py +3 -3
- package/scripts/lint_handoffs.py +1 -1
- package/scripts/lint_load_context.py +11 -11
- package/scripts/lint_media_policy_linkage.py +5 -5
- package/scripts/lint_namespace.py +1 -1
- package/scripts/lint_no_new_atomic_commands.py +2 -2
- package/scripts/lint_orchestration_dsl.py +1 -1
- package/scripts/lint_pack_boundaries.py +2 -2
- package/scripts/lint_persona_governance.py +4 -4
- package/scripts/lint_role_experiences.py +237 -0
- package/scripts/lint_rule_interactions.py +2 -2
- package/scripts/lint_rule_tiers.py +1 -1
- package/scripts/lint_trust_coherence.py +2 -2
- package/scripts/mcp_registry_submit.sh +187 -0
- package/scripts/mcp_server/tools.py +1 -1
- package/scripts/measure_frugality_savings.py +10 -10
- package/scripts/measure_patterns.py +1 -1
- package/scripts/measure_projection_bytes.py +5 -5
- package/scripts/measure_rule_budget.py +3 -3
- package/scripts/measure_skill_reduction.py +1 -1
- package/scripts/memory_lookup.py +1 -1
- package/scripts/memory_status.py +2 -2
- package/scripts/migrate_command_suggestions.py +3 -3
- package/scripts/mine_session.py +1 -1
- package/scripts/move_artefact.py +3 -3
- package/scripts/new_skill.py +2 -2
- package/scripts/pack_mcp_content.py +9 -9
- package/scripts/plan_physical_move.py +6 -6
- package/scripts/print_required_checks.py +196 -0
- package/scripts/probe_skill_registration.py +413 -0
- package/scripts/propose_modules_config.py +145 -0
- package/scripts/prototype_lint_contradictions.py +1 -1
- package/scripts/recruit_preflight.sh +152 -0
- package/scripts/refine_ticket_detect.py +3 -3
- package/scripts/release.py +20 -0
- package/scripts/render_benchmark_md.py +308 -0
- package/scripts/roadmap_progress_hook.py +1 -1
- package/scripts/run_skill_evals.py +2 -2
- package/scripts/runtime_registry.py +4 -4
- package/scripts/schemas/command.schema.json +4 -4
- package/scripts/schemas/rule.schema.json +5 -5
- package/scripts/schemas/skill.schema.json +3 -3
- package/scripts/schemas/user-type.schema.json +1 -1
- package/scripts/score_skill_selection.py +1 -1
- package/scripts/skill_collision_clusters.py +2 -2
- package/scripts/skill_linter.py +81 -81
- package/scripts/skill_overlap.py +5 -5
- package/scripts/skill_tools/audit_persona_coverage.py +2 -2
- package/scripts/skill_tools/audit_user_type_coverage.py +2 -2
- package/scripts/skill_tools/run_block_d_eval.py +1 -1
- package/scripts/skill_tools/score_skill_relevance.py +1 -1
- package/scripts/skill_tools/suggest_skill_for_task.py +1 -1
- package/scripts/skill_trigger_eval.py +3 -3
- package/scripts/smoke/kernel.sh +7 -1
- package/scripts/smoke/router.sh +5 -5
- package/scripts/smoke/skills.sh +1 -1
- package/scripts/smoke_quickstart.py +1 -1
- package/scripts/snapshot_agent_outputs.py +3 -3
- package/scripts/spotcheck_thin_root.py +1 -1
- package/scripts/{caveman_stats.py → telegraph_stats.py} +18 -18
- package/scripts/update_counts.py +1 -1
- package/scripts/validate_decision_engine.py +1 -1
- package/scripts/validate_frontmatter.py +1 -1
- package/scripts/validate_safe_paths.py +3 -3
- package/scripts/{validate_caveman_carveouts.py → validate_telegraph_carveouts.py} +7 -7
- package/scripts/verify_roadmap_closure.py +6 -6
- package/templates/consumer-settings/ONBOARDING.md +41 -0
- package/.agent-src/commands/install-via-agent.md +0 -129
- package/.agent-src/skills/compress-memory/SKILL.md +0 -131
- package/dist/ui/assets/index-D-DY1ywI.js +0 -35
- package/dist/ui/assets/index-D-DY1ywI.js.map +0 -1
- package/dist/ui/assets/index-Dqfhmg-d.css +0 -1
- package/docs/adrs/caveman/README.md +0 -9
- package/docs/contracts/caveman-telemetry.md +0 -83
- package/scripts/compress.sh +0 -18
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"""Detect module root directories from a project tree.
|
|
2
|
+
|
|
3
|
+
Phase B of road-to-configurable-modules. Lifts the multi-stack
|
|
4
|
+
detection table from ``commands/module/explore.md`` Step 1 into a
|
|
5
|
+
reusable, pure Python helper that the installer, onboarding wizard,
|
|
6
|
+
and ``/agents init`` flow all share.
|
|
7
|
+
|
|
8
|
+
Contract — pure, read-only, tolerant:
|
|
9
|
+
|
|
10
|
+
* :func:`detect_module_roots` walks the candidate paths once and
|
|
11
|
+
reports every directory that *exists*. It never creates files,
|
|
12
|
+
never recurses past the first level needed to score confidence,
|
|
13
|
+
and silently skips paths it cannot read.
|
|
14
|
+
* The return shape is a list of :class:`ModuleCandidate` typed
|
|
15
|
+
dicts ordered by descending confidence; callers may turn that
|
|
16
|
+
list straight into numbered options.
|
|
17
|
+
* Confidence is a three-step ladder:
|
|
18
|
+
|
|
19
|
+
- ``high`` — directory exists *and* its first level contains
|
|
20
|
+
plausible module subdirectories for the stack.
|
|
21
|
+
- ``medium`` — directory exists but is empty / unclear; still
|
|
22
|
+
surfaced so the installer can ask the user.
|
|
23
|
+
- Absent paths are skipped entirely; they never appear in the
|
|
24
|
+
output.
|
|
25
|
+
|
|
26
|
+
No interactive logic, no settings I/O, no logging side-effects.
|
|
27
|
+
Settings wiring lives in ``scripts/install.py`` (Step 2) and the
|
|
28
|
+
GUI wizard (Step 3).
|
|
29
|
+
"""
|
|
30
|
+
from __future__ import annotations
|
|
31
|
+
|
|
32
|
+
from dataclasses import dataclass
|
|
33
|
+
from pathlib import Path
|
|
34
|
+
from typing import Iterable
|
|
35
|
+
|
|
36
|
+
#: Directory entry names that never count as modules. Mirrors the
|
|
37
|
+
#: ``modules.skip_dirs`` default from
|
|
38
|
+
#: ``templates/agents/agent-project-settings.example.yml``.
|
|
39
|
+
_SKIP_DIRS: frozenset[str] = frozenset({
|
|
40
|
+
".module-template",
|
|
41
|
+
".example",
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
#: Path segments that exclude a file from module-like detection.
|
|
45
|
+
#: Vendored dependencies, build artefacts, VCS state, IDE config —
|
|
46
|
+
#: never a real module no matter what shape the parent directory has.
|
|
47
|
+
_NOISE_SEGMENTS: frozenset[str] = frozenset({
|
|
48
|
+
"vendor",
|
|
49
|
+
"node_modules",
|
|
50
|
+
".git",
|
|
51
|
+
".idea",
|
|
52
|
+
".vscode",
|
|
53
|
+
"dist",
|
|
54
|
+
"build",
|
|
55
|
+
"tmp",
|
|
56
|
+
"var",
|
|
57
|
+
"storage",
|
|
58
|
+
"bootstrap",
|
|
59
|
+
"public",
|
|
60
|
+
".venv",
|
|
61
|
+
"venv",
|
|
62
|
+
"__pycache__",
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
#: Parent directory names that hint at a module layout when their
|
|
66
|
+
#: immediate child is a non-noise segment (i.e. ``Modules/User/...``,
|
|
67
|
+
#: ``packages/foo/...``). Case-sensitive — ``Modules`` (Laravel HMVC)
|
|
68
|
+
#: differs from ``modules`` (Node convention) intentionally; both are
|
|
69
|
+
#: accepted.
|
|
70
|
+
_MODULE_PARENTS: frozenset[str] = frozenset({
|
|
71
|
+
"Modules",
|
|
72
|
+
"modules",
|
|
73
|
+
"packages",
|
|
74
|
+
"apps",
|
|
75
|
+
"internal",
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def is_module_like_path(rel_path: str) -> bool:
|
|
80
|
+
"""Return ``True`` when ``rel_path`` sits inside a module-shaped tree.
|
|
81
|
+
|
|
82
|
+
Heuristic for the ``module-detect-on-the-fly`` skill: triggered by
|
|
83
|
+
repo-relative POSIX paths the agent is about to edit or reference.
|
|
84
|
+
A path is *module-like* when:
|
|
85
|
+
|
|
86
|
+
1. None of its segments are in :data:`_NOISE_SEGMENTS` (vendored,
|
|
87
|
+
build, VCS, IDE state — never a real module).
|
|
88
|
+
2. At least one segment matches :data:`_MODULE_PARENTS` AND has a
|
|
89
|
+
non-noise sibling directly underneath (so ``Modules/`` alone
|
|
90
|
+
does not trigger, but ``Modules/User/...`` does).
|
|
91
|
+
|
|
92
|
+
Pure, case-sensitive on parent names. Empty / dotted / Windows-style
|
|
93
|
+
inputs return ``False``. The function never touches the filesystem
|
|
94
|
+
— callers pass in a path string they already know about.
|
|
95
|
+
"""
|
|
96
|
+
if not rel_path:
|
|
97
|
+
return False
|
|
98
|
+
normalised = rel_path.replace("\\", "/").strip("/")
|
|
99
|
+
if not normalised:
|
|
100
|
+
return False
|
|
101
|
+
parts = normalised.split("/")
|
|
102
|
+
for segment in parts:
|
|
103
|
+
if segment in _NOISE_SEGMENTS:
|
|
104
|
+
return False
|
|
105
|
+
for idx, segment in enumerate(parts[:-1]):
|
|
106
|
+
if segment not in _MODULE_PARENTS:
|
|
107
|
+
continue
|
|
108
|
+
child = parts[idx + 1]
|
|
109
|
+
if not child or child.startswith("."):
|
|
110
|
+
continue
|
|
111
|
+
if child in _SKIP_DIRS:
|
|
112
|
+
continue
|
|
113
|
+
return True
|
|
114
|
+
return False
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
@dataclass(frozen=True)
|
|
118
|
+
class ModuleCandidate:
|
|
119
|
+
"""One detected module-root candidate.
|
|
120
|
+
|
|
121
|
+
Attributes mirror the JSON shape callers ultimately persist into
|
|
122
|
+
``modules.root_paths`` (the ``path`` field) plus metadata used
|
|
123
|
+
by the installer to phrase the numbered-options prompt.
|
|
124
|
+
"""
|
|
125
|
+
|
|
126
|
+
path: str
|
|
127
|
+
"""Repo-relative POSIX path of the module root (e.g. ``app/Modules``)."""
|
|
128
|
+
|
|
129
|
+
stack: str
|
|
130
|
+
"""Stack identifier — one of ``laravel-hmvc``, ``symfony-ddd``,
|
|
131
|
+
``node-monorepo``, ``python-src``, ``go-internal``, ``composer-src``."""
|
|
132
|
+
|
|
133
|
+
namespace_template_guess: str
|
|
134
|
+
"""PHP-style namespace template with ``{ModuleName}`` placeholder
|
|
135
|
+
(e.g. ``App\\Modules\\{ModuleName}``). Empty string for stacks
|
|
136
|
+
without a PHP-style namespace (Node, Python, Go)."""
|
|
137
|
+
|
|
138
|
+
confidence: str
|
|
139
|
+
"""One of ``high`` or ``medium`` per the ladder in the module
|
|
140
|
+
docstring."""
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
# Detection rules — order encodes priority when two rules match the
|
|
144
|
+
# same directory. ``namespace_template`` is the value emitted as
|
|
145
|
+
# ``namespace_template_guess`` on a hit; empty for non-PHP stacks.
|
|
146
|
+
_RULES: tuple[tuple[str, str, str], ...] = (
|
|
147
|
+
("app/Modules", "laravel-hmvc", "App\\Modules\\{ModuleName}"),
|
|
148
|
+
("src/Module", "symfony-ddd", "App\\Module\\{ModuleName}"),
|
|
149
|
+
("packages", "node-monorepo", ""),
|
|
150
|
+
("apps", "node-monorepo", ""),
|
|
151
|
+
("modules", "node-monorepo", ""),
|
|
152
|
+
("src", "python-src", ""),
|
|
153
|
+
("internal", "go-internal", ""),
|
|
154
|
+
("cmd", "go-internal", ""),
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def _list_module_subdirs(root: Path) -> list[Path]:
|
|
159
|
+
"""Return first-level subdirectories of ``root`` that look like modules."""
|
|
160
|
+
try:
|
|
161
|
+
entries = sorted(root.iterdir())
|
|
162
|
+
except (OSError, PermissionError):
|
|
163
|
+
return []
|
|
164
|
+
out: list[Path] = []
|
|
165
|
+
for entry in entries:
|
|
166
|
+
if not entry.is_dir():
|
|
167
|
+
continue
|
|
168
|
+
if entry.name.startswith("."):
|
|
169
|
+
continue
|
|
170
|
+
if entry.name in _SKIP_DIRS:
|
|
171
|
+
continue
|
|
172
|
+
out.append(entry)
|
|
173
|
+
return out
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def _score_confidence(stack: str, subdirs: Iterable[Path]) -> str:
|
|
177
|
+
"""Return ``high`` when ``subdirs`` looks like a populated module root."""
|
|
178
|
+
subdirs_list = list(subdirs)
|
|
179
|
+
if not subdirs_list:
|
|
180
|
+
return "medium"
|
|
181
|
+
if stack in {"laravel-hmvc", "symfony-ddd"}:
|
|
182
|
+
capitalized = [d for d in subdirs_list if d.name[:1].isupper()]
|
|
183
|
+
return "high" if capitalized else "medium"
|
|
184
|
+
if stack == "node-monorepo":
|
|
185
|
+
with_pkg_json = [d for d in subdirs_list if (d / "package.json").is_file()]
|
|
186
|
+
return "high" if with_pkg_json else "medium"
|
|
187
|
+
if stack == "python-src":
|
|
188
|
+
with_init = [d for d in subdirs_list if (d / "__init__.py").is_file()]
|
|
189
|
+
return "high" if with_init else "medium"
|
|
190
|
+
if stack == "go-internal":
|
|
191
|
+
return "high" if subdirs_list else "medium"
|
|
192
|
+
return "medium"
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def detect_module_roots(project_root: Path) -> list[ModuleCandidate]:
|
|
196
|
+
"""Return module-root candidates discovered under ``project_root``.
|
|
197
|
+
|
|
198
|
+
Pure read-only scan. Walks each rule in :data:`_RULES`, reports
|
|
199
|
+
every directory that exists, and never recurses past the first
|
|
200
|
+
level needed to score confidence. Order: ``high`` first, then
|
|
201
|
+
``medium``; rule order breaks ties. Absent paths never appear
|
|
202
|
+
in the output.
|
|
203
|
+
"""
|
|
204
|
+
project_root = Path(project_root)
|
|
205
|
+
high: list[ModuleCandidate] = []
|
|
206
|
+
medium: list[ModuleCandidate] = []
|
|
207
|
+
for rel_path, stack, namespace_template in _RULES:
|
|
208
|
+
abs_path = project_root / rel_path
|
|
209
|
+
if not abs_path.is_dir():
|
|
210
|
+
continue
|
|
211
|
+
subdirs = _list_module_subdirs(abs_path)
|
|
212
|
+
confidence = _score_confidence(stack, subdirs)
|
|
213
|
+
candidate = ModuleCandidate(
|
|
214
|
+
path=rel_path,
|
|
215
|
+
stack=stack,
|
|
216
|
+
namespace_template_guess=namespace_template,
|
|
217
|
+
confidence=confidence,
|
|
218
|
+
)
|
|
219
|
+
if confidence == "high":
|
|
220
|
+
high.append(candidate)
|
|
221
|
+
else:
|
|
222
|
+
medium.append(candidate)
|
|
223
|
+
return high + medium
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# scope_guard.sh — detect cross-scope install drift for event4u/agent-config.
|
|
3
|
+
#
|
|
4
|
+
# Roadmap reference: road-to-clean-skill-distribution-channels.md, Phase B Step 2.
|
|
5
|
+
# Contract: docs/contracts/skill-distribution-channels.md + docs/contracts/install-scopes.md.
|
|
6
|
+
#
|
|
7
|
+
# Pre-install hook called by scripts/install.sh. Detects whether the same package
|
|
8
|
+
# is already installed at the OTHER scope (user-global vs project-local) for any
|
|
9
|
+
# of the six supported tools. Emits one verdict per tool plus a global verdict
|
|
10
|
+
# on stdout (one finding per line).
|
|
11
|
+
#
|
|
12
|
+
# Verdicts (per the roadmap contract):
|
|
13
|
+
# OK — no install at the other scope; the install can proceed.
|
|
14
|
+
# WARN — install at the other scope, SAME version as the one being installed.
|
|
15
|
+
# Same content; duplicate registration but no drift.
|
|
16
|
+
# DRIFT — install at the other scope, DIFFERENT version (or unreadable).
|
|
17
|
+
# Drift will produce the 2026-05-25 failure mode (stale frontmatter
|
|
18
|
+
# registered alongside fresh frontmatter).
|
|
19
|
+
#
|
|
20
|
+
# Output shape (line-oriented, parseable by install.sh):
|
|
21
|
+
# <verdict>\t<tool-id>\t<other-scope-path>\t<other-version>\t<this-version>
|
|
22
|
+
#
|
|
23
|
+
# A final summary line is emitted:
|
|
24
|
+
# SUMMARY\t<verdict>\t<count-OK>\t<count-WARN>\t<count-DRIFT>
|
|
25
|
+
#
|
|
26
|
+
# The script exits 0 always — verdict interpretation is the caller's job.
|
|
27
|
+
|
|
28
|
+
set -euo pipefail
|
|
29
|
+
|
|
30
|
+
THIS_SCOPE="${1:-project}" # project|user — which scope we're ABOUT to install to
|
|
31
|
+
SOURCE_DIR="${2:-}" # package source repo (read version from here)
|
|
32
|
+
TARGET_DIR="${3:-}" # consumer install root for "this" scope
|
|
33
|
+
|
|
34
|
+
# Default SOURCE_DIR to the package root when invoked from inside this repo.
|
|
35
|
+
if [[ -z "$SOURCE_DIR" ]]; then
|
|
36
|
+
SOURCE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
|
37
|
+
fi
|
|
38
|
+
|
|
39
|
+
# Resolve the version we're about to install. Authoritative source:
|
|
40
|
+
# package.json at the package root (release.py keeps this current).
|
|
41
|
+
this_version() {
|
|
42
|
+
local pkg="$SOURCE_DIR/package.json"
|
|
43
|
+
[[ -f "$pkg" ]] || { echo "unknown"; return; }
|
|
44
|
+
# Tiny scoped parser — no jq / python dependency.
|
|
45
|
+
awk -F'"' '/"version":/ { print $4; exit }' "$pkg" 2>/dev/null || echo "unknown"
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
# Resolve the version recorded at a given install root. Falls back through
|
|
49
|
+
# package.json → .augment-plugin/plugin.json → "unknown".
|
|
50
|
+
installed_version_at() {
|
|
51
|
+
local root="$1"
|
|
52
|
+
if [[ -f "$root/package.json" ]]; then
|
|
53
|
+
awk -F'"' '/"version":/ { print $4; exit }' "$root/package.json" 2>/dev/null && return
|
|
54
|
+
fi
|
|
55
|
+
if [[ -f "$root/.augment-plugin/plugin.json" ]]; then
|
|
56
|
+
awk -F'"' '/"version":/ { print $4; exit }' "$root/.augment-plugin/plugin.json" 2>/dev/null && return
|
|
57
|
+
fi
|
|
58
|
+
echo "unknown"
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
# Heuristic: does this look like an agent-config install (vs a vanilla user
|
|
62
|
+
# directory with the same path layout)? We accept "looks like" if the tool
|
|
63
|
+
# directory contains ≥ N entries that ALSO exist in the SOURCE_DIR tree —
|
|
64
|
+
# but we keep the check coarse: simply that the directory is non-empty.
|
|
65
|
+
dir_nonempty() {
|
|
66
|
+
[[ -d "$1" ]] && [[ -n "$(ls -A "$1" 2>/dev/null | head -1)" ]]
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
# Per-tool probe definitions: tool-id, user-scope path, project-scope path.
|
|
70
|
+
# Project-scope path is relative to "$TARGET_DIR" (or "$HOME/<proj>" for user).
|
|
71
|
+
probe_tool() {
|
|
72
|
+
local tool="$1"
|
|
73
|
+
local user_path="$2"
|
|
74
|
+
local project_path="$3"
|
|
75
|
+
|
|
76
|
+
local other_path other_scope this_scope_path
|
|
77
|
+
if [[ "$THIS_SCOPE" == "project" ]]; then
|
|
78
|
+
this_scope_path="$project_path"
|
|
79
|
+
other_path="$user_path"
|
|
80
|
+
other_scope="user"
|
|
81
|
+
else
|
|
82
|
+
this_scope_path="$user_path"
|
|
83
|
+
other_path="$project_path"
|
|
84
|
+
other_scope="project"
|
|
85
|
+
fi
|
|
86
|
+
|
|
87
|
+
if ! dir_nonempty "$other_path"; then
|
|
88
|
+
printf 'OK\t%s\t-\t-\t%s\n' "$tool" "$(this_version)"
|
|
89
|
+
return
|
|
90
|
+
fi
|
|
91
|
+
|
|
92
|
+
local other_root other_ver
|
|
93
|
+
# Walk up from the tool directory to find the install root (containing
|
|
94
|
+
# package.json or .augment-plugin/plugin.json).
|
|
95
|
+
other_root="$(cd "$other_path/.." 2>/dev/null && pwd)" || other_root=""
|
|
96
|
+
if [[ -n "$other_root" ]]; then
|
|
97
|
+
# Look up to 3 levels up for an install root.
|
|
98
|
+
local probe="$other_root"
|
|
99
|
+
for _ in 1 2 3; do
|
|
100
|
+
if [[ -f "$probe/package.json" ]] || [[ -f "$probe/.augment-plugin/plugin.json" ]]; then
|
|
101
|
+
other_root="$probe"
|
|
102
|
+
break
|
|
103
|
+
fi
|
|
104
|
+
probe="$(dirname "$probe")"
|
|
105
|
+
[[ "$probe" == "/" ]] && break
|
|
106
|
+
done
|
|
107
|
+
fi
|
|
108
|
+
other_ver="$(installed_version_at "$other_root")"
|
|
109
|
+
|
|
110
|
+
local this_ver
|
|
111
|
+
this_ver="$(this_version)"
|
|
112
|
+
|
|
113
|
+
if [[ "$other_ver" == "unknown" ]] || [[ "$this_ver" == "unknown" ]] || [[ "$other_ver" != "$this_ver" ]]; then
|
|
114
|
+
printf 'DRIFT\t%s\t%s\t%s\t%s\n' "$tool" "$other_path" "$other_ver" "$this_ver"
|
|
115
|
+
else
|
|
116
|
+
printf 'WARN\t%s\t%s\t%s\t%s\n' "$tool" "$other_path" "$other_ver" "$this_ver"
|
|
117
|
+
fi
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
main() {
|
|
121
|
+
# Resolve target root for project-scope probes.
|
|
122
|
+
local project_root="${TARGET_DIR:-$(pwd)}"
|
|
123
|
+
local home_root="${HOME:-/tmp}"
|
|
124
|
+
|
|
125
|
+
local count_ok=0 count_warn=0 count_drift=0 finding
|
|
126
|
+
|
|
127
|
+
# Each probe_tool call prints exactly one line. Use
|
|
128
|
+
# assignment-arithmetic (returns 0) rather than post-increment
|
|
129
|
+
# (returns the OLD value — 0 trips `set -e` on the first OK hit
|
|
130
|
+
# under bash 5+ / GitHub Actions runners).
|
|
131
|
+
while IFS= read -r finding; do
|
|
132
|
+
echo "$finding"
|
|
133
|
+
case "${finding%%$'\t'*}" in
|
|
134
|
+
OK) count_ok=$((count_ok + 1)) ;;
|
|
135
|
+
WARN) count_warn=$((count_warn + 1)) ;;
|
|
136
|
+
DRIFT) count_drift=$((count_drift + 1)) ;;
|
|
137
|
+
esac
|
|
138
|
+
done < <(
|
|
139
|
+
probe_tool claude-code "$home_root/.claude/skills" "$project_root/.claude/skills"
|
|
140
|
+
probe_tool augment "$home_root/.augment/skills" "$project_root/.augment/skills"
|
|
141
|
+
probe_tool cursor "$home_root/.cursor/rules" "$project_root/.cursor/rules"
|
|
142
|
+
probe_tool cline "$home_root/.clinerules" "$project_root/.clinerules"
|
|
143
|
+
probe_tool windsurf "$home_root/.windsurf/rules" "$project_root/.windsurf/rules"
|
|
144
|
+
probe_tool copilot "$home_root/.github/copilot-instructions.md" "$project_root/.github/copilot-instructions.md"
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
local overall
|
|
148
|
+
if [[ $count_drift -gt 0 ]]; then
|
|
149
|
+
overall=DRIFT
|
|
150
|
+
elif [[ $count_warn -gt 0 ]]; then
|
|
151
|
+
overall=WARN
|
|
152
|
+
else
|
|
153
|
+
overall=OK
|
|
154
|
+
fi
|
|
155
|
+
printf 'SUMMARY\t%s\t%d\t%d\t%d\n' "$overall" "$count_ok" "$count_warn" "$count_drift"
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
# Allow sourcing without executing (so other scripts can call individual
|
|
159
|
+
# functions). Only run main() when invoked directly.
|
|
160
|
+
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
|
161
|
+
main "$@"
|
|
162
|
+
fi
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"""R3 Phase 4 — one-off artefact-to-pack bucket map.
|
|
3
3
|
|
|
4
4
|
Encodes the council-locked mapping for all skills/rules/commands under
|
|
5
|
-
.agent-src.
|
|
5
|
+
.agent-src.uncondensed/. Run with `--check` to emit a CSV preview;
|
|
6
6
|
run with `--pack <id>` to print the artefact paths for that pack so
|
|
7
7
|
the annotator can consume them via xargs.
|
|
8
8
|
|
|
@@ -17,7 +17,7 @@ import sys
|
|
|
17
17
|
from pathlib import Path
|
|
18
18
|
|
|
19
19
|
ROOT = Path(__file__).resolve().parents[1]
|
|
20
|
-
SRC = ROOT / ".agent-src.
|
|
20
|
+
SRC = ROOT / ".agent-src.uncondensed"
|
|
21
21
|
|
|
22
22
|
# Explicit per-name overrides (highest priority). Use when domain/keyword
|
|
23
23
|
# heuristics misclassify. Council Q3 fallback is applied only if no entry.
|
|
@@ -80,7 +80,7 @@ NAME_TO_PACK: dict[str, str] = {
|
|
|
80
80
|
"video-director": "ai-video", "canvas-design": "ai-video",
|
|
81
81
|
# Meta (agent-config maintenance)
|
|
82
82
|
"ai-council": "meta", "command-routing": "meta", "command-writing": "meta",
|
|
83
|
-
"
|
|
83
|
+
"condense-memory": "meta", "context-authoring": "meta", "context-document": "meta",
|
|
84
84
|
"copilot-agents-optimization": "meta", "copilot-config": "meta",
|
|
85
85
|
"description-assist": "meta", "guideline-writing": "meta",
|
|
86
86
|
"learning-to-rule-or-skill": "meta", "lint-skills": "meta",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""Pilot
|
|
1
|
+
"""Pilot condensation ratio + Iron-Law checksum verification (one-off, not CI)."""
|
|
2
2
|
import sys, re, hashlib, statistics
|
|
3
3
|
from pathlib import Path
|
|
4
4
|
|
|
@@ -15,9 +15,9 @@ def iron_law_sha(body: str) -> str:
|
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
pairs = [
|
|
18
|
-
("agent-authority", ".agent-src.
|
|
19
|
-
("direct-answers", ".agent-src.
|
|
20
|
-
("language-and-tone", ".agent-src.
|
|
18
|
+
("agent-authority", ".agent-src.uncondensed/rules/agent-authority.md", "docs/contracts/pilot/agent-authority.md"),
|
|
19
|
+
("direct-answers", ".agent-src.uncondensed/rules/direct-answers.md", "docs/contracts/pilot/direct-answers.md"),
|
|
20
|
+
("language-and-tone", ".agent-src.uncondensed/rules/language-and-tone.md", "docs/contracts/pilot/language-and-tone.md"),
|
|
21
21
|
]
|
|
22
22
|
|
|
23
23
|
header = f"{'rule':25s} {'orig':>6s} {'pilot':>6s} {'r':>6s} {'budget':>7s} {'sha-orig':>16s} {'sha-pilot':>16s} {'IL':>3s}"
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Roll up ``adoption-snapshots.jsonl`` into a Markdown trend report.
|
|
3
|
+
|
|
4
|
+
Phase D Step 3 of ``road-to-adoption-proof-and-ci-green.md``.
|
|
5
|
+
Reads the JSONL produced by ``scripts/adoption_snapshot.py`` and
|
|
6
|
+
writes an ``agents/runtime/metrics/adoption-report.md`` snapshot
|
|
7
|
+
covering an 8-week rolling window per signal.
|
|
8
|
+
|
|
9
|
+
Mirrors the shape of ``scripts/skill_usage_report.py``: a single
|
|
10
|
+
file, ≤ 200 LOC, no external deps. The report is regenerated on
|
|
11
|
+
every invocation (idempotent for a given JSONL state).
|
|
12
|
+
|
|
13
|
+
CLI:
|
|
14
|
+
|
|
15
|
+
scripts/adoption_report.py [--in <path>] [--out <path>] [--weeks 8]
|
|
16
|
+
|
|
17
|
+
--in JSONL input (default
|
|
18
|
+
``agents/runtime/metrics/adoption-snapshots.jsonl``).
|
|
19
|
+
--out Markdown output (default
|
|
20
|
+
``agents/runtime/metrics/adoption-report.md``).
|
|
21
|
+
--weeks Window size (default 8).
|
|
22
|
+
|
|
23
|
+
Exit codes:
|
|
24
|
+
|
|
25
|
+
0 — report written.
|
|
26
|
+
1 — IO failure on read or write.
|
|
27
|
+
"""
|
|
28
|
+
from __future__ import annotations
|
|
29
|
+
|
|
30
|
+
import argparse
|
|
31
|
+
import datetime as dt
|
|
32
|
+
import json
|
|
33
|
+
import sys
|
|
34
|
+
from pathlib import Path
|
|
35
|
+
from typing import Any
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
REPO_ROOT = Path(__file__).resolve().parent.parent
|
|
39
|
+
DEFAULT_IN = REPO_ROOT / "agents" / "runtime" / "metrics" / "adoption-snapshots.jsonl"
|
|
40
|
+
DEFAULT_OUT = REPO_ROOT / "agents" / "runtime" / "metrics" / "adoption-report.md"
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def parse_jsonl(path: Path) -> list[dict[str, Any]]:
|
|
44
|
+
rows: list[dict[str, Any]] = []
|
|
45
|
+
if not path.exists():
|
|
46
|
+
return rows
|
|
47
|
+
for line in path.read_text(encoding="utf-8").splitlines():
|
|
48
|
+
line = line.strip()
|
|
49
|
+
if not line:
|
|
50
|
+
continue
|
|
51
|
+
try:
|
|
52
|
+
rows.append(json.loads(line))
|
|
53
|
+
except json.JSONDecodeError:
|
|
54
|
+
continue
|
|
55
|
+
return rows
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def filter_window(rows: list[dict[str, Any]], weeks: int) -> list[dict[str, Any]]:
|
|
59
|
+
if not rows:
|
|
60
|
+
return rows
|
|
61
|
+
cutoff = dt.datetime.now(dt.timezone.utc) - dt.timedelta(weeks=weeks)
|
|
62
|
+
out: list[dict[str, Any]] = []
|
|
63
|
+
for r in rows:
|
|
64
|
+
ts = r.get("snapshot_at", "")
|
|
65
|
+
try:
|
|
66
|
+
when = dt.datetime.strptime(ts, "%Y-%m-%dT%H:%M:%SZ").replace(
|
|
67
|
+
tzinfo=dt.timezone.utc
|
|
68
|
+
)
|
|
69
|
+
except ValueError:
|
|
70
|
+
continue
|
|
71
|
+
if when >= cutoff:
|
|
72
|
+
out.append(r)
|
|
73
|
+
return out
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def render_section(title: str, lines: list[str]) -> str:
|
|
77
|
+
return f"## {title}\n\n" + "\n".join(lines) + "\n\n"
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def render_npm_downloads(rows: list[dict[str, Any]]) -> str:
|
|
81
|
+
lines = []
|
|
82
|
+
lines.append("| Snapshot | Last 7 days (npm installs) |")
|
|
83
|
+
lines.append("|---|---:|")
|
|
84
|
+
for r in rows:
|
|
85
|
+
signal = r.get("signals", {}).get("npm_downloads", {})
|
|
86
|
+
if "error" in signal:
|
|
87
|
+
cell = f"_(error: {signal['error'][:40]})_"
|
|
88
|
+
else:
|
|
89
|
+
cell = f"{signal.get('last_7_days', 0):,}"
|
|
90
|
+
lines.append(f"| `{r.get('snapshot_at', '?')}` | {cell} |")
|
|
91
|
+
return render_section("npm install count (last 7 days, weekly snapshot)", lines)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def render_npm_version(rows: list[dict[str, Any]]) -> str:
|
|
95
|
+
lines = []
|
|
96
|
+
lines.append("| Snapshot | Latest version | Version count |")
|
|
97
|
+
lines.append("|---|---|---:|")
|
|
98
|
+
for r in rows:
|
|
99
|
+
signal = r.get("signals", {}).get("npm_version", {})
|
|
100
|
+
if "error" in signal:
|
|
101
|
+
lines.append(f"| `{r.get('snapshot_at', '?')}` | _(error)_ | _(error)_ |")
|
|
102
|
+
else:
|
|
103
|
+
latest = signal.get("latest", "?")
|
|
104
|
+
count = signal.get("version_count", 0)
|
|
105
|
+
lines.append(f"| `{r.get('snapshot_at', '?')}` | `{latest}` | {count} |")
|
|
106
|
+
return render_section("npm version distribution", lines)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def render_github_stars(rows: list[dict[str, Any]]) -> str:
|
|
110
|
+
lines = []
|
|
111
|
+
lines.append("| Snapshot | Stars | Forks | Watchers |")
|
|
112
|
+
lines.append("|---|---:|---:|---:|")
|
|
113
|
+
for r in rows:
|
|
114
|
+
signal = r.get("signals", {}).get("github_stars", {})
|
|
115
|
+
if "error" in signal:
|
|
116
|
+
lines.append(f"| `{r.get('snapshot_at', '?')}` | _(error)_ | _(error)_ | _(error)_ |")
|
|
117
|
+
else:
|
|
118
|
+
lines.append(
|
|
119
|
+
f"| `{r.get('snapshot_at', '?')}` | "
|
|
120
|
+
f"{signal.get('stars', 0):,} | "
|
|
121
|
+
f"{signal.get('forks', 0):,} | "
|
|
122
|
+
f"{signal.get('watchers', 0):,} |"
|
|
123
|
+
)
|
|
124
|
+
return render_section("GitHub stars / forks / watchers", lines)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def render_topic_rank(rows: list[dict[str, Any]]) -> str:
|
|
128
|
+
lines = []
|
|
129
|
+
lines.append("| Snapshot | `agent-skills` rank | `cinematic-ai-video` rank |")
|
|
130
|
+
lines.append("|---|---:|---:|")
|
|
131
|
+
for r in rows:
|
|
132
|
+
signal = r.get("signals", {}).get("topic_rank", {})
|
|
133
|
+
as_block = signal.get("agent-skills", {})
|
|
134
|
+
cav_block = signal.get("cinematic-ai-video", {})
|
|
135
|
+
as_rank = "_(error)_" if "error" in as_block else (as_block.get("rank") or "—")
|
|
136
|
+
cav_rank = "_(error)_" if "error" in cav_block else (cav_block.get("rank") or "—")
|
|
137
|
+
lines.append(
|
|
138
|
+
f"| `{r.get('snapshot_at', '?')}` | {as_rank} | {cav_rank} |"
|
|
139
|
+
)
|
|
140
|
+
return render_section("Topic-search rank (`agent-skills` + `cinematic-ai-video`)", lines)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def render_report(rows: list[dict[str, Any]], weeks: int) -> str:
|
|
144
|
+
header = (
|
|
145
|
+
"# Adoption report — rolling trend\n\n"
|
|
146
|
+
f"> Generated by `scripts/adoption_report.py` from "
|
|
147
|
+
f"`agents/runtime/metrics/adoption-snapshots.jsonl`.\n"
|
|
148
|
+
f"> Window: rolling {weeks} weeks. Source contract: "
|
|
149
|
+
f"`docs/contracts/adoption-signal-floor.md`.\n\n"
|
|
150
|
+
)
|
|
151
|
+
if not rows:
|
|
152
|
+
header += (
|
|
153
|
+
"_No snapshots in the current window — run `python3 scripts/adoption_snapshot.py` "
|
|
154
|
+
"(scheduled weekly via the cron in `.github/workflows/`) to populate the trend._\n"
|
|
155
|
+
)
|
|
156
|
+
return header
|
|
157
|
+
return (
|
|
158
|
+
header
|
|
159
|
+
+ render_npm_downloads(rows)
|
|
160
|
+
+ render_npm_version(rows)
|
|
161
|
+
+ render_github_stars(rows)
|
|
162
|
+
+ render_topic_rank(rows)
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
|
|
167
|
+
p = argparse.ArgumentParser(prog="adoption_report")
|
|
168
|
+
p.add_argument("--in", dest="in_path", type=Path, default=DEFAULT_IN)
|
|
169
|
+
p.add_argument("--out", type=Path, default=DEFAULT_OUT)
|
|
170
|
+
p.add_argument("--weeks", type=int, default=8)
|
|
171
|
+
return p.parse_args(argv)
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def main(argv: list[str] | None = None) -> int:
|
|
175
|
+
args = parse_args(argv)
|
|
176
|
+
try:
|
|
177
|
+
rows = parse_jsonl(args.in_path)
|
|
178
|
+
except OSError as exc:
|
|
179
|
+
print(f"error: failed to read {args.in_path}: {exc}", file=sys.stderr)
|
|
180
|
+
return 1
|
|
181
|
+
rows = filter_window(rows, args.weeks)
|
|
182
|
+
rows.sort(key=lambda r: r.get("snapshot_at", ""))
|
|
183
|
+
report = render_report(rows, args.weeks)
|
|
184
|
+
try:
|
|
185
|
+
args.out.parent.mkdir(parents=True, exist_ok=True)
|
|
186
|
+
args.out.write_text(report, encoding="utf-8")
|
|
187
|
+
except OSError as exc:
|
|
188
|
+
print(f"error: failed to write {args.out}: {exc}", file=sys.stderr)
|
|
189
|
+
return 1
|
|
190
|
+
print(f"adoption_report: wrote {args.out} ({len(rows)} snapshot(s))")
|
|
191
|
+
return 0
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
if __name__ == "__main__":
|
|
195
|
+
sys.exit(main())
|