@event4u/agent-config 5.7.0 → 5.9.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/commands/agent-handoff.md +1 -1
- package/.agent-src/commands/agent-status.md +1 -1
- package/.agent-src/commands/agents/audit.md +1 -1
- package/.agent-src/commands/agents/init.md +1 -1
- package/.agent-src/commands/agents/user/accept.md +3 -3
- package/.agent-src/commands/agents/user/init.md +4 -4
- package/.agent-src/commands/agents/user/show.md +3 -3
- package/.agent-src/commands/agents/user/update.md +3 -3
- package/.agent-src/commands/agents/user.md +1 -1
- package/.agent-src/commands/agents.md +1 -1
- package/.agent-src/commands/analytics/prune.md +1 -1
- package/.agent-src/commands/analytics/show.md +1 -1
- package/.agent-src/commands/analytics.md +1 -1
- package/.agent-src/commands/bug-fix.md +1 -1
- package/.agent-src/commands/challenge-me.md +1 -1
- package/.agent-src/commands/chat-history/import.md +1 -1
- package/.agent-src/commands/chat-history/learn.md +1 -1
- package/.agent-src/commands/chat-history/show.md +1 -1
- package/.agent-src/commands/chat-history.md +1 -1
- package/.agent-src/commands/check-current-md.md +1 -1
- package/.agent-src/commands/condense.md +1 -1
- package/.agent-src/commands/context.md +1 -1
- package/.agent-src/commands/cost-report.md +1 -1
- package/.agent-src/commands/council.md +3 -3
- package/.agent-src/commands/create-pr/description-only.md +1 -1
- package/.agent-src/commands/create-pr.md +1 -1
- package/.agent-src/commands/e2e-heal.md +1 -1
- package/.agent-src/commands/e2e-plan.md +1 -1
- package/.agent-src/commands/feature.md +1 -1
- package/.agent-src/commands/fix/ci.md +1 -1
- package/.agent-src/commands/fix/portability.md +1 -1
- package/.agent-src/commands/fix/pr-bot-comments.md +1 -1
- package/.agent-src/commands/fix/pr-comments.md +1 -1
- package/.agent-src/commands/fix/pr-developer-comments.md +1 -1
- package/.agent-src/commands/fix/refs.md +1 -1
- package/.agent-src/commands/fix/seeder.md +1 -1
- package/.agent-src/commands/fix.md +1 -1
- package/.agent-src/commands/judge.md +1 -1
- package/.agent-src/commands/knowledge/cross-repo.md +1 -1
- package/.agent-src/commands/knowledge/forget.md +1 -1
- package/.agent-src/commands/knowledge/ingest.md +1 -1
- package/.agent-src/commands/knowledge/list.md +1 -1
- package/.agent-src/commands/knowledge.md +1 -1
- package/.agent-src/commands/memory/add.md +1 -1
- package/.agent-src/commands/memory/learn-low-impact.md +1 -1
- package/.agent-src/commands/memory/load.md +1 -1
- package/.agent-src/commands/memory/mine-session.md +1 -1
- package/.agent-src/commands/memory/promote.md +1 -1
- package/.agent-src/commands/memory/propose.md +1 -1
- package/.agent-src/commands/memory.md +1 -1
- package/.agent-src/commands/mode.md +1 -1
- package/.agent-src/commands/optimize/agents-dir.md +1 -1
- package/.agent-src/commands/optimize/augmentignore.md +1 -1
- package/.agent-src/commands/optimize/rtk.md +1 -1
- package/.agent-src/commands/optimize/skills.md +1 -1
- package/.agent-src/commands/optimize.md +1 -1
- package/.agent-src/commands/orchestrate.md +1 -1
- package/.agent-src/commands/override/create.md +1 -1
- package/.agent-src/commands/override/manage.md +1 -1
- package/.agent-src/commands/override.md +1 -1
- package/.agent-src/commands/package-reset.md +1 -1
- package/.agent-src/commands/prediction-pool.md +31 -12
- package/.agent-src/commands/profile/activate.md +81 -0
- package/.agent-src/commands/profile/deactivate.md +68 -0
- package/.agent-src/commands/profile/show.md +70 -0
- package/.agent-src/commands/profile.md +68 -0
- package/.agent-src/commands/project-health.md +1 -1
- package/.agent-src/commands/quality-fix.md +1 -1
- package/.agent-src/commands/roadmap/process-full.md +1 -1
- package/.agent-src/commands/roadmap/process-phase.md +1 -1
- package/.agent-src/commands/roadmap/process-step.md +1 -1
- package/.agent-src/commands/roadmap.md +1 -1
- package/.agent-src/commands/set-cost-profile.md +1 -1
- package/.agent-src/commands/skill/preview.md +3 -3
- package/.agent-src/commands/skill.md +1 -1
- package/.agent-src/commands/skills/discover.md +1 -1
- package/.agent-src/commands/skills.md +1 -1
- package/.agent-src/commands/sync-agent-settings.md +1 -1
- package/.agent-src/commands/sync-gitignore/fix.md +1 -1
- package/.agent-src/commands/sync-gitignore.md +1 -1
- package/.agent-src/commands/update-form-request-messages.md +1 -1
- package/.agent-src/skills/check-refs/SKILL.md +1 -1
- package/.agent-src/skills/finishing-a-development-branch/SKILL.md +1 -1
- package/.agent-src/skills/git-workflow/SKILL.md +1 -1
- package/.agent-src/skills/jira-integration/SKILL.md +1 -1
- package/.agent-src/skills/markitdown/SKILL.md +1 -1
- package/.agent-src/skills/prediction-pool-optimizer/SKILL.md +195 -77
- package/.agent-src/skills/prediction-pool-optimizer/evals/triggers.json +3 -1
- package/.agent-src/skills/prediction-pool-optimizer/reference/ev-fixtures.md +111 -16
- package/.agent-src/skills/prediction-pool-optimizer/reference/odds-and-bonus.md +109 -0
- package/.agent-src/skills/rtk-output-filtering/SKILL.md +1 -1
- package/.agent-src/skills/script-writing/SKILL.md +1 -1
- package/.agent-src/skills/token-optimizer/SKILL.md +1 -1
- package/.agent-src/skills/using-git-worktrees/SKILL.md +1 -1
- package/.agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/.agent-src/templates/scripts/work_engine/_lib/agent_settings.py +52 -5
- package/.claude-plugin/marketplace.json +370 -366
- package/CHANGELOG.md +77 -0
- package/README.md +2 -2
- package/config/discovery/session-profiles.yml +37 -0
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +183 -95
- 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 +9 -5
- package/dist/discovery/trust-report.md +2 -2
- package/dist/discovery/workspaces.json +8 -4
- package/dist/mcp/registry-manifest.json +3 -3
- package/docs/architecture.md +1 -1
- package/docs/catalog.md +7 -3
- package/docs/contracts/command-clusters.md +2 -0
- package/docs/contracts/session-profile-overlay.md +120 -0
- package/docs/customization.md +26 -0
- package/docs/decisions/ADR-010-profile-pack-preset-boundary.md +36 -0
- package/docs/decisions/ADR-038-canonical-settings-path.md +66 -0
- package/docs/decisions/ADR-039-claude-skills-untracked.md +139 -0
- package/docs/decisions/INDEX.md +2 -0
- package/docs/development.md +12 -0
- package/docs/getting-started.md +1 -1
- package/docs/guidelines/agent-infra/layered-settings.md +8 -2
- package/docs/skills-catalog.md +5 -1
- package/llms.txt +4 -0
- package/package.json +1 -1
- package/scripts/__pycache__/validate_frontmatter.cpython-312.pyc +0 -0
- package/scripts/_cli/cmd_doctor.py +180 -16
- package/scripts/_cli/cmd_versions.py +2 -2
- 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 +52 -5
- package/scripts/_lib/agent_src.py +30 -0
- package/scripts/ai_council/session.py +5 -1
- package/scripts/audit_command_surface.py +7 -1
- package/scripts/audit_initial_context.py +10 -2
- package/scripts/check_gate_paths.py +117 -0
- package/scripts/check_references.py +51 -2
- package/scripts/check_release_published.py +145 -0
- package/scripts/check_test_coverage_diff.py +180 -0
- package/scripts/compile_router.py +5 -1
- package/scripts/condense.py +79 -2
- package/scripts/config/session_profiles.py +492 -0
- package/scripts/council_cli.py +5 -1
- package/scripts/hook_manifest.yaml +15 -7
- package/scripts/hooks/dispatch_hook.py +8 -0
- package/scripts/install-hooks.sh +2 -1
- package/scripts/install.py +76 -5
- package/scripts/inventory_abstraction_budget.py +6 -1
- package/scripts/lint_agents_md.py +11 -4
- package/scripts/lint_hook_concern_budget.py +5 -1
- package/scripts/lint_marketplace.py +18 -7
- package/scripts/lint_roadmap_ci_steps.py +5 -1
- package/scripts/lint_roadmap_complexity.py +5 -1
- package/scripts/mcp_server/prompts.py +5 -1
- package/scripts/prediction-pool/pool_winsim.py +236 -0
- package/scripts/prediction-pool/score_ev.py +188 -0
- package/scripts/profile_staleness_hook.py +69 -0
- package/scripts/release.py +54 -31
- package/scripts/roadmap_progress_hook.py +56 -6
- package/scripts/smoke_quickstart.py +3 -2
- package/scripts/sync_agent_settings.py +8 -3
- package/scripts/validate_agent_settings.py +5 -1
- package/scripts/validate_decision_engine.py +5 -1
- package/scripts/measure_roadmap_trajectory.py +0 -112
- package/scripts/verify_roadmap_closure.py +0 -327
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
4b7e6f9a9278cd1129d4cc5d1e5901f0c18b8ef8d741ef2ab7cfc30e567eb0cb discovery-manifest.json
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Discovery Manifest — Summary
|
|
2
2
|
|
|
3
|
-
- Generated: `2026-06-
|
|
3
|
+
- Generated: `2026-06-02T05:57:08Z`
|
|
4
4
|
- Scanner: `ca7acd2ec7af`
|
|
5
|
-
- Artefacts: **
|
|
5
|
+
- Artefacts: **453**
|
|
6
6
|
- Unassigned: **0**
|
|
7
7
|
|
|
8
8
|
## `engineering` — Engineering
|
|
@@ -90,5 +90,5 @@
|
|
|
90
90
|
|
|
91
91
|
| Pack | Artefacts |
|
|
92
92
|
|---|---|
|
|
93
|
-
| `meta` — Meta |
|
|
93
|
+
| `meta` — Meta | 267 |
|
|
94
94
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"checksum": "sha256:
|
|
3
|
-
"generated_at": "2026-06-
|
|
2
|
+
"checksum": "sha256:b55ddc4224e45ec7627ece7c2fd6f043df8c7030efbe50df87573f0da4de4173",
|
|
3
|
+
"generated_at": "2026-06-02T05:57:08Z",
|
|
4
4
|
"packs": [
|
|
5
5
|
{
|
|
6
6
|
"artefact_count": 85,
|
|
@@ -784,7 +784,7 @@
|
|
|
784
784
|
]
|
|
785
785
|
},
|
|
786
786
|
{
|
|
787
|
-
"artefact_count":
|
|
787
|
+
"artefact_count": 267,
|
|
788
788
|
"artefacts": [
|
|
789
789
|
"packages/core/.agent-src.uncondensed/commands/agent-handoff.md",
|
|
790
790
|
"packages/core/.agent-src.uncondensed/commands/agent-status.md",
|
|
@@ -894,6 +894,10 @@
|
|
|
894
894
|
"packages/core/.agent-src.uncondensed/commands/post-as/ghostwriter.md",
|
|
895
895
|
"packages/core/.agent-src.uncondensed/commands/post-as/me.md",
|
|
896
896
|
"packages/core/.agent-src.uncondensed/commands/prepare-for-review.md",
|
|
897
|
+
"packages/core/.agent-src.uncondensed/commands/profile.md",
|
|
898
|
+
"packages/core/.agent-src.uncondensed/commands/profile/activate.md",
|
|
899
|
+
"packages/core/.agent-src.uncondensed/commands/profile/deactivate.md",
|
|
900
|
+
"packages/core/.agent-src.uncondensed/commands/profile/show.md",
|
|
897
901
|
"packages/core/.agent-src.uncondensed/commands/project-analyze.md",
|
|
898
902
|
"packages/core/.agent-src.uncondensed/commands/project-health.md",
|
|
899
903
|
"packages/core/.agent-src.uncondensed/commands/quality-fix.md",
|
|
@@ -1051,14 +1055,14 @@
|
|
|
1051
1055
|
"packages/core/.agent-src.uncondensed/templates/agents/proposal.example.md"
|
|
1052
1056
|
],
|
|
1053
1057
|
"by_lifecycle": {
|
|
1054
|
-
"active":
|
|
1058
|
+
"active": 266,
|
|
1055
1059
|
"archived": 0,
|
|
1056
1060
|
"deprecated": 0,
|
|
1057
1061
|
"experimental": 1
|
|
1058
1062
|
},
|
|
1059
1063
|
"by_trust_level": {
|
|
1060
1064
|
"advisory": 0,
|
|
1061
|
-
"core":
|
|
1065
|
+
"core": 266,
|
|
1062
1066
|
"experimental": 1,
|
|
1063
1067
|
"professional": 0,
|
|
1064
1068
|
"restricted": 0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Discovery — Trust Report
|
|
2
2
|
|
|
3
|
-
- Generated: `2026-06-
|
|
3
|
+
- Generated: `2026-06-02T05:57:08Z`
|
|
4
4
|
- Workspaces tracked: **8**
|
|
5
5
|
- Human-review-required artefacts: **2**
|
|
6
6
|
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
| Workspace | core | professional | experimental | advisory | restricted |
|
|
10
10
|
|---|---|---|---|---|---|
|
|
11
|
-
| `agent-config-maintainer` |
|
|
11
|
+
| `agent-config-maintainer` | 266 | 0 | 2 | 0 | 0 |
|
|
12
12
|
| `engineering` | 86 | 41 | 1 | 0 | 0 |
|
|
13
13
|
| `finance` | 2 | 3 | 0 | 1 | 0 |
|
|
14
14
|
| `founder` | 7 | 0 | 0 | 1 | 0 |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"checksum": "sha256:
|
|
3
|
-
"generated_at": "2026-06-
|
|
2
|
+
"checksum": "sha256:b55ddc4224e45ec7627ece7c2fd6f043df8c7030efbe50df87573f0da4de4173",
|
|
3
|
+
"generated_at": "2026-06-02T05:57:08Z",
|
|
4
4
|
"scanner_version": "ca7acd2ec7af",
|
|
5
5
|
"workspaces": [
|
|
6
6
|
{
|
|
@@ -454,7 +454,7 @@
|
|
|
454
454
|
]
|
|
455
455
|
},
|
|
456
456
|
{
|
|
457
|
-
"artefact_count":
|
|
457
|
+
"artefact_count": 267,
|
|
458
458
|
"default_packs": [
|
|
459
459
|
"meta"
|
|
460
460
|
],
|
|
@@ -464,7 +464,7 @@
|
|
|
464
464
|
"optional_packs": [],
|
|
465
465
|
"packs": [
|
|
466
466
|
{
|
|
467
|
-
"artefact_count":
|
|
467
|
+
"artefact_count": 267,
|
|
468
468
|
"artefacts": [
|
|
469
469
|
"packages/core/.agent-src.uncondensed/commands/agent-handoff.md",
|
|
470
470
|
"packages/core/.agent-src.uncondensed/commands/agent-status.md",
|
|
@@ -574,6 +574,10 @@
|
|
|
574
574
|
"packages/core/.agent-src.uncondensed/commands/post-as/ghostwriter.md",
|
|
575
575
|
"packages/core/.agent-src.uncondensed/commands/post-as/me.md",
|
|
576
576
|
"packages/core/.agent-src.uncondensed/commands/prepare-for-review.md",
|
|
577
|
+
"packages/core/.agent-src.uncondensed/commands/profile.md",
|
|
578
|
+
"packages/core/.agent-src.uncondensed/commands/profile/activate.md",
|
|
579
|
+
"packages/core/.agent-src.uncondensed/commands/profile/deactivate.md",
|
|
580
|
+
"packages/core/.agent-src.uncondensed/commands/profile/show.md",
|
|
577
581
|
"packages/core/.agent-src.uncondensed/commands/project-analyze.md",
|
|
578
582
|
"packages/core/.agent-src.uncondensed/commands/project-health.md",
|
|
579
583
|
"packages/core/.agent-src.uncondensed/commands/quality-fix.md",
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"discovery": {
|
|
3
|
-
"artefact_count":
|
|
3
|
+
"artefact_count": 453,
|
|
4
4
|
"scanner_version": "ca7acd2ec7af"
|
|
5
5
|
},
|
|
6
|
-
"generated_at": "2026-06-
|
|
6
|
+
"generated_at": "2026-06-02",
|
|
7
7
|
"package": {
|
|
8
8
|
"description": "Universal AI Agent OS \u2014 audited skills, governance rules, commands, and templates for AI coding tools (Claude Code, Cursor, Windsurf, Copilot).",
|
|
9
9
|
"homepage": "https://github.com/event4u-app/agent-config#readme",
|
|
10
10
|
"name": "@event4u/agent-config",
|
|
11
11
|
"repository": "https://github.com/event4u-app/agent-config",
|
|
12
|
-
"version": "5.
|
|
12
|
+
"version": "5.9.0"
|
|
13
13
|
},
|
|
14
14
|
"registries": [
|
|
15
15
|
{
|
package/docs/architecture.md
CHANGED
|
@@ -148,7 +148,7 @@ note, package-internal path-swap, description budget, and the
|
|
|
148
148
|
|---|---|---|
|
|
149
149
|
| **Skills** | 223 | On-demand expertise — stack analysis (Laravel · Symfony · Zend / Laminas · Next.js · React · Node), testing, Docker, API design, security, observability, … |
|
|
150
150
|
| **Rules** | 79 | Always-active constraints — coding standards, scope control, verification, language-and-tone, agent-authority |
|
|
151
|
-
| **Commands** |
|
|
151
|
+
| **Commands** | 150 | Slash-command workflows — `/commit`, `/create-pr`, `/fix ci`, `/optimize skills`, `/feature plan`, `/work`, `/implement-ticket`, `/condense`, … |
|
|
152
152
|
| **Guidelines** | 73 | Reference material cited by skills — PHP patterns, Eloquent, Playwright, agent-infra, … |
|
|
153
153
|
| **Templates** | 7 | Scaffolds for features, roadmaps, contexts, skills, overrides |
|
|
154
154
|
| **Contexts** | 5 | Shared knowledge about the system itself |
|
package/docs/catalog.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# agent-config — Public Catalog
|
|
2
2
|
|
|
3
|
-
Consumer-facing catalog of all **
|
|
3
|
+
Consumer-facing catalog of all **524 public artefacts** shipped by
|
|
4
4
|
this package. Internal package-maintenance rules and deprecation shims
|
|
5
5
|
are excluded.
|
|
6
6
|
|
|
@@ -157,7 +157,7 @@ are excluded.
|
|
|
157
157
|
| skill | [`playwright-testing`](../.agent-src/skills/playwright-testing/SKILL.md) | | Use when writing Playwright E2E tests — browser automation, visual regression testing, Page Objects, fixtures, and reliable test patterns. |
|
|
158
158
|
| skill | [`po-discovery`](../.agent-src/skills/po-discovery/SKILL.md) | | Use when shaping a fuzzy product ask into a refined backlog item — problem framing, user-story rewrite, AC tightening — even if the user just says 'help me write this ticket'. |
|
|
159
159
|
| skill | [`positioning-strategy`](../.agent-src/skills/positioning-strategy/SKILL.md) | | Use when locking the market frame — category, segment, alternative, point-of-view — before messaging, launch, or pricing rides on it. Triggers on 'who are we for', 'opposable audit'. |
|
|
160
|
-
| skill | [`prediction-pool-optimizer`](../.agent-src/skills/prediction-pool-optimizer/SKILL.md) | | Optimize prediction-pool tips (kicktipp etc.):
|
|
160
|
+
| skill | [`prediction-pool-optimizer`](../.agent-src/skills/prediction-pool-optimizer/SKILL.md) | | Optimize prediction-pool tips (kicktipp etc.): rules + multi-book consensus odds → expected-points-max answer for every question, scores AND bonus. Triggers 'optimize my pool tips', 'predict'. |
|
|
161
161
|
| skill | [`privacy-review`](../.agent-src/skills/privacy-review/SKILL.md) | | Use when reviewing data flows, support macros, refund templates for GDPR/CCPA/HIPAA fit — regime, consent, PII redaction (email, order-id), breach triage. Triggers 'is this GDPR-safe', 'PII redact'. |
|
|
162
162
|
| skill | [`project-analysis-core`](../.agent-src/skills/project-analysis-core/SKILL.md) | | Raw discovery primitives — project discovery, version resolution, docs loading, architecture mapping, execution flow. Called by `universal-project-analysis`. Single-pass scan → `project-analyzer`. |
|
|
163
163
|
| skill | [`project-analysis-hypothesis-driven`](../.agent-src/skills/project-analysis-hypothesis-driven/SKILL.md) | | Use when a bug has multiple plausible causes across layers — competing hypotheses, validation loops, evidence-based conclusions — even when the user just says 'why is this happening?'. |
|
|
@@ -318,7 +318,7 @@ are excluded.
|
|
|
318
318
|
| rule | [`user-interrupt-priority`](../.agent-src/rules/user-interrupt-priority.md) | always | User interrupts override the current task — STOP, complete new task in full, then ASK before resuming; never silently return to prior work |
|
|
319
319
|
| rule | [`verify-before-complete`](../.agent-src/rules/verify-before-complete.md) | always | Verify before completion — run tests and quality tools before claiming done |
|
|
320
320
|
|
|
321
|
-
## Commands (
|
|
321
|
+
## Commands (150)
|
|
322
322
|
|
|
323
323
|
| kind | name | cluster | description |
|
|
324
324
|
|---|---|---|---|
|
|
@@ -431,6 +431,10 @@ are excluded.
|
|
|
431
431
|
| command | [`post-as:me`](../.agent-src/commands/post-as/me.md) | cluster: post-as | Draft a copyable markdown post in the maintainer's own voice (style source = .agent-user.md.voice_sample). No disclosure footer — the user is the author. |
|
|
432
432
|
| command | [`prediction-pool`](../.agent-src/commands/prediction-pool.md) | | Fill a prediction pool (kicktipp, football/basketball WM): optimize expected points under the rules, enter tips via Playwright. Triggers 'Tippspiel', 'kicktipp', 'predict the pool'. |
|
|
433
433
|
| command | [`prepare-for-review`](../.agent-src/commands/prepare-for-review.md) | | Prepare a PR branch for local review — updates main and merges the full branch chain so the branch is up to date |
|
|
434
|
+
| command | [`profile`](../.agent-src/commands/profile.md) | cluster: profile | Session-profile orchestrator — activate / deactivate / show the active packs for this session (recommendation-bias surface filter, no persistence) |
|
|
435
|
+
| command | [`profile:activate`](../.agent-src/commands/profile/activate.md) | cluster: profile | Activate a session profile — surface only the named profile/pack closure plus core artefacts, no persistence |
|
|
436
|
+
| command | [`profile:deactivate`](../.agent-src/commands/profile/deactivate.md) | cluster: profile | Deactivate the session profile — clear the overlay (or drop named packs) so the full surface returns |
|
|
437
|
+
| command | [`profile:show`](../.agent-src/commands/profile/show.md) | cluster: profile | Show the active session profile — active packs and surfaced/hidden command+skill counts (observability surface) |
|
|
434
438
|
| command | [`project-analyze`](../.agent-src/commands/project-analyze.md) | | Full project analysis — detect stack, inventory modules, audit docs, create missing contexts |
|
|
435
439
|
| command | [`project-health`](../.agent-src/commands/project-health.md) | | Quick project health check — show status of docs, modules, contexts, and roadmaps without creating anything |
|
|
436
440
|
| command | [`quality-fix`](../.agent-src/commands/quality-fix.md) | | Run quality pipeline (PHP and/or JS/TS) and fix all errors — auto-detects language from changed files |
|
|
@@ -55,6 +55,8 @@ column 1 of this table.
|
|
|
55
55
|
| `skill` | — | `preview` | new cluster 2026-05-30 (`road-to-leaner-core-and-discovery` Phase 5) — non-destructive skill/command preview: surfaces the declared steps + files/commands a skill would touch before it runs, per [`skill-dry-run`](skill-dry-run.md). Singular `skill` (one target) vs plural `skills` (the catalog) by design. |
|
|
56
56
|
| `image` | — | `analyse` · `create` · `verify` | new cluster 2026-05-31 (`road-to-character-image-fidelity` Phase 4) — character-image fidelity surface mirroring `/video:*`. `:analyse` extracts a per-feature spec from an image and diffs it against a Canon Spec down to the smallest mole (OCR for lettered tattoos, per-section severity scores, canon-breaking hard gate); `:create` assembles a max-fidelity anchors-first generation prompt from the Canon Spec, governance- + provider-gated, `AIV_DRYRUN=true` default; `:verify` runs the analyser in loop mode against a candidate and reports the gate verdict + remaining diff with plateau/oscillation/budget stop conditions. Skills: [`image-analyser`](../../skills/image-analyser/SKILL.md) + [`image-creator`](../../skills/image-creator/SKILL.md); schema/rubric/loop in [`canon-spec.md`](../../skills/image-analyser/canon-spec.md). |
|
|
57
57
|
|
|
58
|
+
| `profile` | — | `activate` · `deactivate` · `show` | new cluster 2026-06-02 (`road-to-session-profile-activation`) — session-profile activation: an ephemeral `runtime.active_packs` overlay that biases the surfaced command/skill set to the active pack closure, with no persistence and no execution-gating (recommendation-bias MVP). `:activate <name…>` resolves an alias (`config/discovery/session-profiles.yml`) or a raw pack id, fails fast on a not-installed pack, expands the `requires_hint` closure, and writes the overlay atomically to `agents/settings/.agent-settings.local.yml`; `:deactivate [name…]` clears it (or drops named packs, keeping deps a still-active pack needs); `:show` is the observability surface (active packs + surfaced/hidden counts). Overlay = runtime modulation of the existing `pack` axis, not a fifth axis (ADR-010 addendum). Library: `scripts/config/session_profiles.py`; schema in [`session-profile-overlay`](session-profile-overlay.md). |
|
|
59
|
+
|
|
58
60
|
**Net change:** Phase 1 collapsed 15 atomics → 3 clusters; Phase 2
|
|
59
61
|
collapses 26 atomics → 11 sub-command clusters. Sub-commands use
|
|
60
62
|
colon syntax (`/cluster:sub`) so Claude Code's command palette can
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
---
|
|
2
|
+
stability: beta
|
|
3
|
+
keep-beta-until: 2026-09-02
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Session-profile overlay — contract
|
|
7
|
+
|
|
8
|
+
> **Status:** beta · **Owner:** package maintainer · **Last reviewed:** 2026-06-02
|
|
9
|
+
>
|
|
10
|
+
> Schema and semantics for the `runtime.active_packs` overlay shipped by the
|
|
11
|
+
> `/profile` command cluster. The overlay lets a developer activate a
|
|
12
|
+
> profile for the **current session** so only the matching packs'
|
|
13
|
+
> commands/skills are the surfaced set, then switch freely without
|
|
14
|
+
> persisting the choice. Locked decisions: the session-profile-activation
|
|
15
|
+
> roadmap Phase 0. Axis boundary: the
|
|
16
|
+
> [ADR-010 addendum](../decisions/ADR-010-profile-pack-preset-boundary.md).
|
|
17
|
+
|
|
18
|
+
## Decision
|
|
19
|
+
|
|
20
|
+
The overlay is an **ephemeral, runtime modulation of the `pack` axis** — an
|
|
21
|
+
instance of the resolution chain's existing
|
|
22
|
+
`… → user/env/runtime overrides` link. It is **not** a fifth axis.
|
|
23
|
+
|
|
24
|
+
It selects which already-installed packs are *surfaced* this session; it
|
|
25
|
+
never installs, never persists, never gates execution.
|
|
26
|
+
|
|
27
|
+
## On-disk shape
|
|
28
|
+
|
|
29
|
+
Written to `agents/settings/.agent-settings.local.yml` (gitignored,
|
|
30
|
+
deepest-winning cascade layer) — **never** the committed `.agent-settings.yml`.
|
|
31
|
+
|
|
32
|
+
```yaml
|
|
33
|
+
runtime:
|
|
34
|
+
active_packs: [engineering-base, laravel, php] # expanded closure, sorted
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
- `runtime.active_packs` — a list of installed pack ids: the transitive
|
|
38
|
+
`requires_hint` closure of the activated profile/pack seed set.
|
|
39
|
+
- Absent / empty / wrong-type → **no overlay** (full surface).
|
|
40
|
+
|
|
41
|
+
## Activatable tokens
|
|
42
|
+
|
|
43
|
+
`/profile activate <name…>` accepts, for each name:
|
|
44
|
+
|
|
45
|
+
1. a **session-profile alias** from `config/discovery/session-profiles.yml`
|
|
46
|
+
(`developer`, `po`, `finance`, `gtm`, `content`) → its seed pack list, or
|
|
47
|
+
2. a **raw pack id** from `config/discovery/packs.yml` (`laravel`, `php`, …).
|
|
48
|
+
|
|
49
|
+
Multiple names union their closures. The seed set's transitive
|
|
50
|
+
`requires_hint` closure is expanded before writing. **Only installed packs
|
|
51
|
+
are activatable** — a not-installed seed pack fails fast (exit 2). Installed
|
|
52
|
+
set = the top-level `packs:` block in settings, or the full vocabulary when
|
|
53
|
+
no block is present (maintainer repo / base-only install).
|
|
54
|
+
|
|
55
|
+
## Surface filter (recommendation-bias)
|
|
56
|
+
|
|
57
|
+
For each `command` / `skill` artefact in `dist/discovery/discovery-manifest.json`:
|
|
58
|
+
|
|
59
|
+
- **always surfaced** when it is **core-trust** (`trust.level == "core"`) or
|
|
60
|
+
unscoped (no `packs`);
|
|
61
|
+
- otherwise **surfaced iff** `packs ∩ active_packs ≠ ∅`;
|
|
62
|
+
- **no overlay → everything surfaced.**
|
|
63
|
+
|
|
64
|
+
Execution is **never gated**: an inactive-pack artefact still runs, with a
|
|
65
|
+
one-line "from inactive pack X" notice. Hard execution-gating is deferred
|
|
66
|
+
(host-dependent — see
|
|
67
|
+
[`session-host-capability-audit`](../../agents/settings/contexts/session-host-capability-audit.md)).
|
|
68
|
+
|
|
69
|
+
## Lifecycle (locked: option a)
|
|
70
|
+
|
|
71
|
+
- **Activate / switch / deactivate** are explicit `/profile` sub-commands.
|
|
72
|
+
- The overlay **survives an IDE restart** (task-scoped). A new session emits
|
|
73
|
+
a **staleness notice** via the `profile-staleness` `session_start` hook —
|
|
74
|
+
it never silently resets (the registry-refresh Catch-22).
|
|
75
|
+
- **Kill-switch:** delete `runtime.active_packs` (or the local file).
|
|
76
|
+
|
|
77
|
+
## Robustness invariants
|
|
78
|
+
|
|
79
|
+
- **Fail-open read** — a corrupt / unparseable / schema-invalid overlay is
|
|
80
|
+
ignored; the full surface returns. A misconfigured overlay never hides
|
|
81
|
+
artefacts.
|
|
82
|
+
- **Atomic write** — the helper writes via a temp file + `os.replace`, so a
|
|
83
|
+
concurrent reader never sees a half-written overlay.
|
|
84
|
+
- **Closure self-heal** — a closure dependency that is not installed is
|
|
85
|
+
dropped from the written set with a note, never blocking activation.
|
|
86
|
+
|
|
87
|
+
## Reconciliation with the existing `--profile=<id>` install flag
|
|
88
|
+
|
|
89
|
+
The install/CLI flag `--profile=<minimal|balanced|full>`
|
|
90
|
+
(`scripts/install.py`) is a **legacy alias for `rule_loading_tier`** — it
|
|
91
|
+
sets the rule-loading cost tier, not an audience profile. The word
|
|
92
|
+
"profile" is overloaded across three distinct, orthogonal things; this
|
|
93
|
+
command does **not** add a fourth meaning:
|
|
94
|
+
|
|
95
|
+
| Surface | What it sets | Axis | Persists? |
|
|
96
|
+
|---|---|---|---|
|
|
97
|
+
| `install --profile=<minimal\|balanced\|full>` | `rule_loading_tier` (cost tier) | rule_loading_tier | yes |
|
|
98
|
+
| `profile.id` in settings (`founder`/`developer`/…) | audience identity → default surface + personas ([`profile-system`](profile-system.md)) | profile | yes |
|
|
99
|
+
| **`/profile activate <name>`** (this command) | `runtime.active_packs` — which installed packs are *surfaced* this session | pack (runtime overlay) | **no** |
|
|
100
|
+
|
|
101
|
+
The session overlay answers *which installed packs are surfaced right now?*.
|
|
102
|
+
It does **not** change `rule_loading_tier`, does **not** change
|
|
103
|
+
`profile.id`, and writes only the gitignored local file. The naming
|
|
104
|
+
collision is pre-existing; the overlay deliberately keeps to the `pack`
|
|
105
|
+
axis (ADR-010 addendum) so it adds no new axis despite sharing the word.
|
|
106
|
+
|
|
107
|
+
## Implementation
|
|
108
|
+
|
|
109
|
+
- Library + CLI: `scripts/config/session_profiles.py`
|
|
110
|
+
(`activate` · `deactivate` · `show` · `surface` · `stale-notice`).
|
|
111
|
+
- Aliases: `config/discovery/session-profiles.yml`.
|
|
112
|
+
- Hook: `scripts/profile_staleness_hook.py` (session_start staleness notice).
|
|
113
|
+
- Tests: `tests/test_session_profiles.py`.
|
|
114
|
+
|
|
115
|
+
## See also
|
|
116
|
+
|
|
117
|
+
- [`ADR-010 addendum`](../decisions/ADR-010-profile-pack-preset-boundary.md) — overlay ≠ fifth axis.
|
|
118
|
+
- [`profile-system`](profile-system.md) — the profile (audience) axis the overlay is reconciled against.
|
|
119
|
+
- [`command-clusters`](command-clusters.md) — the `/profile` cluster registration.
|
|
120
|
+
- [`session-host-capability-audit`](../../agents/settings/contexts/session-host-capability-audit.md) — why hard-gating + true session-reset are deferred.
|
package/docs/customization.md
CHANGED
|
@@ -429,6 +429,32 @@ packs at install time via `npx @event4u/agent-config install` and the
|
|
|
429
429
|
resulting `.agent-settings.yml` records which packs the project opted
|
|
430
430
|
into.
|
|
431
431
|
|
|
432
|
+
### Session profiles — surface one audience for the current session
|
|
433
|
+
|
|
434
|
+
Install every pack once, then **activate a profile per session** so only
|
|
435
|
+
the matching packs' commands/skills are the surfaced set:
|
|
436
|
+
|
|
437
|
+
- `/profile activate laravel` — surface the Laravel closure
|
|
438
|
+
(`laravel` + `php` + `engineering-base`) + core artefacts; everything
|
|
439
|
+
else is hidden from `/help` and the skill surface.
|
|
440
|
+
- `/profile activate po` — switch to the product-owner surface.
|
|
441
|
+
- `/profile show` — active packs + surfaced/hidden counts.
|
|
442
|
+
- `/profile deactivate` — full surface returns.
|
|
443
|
+
|
|
444
|
+
The activatable name is a session-profile alias
|
|
445
|
+
(`config/discovery/session-profiles.yml`: `developer`, `po`, `finance`,
|
|
446
|
+
`gtm`, `content`) or a raw pack id. It is **recommendation-bias only** —
|
|
447
|
+
an inactive-pack command still runs (with a one-line notice); execution is
|
|
448
|
+
never blocked. The choice is **ephemeral**: it writes
|
|
449
|
+
`runtime.active_packs` to the gitignored `agents/settings/.agent-settings.local.yml`,
|
|
450
|
+
never the committed config, and is cleared with `/profile deactivate`.
|
|
451
|
+
A new session emits a staleness reminder if a profile is still active.
|
|
452
|
+
|
|
453
|
+
This is a runtime view over the existing **pack** axis, not a new axis,
|
|
454
|
+
and is unrelated to the install `--profile=<minimal|balanced|full>` flag
|
|
455
|
+
(which sets `rule_loading_tier`). Full contract:
|
|
456
|
+
[`session-profile-overlay`](contracts/session-profile-overlay.md).
|
|
457
|
+
|
|
432
458
|
---
|
|
433
459
|
|
|
434
460
|
## Update check
|
|
@@ -125,8 +125,44 @@ DUPLICATION ACROSS AXES IS A CONTRACT VIOLATION.
|
|
|
125
125
|
(Phase 1 item 4). Pack shape lives in `docs/contracts/workflow-packs.md`
|
|
126
126
|
(Phase 2 item 7).
|
|
127
127
|
|
|
128
|
+
## Addendum — runtime `active_packs` overlay is not a fifth axis (2026-06-02)
|
|
129
|
+
|
|
130
|
+
The session-profile-activation work introduces an **ephemeral
|
|
131
|
+
`runtime.active_packs` overlay**: a developer activates a profile for the
|
|
132
|
+
current session and only the matching packs' commands/skills are the
|
|
133
|
+
surfaced set. This addendum records that the overlay does **not** add a
|
|
134
|
+
fifth axis and does **not** violate the no-duplication rule above.
|
|
135
|
+
|
|
136
|
+
The resolution chain is
|
|
137
|
+
`pack → profile → preset → rule_loading_tier → user/env/runtime overrides`.
|
|
138
|
+
The `active_packs` overlay is an instance of the chain's **existing final
|
|
139
|
+
link** (`… → user/env/runtime overrides`): a runtime override that
|
|
140
|
+
**modulates the `pack` axis** for the duration of a session. It selects
|
|
141
|
+
which already-installed packs are *surfaced*; it does not create a new
|
|
142
|
+
knob, a new vocabulary, or a new ownership boundary.
|
|
143
|
+
|
|
144
|
+
- **Axis ownership unchanged.** The `pack` axis still owns "which bundle".
|
|
145
|
+
The overlay narrows the *active subset* of installed packs at runtime —
|
|
146
|
+
the same way the documented "runtime wins" rule lets a CLI flag
|
|
147
|
+
shadow-disable a pack-supplied skill (see Consequences § Negative). It
|
|
148
|
+
is the read-time companion of that write-time precedent.
|
|
149
|
+
- **No knob duplication.** The overlay stores only a list of pack ids
|
|
150
|
+
(`runtime.active_packs: [...]`), the closure of the activated
|
|
151
|
+
profile/pack. It never restates a `preset` knob or a `profile` default.
|
|
152
|
+
- **Governance stays on its own axis.** Profile activation **does not**
|
|
153
|
+
touch `rule_loading_tier`. Rules load by tier + trigger, never by pack
|
|
154
|
+
(session-profile work Phase 0.4). Letting a profile move the tier would
|
|
155
|
+
be the very axis-collision this ADR forbids.
|
|
156
|
+
- **Ephemeral + uncommitted.** The overlay lives in
|
|
157
|
+
`.agent-settings.local.yml` (gitignored, deepest-winning layer), never
|
|
158
|
+
the committed settings file — so it cannot drift into a persisted axis.
|
|
159
|
+
|
|
160
|
+
Net: the overlay is a session-scoped *view* over the `pack` axis, not a
|
|
161
|
+
new axis. ADR-010's orthogonality holds.
|
|
162
|
+
|
|
128
163
|
## See also
|
|
129
164
|
|
|
165
|
+
- [`agents/settings/contexts/session-host-capability-audit.md`](../../agents/settings/contexts/session-host-capability-audit.md) — host-capability facts that bound the overlay's lifecycle (addendum input).
|
|
130
166
|
- [`docs/contracts/cost-profile-defaults.md`](../contracts/cost-profile-defaults.md) — the existing `rule_loading_tier` contract this ADR explicitly does **not** touch.
|
|
131
167
|
- [`agents/roadmaps/step-15-product-refinement.md`](../../agents/roadmaps/step-15-product-refinement.md) — Phase 1 items 1, 4 and Phase 2 item 7.
|
|
132
168
|
- [`agents/runtime/council/responses/2026-05-16-step-15-product-refinement-v3.json`](../../agents/runtime/council/responses/2026-05-16-step-15-product-refinement-v3.json) — Council v3 action #2 (origin). <!-- council-ref-allowed: ADR decision-trace to originating council response -->
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# ADR-038: Canonical settings path is `agents/settings/.agent-settings.yml`
|
|
2
|
+
|
|
3
|
+
- **Status:** Accepted
|
|
4
|
+
- **Date:** 2026-06-01
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
|
|
8
|
+
The project's settings *layer* lives under `agents/settings/` — it already
|
|
9
|
+
holds `contexts/`, `policies/`, and the per-machine override
|
|
10
|
+
`.agent-settings.local.yml` (relocated there by `4f887ae8`). The main
|
|
11
|
+
developer settings file, however, stayed at the repo root as
|
|
12
|
+
`./.agent-settings.yml`: `agent_settings.py` (`DEFAULT_PROJECT_FILE`),
|
|
13
|
+
`install.py` (`SETTINGS_FILE`), `sync_agent_settings.py` (`DEFAULT_SETTINGS`),
|
|
14
|
+
and ~30 reader scripts all hardcode the root path. The split is inconsistent —
|
|
15
|
+
the override sits in the settings layer while the file it overrides sits at the
|
|
16
|
+
root — and surfaced as a real defect: roadmaps and contributors referenced
|
|
17
|
+
`agents/settings/.agent-settings.yml` (the location they expected), which then
|
|
18
|
+
failed `check-references` because no such canonical file existed.
|
|
19
|
+
|
|
20
|
+
Both files are gitignored (`.gitignore` matches the `.agent-settings.yml`
|
|
21
|
+
basename anywhere) and per-machine; neither is ever committed.
|
|
22
|
+
|
|
23
|
+
## Decision
|
|
24
|
+
|
|
25
|
+
The canonical project settings file is **`agents/settings/.agent-settings.yml`**,
|
|
26
|
+
co-located with the rest of the settings layer. The repo-root
|
|
27
|
+
`./.agent-settings.yml` becomes a **back-compat read-fallback only**.
|
|
28
|
+
|
|
29
|
+
- **Read precedence (deepest wins):** legacy root `.agent-settings.yml`
|
|
30
|
+
< canonical `agents/settings/.agent-settings.yml` < per-machine
|
|
31
|
+
`agents/settings/.agent-settings.local.yml`.
|
|
32
|
+
- **Write target:** always `agents/settings/.agent-settings.yml`
|
|
33
|
+
(`canonical_settings_write_path`). The legacy root file is migrated into
|
|
34
|
+
the canonical location, never written afresh.
|
|
35
|
+
- **Resolution helper:** `project_settings_path()` returns the canonical file
|
|
36
|
+
when present, else the legacy root file when present (back-compat), else the
|
|
37
|
+
canonical path (fresh repo). All direct readers route through it.
|
|
38
|
+
- **Migration:** `install` and the `migrate` command relocate an existing root
|
|
39
|
+
`./.agent-settings.yml` to `agents/settings/.agent-settings.yml` once; no
|
|
40
|
+
consumer install breaks because the fallback keeps the old location readable
|
|
41
|
+
until it is moved.
|
|
42
|
+
|
|
43
|
+
## Consequences
|
|
44
|
+
|
|
45
|
+
- Settings layout is internally consistent: the main file and its override live
|
|
46
|
+
together under `agents/settings/`.
|
|
47
|
+
- Existing installs keep working unchanged until migrated (read-fallback).
|
|
48
|
+
- One-time cost: ~36 Python reader sites + the TS settings server/CLI route
|
|
49
|
+
through the helper; install/sync/migrate gain the relocation step; docs and
|
|
50
|
+
the gitignore-managed block name the canonical path.
|
|
51
|
+
- The `.gitignore` basename match already covers the canonical path — no new
|
|
52
|
+
ignore entry required.
|
|
53
|
+
|
|
54
|
+
## Alternatives considered
|
|
55
|
+
|
|
56
|
+
- **Keep root canonical (status quo).** Rejected: leaves the override/main-file
|
|
57
|
+
split inconsistent and keeps surfacing as wrong-path references.
|
|
58
|
+
- **Hard cut, no fallback.** Rejected: breaks every existing install (and this
|
|
59
|
+
repo) until each re-runs setup; the fallback is cheap insurance.
|
|
60
|
+
|
|
61
|
+
## References
|
|
62
|
+
|
|
63
|
+
- `scripts/_lib/agent_settings.py` — resolver cascade + `project_settings_path` / `canonical_settings_write_path`.
|
|
64
|
+
- `4f887ae8` — prior relocation of `.agent-settings.local.yml` into `agents/settings/`.
|
|
65
|
+
- `docs/guidelines/agent-infra/layered-settings.md` — precedence model.
|
|
66
|
+
- `docs/contracts/migrate-command.md` — migration surface.
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
---
|
|
2
|
+
adr: 039
|
|
3
|
+
status: accepted
|
|
4
|
+
date: 2026-06-01
|
|
5
|
+
decision: claude-skills-untracked
|
|
6
|
+
supersedes: —
|
|
7
|
+
superseded_by: —
|
|
8
|
+
phase: road-to-claude-skills-untrack
|
|
9
|
+
type: structural
|
|
10
|
+
review_date: 2026-06-15
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# ADR-039 — `.claude/skills/` is untracked; skills resolve from committed canonical sources
|
|
14
|
+
|
|
15
|
+
## Status
|
|
16
|
+
|
|
17
|
+
**Accepted** · 2026-06-01. Decision lands **without** soak — all binding
|
|
18
|
+
conditions were verified empirically against a real Claude Code instance
|
|
19
|
+
(v2.1.159) in the same session. Review date 2026-06-15 keeps the revert path
|
|
20
|
+
open; reverting is one `git rm`-reversing commit plus a generator repoint.
|
|
21
|
+
|
|
22
|
+
## Context
|
|
23
|
+
|
|
24
|
+
`event4u/agent-config` distributes ~365 skills to Claude Code. Until
|
|
25
|
+
commit `c0e2d897` the package committed `.claude/skills/<name>/SKILL.md`
|
|
26
|
+
(symlinks) and the plugin marketplace (`.claude-plugin/marketplace.json`)
|
|
27
|
+
referenced those committed paths. ADR-030 had established `.claude/skills/`
|
|
28
|
+
as Claude Code's filesystem-channel convention, and the cleanup that
|
|
29
|
+
untracked `.claude/{rules,personas,user-types}/` deliberately **kept**
|
|
30
|
+
`.claude/skills/` tracked, flagging the question for a dedicated
|
|
31
|
+
investigation (`road-to-claude-skills-untrack`).
|
|
32
|
+
|
|
33
|
+
The question this ADR closes: can the package stop committing
|
|
34
|
+
`.claude/skills/` — so `.claude/` in git reduces to `settings.json` only —
|
|
35
|
+
without breaking skill resolution on any channel?
|
|
36
|
+
|
|
37
|
+
Three resolution channels exist:
|
|
38
|
+
|
|
39
|
+
1. **Marketplace plugin** — Claude Code reads `.claude-plugin/marketplace.json`
|
|
40
|
+
`skills[]` and loads skills from the referenced source paths.
|
|
41
|
+
2. **Consumer filesystem** — `scripts/install.sh` builds `~/.claude/skills/`
|
|
42
|
+
symlinks at install time.
|
|
43
|
+
3. **Local dev** — `task generate-tools` rebuilds a gitignored local
|
|
44
|
+
`.claude/skills/` for in-repo auto-discovery.
|
|
45
|
+
|
|
46
|
+
Commit `c0e2d897` already repointed the marketplace generator (real skills →
|
|
47
|
+
`./.agent-src/skills/<name>` (223), command-as-skill entries →
|
|
48
|
+
`./.claude-plugin/skills/<slug>` (142), both committed), updated
|
|
49
|
+
`lint_marketplace.py` and the pre-commit hook, and gitignored
|
|
50
|
+
`/.claude/skills/`. This ADR is the decision-gate record that the
|
|
51
|
+
investigation reached, backed by a real-instance registration test rather
|
|
52
|
+
than reasoning alone.
|
|
53
|
+
|
|
54
|
+
## Decision
|
|
55
|
+
|
|
56
|
+
**`.claude/skills/` stays untracked.** Skills resolve from the committed
|
|
57
|
+
canonical sources (`.agent-src/skills/` + `.claude-plugin/skills/`) for the
|
|
58
|
+
marketplace channel, and from locally-built trees for the consumer and dev
|
|
59
|
+
channels. `.claude/` in git is `settings.json` only.
|
|
60
|
+
|
|
61
|
+
## Evidence (real Claude Code v2.1.159, this machine)
|
|
62
|
+
|
|
63
|
+
- **Marketplace manifest validates.** `claude plugin validate
|
|
64
|
+
.claude-plugin/marketplace.json` → "Validation passed" (sole warning:
|
|
65
|
+
`metadata.keywords` is ignored at load — cosmetic, see Consequences).
|
|
66
|
+
- **Marketplace registers + installs at runtime.** `claude plugin
|
|
67
|
+
marketplace add <repo>` → `claude plugin install
|
|
68
|
+
agent-config@event4u-agent-config` → **enabled**; `claude plugin details`
|
|
69
|
+
reports **Skills (365)** resolved from `./.agent-src/skills/` (223) +
|
|
70
|
+
`./.claude-plugin/skills/` (142), with **no committed `.claude/skills/`**.
|
|
71
|
+
- **Runtime execution without a committed tree.** This very session is a live
|
|
72
|
+
Claude Code runtime in which `git ls-files .claude/skills/` returns `0`
|
|
73
|
+
yet skills load **and execute** (the `roadmap:process-full` skill was
|
|
74
|
+
loaded and run from its SKILL.md). Registration → runtime is therefore
|
|
75
|
+
demonstrated, not inferred, for the filesystem channel.
|
|
76
|
+
- **Consumer filesystem channel.** `scripts/probe_skill_registration.py`
|
|
77
|
+
shows 365 skills register from user-scope `~/.claude/skills/`, built by
|
|
78
|
+
`install.sh`, independent of any committed project tree.
|
|
79
|
+
- **Lint green.** `python3 scripts/lint_marketplace.py` → 365 skills, no
|
|
80
|
+
issues (reverse-completeness scans the two committed sources).
|
|
81
|
+
- **Idempotent regen.** `task generate-tools` produces no tracked diff;
|
|
82
|
+
`.claude/skills/` stays gitignored (0 tracked files).
|
|
83
|
+
|
|
84
|
+
## Council convergence
|
|
85
|
+
|
|
86
|
+
Cross-checked with the AI council (analysis mode, members
|
|
87
|
+
anthropic/claude-sonnet-4-5 + openai/gpt-4o, 2026-06-01). Both members
|
|
88
|
+
converged on a single strongest blind spot: `claude plugin details` proves
|
|
89
|
+
*registration metadata*, not *live runtime execution*, and asked for a live
|
|
90
|
+
session test before closing. That test was then run and is recorded above
|
|
91
|
+
(this session executes skills with zero committed `.claude/skills/`; the
|
|
92
|
+
marketplace plugin was installed + enabled and resolved all 365 skills).
|
|
93
|
+
The council's residual follow-ups are carried into Consequences.
|
|
94
|
+
|
|
95
|
+
## Consequences
|
|
96
|
+
|
|
97
|
+
**Positive**
|
|
98
|
+
|
|
99
|
+
- `.claude/` in git is `settings.json` only — no per-skill-set PR churn from
|
|
100
|
+
the previously-committed 365 symlinks.
|
|
101
|
+
- Marketplace source paths (`.agent-src/skills/`, `.claude-plugin/skills/`)
|
|
102
|
+
are **committed**, so marketplace consumers cloning at a tag or with
|
|
103
|
+
`--depth=1` still resolve every referenced skill — a strict improvement
|
|
104
|
+
over the old gitignore-adjacent layout.
|
|
105
|
+
|
|
106
|
+
**Costs / residual risks (from council follow-ups)**
|
|
107
|
+
|
|
108
|
+
- **Consumer channel depends on `install.sh`.** A consumer who clones the
|
|
109
|
+
repo but never runs `install.sh` (and never installs the marketplace
|
|
110
|
+
plugin) gets no `~/.claude/skills/`. This is unchanged from before the
|
|
111
|
+
untracking and is the documented consumer contract; a CI smoke test
|
|
112
|
+
(`npm install` → `probe_skill_registration.py` → assert 365) is a sensible
|
|
113
|
+
follow-up but is out of this ADR's scope.
|
|
114
|
+
- **Channel precedence is undocumented.** When a dev has the repo open
|
|
115
|
+
(local `.claude/skills/`) *and* the marketplace plugin installed, the
|
|
116
|
+
precedence of local vs marketplace skills is not formally specified.
|
|
117
|
+
Day-to-day dev uses the local generate-tools tree; no conflict observed.
|
|
118
|
+
Follow-up only.
|
|
119
|
+
- **`metadata.keywords` validator warning.** The field holds generic terms
|
|
120
|
+
(tool names, `php`, `laravel`), not skill names, so it is safe to drop;
|
|
121
|
+
left in place here to keep this diff minimal (out of scope per
|
|
122
|
+
`minimal-safe-diff`).
|
|
123
|
+
|
|
124
|
+
## Alternatives
|
|
125
|
+
|
|
126
|
+
- **Keep `.claude/skills/` tracked (ADR-030 convention).** Rejected: the
|
|
127
|
+
registration test shows the convention is satisfied by locally-built and
|
|
128
|
+
marketplace-resolved trees; committing 365 symlinks adds PR churn with no
|
|
129
|
+
resolution benefit.
|
|
130
|
+
|
|
131
|
+
## References
|
|
132
|
+
|
|
133
|
+
- ADR-030 — Claude Code command-projection strategy (established the
|
|
134
|
+
`.claude/skills/` filesystem-channel convention this ADR revisits).
|
|
135
|
+
- `scripts/condense.py` — `generate_plugin_command_skills()` emits the
|
|
136
|
+
`.claude-plugin/skills/<slug>` projection.
|
|
137
|
+
- `scripts/lint_marketplace.py` — reverse-completeness over the two
|
|
138
|
+
committed sources.
|
|
139
|
+
- `scripts/probe_skill_registration.py` — live install-state probe.
|
package/docs/decisions/INDEX.md
CHANGED
|
@@ -41,6 +41,8 @@ _Auto-generated by `scripts/adr/regenerate_index.py`. Do not edit._
|
|
|
41
41
|
| [ADR-035](ADR-035-model-capability-tiers.md) | Model Capability Tiers | accepted | 2026-05-30 | 034 |
|
|
42
42
|
| [ADR-036](ADR-036-global-install-browser-wizard-handoff.md) | Global Install Browser Wizard Handoff | accepted | 2026-06-01 | — |
|
|
43
43
|
| [ADR-037](ADR-037-cost-profile-untangle.md) | Cost Profile Untangle | accepted | 2026-06-01 | — |
|
|
44
|
+
| [ADR-038](ADR-038-canonical-settings-path.md) | Canonical Settings Path | — | — | — |
|
|
45
|
+
| [ADR-039](ADR-039-claude-skills-untracked.md) | Claude Skills Untracked | accepted | 2026-06-01 | — |
|
|
44
46
|
|
|
45
47
|
## Unnumbered (legacy)
|
|
46
48
|
|