@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
package/scripts/install.py
CHANGED
|
@@ -88,6 +88,43 @@ LEGACY_RENAME_MAP = {
|
|
|
88
88
|
|
|
89
89
|
QUIET = False
|
|
90
90
|
|
|
91
|
+
# Machine-readable progress stream for the wizard `--apply-payload` real-apply
|
|
92
|
+
# bridge (road-to-single-install-source-of-truth § Phase 1). When True,
|
|
93
|
+
# `_emit_progress` writes NDJSON lines to stdout so the GUI can stream install
|
|
94
|
+
# progress; human-readable `info`/`success` output is suppressed via QUIET so
|
|
95
|
+
# the two never interleave (`warn`/`fail` still surface on stderr). Off for
|
|
96
|
+
# every normal CLI install.
|
|
97
|
+
PROGRESS_NDJSON = False
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def _emit_progress(obj: "dict[str, Any]") -> None:
|
|
101
|
+
"""Write one NDJSON progress line to stdout when PROGRESS_NDJSON is on.
|
|
102
|
+
|
|
103
|
+
No-op for normal CLI installs. The line shapes mirror the wizard SSE
|
|
104
|
+
frames the GUI already consumes: per-unit
|
|
105
|
+
``{"type":"file","file":...,"status":...,"written":N,"total":M}`` and the
|
|
106
|
+
terminal ``{"type":"done"|"error",...}``.
|
|
107
|
+
"""
|
|
108
|
+
if not PROGRESS_NDJSON:
|
|
109
|
+
return
|
|
110
|
+
sys.stdout.write(json.dumps(obj, separators=(",", ":")) + "\n")
|
|
111
|
+
sys.stdout.flush()
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def _emit_progress_terminal(rc: int) -> None:
|
|
115
|
+
"""Emit the terminal NDJSON frame for a real-apply run.
|
|
116
|
+
|
|
117
|
+
rc == 0 → ``{"type":"done"}``; otherwise ``{"type":"error",...}``. No-op
|
|
118
|
+
unless PROGRESS_NDJSON is on, so it is safe to call from every install
|
|
119
|
+
return path.
|
|
120
|
+
"""
|
|
121
|
+
if not PROGRESS_NDJSON:
|
|
122
|
+
return
|
|
123
|
+
if rc == 0:
|
|
124
|
+
_emit_progress({"type": "done"})
|
|
125
|
+
else:
|
|
126
|
+
_emit_progress({"type": "error", "code": "E_INSTALL", "exitCode": rc})
|
|
127
|
+
|
|
91
128
|
|
|
92
129
|
def info(msg: str) -> None:
|
|
93
130
|
if not QUIET:
|
|
@@ -817,12 +854,42 @@ def _validate_user_type(package_root: Path, value: str) -> str:
|
|
|
817
854
|
return cleaned
|
|
818
855
|
|
|
819
856
|
|
|
857
|
+
def _inject_packs(body: str, packs: "list[str]") -> str:
|
|
858
|
+
"""Insert a top-level ``packs:`` block into a rendered settings body.
|
|
859
|
+
|
|
860
|
+
Inserted directly after the ``cost_profile:`` line so the active pack
|
|
861
|
+
selection sits beside the other install-time knobs. No-op when ``packs``
|
|
862
|
+
is empty — non-pack installs stay byte-identical to the template render.
|
|
863
|
+
"""
|
|
864
|
+
if not packs:
|
|
865
|
+
return body
|
|
866
|
+
block = "packs:\n" + "".join(f" - {p}\n" for p in packs)
|
|
867
|
+
lines = body.splitlines(keepends=True)
|
|
868
|
+
out: list[str] = []
|
|
869
|
+
inserted = False
|
|
870
|
+
for line in lines:
|
|
871
|
+
out.append(line)
|
|
872
|
+
if not inserted and line.startswith("cost_profile:"):
|
|
873
|
+
if not line.endswith("\n"):
|
|
874
|
+
out[-1] = line + "\n"
|
|
875
|
+
out.append(block)
|
|
876
|
+
inserted = True
|
|
877
|
+
if not inserted:
|
|
878
|
+
# No cost_profile anchor (unexpected) — append at the end so the
|
|
879
|
+
# selection is still recorded rather than silently dropped.
|
|
880
|
+
if out and not out[-1].endswith("\n"):
|
|
881
|
+
out[-1] = out[-1] + "\n"
|
|
882
|
+
out.append(block)
|
|
883
|
+
return "".join(out)
|
|
884
|
+
|
|
885
|
+
|
|
820
886
|
def ensure_agent_settings(
|
|
821
887
|
project_root: Path,
|
|
822
888
|
package_root: Path,
|
|
823
889
|
profile: str,
|
|
824
890
|
force: bool,
|
|
825
891
|
user_type: str = "",
|
|
892
|
+
packs: "list[str] | None" = None,
|
|
826
893
|
) -> None:
|
|
827
894
|
target = project_root / SETTINGS_FILE
|
|
828
895
|
profile_source = package_root / "config" / "profiles" / f"{profile}.ini"
|
|
@@ -847,6 +914,7 @@ def ensure_agent_settings(
|
|
|
847
914
|
# Inject runtime-only values (not part of the .ini profile presets).
|
|
848
915
|
profile_values["user_type"] = _validate_user_type(package_root, user_type)
|
|
849
916
|
template_body = _render_template(template, profile_values)
|
|
917
|
+
template_body = _inject_packs(template_body, packs or [])
|
|
850
918
|
|
|
851
919
|
legacy_target = project_root / LEGACY_SETTINGS_FILE
|
|
852
920
|
if legacy_target.is_file() and target.exists():
|
|
@@ -2921,12 +2989,12 @@ def _detect_legacy_for_migration(project_root: Path) -> list[str]:
|
|
|
2921
2989
|
|
|
2922
2990
|
- ``AGENT_CONFIG_DEV_MODE=1`` is set (maintainer dogfood loop),
|
|
2923
2991
|
- the project root IS the agent-config source repo
|
|
2924
|
-
(``.agent-src.
|
|
2992
|
+
(``.agent-src.uncondensed/`` present),
|
|
2925
2993
|
- the bridge marker already exists (project is already global-only).
|
|
2926
2994
|
"""
|
|
2927
2995
|
if os.environ.get("AGENT_CONFIG_DEV_MODE") == "1":
|
|
2928
2996
|
return []
|
|
2929
|
-
if (project_root / ".agent-src.
|
|
2997
|
+
if (project_root / ".agent-src.uncondensed").is_dir():
|
|
2930
2998
|
return []
|
|
2931
2999
|
if (project_root / CONSUMER_BRIDGE_MARKER_RELPATH).is_file():
|
|
2932
3000
|
return []
|
|
@@ -3031,7 +3099,7 @@ def _write_consumer_bridge_marker(
|
|
|
3031
3099
|
- ``AGENT_CONFIG_DEV_MODE=1`` (maintainer dev installs never lay the
|
|
3032
3100
|
bridge into the source repo).
|
|
3033
3101
|
- The project root is the agent-config source repo itself
|
|
3034
|
-
(``.agent-src.
|
|
3102
|
+
(``.agent-src.uncondensed/`` present) — same rationale.
|
|
3035
3103
|
|
|
3036
3104
|
Atomic write: ``tempfile`` in the same dir + ``os.replace``. Same
|
|
3037
3105
|
pattern the lockfile uses (see ``scripts/_lib/installed_lock.py``).
|
|
@@ -3042,7 +3110,7 @@ def _write_consumer_bridge_marker(
|
|
|
3042
3110
|
env_map = env if env is not None else os.environ
|
|
3043
3111
|
if env_map.get("AGENT_CONFIG_DEV_MODE") == "1":
|
|
3044
3112
|
return None
|
|
3045
|
-
if (project_root / ".agent-src.
|
|
3113
|
+
if (project_root / ".agent-src.uncondensed").is_dir():
|
|
3046
3114
|
return None
|
|
3047
3115
|
|
|
3048
3116
|
paths_mod = _load_user_global_paths_module()
|
|
@@ -3112,7 +3180,7 @@ def _write_per_tool_project_anchors(
|
|
|
3112
3180
|
|
|
3113
3181
|
- Skipped under ``AGENT_CONFIG_DEV_MODE=1``.
|
|
3114
3182
|
- Skipped inside the agent-config source repo
|
|
3115
|
-
(``.agent-src.
|
|
3183
|
+
(``.agent-src.uncondensed/`` present).
|
|
3116
3184
|
- Skipped when the tool is not in ``tools``.
|
|
3117
3185
|
|
|
3118
3186
|
Atomic write per file (temp file + ``os.replace``); ``0o644``
|
|
@@ -3124,7 +3192,7 @@ def _write_per_tool_project_anchors(
|
|
|
3124
3192
|
env_map = env if env is not None else os.environ
|
|
3125
3193
|
if env_map.get("AGENT_CONFIG_DEV_MODE") == "1":
|
|
3126
3194
|
return []
|
|
3127
|
-
if (project_root / ".agent-src.
|
|
3195
|
+
if (project_root / ".agent-src.uncondensed").is_dir():
|
|
3128
3196
|
return []
|
|
3129
3197
|
|
|
3130
3198
|
paths_mod = _load_user_global_paths_module()
|
|
@@ -3524,6 +3592,24 @@ def install_global(
|
|
|
3524
3592
|
package_root = _resolve_package_root_for_global()
|
|
3525
3593
|
deploy_results = _deploy_global_content(tools, force, package_root, written)
|
|
3526
3594
|
|
|
3595
|
+
# NDJSON progress for the wizard --apply-payload real-apply bridge. One
|
|
3596
|
+
# `file` frame per deployed tool unit (coarse, per AI-council 2026-05-27);
|
|
3597
|
+
# the GUI maps these to its SSE progress frames. No-op under normal CLI
|
|
3598
|
+
# installs (PROGRESS_NDJSON off). Emitted independent of QUIET because the
|
|
3599
|
+
# real-apply path sets QUIET=True to silence the human stream.
|
|
3600
|
+
if PROGRESS_NDJSON:
|
|
3601
|
+
ordered = sorted(deploy_results)
|
|
3602
|
+
total = len(ordered)
|
|
3603
|
+
for idx, tool_id in enumerate(ordered, start=1):
|
|
3604
|
+
w, _s, status, _ = deploy_results[tool_id]
|
|
3605
|
+
_emit_progress({
|
|
3606
|
+
"type": "file",
|
|
3607
|
+
"file": tool_id,
|
|
3608
|
+
"status": status,
|
|
3609
|
+
"written": idx,
|
|
3610
|
+
"total": total,
|
|
3611
|
+
})
|
|
3612
|
+
|
|
3527
3613
|
if not QUIET:
|
|
3528
3614
|
print()
|
|
3529
3615
|
info("Deployed per-tool content:")
|
|
@@ -3548,12 +3634,12 @@ def install_global(
|
|
|
3548
3634
|
# (ADR-008 Phase 3.2). Outside a project (e.g. plain `~/`) there is no
|
|
3549
3635
|
# manifest to write and the global lockfile alone is the source of truth.
|
|
3550
3636
|
# Skipped inside the agent-config source repo (detected by
|
|
3551
|
-
# `.agent-src.
|
|
3637
|
+
# `.agent-src.uncondensed/`) — maintainers dogfood with their own
|
|
3552
3638
|
# `.agent-settings.yml` and the manifest would be untracked noise.
|
|
3553
3639
|
if (
|
|
3554
3640
|
project_root is not None
|
|
3555
3641
|
and (project_root / SETTINGS_FILE).exists()
|
|
3556
|
-
and not (project_root / ".agent-src.
|
|
3642
|
+
and not (project_root / ".agent-src.uncondensed").is_dir()
|
|
3557
3643
|
):
|
|
3558
3644
|
# Collect deployed/marker paths per tool so the manifest records
|
|
3559
3645
|
# the v2 ``files[]`` inventory (P1.4).
|
|
@@ -3571,7 +3657,7 @@ def install_global(
|
|
|
3571
3657
|
# ``agents/.event4u-bridge.yml`` lets per-tool adapters locate
|
|
3572
3658
|
# the global root from inside the repo. Skipped in maintainer
|
|
3573
3659
|
# dev mode and in the source repo (see contract § Writer
|
|
3574
|
-
# contract; the surrounding ``.agent-src.
|
|
3660
|
+
# contract; the surrounding ``.agent-src.uncondensed`` guard
|
|
3575
3661
|
# already covers the source-repo case, the dev-mode skip is
|
|
3576
3662
|
# enforced inside the writer).
|
|
3577
3663
|
marker_path = _write_consumer_bridge_marker(project_root, installed_version)
|
|
@@ -3697,6 +3783,17 @@ def parse_options(argv: list[str]) -> argparse.Namespace:
|
|
|
3697
3783
|
"the comma-separated values are unioned. Default: all."
|
|
3698
3784
|
),
|
|
3699
3785
|
)
|
|
3786
|
+
parser.add_argument(
|
|
3787
|
+
"--packs",
|
|
3788
|
+
default=None,
|
|
3789
|
+
help=(
|
|
3790
|
+
"comma-separated pack IDs to record as the active selection in "
|
|
3791
|
+
".agent-settings.yml (project scope). Packs are a "
|
|
3792
|
+
"frontmatter/condense-time concept — recording the selection "
|
|
3793
|
+
"lets downstream condense/runtime honor it; install.py does not "
|
|
3794
|
+
"materialize packs. Default: none (base package only)."
|
|
3795
|
+
),
|
|
3796
|
+
)
|
|
3700
3797
|
parser.add_argument(
|
|
3701
3798
|
"--no-smoke",
|
|
3702
3799
|
action="store_true",
|
|
@@ -3794,7 +3891,7 @@ def parse_options(argv: list[str]) -> argparse.Namespace:
|
|
|
3794
3891
|
dest="apply_payload",
|
|
3795
3892
|
default=None,
|
|
3796
3893
|
help=(
|
|
3797
|
-
"path to a WizardApplyPayload JSON file (schemas/"
|
|
3894
|
+
"path to a WizardApplyPayload JSON file (internal/schemas/"
|
|
3798
3895
|
"wizard-apply-payload.schema.json). When supplied, install.py "
|
|
3799
3896
|
"reads the payload, validates schema_version, translates "
|
|
3800
3897
|
"tools/packs/settings into CLI equivalents, and dispatches "
|
|
@@ -3805,6 +3902,13 @@ def parse_options(argv: list[str]) -> argparse.Namespace:
|
|
|
3805
3902
|
)
|
|
3806
3903
|
opts = parser.parse_args(argv)
|
|
3807
3904
|
opts.tools = _merge_tools_aliases(opts.tools, opts.ai)
|
|
3905
|
+
# Normalize --packs (comma-separated string | None) to a list so the CLI
|
|
3906
|
+
# and the --apply-payload bridge agree on opts.packs being list[str].
|
|
3907
|
+
opts.packs = (
|
|
3908
|
+
[p.strip() for p in opts.packs.split(",") if p.strip()]
|
|
3909
|
+
if isinstance(opts.packs, str)
|
|
3910
|
+
else []
|
|
3911
|
+
)
|
|
3808
3912
|
if opts.scope == "global" and opts.custom_path:
|
|
3809
3913
|
fail("--custom-path is incompatible with --scope=global")
|
|
3810
3914
|
if opts.global_install and opts.custom_path:
|
|
@@ -4072,7 +4176,7 @@ _INTERACTIVE_STACKS: tuple[tuple[str, str], ...] = (
|
|
|
4072
4176
|
)
|
|
4073
4177
|
|
|
4074
4178
|
_INTERACTIVE_VERBOSITIES: tuple[tuple[str, str], ...] = (
|
|
4075
|
-
("quiet", "
|
|
4179
|
+
("quiet", "Telegraph / minimal output"),
|
|
4076
4180
|
("normal", "Default verbosity"),
|
|
4077
4181
|
("verbose", "Full intent announcements + play-by-play"),
|
|
4078
4182
|
)
|
|
@@ -4167,16 +4271,17 @@ def run_interactive_init(project_root: Path, force: bool) -> int:
|
|
|
4167
4271
|
# --- Wizard auto-launch (Phase 6 follow-up) ---
|
|
4168
4272
|
#
|
|
4169
4273
|
# Auto-launches the browser configuration wizard at the tail of a
|
|
4170
|
-
# successful install. The
|
|
4171
|
-
#
|
|
4274
|
+
# successful install. The unified CLI ships an `install` subcommand
|
|
4275
|
+
# (`dist/cli/agent-config.js`); this Python parent acts as a supervisor that:
|
|
4172
4276
|
#
|
|
4173
4277
|
# 1. evaluates gate conditions (TTY, CI, --no-ui, env override),
|
|
4174
4278
|
# 2. validates the dist exists,
|
|
4175
|
-
# 3. spawns `node <cli>
|
|
4279
|
+
# 3. spawns `node <cli> install --no-open --project-root <root>` via subprocess.Popen,
|
|
4176
4280
|
# 4. captures stderr on a background thread (for failure surfacing),
|
|
4177
4281
|
# 5. reads stdout line-by-line with a progressive timeout
|
|
4178
4282
|
# (10s → 20s → 40s → 80s) and matches the strict readiness regex
|
|
4179
|
-
# `^WIZARD_READY
|
|
4283
|
+
# `^WIZARD_READY (http://(?:127.0.0.1|localhost):\d+/\S*)\r?$`
|
|
4284
|
+
# (the CLI prints `WIZARD_READY <url>` where url carries `?token=…`),
|
|
4180
4285
|
# 6. on success: prints the URL banner and waits for the child to
|
|
4181
4286
|
# exit (Ctrl-C in the parent terminal propagates to the child),
|
|
4182
4287
|
# 7. on timeout: kills the child, prints captured stderr tail, falls
|
|
@@ -4186,7 +4291,7 @@ def run_interactive_init(project_root: Path, force: bool) -> int:
|
|
|
4186
4291
|
# Roadmap: agents/roadmaps/wizard-install-py-wiring.md Step 3.
|
|
4187
4292
|
|
|
4188
4293
|
_WIZARD_READY_RE = re.compile(
|
|
4189
|
-
r"^WIZARD_READY
|
|
4294
|
+
r"^WIZARD_READY (http://(?:127\.0\.0\.1|localhost):\d+/\S*)\r?$"
|
|
4190
4295
|
)
|
|
4191
4296
|
_WIZARD_TIMEOUTS = (10.0, 20.0, 40.0, 80.0) # cumulative budget 150s.
|
|
4192
4297
|
|
|
@@ -4195,8 +4300,8 @@ def _wizard_should_launch(opts: argparse.Namespace) -> tuple[bool, str]:
|
|
|
4195
4300
|
"""Evaluate gate conditions for the post-install wizard auto-launch.
|
|
4196
4301
|
|
|
4197
4302
|
Returns (decision, reason). When decision is False the reason
|
|
4198
|
-
string explains why (CI / no-tty / --no-ui / env override
|
|
4199
|
-
suitable for the pre-install banner Council Tier 2 § 8.
|
|
4303
|
+
string explains why (CI / no-tty / --no-ui / env override / explicit
|
|
4304
|
+
--tools) and is suitable for the pre-install banner Council Tier 2 § 8.
|
|
4200
4305
|
"""
|
|
4201
4306
|
if getattr(opts, "no_ui", False):
|
|
4202
4307
|
return (False, "--no-ui flag set")
|
|
@@ -4207,18 +4312,26 @@ def _wizard_should_launch(opts: argparse.Namespace) -> tuple[bool, str]:
|
|
|
4207
4312
|
return (False, "CI environment detected")
|
|
4208
4313
|
if not sys.stdout.isatty():
|
|
4209
4314
|
return (False, "stdout is not a TTY")
|
|
4315
|
+
# Explicit `--tools=<list>` means the caller already knows what to
|
|
4316
|
+
# install — run the non-interactive CLI install, don't open the GUI
|
|
4317
|
+
# (road-to-single-install-source-of-truth § Phase 4). The implicit/
|
|
4318
|
+
# explicit `all` default does NOT suppress the wizard.
|
|
4319
|
+
tools_raw = getattr(opts, "tools", None)
|
|
4320
|
+
if tools_raw and not _tools_was_all(tools_raw):
|
|
4321
|
+
return (False, "explicit --tools= selection (headless install)")
|
|
4210
4322
|
return (True, "")
|
|
4211
4323
|
|
|
4212
4324
|
|
|
4213
4325
|
def _wizard_cli_dist(project_root: Path) -> Path | None:
|
|
4214
|
-
"""Resolve the
|
|
4326
|
+
"""Resolve the unified CLI dist path. Returns None if not built.
|
|
4215
4327
|
|
|
4216
|
-
Walks up from this file (scripts/install.py is at <pkg>/scripts/)
|
|
4217
|
-
|
|
4218
|
-
|
|
4328
|
+
Walks up from this file (scripts/install.py is at <pkg>/scripts/) to
|
|
4329
|
+
<pkg>/dist/cli/agent-config.js — the published bin entry (package.json
|
|
4330
|
+
`bin`). The dead `packages/core/installer/dist/cli.js` layout was
|
|
4331
|
+
retired in road-to-single-install-source-of-truth § Phase 4.
|
|
4219
4332
|
"""
|
|
4220
4333
|
package_root = Path(__file__).resolve().parent.parent
|
|
4221
|
-
cli = package_root / "
|
|
4334
|
+
cli = package_root / "dist" / "cli" / "agent-config.js"
|
|
4222
4335
|
return cli if cli.exists() else None
|
|
4223
4336
|
|
|
4224
4337
|
|
|
@@ -4233,17 +4346,18 @@ def _wizard_spawn(project_root: Path) -> int:
|
|
|
4233
4346
|
cli = _wizard_cli_dist(project_root)
|
|
4234
4347
|
if cli is None:
|
|
4235
4348
|
print(
|
|
4236
|
-
"(Wizard not available —
|
|
4237
|
-
"Run 'npm run build'
|
|
4349
|
+
"(Wizard not available — CLI bundle not built. "
|
|
4350
|
+
"Run 'npm run build' at the package root to produce dist/cli/.)"
|
|
4238
4351
|
)
|
|
4239
4352
|
return 0
|
|
4240
4353
|
|
|
4241
|
-
|
|
4354
|
+
# Spawn the unified CLI's `install` subcommand (boots the UI server,
|
|
4355
|
+
# lands on Step 1 / AI tools). `--no-open` keeps the Python parent in
|
|
4356
|
+
# charge of the user-facing URL print (Tier 2 § 8 ordering) — the dead
|
|
4357
|
+
# `gui` subcommand + AGENT_CONFIG_GUI_NO_OPEN env were retired in
|
|
4358
|
+
# road-to-single-install-source-of-truth § Phase 4.
|
|
4359
|
+
cmd = ["node", str(cli), "install", "--no-open", "--project-root", str(project_root)]
|
|
4242
4360
|
env = os.environ.copy()
|
|
4243
|
-
# The Node child writes its own readiness banner; suppress the
|
|
4244
|
-
# browser-open inside the child so the Python parent stays in
|
|
4245
|
-
# charge of the user-facing URL print (Tier 2 § 8 ordering).
|
|
4246
|
-
env.setdefault("AGENT_CONFIG_GUI_NO_OPEN", "1")
|
|
4247
4361
|
|
|
4248
4362
|
try:
|
|
4249
4363
|
child = subprocess.Popen( # noqa: S603 - cmd is locally-built, not user input
|
|
@@ -4255,7 +4369,7 @@ def _wizard_spawn(project_root: Path) -> int:
|
|
|
4255
4369
|
bufsize=1, # line-buffered
|
|
4256
4370
|
)
|
|
4257
4371
|
except OSError as exc:
|
|
4258
|
-
print(f"(Wizard failed to start: {exc}; run 'node {cli}
|
|
4372
|
+
print(f"(Wizard failed to start: {exc}; run 'node {cli} install --no-open' manually.)")
|
|
4259
4373
|
return 0
|
|
4260
4374
|
|
|
4261
4375
|
# Drain stderr on a background thread so a chatty child can't
|
|
@@ -4327,7 +4441,7 @@ def _wizard_await_ready(
|
|
|
4327
4441
|
tail = "\n ".join(stderr_tail[-20:]) if stderr_tail else "(no stderr captured)"
|
|
4328
4442
|
print(
|
|
4329
4443
|
f"(Wizard server boot timed out after {int(sum(_WIZARD_TIMEOUTS))}s; "
|
|
4330
|
-
f"run 'node {cli}
|
|
4444
|
+
f"run 'node {cli} install --no-open' manually.)\n"
|
|
4331
4445
|
f" Last stderr:\n {tail}"
|
|
4332
4446
|
)
|
|
4333
4447
|
return 0
|
|
@@ -4445,10 +4559,9 @@ def main(argv: list[str]) -> int:
|
|
|
4445
4559
|
f"--apply-payload schema_version must be 'wizard-v2' or "
|
|
4446
4560
|
f"'installer-v1', got {schema_version!r}"
|
|
4447
4561
|
)
|
|
4448
|
-
# Translate payload → opts so the
|
|
4449
|
-
# downstream sees the
|
|
4450
|
-
#
|
|
4451
|
-
# follow-up minor (kill-switch via package version per D7).
|
|
4562
|
+
# Translate payload → opts so the SAME canonical install path
|
|
4563
|
+
# downstream sees the shape it would from CLI flags — no second
|
|
4564
|
+
# code path (road-to-single-install-source-of-truth § Phase 1).
|
|
4452
4565
|
if schema_version == "wizard-v2":
|
|
4453
4566
|
tools = payload.get("tools") or []
|
|
4454
4567
|
if isinstance(tools, list) and tools:
|
|
@@ -4457,6 +4570,36 @@ def main(argv: list[str]) -> int:
|
|
|
4457
4570
|
opts.scope = "project"
|
|
4458
4571
|
else:
|
|
4459
4572
|
opts.scope = "global"
|
|
4573
|
+
# settings{} → --profile / --user-type. `settings` is the
|
|
4574
|
+
# merged .agent-settings.yml body; pull the two install-time
|
|
4575
|
+
# knobs the canonical installer consumes. Everything else in
|
|
4576
|
+
# the settings body is written by the wizard `/finish` 2PC
|
|
4577
|
+
# commit, not by install.py.
|
|
4578
|
+
settings = payload.get("settings") or {}
|
|
4579
|
+
if isinstance(settings, dict):
|
|
4580
|
+
cost_profile = settings.get("cost_profile")
|
|
4581
|
+
if isinstance(cost_profile, str) and cost_profile:
|
|
4582
|
+
opts.profile = cost_profile
|
|
4583
|
+
personal = settings.get("personal")
|
|
4584
|
+
if isinstance(personal, dict):
|
|
4585
|
+
user_type = personal.get("user_type")
|
|
4586
|
+
if isinstance(user_type, str) and user_type:
|
|
4587
|
+
opts.user_type = user_type
|
|
4588
|
+
# packs[] → declarative selection persisted into
|
|
4589
|
+
# .agent-settings.yml on the project path (ensure_agent_settings).
|
|
4590
|
+
# Packs are a frontmatter/condense-time concept; there is no
|
|
4591
|
+
# install-time materialization — the selection is recorded so
|
|
4592
|
+
# downstream condense/runtime honors it (AI-council 2026-05-27).
|
|
4593
|
+
packs = payload.get("packs") or []
|
|
4594
|
+
if isinstance(packs, list):
|
|
4595
|
+
opts.packs = [p for p in packs if isinstance(p, str)]
|
|
4596
|
+
# Per-tool user-hook opts → ensure_*_hook flags: deliberately
|
|
4597
|
+
# NOT wired. The wizard-v2 payload carries no hook fields, and
|
|
4598
|
+
# auto-enabling user-scope hooks (which write to the global
|
|
4599
|
+
# user config) on tool selection would silently widen install
|
|
4600
|
+
# scope — a non-destructive-by-default violation. Maps only
|
|
4601
|
+
# once the schema grows an explicit hooks field (AI-council
|
|
4602
|
+
# 2026-05-27, Gemini + Codex converged).
|
|
4460
4603
|
elif schema_version == "installer-v1":
|
|
4461
4604
|
ai_tools = payload.get("ai_tools") or []
|
|
4462
4605
|
if isinstance(ai_tools, list) and ai_tools:
|
|
@@ -4466,13 +4609,13 @@ def main(argv: list[str]) -> int:
|
|
|
4466
4609
|
opts.dry_run = True
|
|
4467
4610
|
if opts.dry_run:
|
|
4468
4611
|
return _apply_payload_preview(payload, opts)
|
|
4469
|
-
# Real
|
|
4470
|
-
#
|
|
4471
|
-
#
|
|
4472
|
-
|
|
4473
|
-
|
|
4474
|
-
|
|
4475
|
-
|
|
4612
|
+
# Real apply: stream machine-readable NDJSON progress on stdout and
|
|
4613
|
+
# silence human output so the GUI gets a clean stream. Then fall
|
|
4614
|
+
# through to the canonical install path below — no separate apply
|
|
4615
|
+
# implementation.
|
|
4616
|
+
global PROGRESS_NDJSON
|
|
4617
|
+
PROGRESS_NDJSON = True
|
|
4618
|
+
QUIET = True
|
|
4476
4619
|
|
|
4477
4620
|
# --offline: propagate via env so child subprocesses (versions /
|
|
4478
4621
|
# update / check_update_banner) honor the air-gap guarantee
|
|
@@ -4561,7 +4704,9 @@ def main(argv: list[str]) -> int:
|
|
|
4561
4704
|
return rc
|
|
4562
4705
|
# Pass detect_root so the manifest refresh runs when --global is
|
|
4563
4706
|
# invoked from within a project tree (ADR-008 Phase 3.2).
|
|
4564
|
-
|
|
4707
|
+
rc = install_global(parsed_tools, opts.force, project_root=detect_root)
|
|
4708
|
+
_emit_progress_terminal(rc)
|
|
4709
|
+
return rc
|
|
4565
4710
|
|
|
4566
4711
|
project_root = custom_path or Path(opts.project or os.environ.get("PROJECT_ROOT") or os.getcwd()).resolve()
|
|
4567
4712
|
is_first_run = not (project_root / SETTINGS_FILE).exists()
|
|
@@ -4571,14 +4716,75 @@ def main(argv: list[str]) -> int:
|
|
|
4571
4716
|
# never ships ahead of the bridge files it parameterizes.
|
|
4572
4717
|
if rc == 0 and getattr(opts, "interactive", False):
|
|
4573
4718
|
run_interactive_init(project_root, opts.force)
|
|
4719
|
+
_emit_progress_terminal(rc)
|
|
4574
4720
|
return rc
|
|
4575
4721
|
except ConflictAbort as exc:
|
|
4576
4722
|
warn(exc.message)
|
|
4723
|
+
_emit_progress({"type": "error", "code": "E_CONFLICT_UNRESOLVED", "message": exc.message})
|
|
4577
4724
|
return 1
|
|
4578
4725
|
finally:
|
|
4579
4726
|
_set_conflict_policy(None)
|
|
4580
4727
|
|
|
4581
4728
|
|
|
4729
|
+
def _propose_modules_config(project_root: Path, is_first_run: bool) -> None:
|
|
4730
|
+
"""Surface module-root candidates as numbered options on first install.
|
|
4731
|
+
|
|
4732
|
+
Phase B Step 2 of road-to-configurable-modules. Hooks into the
|
|
4733
|
+
project-install path: when the install is first-run, the terminal
|
|
4734
|
+
is a TTY, ``.agent-project-settings.yml`` exists without a populated
|
|
4735
|
+
``modules:`` block, and the detection helper finds at least one
|
|
4736
|
+
candidate, the installer prints the proposed block and asks the
|
|
4737
|
+
user to paste it into the team file. No automatic write — the
|
|
4738
|
+
layered-settings contract treats ``.agent-project-settings.yml``
|
|
4739
|
+
as user-curated.
|
|
4740
|
+
|
|
4741
|
+
Gates (any miss → silent no-op):
|
|
4742
|
+
|
|
4743
|
+
* ``is_first_run`` must be True — re-runs never re-prompt.
|
|
4744
|
+
* stdin + stdout must be TTYs — non-interactive installs (CI,
|
|
4745
|
+
wizard apply-payload, ``--quiet``) skip silently.
|
|
4746
|
+
* ``QUIET`` must be False.
|
|
4747
|
+
* The detection helper must surface at least one candidate.
|
|
4748
|
+
"""
|
|
4749
|
+
if not is_first_run or QUIET or not sys.stdin.isatty() or not sys.stdout.isatty():
|
|
4750
|
+
return
|
|
4751
|
+
try:
|
|
4752
|
+
from scripts._lib.module_detection import detect_module_roots
|
|
4753
|
+
except ImportError:
|
|
4754
|
+
return
|
|
4755
|
+
try:
|
|
4756
|
+
candidates = detect_module_roots(project_root)
|
|
4757
|
+
except OSError:
|
|
4758
|
+
return
|
|
4759
|
+
if not candidates:
|
|
4760
|
+
return
|
|
4761
|
+
print()
|
|
4762
|
+
info("Module-root candidates detected — propose `modules:` block")
|
|
4763
|
+
info(
|
|
4764
|
+
"Paste into .agent-project-settings.yml to enable module-aware "
|
|
4765
|
+
"skills (or skip; the block stays opt-in)."
|
|
4766
|
+
)
|
|
4767
|
+
print()
|
|
4768
|
+
print(" modules:")
|
|
4769
|
+
print(" enabled: true")
|
|
4770
|
+
print(
|
|
4771
|
+
" root_paths: [" + ", ".join(c.path for c in candidates) + "]"
|
|
4772
|
+
)
|
|
4773
|
+
primary_ns = next(
|
|
4774
|
+
(c.namespace_template_guess for c in candidates if c.namespace_template_guess),
|
|
4775
|
+
"",
|
|
4776
|
+
)
|
|
4777
|
+
if primary_ns:
|
|
4778
|
+
print(f" namespace_template: '{primary_ns}'")
|
|
4779
|
+
print(" agent_folder: agents")
|
|
4780
|
+
print(" skip_dirs: [.module-template, .example]")
|
|
4781
|
+
print()
|
|
4782
|
+
info(
|
|
4783
|
+
"Re-run anytime via `python3 scripts/propose_modules_config.py` "
|
|
4784
|
+
"(installed under <package>/scripts/)."
|
|
4785
|
+
)
|
|
4786
|
+
|
|
4787
|
+
|
|
4582
4788
|
def _main_project_install(
|
|
4583
4789
|
opts: argparse.Namespace,
|
|
4584
4790
|
project_root: Path,
|
|
@@ -4611,7 +4817,8 @@ def _main_project_install(
|
|
|
4611
4817
|
print()
|
|
4612
4818
|
|
|
4613
4819
|
ensure_agent_settings(
|
|
4614
|
-
project_root, package_root, opts.profile, opts.force, opts.user_type
|
|
4820
|
+
project_root, package_root, opts.profile, opts.force, opts.user_type,
|
|
4821
|
+
packs=getattr(opts, "packs", None),
|
|
4615
4822
|
)
|
|
4616
4823
|
|
|
4617
4824
|
# Install-mode marker (Step 8 A5) — full path flips any prior
|
|
@@ -4686,6 +4893,21 @@ def _main_project_install(
|
|
|
4686
4893
|
ensure_gemini_user_hooks(package_root, opts.force),
|
|
4687
4894
|
)
|
|
4688
4895
|
|
|
4896
|
+
# NDJSON progress for the wizard --apply-payload real-apply bridge on the
|
|
4897
|
+
# project scope (scope_to_project_only=true). One `file` frame per enabled
|
|
4898
|
+
# tool unit, coarse per AI-council 2026-05-27. No-op under normal CLI.
|
|
4899
|
+
if PROGRESS_NDJSON and not opts.skip_bridges:
|
|
4900
|
+
ordered = sorted(tools)
|
|
4901
|
+
total = len(ordered)
|
|
4902
|
+
for idx, tool_id in enumerate(ordered, start=1):
|
|
4903
|
+
_emit_progress({
|
|
4904
|
+
"type": "file",
|
|
4905
|
+
"file": tool_id,
|
|
4906
|
+
"status": "deployed",
|
|
4907
|
+
"written": idx,
|
|
4908
|
+
"total": total,
|
|
4909
|
+
})
|
|
4910
|
+
|
|
4689
4911
|
if not opts.skip_bridges and not opts.no_smoke:
|
|
4690
4912
|
if not QUIET:
|
|
4691
4913
|
print()
|
|
@@ -4728,6 +4950,12 @@ def _main_project_install(
|
|
|
4728
4950
|
print(" Re-run complete. Walkthrough: https://github.com/event4u-app/agent-config/blob/main/docs/getting-started.md")
|
|
4729
4951
|
print()
|
|
4730
4952
|
|
|
4953
|
+
# Module-root proposal (road-to-configurable-modules Phase B Step 2).
|
|
4954
|
+
# First-run TTY installs surface detected `modules:` candidates so
|
|
4955
|
+
# the user can paste an opt-in block into .agent-project-settings.yml.
|
|
4956
|
+
# Silent no-op on re-runs, CI, --quiet, and wizard apply-payload runs.
|
|
4957
|
+
_propose_modules_config(project_root, is_first_run)
|
|
4958
|
+
|
|
4731
4959
|
# Wizard auto-launch (Phase 6 follow-up). Runs after the success
|
|
4732
4960
|
# banner so the user sees install completion even if the wizard
|
|
4733
4961
|
# boot times out. Gate was already evaluated at the top of main()
|