@event4u/agent-config 9.9.0 → 9.10.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/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +153 -194
- package/README.md +1 -1
- package/dist/agent-src/commands/agent-status.md +12 -11
- package/dist/agent-src/commands/agents/user/accept.md +115 -30
- package/dist/agent-src/commands/agents/user/delete.md +147 -0
- package/dist/agent-src/commands/agents/user/review.md +65 -28
- package/dist/agent-src/commands/agents/user/show.md +82 -29
- package/dist/agent-src/commands/agents/user/update.md +2 -2
- package/dist/agent-src/commands/agents/user.md +16 -3
- package/dist/agent-src/commands/check-current-md.md +0 -10
- package/dist/agent-src/commands/condense.md +28 -97
- package/dist/agent-src/commands/cost/report.md +7 -0
- package/dist/agent-src/commands/fix/portability.md +0 -8
- package/dist/agent-src/commands/fix/refs.md +0 -8
- package/dist/agent-src/commands/humanize.md +2 -2
- package/dist/agent-src/commands/jira-ticket.md +1 -1
- package/dist/agent-src/commands/memory/load.md +11 -0
- package/dist/agent-src/commands/optimize/skills.md +1 -1
- package/dist/agent-src/commands/pr/create.md +4 -4
- package/dist/agent-src/commands/profile/show.md +3 -3
- package/dist/agent-src/commands/rule-compliance-audit.md +5 -4
- package/dist/agent-src/commands/security-audit-config.md +1 -1
- package/dist/agent-src/commands/sync/gitignore/fix.md +1 -1
- package/dist/agent-src/commands/tdd.md +21 -0
- package/dist/agent-src/commands/team/delegate.md +2 -2
- package/dist/agent-src/commands/team-knowledge/bootstrap.md +9 -8
- package/dist/agent-src/commands/team-knowledge/consolidate.md +8 -7
- package/dist/agent-src/commands/team.md +4 -1
- package/dist/agent-src/commands/upstream-contribute.md +0 -1
- package/dist/agent-src/contexts/authority/commit-mechanics.md +7 -0
- package/dist/agent-src/contexts/authority/destructive-mechanics.md +16 -0
- package/dist/agent-src/contexts/authority/scope-mechanics.md +61 -0
- package/dist/agent-src/contexts/communication/rules-auto/reply-close-mechanics.md +20 -18
- package/dist/agent-src/contexts/communication/rules-auto/skill-quality-mechanics.md +1 -1
- package/dist/agent-src/contexts/communication/rules-auto/slash-command-routing-policy-mechanics.md +1 -1
- package/dist/agent-src/contexts/communication/rules-auto/source-of-truth-mechanics.md +9 -10
- package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +1 -1
- package/dist/agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +11 -0
- package/dist/agent-src/contexts/contracts/artifact-engagement-flow.md +26 -15
- package/dist/agent-src/contexts/contracts/command-suggestion-flow.md +3 -0
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +67 -37
- package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +1 -1
- package/dist/agent-src/contexts/execution/autonomy-examples.md +1 -1
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +7 -6
- package/dist/agent-src/contexts/execution/evidence-discipline.md +92 -77
- package/dist/agent-src/contexts/execution/orchestration-benchmark-gate.md +22 -21
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +24 -0
- package/dist/agent-src/contexts/execution/project-intelligence.md +122 -103
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +23 -21
- package/dist/agent-src/contexts/execution/subagent-response-contract.md +5 -5
- package/dist/agent-src/contexts/execution/subagent-routing.md +11 -0
- package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +13 -13
- package/dist/agent-src/contexts/execution/subagent-steering.md +36 -34
- package/dist/agent-src/contexts/execution/toolchain-resolver.md +1 -1
- package/dist/agent-src/contexts/execution/user-memory-channels.md +189 -0
- package/dist/agent-src/contexts/execution/verification-mechanics.md +9 -0
- package/dist/agent-src/contexts/model-recommendations.md +3 -2
- package/dist/agent-src/contexts/subagent-configuration.md +3 -3
- package/dist/agent-src/ghostwriter/README.md +2 -2
- package/dist/agent-src/packs/README.md +1 -1
- package/dist/agent-src/personas/README.md +5 -5
- package/dist/agent-src/personas/_template-specialist/persona.md +3 -3
- package/dist/agent-src/personas/backend-architect.md +24 -23
- package/dist/agent-src/personas/eloquent-tamer.md +30 -30
- package/dist/agent-src/personas/frontend-engineer.md +30 -30
- package/dist/agent-src/personas/product-owner.md +41 -38
- package/dist/agent-src/personas/qa.md +13 -13
- package/dist/agent-src/personas/security-engineer.md +22 -22
- package/dist/agent-src/presets/README.md +3 -3
- package/dist/agent-src/profiles/README.md +3 -3
- package/dist/agent-src/rules/active-remediation.md +2 -2
- package/dist/agent-src/rules/artifact-engagement-recording.md +4 -4
- package/dist/agent-src/rules/ask-when-uncertain.md +0 -4
- package/dist/agent-src/rules/augment-edit-discipline.md +1 -1
- package/dist/agent-src/rules/broken-access-control.md +4 -4
- package/dist/agent-src/rules/code-comment-discipline.md +1 -1
- package/dist/agent-src/rules/code-provenance.md +2 -2
- package/dist/agent-src/rules/commit-policy.md +4 -9
- package/dist/agent-src/rules/communication-through-line.md +5 -5
- package/dist/agent-src/rules/decision-revisit-gate.md +1 -1
- package/dist/agent-src/rules/doc-screenshot-hygiene.md +1 -1
- package/dist/agent-src/rules/domain-adoption-policy.md +1 -1
- package/dist/agent-src/rules/domain-safety-pii.md +1 -1
- package/dist/agent-src/rules/external-code-graph-interop.md +1 -1
- package/dist/agent-src/rules/fast-path-marker-visibility.md +43 -7
- package/dist/agent-src/rules/finance-safety-floor.md +1 -1
- package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +3 -3
- package/dist/agent-src/rules/history-discipline.md +1 -1
- package/dist/agent-src/rules/legal-safety-floor.md +1 -1
- package/dist/agent-src/rules/lethal-trifecta-guard.md +5 -5
- package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +10 -8
- package/dist/agent-src/rules/media-governance-routing.md +13 -13
- package/dist/agent-src/rules/media-sync-ground-truth.md +29 -11
- package/dist/agent-src/rules/no-cheap-questions.md +7 -7
- package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +29 -18
- package/dist/agent-src/rules/non-destructive-by-default.md +5 -23
- package/dist/agent-src/rules/onboarding-gate.md +14 -4
- package/dist/agent-src/rules/persona-governance.md +2 -2
- package/dist/agent-src/rules/prefer-enums-over-literals.md +9 -9
- package/dist/agent-src/rules/preservation-guard.md +10 -2
- package/dist/agent-src/rules/question-not-instruction.md +1 -1
- package/dist/agent-src/rules/roadmap-progress-sync.md +6 -6
- package/dist/agent-src/rules/rule-type-governance.md +1 -1
- package/dist/agent-src/rules/scale-discipline.md +1 -1
- package/dist/agent-src/rules/scope-control.md +1 -1
- package/dist/agent-src/rules/secret-vcs-guard.md +1 -1
- package/dist/agent-src/rules/security-sensitive-stop.md +17 -11
- package/dist/agent-src/rules/senior-engineering-discipline.md +17 -17
- package/dist/agent-src/rules/session-canary.md +1 -1
- package/dist/agent-src/rules/skill-quality.md +1 -1
- package/dist/agent-src/rules/source-confidentiality.md +21 -19
- package/dist/agent-src/rules/source-of-truth.md +6 -5
- package/dist/agent-src/rules/spreadsheet-source-quality.md +2 -2
- package/dist/agent-src/rules/strategy-safety-floor.md +1 -1
- package/dist/agent-src/rules/think-before-action.md +5 -5
- package/dist/agent-src/rules/token-budget-discipline.md +5 -3
- package/dist/agent-src/rules/token-efficiency.md +2 -2
- package/dist/agent-src/rules/untrusted-input-defense.md +4 -4
- package/dist/agent-src/rules/user-interaction.md +12 -0
- package/dist/agent-src/rules/verify-before-complete.md +4 -24
- package/dist/agent-src/skills/adversarial-review/SKILL.md +2 -2
- package/dist/agent-src/skills/agent-security-review/SKILL.md +52 -45
- package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +2 -2
- package/dist/agent-src/skills/ai-code-blindspots/SKILL.md +20 -20
- package/dist/agent-src/skills/ai-council/SKILL.md +185 -128
- package/dist/agent-src/skills/analysis-skill-router/SKILL.md +3 -3
- package/dist/agent-src/skills/api-endpoint/SKILL.md +2 -2
- package/dist/agent-src/skills/artisan-commands/SKILL.md +2 -2
- package/dist/agent-src/skills/async-python-patterns/SKILL.md +8 -7
- package/dist/agent-src/skills/authz-review/SKILL.md +16 -15
- package/dist/agent-src/skills/aws-infrastructure/SKILL.md +5 -5
- package/dist/agent-src/skills/blade-ui/SKILL.md +1 -1
- package/dist/agent-src/skills/bug-analyzer/SKILL.md +30 -12
- package/dist/agent-src/skills/code-intelligence/SKILL.md +0 -1
- package/dist/agent-src/skills/code-intelligence/evals/triggers.json +52 -0
- package/dist/agent-src/skills/code-review/SKILL.md +6 -6
- package/dist/agent-src/skills/command-routing/SKILL.md +5 -4
- package/dist/agent-src/skills/composer-packages/SKILL.md +2 -2
- package/dist/agent-src/skills/condense-memory/SKILL.md +43 -41
- package/dist/agent-src/skills/context-document/SKILL.md +23 -21
- package/dist/agent-src/skills/copilot-config/SKILL.md +6 -1
- package/dist/agent-src/skills/decision-record/SKILL.md +20 -18
- package/dist/agent-src/skills/design-intelligence/SKILL.md +4 -4
- package/dist/agent-src/skills/design-review/SKILL.md +15 -14
- package/dist/agent-src/skills/design-system-capture/reference/design-system-json.md +28 -25
- package/dist/agent-src/skills/devcontainer/SKILL.md +2 -2
- package/dist/agent-src/skills/docker/SKILL.md +1 -1
- package/dist/agent-src/skills/docx-authoring/evals/triggers.json +52 -0
- package/dist/agent-src/skills/emit-tickets/SKILL.md +2 -2
- package/dist/agent-src/skills/error-handling-patterns/SKILL.md +1 -1
- package/dist/agent-src/skills/estimate-ticket/SKILL.md +2 -2
- package/dist/agent-src/skills/evaluate-llm-feature/SKILL.md +0 -1
- package/dist/agent-src/skills/evaluate-llm-feature/evals/triggers.json +52 -0
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +6 -5
- package/dist/agent-src/skills/feature-planning/SKILL.md +2 -2
- package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +3 -3
- package/dist/agent-src/skills/flux/SKILL.md +1 -1
- package/dist/agent-src/skills/frontend-render-security/SKILL.md +13 -13
- package/dist/agent-src/skills/git-workflow/SKILL.md +33 -33
- package/dist/agent-src/skills/grafana/SKILL.md +5 -0
- package/dist/agent-src/skills/humanizer/SKILL.md +83 -66
- package/dist/agent-src/skills/humanizer/data/patterns.md +14 -14
- package/dist/agent-src/skills/humanizer/references/anti-aiisms.md +4 -4
- package/dist/agent-src/skills/judge-artifact-completeness/SKILL.md +82 -37
- package/dist/agent-src/skills/judge-bug-hunter/SKILL.md +17 -5
- package/dist/agent-src/skills/judge-injection-defense/SKILL.md +63 -25
- package/dist/agent-src/skills/judge-security-auditor/SKILL.md +2 -0
- package/dist/agent-src/skills/judge-synthesis/SKILL.md +72 -28
- package/dist/agent-src/skills/laravel-horizon/SKILL.md +5 -0
- package/dist/agent-src/skills/laravel-mail/SKILL.md +5 -4
- package/dist/agent-src/skills/laravel-middleware/SKILL.md +5 -4
- package/dist/agent-src/skills/laravel-notifications/SKILL.md +10 -9
- package/dist/agent-src/skills/laravel-pennant/SKILL.md +1 -1
- package/dist/agent-src/skills/laravel-pulse/SKILL.md +9 -8
- package/dist/agent-src/skills/laravel-reverb/SKILL.md +6 -5
- package/dist/agent-src/skills/laravel-scheduling/SKILL.md +6 -1
- package/dist/agent-src/skills/laravel-validation/SKILL.md +12 -0
- package/dist/agent-src/skills/launch-readiness/SKILL.md +1 -1
- package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +7 -7
- package/dist/agent-src/skills/learning-tutor/SKILL.md +44 -43
- package/dist/agent-src/skills/learning-tutor/evals/triggers.json +52 -0
- package/dist/agent-src/skills/license-compliance-audit/SKILL.md +7 -7
- package/dist/agent-src/skills/license-compliance-borrow-check/SKILL.md +3 -3
- package/dist/agent-src/skills/license-compliance-credits/SKILL.md +4 -4
- package/dist/agent-src/skills/llm-provider-knowledge/SKILL.md +0 -1
- package/dist/agent-src/skills/memory-consolidation/SKILL.md +69 -64
- package/dist/agent-src/skills/motion-choreographer/SKILL.md +6 -6
- package/dist/agent-src/skills/pdf-tools/evals/triggers.json +52 -0
- package/dist/agent-src/skills/performance-analysis/SKILL.md +7 -3
- package/dist/agent-src/skills/persona-improvement/SKILL.md +0 -2
- package/dist/agent-src/skills/persona-improvement/evals/triggers.json +52 -0
- package/dist/agent-src/skills/php-coder/SKILL.md +10 -0
- package/dist/agent-src/skills/prediction-pool-optimizer/SKILL.md +129 -120
- package/dist/agent-src/skills/prediction-pool-optimizer/reference/ev-fixtures.md +36 -35
- package/dist/agent-src/skills/prediction-pool-optimizer/reference/odds-and-bonus.md +45 -41
- package/dist/agent-src/skills/project-analysis-core/SKILL.md +4 -4
- package/dist/agent-src/skills/project-analysis-hypothesis-driven/SKILL.md +3 -3
- package/dist/agent-src/skills/project-analysis-react/SKILL.md +1 -1
- package/dist/agent-src/skills/project-analysis-symfony/SKILL.md +1 -1
- package/dist/agent-src/skills/project-analysis-zend-laminas/SKILL.md +2 -2
- package/dist/agent-src/skills/prompt-engineering-patterns/SKILL.md +1 -1
- package/dist/agent-src/skills/prompt-validator/SKILL.md +39 -39
- package/dist/agent-src/skills/quality-tools/SKILL.md +15 -15
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +55 -19
- package/dist/agent-src/skills/react-shadcn-ui/reference/registry.md +29 -27
- package/dist/agent-src/skills/readme-writing-package/SKILL.md +2 -2
- package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +25 -25
- package/dist/agent-src/skills/recursive-verification/SKILL.md +6 -5
- package/dist/agent-src/skills/refine-prompt/SKILL.md +1 -1
- package/dist/agent-src/skills/refine-ticket/SKILL.md +20 -2
- package/dist/agent-src/skills/repomix-packer/SKILL.md +1 -1
- package/dist/agent-src/skills/requesting-code-review/SKILL.md +2 -2
- package/dist/agent-src/skills/roadmap-management/SKILL.md +80 -66
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +84 -77
- package/dist/agent-src/skills/rule-refactor/SKILL.md +1 -1
- package/dist/agent-src/skills/screenshot-hygiene/evals/triggers.json +52 -0
- package/dist/agent-src/skills/security-audit/SKILL.md +26 -9
- package/dist/agent-src/skills/security-maturity-assessment/SKILL.md +38 -16
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +14 -11
- package/dist/agent-src/skills/skill-writing/SKILL.md +9 -8
- package/dist/agent-src/skills/song-to-script/SKILL.md +93 -85
- package/dist/agent-src/skills/sql-writing/SKILL.md +2 -2
- package/dist/agent-src/skills/stakeholder-tradeoff/SKILL.md +4 -3
- package/dist/agent-src/skills/standards-from-config/SKILL.md +61 -43
- package/dist/agent-src/skills/subagent-orchestration/SKILL.md +22 -8
- package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +28 -2
- package/dist/agent-src/skills/supply-chain-intake/SKILL.md +13 -13
- package/dist/agent-src/skills/systematic-debugging/SKILL.md +22 -21
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +1 -1
- package/dist/agent-src/skills/technical-specification/SKILL.md +5 -0
- package/dist/agent-src/skills/terraform/SKILL.md +2 -2
- package/dist/agent-src/skills/terragrunt/SKILL.md +8 -8
- package/dist/agent-src/skills/testing-anti-patterns/process-anti-patterns.md +1 -1
- package/dist/agent-src/skills/threat-modeling/SKILL.md +19 -13
- package/dist/agent-src/skills/universal-project-analysis/SKILL.md +1 -1
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +0 -1
- package/dist/agent-src/skills/using-git-worktrees/SKILL.md +9 -9
- package/dist/agent-src/skills/validate-feature-fit/SKILL.md +3 -1
- package/dist/agent-src/skills/verify-completion-evidence/SKILL.md +4 -6
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +67 -61
- package/dist/agent-src/skills/video-director/SKILL.md +7 -7
- package/dist/agent-src/skills/worktree-lifecycle/SKILL.md +3 -3
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/contexts/knowledge-pages.md +47 -45
- package/dist/agent-src/templates/contexts/lesson-card.md +2 -2
- package/dist/agent-src/templates/contexts/tenant-boundaries.md +2 -2
- package/dist/agent-src/templates/contexts.md +1 -1
- package/dist/agent-src/templates/features.md +1 -1
- package/dist/agent-src/templates/roadmaps.md +125 -116
- package/dist/agent-src/templates/rule.md +2 -1
- package/dist/agent-src/templates/scripts/pr_risk_review.ts +0 -0
- package/dist/agent-src/templates/scripts/telemetry/aggregator.ts +0 -0
- package/dist/agent-src/templates/scripts/tier_usage_report.ts +2 -2
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +2 -2
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/review.ts +1 -1
- package/dist/agent-src/user-types/README.md +8 -8
- package/dist/agent-src/user-types/galabau-field-crew.md +34 -33
- package/dist/agent-src/user-types/metalworking-shop.md +35 -34
- package/dist/agent-src/user-types/truck-driver.md +22 -20
- package/dist/cli/python/workspace_roles.js +2 -2
- package/dist/cli/python/workspace_roles.js.map +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +88 -62
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +3 -3
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +6 -5
- package/dist/discovery/trust-report.md +2 -2
- package/dist/discovery/workspaces.json +5 -4
- package/dist/hooks/dispatch.js +186 -12
- package/dist/install/install.mjs +8 -0
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +1199 -857
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/compile_time_toggles.js +48 -0
- package/dist/scripts/_lib/compile_time_toggles.js.map +1 -0
- package/dist/scripts/condense.js +234 -217
- package/dist/scripts/condense.js.map +1 -1
- package/dist/server/schemas/settings.js +4 -0
- package/dist/server/schemas/settings.js.map +1 -1
- package/dist/shared/userMd/utils.js +30 -0
- package/dist/shared/userMd/utils.js.map +1 -1
- package/dist/ui/assets/index-BpSQt5vm.js.map +1 -1
- package/docs/guidelines/agent-infra/api-cost-levers.md +56 -5
- package/docs/guidelines/agent-infra/simplicity-and-goal-demos.md +93 -33
- package/package.json +1 -1
- package/src/agent-src/templates/scripts/pr_risk_review.ts +0 -0
- package/src/agent-src/templates/scripts/telemetry/aggregator.ts +0 -0
- package/src/agent-src/templates/scripts/tier_usage_report.ts +2 -2
- package/src/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +2 -2
- package/src/agent-src/templates/scripts/work_engine/directives/ui/review.ts +1 -1
- package/src/config/agent-settings.template.yml +32 -2
- package/src/config/ci-local-parity.yml +142 -0
- package/src/config/gate-coverage.yml +127 -0
- package/src/config/preamble-payload-budget.json +44 -0
- package/src/scripts/_cli/cmd_doctor.ts +78 -2
- package/src/scripts/_lib/agent_user_profile.ts +381 -0
- package/src/scripts/_lib/agents_overlay.ts +9 -0
- package/src/scripts/_lib/anchor_eval.ts +311 -0
- package/src/scripts/_lib/cc_transcript.ts +316 -0
- package/src/scripts/_lib/compile_time_toggles.ts +79 -0
- package/src/scripts/_lib/confusables.ts +101 -0
- package/src/scripts/_lib/duplicate_scope_census.ts +77 -0
- package/src/scripts/_lib/managed_agents_folder.ts +181 -0
- package/src/scripts/_lib/payload_hash_drift.ts +126 -0
- package/src/scripts/_lib/preservation_migration.ts +291 -0
- package/src/scripts/_lib/retrieval_sanitize.ts +166 -2
- package/src/scripts/_lib/scan_scope.ts +115 -0
- package/src/scripts/_lib/user_global_memory_audit.ts +187 -0
- package/src/scripts/_lib/user_global_observations.ts +830 -0
- package/src/scripts/_lib/user_global_revocations.ts +110 -0
- package/src/scripts/_lib/user_memory_gate_counters.ts +291 -0
- package/src/scripts/ai_council/blind_review.ts +0 -0
- package/src/scripts/ai_council/budget_guard.ts +90 -11
- package/src/scripts/ai_council/bundler.ts +2 -2
- package/src/scripts/ai_council/clients.ts +59 -3
- package/src/scripts/ai_council/config.ts +38 -0
- package/src/scripts/ai_council/orchestrator.ts +54 -9
- package/src/scripts/ai_team/team_dispatch.ts +17 -6
- package/src/scripts/anchor_eval_falsify.ts +198 -0
- package/src/scripts/anchor_scoring_run.ts +239 -0
- package/src/scripts/annotate_discovery.ts +1 -65
- package/src/scripts/bench_quality_run.ts +168 -4
- package/src/scripts/cache_realization_report.ts +782 -0
- package/src/scripts/check_artefact_count_messaging.ts +5 -1
- package/src/scripts/check_augment_description_cap.ts +15 -4
- package/src/scripts/check_ci_local_parity.ts +317 -0
- package/src/scripts/check_condensation.ts +96 -191
- package/src/scripts/check_context_paths.ts +38 -9
- package/src/scripts/check_gate_coverage.ts +299 -0
- package/src/scripts/check_iron_law_prominence.ts +22 -1
- package/src/scripts/check_kernel_prefix_stability.ts +0 -0
- package/src/scripts/check_no_new_legacy_path.ts +16 -6
- package/src/scripts/check_no_roadmap_refs.ts +22 -9
- package/src/scripts/check_originality_freshness.ts +167 -0
- package/src/scripts/check_preamble_payload_budget.ts +130 -0
- package/src/scripts/check_proposal.ts +0 -0
- package/src/scripts/check_references.ts +0 -1
- package/src/scripts/check_safety_floor_untouched.ts +171 -24
- package/src/scripts/check_site_links.ts +62 -3
- package/src/scripts/ci_status.ts +0 -0
- package/src/scripts/cluster_near_miss_patterns.ts +0 -0
- package/src/scripts/code_graph/build.ts +0 -0
- package/src/scripts/command_suggester/types.ts +0 -0
- package/src/scripts/compile_router.ts +10 -14
- package/src/scripts/condense.sh +3 -4
- package/src/scripts/condense.ts +247 -228
- package/src/scripts/cost/track.mjs +168 -33
- package/src/scripts/cost_summary.ts +33 -1
- package/src/scripts/council_cli.ts +45 -3
- package/src/scripts/discovery_graph.ts +0 -0
- package/src/scripts/encoding_corpus.ts +500 -0
- package/src/scripts/encoding_corpus_report.ts +216 -0
- package/src/scripts/generate_index.ts +19 -2
- package/src/scripts/install-hooks.sh +2 -2
- package/src/scripts/learning_sidecar.ts +0 -0
- package/src/scripts/lint_confusables.ts +10 -72
- package/src/scripts/lint_featured_skills.ts +0 -0
- package/src/scripts/lint_hidden_unicode.ts +208 -0
- package/src/scripts/lint_load_context.ts +17 -5
- package/src/scripts/lint_new_skill_gate.ts +9 -3
- package/src/scripts/lint_no_python_twin_rationale.ts +17 -2
- package/src/scripts/lint_originality.ts +1 -1
- package/src/scripts/lint_skill_originality.ts +1 -1
- package/src/scripts/lint_ticket_buildable.ts +1 -1
- package/src/scripts/mcp_server/tools.ts +4 -4
- package/src/scripts/measure_scope_dedup.ts +224 -0
- package/src/scripts/memory_lookup.ts +0 -0
- package/src/scripts/mine_session.ts +98 -0
- package/src/scripts/orchestration_payload_hash_drift.ts +145 -0
- package/src/scripts/preamble_byte_census.ts +574 -0
- package/src/scripts/probe_skill_registration.ts +2 -2
- package/src/scripts/redact_hook_capture.ts +13 -0
- package/src/scripts/release.ts +65 -10
- package/src/scripts/router_telemetry.ts +1 -1
- package/src/scripts/second_brain_retrieval.ts +14 -4
- package/src/scripts/skill_linter.ts +5 -0
- package/src/scripts/surface-tiers.yml +2 -0
- package/src/scripts/validate_pack_yaml.ts +0 -0
- package/src/server/schemas/settings.ts +8 -0
- package/src/shared/userMd/utils.ts +31 -0
- package/dist/agent-src/rules/telegraph-speak.md +0 -87
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Two-layer cascade for the user-persona profile (ADR-138,
|
|
4
|
+
* road-to-global-user-memory Phase 1 — read path only).
|
|
5
|
+
*
|
|
6
|
+
* Layers, weakest first:
|
|
7
|
+
*
|
|
8
|
+
* 1. Global — `~/.event4u/agent-config/user/profile.md` (this package's
|
|
9
|
+
* vendor-namespaced root; `$EVENT4U_CONFIG_HOME` override honoured,
|
|
10
|
+
* legacy `~/.config/agent-config/` read as a fallback — see
|
|
11
|
+
* `user_global_paths.ts`).
|
|
12
|
+
* 2. Project — `.agent-user.md` at the project root (unchanged; the sole
|
|
13
|
+
* layer before this phase — see `docs/contracts/agent-user-schema.md`).
|
|
14
|
+
*
|
|
15
|
+
* Merge rule: the authoring discipline is DISJOINT FIELDS (global owns
|
|
16
|
+
* durable identity/style, project owns project-specific addenda). The
|
|
17
|
+
* mechanism for when a field is declared in both anyway is
|
|
18
|
+
* PRIMITIVE-LEVEL DEEPEST-WINS — the project value replaces the global
|
|
19
|
+
* value outright, never an object/array merge. `notes` is the one
|
|
20
|
+
* exception: both layers' text is concatenated under `[global]` /
|
|
21
|
+
* `[project]` markers so neither voice is dropped.
|
|
22
|
+
*
|
|
23
|
+
* The 100-line cap (`docs/contracts/agent-user-schema.md`) applies PER
|
|
24
|
+
* LAYER, never as a shared total — a shared cap would force deleting
|
|
25
|
+
* global identity to make room for project context.
|
|
26
|
+
*
|
|
27
|
+
* Parsing reuses `parseLegacyUserMd` from `shared/userMd/utils.ts` — the
|
|
28
|
+
* same fenced-frontmatter-plus-body parser the wizard's legacy-read path
|
|
29
|
+
* already uses for `.agent-user.md`, so both layers are read identically.
|
|
30
|
+
*
|
|
31
|
+
* Pure, read-only. Never writes, never creates directories.
|
|
32
|
+
*/
|
|
33
|
+
import * as fs from 'node:fs';
|
|
34
|
+
import * as path from 'node:path';
|
|
35
|
+
|
|
36
|
+
import { composeLegacyUserMd, parseLegacyUserMd } from '../../shared/userMd/utils.js';
|
|
37
|
+
import * as revocations from './user_global_revocations.js';
|
|
38
|
+
import type { RevocationEntry } from './user_global_revocations.js';
|
|
39
|
+
import * as user_global_paths from './user_global_paths.js';
|
|
40
|
+
import { recordObservationAccepted } from './user_memory_gate_counters.js';
|
|
41
|
+
|
|
42
|
+
/** Relative-to-root path of the global profile (weakest layer). */
|
|
43
|
+
export const GLOBAL_PROFILE_RELATIVE = path.join('user', 'profile.md');
|
|
44
|
+
|
|
45
|
+
/** Hard cap, enforced per layer independently (see module docstring). */
|
|
46
|
+
export const USER_PROFILE_LINE_CAP = 100;
|
|
47
|
+
|
|
48
|
+
export type ProfileSource = 'global' | 'project';
|
|
49
|
+
|
|
50
|
+
export interface UserProfileLayer {
|
|
51
|
+
source: ProfileSource;
|
|
52
|
+
path: string;
|
|
53
|
+
raw: string;
|
|
54
|
+
data: Record<string, unknown>;
|
|
55
|
+
lineCount: number;
|
|
56
|
+
overCap: boolean;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface MergedUserProfile {
|
|
60
|
+
/** Merged plain object — only the fields a layer actually declared. */
|
|
61
|
+
profile: Record<string, unknown>;
|
|
62
|
+
/** Dotted-path -> which layer supplied the value (`identity.name`, `style.pace`, ...). */
|
|
63
|
+
sources: Record<string, ProfileSource>;
|
|
64
|
+
/** One entry per layer that exceeds `USER_PROFILE_LINE_CAP`; empty when both are within cap. */
|
|
65
|
+
capWarnings: string[];
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Leaf field paths the cascade resolves individually. `notes` is handled
|
|
70
|
+
* separately (concatenation, not override) and is deliberately absent here.
|
|
71
|
+
*/
|
|
72
|
+
const KNOWN_LEAF_PATHS: readonly (readonly string[])[] = [
|
|
73
|
+
['identity', 'name'],
|
|
74
|
+
['identity', 'nickname'],
|
|
75
|
+
['language'],
|
|
76
|
+
['role'],
|
|
77
|
+
['style', 'pace'],
|
|
78
|
+
['voice_sample'],
|
|
79
|
+
['last_updated'],
|
|
80
|
+
];
|
|
81
|
+
|
|
82
|
+
/** Canonical write target for the global profile (Phase 2 writes here; Phase 1 only reads). */
|
|
83
|
+
export function globalProfileWriteTarget(env?: user_global_paths.EnvMap | null): string {
|
|
84
|
+
return user_global_paths.write_target(GLOBAL_PROFILE_RELATIVE, { env: env ?? null });
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** Resolve the global profile's on-disk path — new namespace first, legacy fallback, `null` if neither exists. */
|
|
88
|
+
export function resolveGlobalProfilePath(env?: user_global_paths.EnvMap | null): string | null {
|
|
89
|
+
return user_global_paths.resolve_with_fallback(GLOBAL_PROFILE_RELATIVE, { env: env ?? null });
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** Count lines the same way the schema's 100-line cap is defined: whole-file, `\r\n` normalized. */
|
|
93
|
+
export function countLines(body: string): number {
|
|
94
|
+
const normalized = body.replace(/\r\n/g, '\n');
|
|
95
|
+
return normalized === '' ? 0 : normalized.split('\n').length;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Read + parse a single layer file. Returns `null` when the file does not exist. */
|
|
99
|
+
export function loadProfileLayer(filePath: string, source: ProfileSource): UserProfileLayer | null {
|
|
100
|
+
let raw: string;
|
|
101
|
+
try {
|
|
102
|
+
raw = fs.readFileSync(filePath, 'utf-8');
|
|
103
|
+
} catch {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
const lineCount = countLines(raw);
|
|
107
|
+
return {
|
|
108
|
+
source,
|
|
109
|
+
path: filePath,
|
|
110
|
+
raw,
|
|
111
|
+
data: parseLegacyUserMd(raw),
|
|
112
|
+
lineCount,
|
|
113
|
+
overCap: lineCount > USER_PROFILE_LINE_CAP,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** Load the global (weakest) layer, honouring the new-namespace/legacy-fallback resolution order. */
|
|
118
|
+
export function loadGlobalProfileLayer(env?: user_global_paths.EnvMap | null): UserProfileLayer | null {
|
|
119
|
+
const resolved = resolveGlobalProfilePath(env);
|
|
120
|
+
return resolved === null ? null : loadProfileLayer(resolved, 'global');
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** Load the project (deepest) layer — `.agent-user.md` directly under `projectRoot`. */
|
|
124
|
+
export function loadProjectProfileLayer(projectRoot: string): UserProfileLayer | null {
|
|
125
|
+
return loadProfileLayer(path.join(projectRoot, '.agent-user.md'), 'project');
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** Read a dotted leaf path out of a parsed profile object. Exported for the Phase 4 audit render (`user_global_memory_audit.ts`), which enumerates `mergeUserProfileLayers`' `sources` keys back into values. */
|
|
129
|
+
export function getPath(obj: Record<string, unknown> | undefined, keys: readonly string[]): unknown {
|
|
130
|
+
let cur: unknown = obj;
|
|
131
|
+
for (const key of keys) {
|
|
132
|
+
if (cur === null || typeof cur !== 'object') return undefined;
|
|
133
|
+
cur = (cur as Record<string, unknown>)[key];
|
|
134
|
+
}
|
|
135
|
+
return cur;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export function setPath(obj: Record<string, unknown>, keys: readonly string[], value: unknown): void {
|
|
139
|
+
let cur = obj;
|
|
140
|
+
for (let i = 0; i < keys.length - 1; i += 1) {
|
|
141
|
+
const key = keys[i] as string;
|
|
142
|
+
const next = cur[key];
|
|
143
|
+
if (typeof next !== 'object' || next === null) {
|
|
144
|
+
cur[key] = {};
|
|
145
|
+
}
|
|
146
|
+
cur = cur[key] as Record<string, unknown>;
|
|
147
|
+
}
|
|
148
|
+
cur[keys[keys.length - 1] as string] = value;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** Concatenate `# Notes` bodies with `[global]` / `[project]` markers — only when BOTH sides carry text. */
|
|
152
|
+
function mergeNotes(globalNotes: string | undefined, projectNotes: string | undefined): string | undefined {
|
|
153
|
+
const g = globalNotes?.trim();
|
|
154
|
+
const p = projectNotes?.trim();
|
|
155
|
+
if (g && p) {
|
|
156
|
+
return `[global]\n${g}\n\n[project]\n${p}`;
|
|
157
|
+
}
|
|
158
|
+
return p || g || undefined;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Merge two already-loaded layers per the deepest-wins rule above.
|
|
163
|
+
* Either layer may be `null` (file absent) — the "neither" case returns an
|
|
164
|
+
* empty profile so the existing "agent uses generic address forms"
|
|
165
|
+
* fallback keeps working unchanged.
|
|
166
|
+
*/
|
|
167
|
+
export function mergeUserProfileLayers(
|
|
168
|
+
global: UserProfileLayer | null,
|
|
169
|
+
project: UserProfileLayer | null,
|
|
170
|
+
): MergedUserProfile {
|
|
171
|
+
const profile: Record<string, unknown> = {};
|
|
172
|
+
const sources: Record<string, ProfileSource> = {};
|
|
173
|
+
|
|
174
|
+
for (const leafPath of KNOWN_LEAF_PATHS) {
|
|
175
|
+
const globalValue = global ? getPath(global.data, leafPath) : undefined;
|
|
176
|
+
const projectValue = project ? getPath(project.data, leafPath) : undefined;
|
|
177
|
+
if (projectValue !== undefined) {
|
|
178
|
+
setPath(profile, leafPath, projectValue);
|
|
179
|
+
sources[leafPath.join('.')] = 'project';
|
|
180
|
+
} else if (globalValue !== undefined) {
|
|
181
|
+
setPath(profile, leafPath, globalValue);
|
|
182
|
+
sources[leafPath.join('.')] = 'global';
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const globalNotes = typeof global?.data.notes === 'string' ? global.data.notes : undefined;
|
|
187
|
+
const projectNotes = typeof project?.data.notes === 'string' ? project.data.notes : undefined;
|
|
188
|
+
const mergedNotes = mergeNotes(globalNotes, projectNotes);
|
|
189
|
+
if (mergedNotes !== undefined) {
|
|
190
|
+
profile.notes = mergedNotes;
|
|
191
|
+
// Provenance for `notes` is "both" whenever concatenation actually
|
|
192
|
+
// happened; a single-layer note keeps that layer's provenance.
|
|
193
|
+
sources.notes = globalNotes && projectNotes ? 'project' : project ? 'project' : 'global';
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const capWarnings: string[] = [];
|
|
197
|
+
if (global?.overCap) {
|
|
198
|
+
capWarnings.push(
|
|
199
|
+
`global profile exceeds ${USER_PROFILE_LINE_CAP}-line cap (${global.lineCount} lines): ${global.path}`,
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
if (project?.overCap) {
|
|
203
|
+
capWarnings.push(
|
|
204
|
+
`project profile exceeds ${USER_PROFILE_LINE_CAP}-line cap (${project.lineCount} lines): ${project.path}`,
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
return { profile, sources, capWarnings };
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/** Load both layers for `projectRoot` and merge them — the one call sites need. */
|
|
212
|
+
export function loadEffectiveUserProfile(
|
|
213
|
+
projectRoot: string,
|
|
214
|
+
env?: user_global_paths.EnvMap | null,
|
|
215
|
+
): MergedUserProfile {
|
|
216
|
+
const global = loadGlobalProfileLayer(env);
|
|
217
|
+
const project = loadProjectProfileLayer(projectRoot);
|
|
218
|
+
return mergeUserProfileLayers(global, project);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// ---------------------------------------------------------------------------
|
|
222
|
+
// Write path (road-to-global-user-memory Phase 2) — the learning channel's
|
|
223
|
+
// ONLY writer of `profile.md`. Everything upstream of this function
|
|
224
|
+
// (`user_global_observations.ts`'s buffer, `/agents:user review`) only ever
|
|
225
|
+
// proposes; this is the human-gated `accept` step's write primitive. No
|
|
226
|
+
// other function in this module, and no function in
|
|
227
|
+
// `user_global_observations.ts`, ever touches `profile.md`.
|
|
228
|
+
// ---------------------------------------------------------------------------
|
|
229
|
+
|
|
230
|
+
/** Leaf path a `field` string from the observation-buffer schema resolves to (`'notes'` is top-level, never nested). */
|
|
231
|
+
function fieldToLeafPath(field: string): readonly string[] {
|
|
232
|
+
return field === 'notes' ? ['notes'] : field.split('.');
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
export interface ApplyObservationResult {
|
|
236
|
+
/** Absolute path written. */
|
|
237
|
+
readonly path: string;
|
|
238
|
+
/** Line count of the file AFTER the write (already validated ≤ the cap). */
|
|
239
|
+
readonly lineCount: number;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Apply one accepted observation to the global `profile.md`, bump
|
|
244
|
+
* `last_updated`, and enforce the per-layer 100-line cap. The ONLY function
|
|
245
|
+
* in this module (or in `user_global_observations.ts`) that writes
|
|
246
|
+
* `profile.md` — everything else in the learning channel only reads or
|
|
247
|
+
* proposes. Called exclusively from the human-confirmed
|
|
248
|
+
* `/agents:user accept` step; never invoked automatically.
|
|
249
|
+
*
|
|
250
|
+
* Preserves every field the file already declares (round-trips through
|
|
251
|
+
* `parseLegacyUserMd` / `composeLegacyUserMd`) except the one field being
|
|
252
|
+
* set and `last_updated`. Throws rather than writing when the result would
|
|
253
|
+
* exceed the cap — the caller is expected to surface that as a rollback,
|
|
254
|
+
* matching `/agents:user accept`'s "any violation → roll back and print the
|
|
255
|
+
* error" contract.
|
|
256
|
+
*/
|
|
257
|
+
export function applyObservationToGlobalProfile(
|
|
258
|
+
field: string,
|
|
259
|
+
value: unknown,
|
|
260
|
+
options: { env?: user_global_paths.EnvMap | null; today?: string } = {},
|
|
261
|
+
): ApplyObservationResult {
|
|
262
|
+
const target = globalProfileWriteTarget(options.env ?? null);
|
|
263
|
+
let raw = '';
|
|
264
|
+
try {
|
|
265
|
+
raw = fs.readFileSync(target, 'utf-8');
|
|
266
|
+
} catch {
|
|
267
|
+
raw = '';
|
|
268
|
+
}
|
|
269
|
+
const data = raw === '' ? {} : parseLegacyUserMd(raw);
|
|
270
|
+
|
|
271
|
+
setPath(data, fieldToLeafPath(field), value);
|
|
272
|
+
if (data.version === undefined) {
|
|
273
|
+
data.version = 1;
|
|
274
|
+
}
|
|
275
|
+
data.last_updated = options.today ?? new Date().toISOString().slice(0, 10);
|
|
276
|
+
|
|
277
|
+
const serialized = composeLegacyUserMd(data);
|
|
278
|
+
const lineCount = countLines(serialized);
|
|
279
|
+
if (lineCount > USER_PROFILE_LINE_CAP) {
|
|
280
|
+
throw new Error(
|
|
281
|
+
`applying '${field}' would grow the global profile to ${lineCount} lines, ` +
|
|
282
|
+
`exceeding the ${USER_PROFILE_LINE_CAP}-line-per-layer cap — write refused`,
|
|
283
|
+
);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
287
|
+
fs.writeFileSync(target, serialized, 'utf-8');
|
|
288
|
+
// Phase 5 gate: the accept count is what makes the kill-criterion able to
|
|
289
|
+
// fire, so it increments where the accept actually lands — not at the
|
|
290
|
+
// command layer, which a caller could bypass. Counter failures never fail
|
|
291
|
+
// the accept: the profile write already succeeded and is the user's data.
|
|
292
|
+
try {
|
|
293
|
+
recordObservationAccepted({ env: options.env ?? null });
|
|
294
|
+
} catch {
|
|
295
|
+
/* a counter is telemetry, never a gate on the user's own write */
|
|
296
|
+
}
|
|
297
|
+
return { path: target, lineCount };
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// ---------------------------------------------------------------------------
|
|
301
|
+
// Phase 4 (road-to-global-user-memory) — delete, revoke, audit. Delete
|
|
302
|
+
// counterpart of `applyObservationToGlobalProfile` above: this module
|
|
303
|
+
// remains the ONLY writer (now also the only revoker) of `profile.md`.
|
|
304
|
+
// ---------------------------------------------------------------------------
|
|
305
|
+
|
|
306
|
+
/** Unset a dotted leaf path, pruning an emptied parent object so a revoked `identity.name` does not leave a dangling `identity: {}` behind. */
|
|
307
|
+
function _deletePath(obj: Record<string, unknown>, keys: readonly string[]): void {
|
|
308
|
+
if (keys.length === 0) {
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
const [head, ...rest] = keys as [string, ...string[]];
|
|
312
|
+
if (rest.length === 0) {
|
|
313
|
+
delete obj[head];
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
const child = obj[head];
|
|
317
|
+
if (typeof child !== 'object' || child === null || Array.isArray(child)) {
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
_deletePath(child as Record<string, unknown>, rest);
|
|
321
|
+
if (Object.keys(child as Record<string, unknown>).length === 0) {
|
|
322
|
+
delete obj[head];
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
export interface RevokeProfileFieldResult {
|
|
327
|
+
/** `false` when the field had no value in `profile.md` to revoke (no tombstone written, no file touched). */
|
|
328
|
+
readonly revoked: boolean;
|
|
329
|
+
readonly tombstone?: RevocationEntry | undefined;
|
|
330
|
+
/** Absolute path of the global profile that was (or would have been) rewritten. */
|
|
331
|
+
readonly path: string;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Revoke (delete) one field's value from the global `profile.md` — the
|
|
336
|
+
* delete counterpart of `applyObservationToGlobalProfile`, covering BOTH the
|
|
337
|
+
* plain-accept write and the Phase 3 promotion write (promotion calls the
|
|
338
|
+
* same function, so one revoke path covers both). Writes an append-only
|
|
339
|
+
* tombstone to `user_global_revocations.ts`'s ledger BEFORE the file is
|
|
340
|
+
* rewritten without the field — reusing ADR-121's tombstone-before-deletion
|
|
341
|
+
* discipline exactly as `user_global_observations.ts`'s
|
|
342
|
+
* `deleteGlobalObservation` does for the buffer.
|
|
343
|
+
*
|
|
344
|
+
* A profile field has no natural content-derived id the way a buffered
|
|
345
|
+
* observation or a knowledge card does — it is a fixed YAML key in a
|
|
346
|
+
* closed enum — so the tombstone's `entity_id` is simply `profile:<field>`,
|
|
347
|
+
* human-readable and stable across revokes of the same field.
|
|
348
|
+
*
|
|
349
|
+
* Never invoked automatically; the matching `/agents user delete` step
|
|
350
|
+
* requires the same explicit human confirmation `accept` requires to write.
|
|
351
|
+
*/
|
|
352
|
+
export function revokeGlobalProfileField(
|
|
353
|
+
field: string,
|
|
354
|
+
reason: string,
|
|
355
|
+
options: { env?: user_global_paths.EnvMap | null; today?: string } = {},
|
|
356
|
+
): RevokeProfileFieldResult {
|
|
357
|
+
const target = globalProfileWriteTarget(options.env ?? null);
|
|
358
|
+
let raw: string;
|
|
359
|
+
try {
|
|
360
|
+
raw = fs.readFileSync(target, 'utf-8');
|
|
361
|
+
} catch {
|
|
362
|
+
return { revoked: false, path: target };
|
|
363
|
+
}
|
|
364
|
+
const data = parseLegacyUserMd(raw);
|
|
365
|
+
const leafPath = fieldToLeafPath(field);
|
|
366
|
+
if (getPath(data, leafPath) === undefined) {
|
|
367
|
+
return { revoked: false, path: target };
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
const tombstone = revocations.appendTombstone(`profile:${field}`, reason, {
|
|
371
|
+
today: options.today,
|
|
372
|
+
env: options.env ?? null,
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
_deletePath(data, leafPath);
|
|
376
|
+
data.last_updated = options.today ?? new Date().toISOString().slice(0, 10);
|
|
377
|
+
const serialized = composeLegacyUserMd(data);
|
|
378
|
+
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
379
|
+
fs.writeFileSync(target, serialized, 'utf-8');
|
|
380
|
+
return { revoked: true, tombstone, path: target };
|
|
381
|
+
}
|
|
@@ -60,6 +60,15 @@ export const CASCADE_ELIGIBLE_KINDS: ReadonlySet<string> = new Set([
|
|
|
60
60
|
* layer (`~/.event4u/agent-config/agents/<kind>/`). `contexts/` and
|
|
61
61
|
* `decisions/` are project-shaped and must not leak across projects;
|
|
62
62
|
* only `overrides/` — the developer's personal layer — is whitelisted.
|
|
63
|
+
*
|
|
64
|
+
* Unrelated to the global USER-PROFILE layer added by ADR-138
|
|
65
|
+
* (`~/.event4u/agent-config/user/profile.md`, resolved by
|
|
66
|
+
* `agent_user_profile.ts`): that file is not an `agents/<kind>/<name>.md`
|
|
67
|
+
* overlay, so it does not extend this set. Read this comment as
|
|
68
|
+
* confirmation that ADR-138 is a *different* mechanism, not evidence
|
|
69
|
+
* that the `contexts/`/`decisions/` asymmetry above has been relaxed —
|
|
70
|
+
* it hasn't; that lock is unamended (see the global-user-memory council
|
|
71
|
+
* cut, `agents/settings/contexts/global-user-memory-cut.md`).
|
|
63
72
|
*/
|
|
64
73
|
export const USER_GLOBAL_OVERLAY_KINDS: ReadonlySet<string> = new Set(['overrides']);
|
|
65
74
|
|