@softspark/ai-toolkit 1.7.0 → 1.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/CHANGELOG.md CHANGED
@@ -7,6 +7,49 @@ Versioning follows [Semantic Versioning](https://semver.org/).
7
7
 
8
8
  ---
9
9
 
10
+ ## v1.9.0 — Project Registry & Doc Sync (2026-04-12)
11
+
12
+ ### Added
13
+ - **Project registry** — `install --local` automatically registers project path in `~/.ai-toolkit/projects.json`. `ai-toolkit update` propagates updates to all registered projects in parallel via `ThreadPoolExecutor`
14
+ - **`ai-toolkit projects`** — list registered projects, `--prune` to remove stale (deleted directories), `remove <path>` to unregister specific project
15
+ - **Parallel update propagation** — `ai-toolkit update` (global) now auto-updates all registered local projects concurrently (max 8 workers)
16
+
17
+ ### Fixed
18
+ - **README.md** — skill count 91→92 in comparison table, added Augment/Antigravity to cross-tool tables, fixed Notification hook description (inline→`notify-waiting.sh`)
19
+ - **README.md** — added Config Inheritance section, Project Registry section, 6 new CLI commands to reference table
20
+ - **ARCHITECTURE.md** — added Config Inheritance and Project Registry to Extension Points
21
+ - **CLAUDE.md** — added `config` and `projects` commands
22
+
23
+ ---
24
+
25
+ ## v1.8.0 — Enterprise Config Inheritance (2026-04-12)
26
+
27
+ ### Added
28
+ - **Configuration inheritance system** — `extends` pattern (like ESLint/TypeScript) for multi-repo AI governance. Organizations define a shared base config published as npm package, git URL, or local path; projects inherit via `.ai-toolkit.json`
29
+ - **`ai-toolkit config validate`** — schema validation + extends resolution + enforcement check
30
+ - **`ai-toolkit config diff`** — visual diff of project vs base config (profile, agents, rules, constitution, overrides)
31
+ - **`ai-toolkit config init`** — interactive or flag-driven `.ai-toolkit.json` creation with extends validation
32
+ - **`ai-toolkit config create-base`** — scaffolds ready-to-publish npm base config package (package.json, ai-toolkit.config.json, rules/, agents/, README)
33
+ - **`ai-toolkit config check`** — CI enforcement gate with JSON output and exit codes (0=pass, 1=fail, 2=no config)
34
+ - **Merge engine** — layered deep merge (base → project) with special handling for agents (requiredAgents enforcement), rules (union), constitution (immutability), enforce blocks (cannot weaken)
35
+ - **Constitution immutability guard** — Articles I-V absolutely immutable; base config articles immutable; projects can only ADD new articles (6+)
36
+ - **Override validation** — `override: true` + justification (min 20 chars) required; `forbidOverride` enforcement
37
+ - **Enforce constraints** — 4 types: `minHookProfile`, `requiredPlugins`, `forbidOverride`, `requiredAgents`
38
+ - **Lock file** (`.ai-toolkit.lock.json`) — pins resolved base config versions for reproducible installs across team; generated on `install --local`, updated on `update --local`
39
+ - **Audit trail** — extends metadata recorded in `state.json` and `.ai-toolkit-extends.json`
40
+ - **Offline fallback** — uses cached configs from `~/.ai-toolkit/config-cache/` when registry unavailable
41
+ - **Cycle detection** — max 5-level extends chain with circular reference detection
42
+ - **Install integration** — `install --local` and `update --local` auto-detect `.ai-toolkit.json`, resolve extends, merge, validate, inject rules + constitution amendments into generated files
43
+ - **New CLI flags** — `--config <path>` (explicit config file), `--refresh-base` (force re-fetch)
44
+ - **JSON Schema** — `scripts/schemas/ai-toolkit-config.schema.json` for editor autocompletion
45
+ - **Enterprise config guide** — `kb/reference/enterprise-config-guide.md` comprehensive documentation
46
+ - **52 new tests** — resolver (7), merger (13), CLI (23), install integration (9)
47
+
48
+ ### Changed
49
+ - **`manifest.json`** — added `config_inheritance` section with schema references and v1 field list
50
+
51
+ ---
52
+
10
53
  ## v1.7.0 — Offline-First SLM Compilation (2026-04-11)
11
54
 
12
55
  ### Added
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
7
7
  [![Skills](https://img.shields.io/badge/skills-92-brightgreen)](app/skills/)
8
8
  [![Agents](https://img.shields.io/badge/agents-44-blue)](app/agents/)
9
- [![Tests](https://img.shields.io/badge/tests-512%20passing-success)](tests/)
9
+ [![Tests](https://img.shields.io/badge/tests-575%20passing-success)](tests/)
10
10
 
11
11
  ---
12
12
 
@@ -318,7 +318,7 @@ Hook logic lives in `app/hooks/*.sh` — not inline JSON one-liners. Scripts are
318
318
  | SessionStart | `session-start.sh` | MANDATORY rules reminder + session context + instincts |
319
319
  | SessionStart | `mcp-health.sh` | Check MCP server command availability (non-blocking warning) |
320
320
  | SessionStart | `session-context.sh` | Capture environment snapshot (pwd, git branch, versions) to `~/.ai-toolkit/sessions/current-context.json` |
321
- | Notification | *(inline)* | macOS desktop notification |
321
+ | Notification | `notify-waiting.sh` | Cross-platform desktop notification |
322
322
  | PreToolUse | `guard-destructive.sh` | Block `rm -rf`, `DROP TABLE`, etc. |
323
323
  | PreToolUse | `guard-path.sh` | Block wrong-user path hallucination |
324
324
  | PreToolUse | `guard-config.sh` | Block edits to linter/formatter config files unless explicitly requested |
@@ -612,18 +612,62 @@ All packs have `status: experimental`. Each has a `plugin.json` manifest and `RE
612
612
 
613
613
  ---
614
614
 
615
+ ## Config Inheritance (`extends`)
616
+
617
+ Enterprise-grade configuration inheritance for multi-repo AI governance. Organizations define a shared base config published as an npm package, Git URL, or local path. Projects inherit via `.ai-toolkit.json`:
618
+
619
+ ```json
620
+ {
621
+ "extends": "@mycompany/ai-toolkit-config",
622
+ "profile": "standard"
623
+ }
624
+ ```
625
+
626
+ **Key capabilities:**
627
+ - **Layered merge** — base config + project overrides, with deep merge for dicts, union for lists, project-wins for scalars
628
+ - **Constitution immutability** — Articles I-V and base articles cannot be modified; projects can only ADD new articles (6+)
629
+ - **Enforce constraints** — `requiredAgents`, `forbidOverride`, `minHookProfile`, `requiredPlugins`
630
+ - **Override validation** — requires explicit `override: true` + justification (min 20 chars)
631
+ - **Lock file** — `.ai-toolkit.lock.json` pins resolved versions for reproducible installs
632
+ - **Offline fallback** — uses cached configs from `~/.ai-toolkit/config-cache/` when registry unavailable
633
+
634
+ ```bash
635
+ ai-toolkit config create-base @mycompany/ai-toolkit-config # scaffold base package
636
+ ai-toolkit config init --extends @mycompany/ai-toolkit-config # setup project
637
+ ai-toolkit config validate # schema + extends + enforcement
638
+ ai-toolkit config diff # project vs base differences
639
+ ai-toolkit config check # CI enforcement gate (exit 0/1/2, --json)
640
+ ```
641
+
642
+ See [Enterprise Config Guide](kb/reference/enterprise-config-guide.md) for full documentation.
643
+
644
+ ---
645
+
646
+ ## Project Registry
647
+
648
+ All projects installed with `--local` are automatically registered in `~/.ai-toolkit/projects.json`. Running `ai-toolkit update` propagates updates to all registered projects in parallel.
649
+
650
+ ```bash
651
+ ai-toolkit projects # list registered projects
652
+ ai-toolkit projects --prune # remove stale (deleted) entries
653
+ ai-toolkit projects remove /path # unregister specific project
654
+ ai-toolkit update # global update + parallel update ALL projects
655
+ ```
656
+
657
+ ---
658
+
615
659
  ## Comparison
616
660
 
617
661
  | Feature | ai-toolkit | everything-claude-code | wshobson/agents | ruflo |
618
662
  |---------|---------------|----------------------|-----------------|-------|
619
- | Skills | 91 | 100+ | 146 | 20+ |
663
+ | Skills | 92 | 100+ | 146 | 20+ |
620
664
  | Agents | 44 | 30+ | 112 | 20+ |
621
665
  | Machine-enforced constitution | **Yes** | No (docs only) | No | No |
622
666
  | Skill-scoped lifecycle hooks | **Yes** | No | No | No |
623
667
  | Effort-based model budgeting | **Yes** | No | No | No |
624
668
  | Test suite | Yes (bats) | Yes (997 tests) | No | Yes |
625
669
  | npm/npx install | Yes | Yes | Yes | Yes |
626
- | Cross-tool support | **Cursor, Windsurf, Copilot, Gemini, Cline, Roo, Aider, Codex** | 5+ tools | Smithery | Limited |
670
+ | Cross-tool support | **Cursor, Windsurf, Copilot, Gemini, Cline, Roo, Aider, Augment, Antigravity** | 5+ tools | Smithery | Limited |
627
671
  | Selective install | Yes | Yes | Yes (72 plugins) | No |
628
672
  | Session persistence | Yes | Yes | No | No |
629
673
  | Architecture notes | **Yes** | No | No | No |
@@ -662,6 +706,8 @@ Pre-configured team presets via `/teams`:
662
706
  | Cline | `.clinerules` | project |
663
707
  | Roo Code | `.roomodes` | project |
664
708
  | Aider | `.aider.conf.yml` | project |
709
+ | Augment | `.augment/rules/ai-toolkit-*.md` | project |
710
+ | Google Antigravity | `.agent/rules/` + `.agent/workflows/` | project |
665
711
  | Codex / OpenCode | `AGENTS.md` | project |
666
712
 
667
713
  ```bash
@@ -764,8 +810,14 @@ Usage: ai-toolkit <command> [options]
764
810
  | `mcp add <name> [names...]` | Add MCP server template(s) to `.mcp.json` |
765
811
  | `mcp show <name>` | Show MCP template config details |
766
812
  | `mcp remove <name>` | Remove MCP server from `.mcp.json` |
813
+ | `config validate [path]` | Validate `.ai-toolkit.json` schema + extends + enforcement |
814
+ | `config diff [path]` | Show project vs base config differences |
815
+ | `config init [flags]` | Create `.ai-toolkit.json` (`--extends`, `--profile`, `--no-extends`) |
816
+ | `config create-base <name>` | Scaffold base config npm package |
817
+ | `config check [path]` | CI enforcement gate (exit 0=pass, 1=fail, 2=no config; `--json`) |
818
+ | `projects` | List registered projects (`--prune` to clean stale, `remove <path>`) |
767
819
  | `status` | Show installed modules and version |
768
- | `update` | Re-install with saved modules (incremental) |
820
+ | `update` | Re-install with saved modules + update all registered projects |
769
821
  | `validate` | Verify toolkit integrity (`--strict` for CI-grade, warnings = errors) |
770
822
  | `doctor` | Diagnose install health, hooks, quick-win assets, and artifact drift |
771
823
  | `doctor --fix` | Auto-repair broken symlinks, missing hooks, stale artifacts |
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ai-toolkit",
3
3
  "description": "Professional-grade Claude Code toolkit with persona presets, skill security auditor, expanded lifecycle hooks, experimental opt-in plugin packs, benchmark harvesting, and multi-tool support.",
4
- "version": "1.7.0",
4
+ "version": "1.9.0",
5
5
  "author": {
6
6
  "name": "SoftSpark",
7
7
  "url": "https://github.com/softspark"
@@ -315,6 +315,12 @@ The `inject_section_cli.py` script provides a stable marker-based injection API.
315
315
  ### SLM Compilation (`compile-slm`)
316
316
  `scripts/compile_slm.py` compiles the full toolkit (20K+ tokens) into a minimal system prompt for Small Language Models (2K-16K tokens). Pipeline: Parse → Score → Compress → Pack → Emit. Supports 4 compression levels (ultra-light, light, standard, extended), 4 output formats (raw, ollama, json-string, aider), persona-aware scoring, and language-aware rule filtering. Profile `offline-slm` in `manifest.json`. Constitution is always included (non-negotiable).
317
317
 
318
+ ### Config Inheritance (`extends`)
319
+ `scripts/config_resolver.py`, `config_merger.py`, `config_validator.py`, `config_cli.py`, `config_scaffold.py`, `config_lock.py`. Enterprise configuration inheritance via `.ai-toolkit.json` `extends` field. Resolves base configs from npm packages, Git URLs, or local paths. Layered deep merge with constitution immutability (Articles I-V absolute), enforce constraints (`requiredAgents`, `forbidOverride`, `minHookProfile`), override validation (`override: true` + justification), and lock file (`.ai-toolkit.lock.json`). CLI: `config validate`, `config diff`, `config init`, `config create-base`, `config check`. Integrated into `install --local` and `update --local` flows.
320
+
321
+ ### Project Registry
322
+ `scripts/install_steps/project_registry.py`, `scripts/update_projects.py`, `scripts/projects_cli.py`. Tracks all `--local` installed projects in `~/.ai-toolkit/projects.json`. `ai-toolkit update` propagates to all registered projects in parallel via `ThreadPoolExecutor`. CLI: `ai-toolkit projects`, `--prune`, `remove <path>`.
323
+
318
324
  ### Manifest Install (`--modules`, `--auto-detect`)
319
325
  `manifest.json` defines all installable components as named modules. Install individual modules with `ai-toolkit install --modules <name>` or let the installer detect which language rules to add based on project files (e.g. `package.json` → `rules-typescript`, `go.mod` → `rules-golang`).
320
326
 
package/bin/ai-toolkit.js CHANGED
@@ -75,6 +75,8 @@ const COMMANDS = {
75
75
  stats: 'Show skill usage statistics (--reset to clear, --json for raw output)',
76
76
  create: 'Scaffold new skill from template (e.g. create skill my-lint --template=linter)',
77
77
  mcp: 'Manage MCP server templates (list, show, add, remove)',
78
+ config: 'Manage config inheritance (validate, diff, init, create-base, check)',
79
+ projects: 'List and manage registered projects (--prune, remove <path>)',
78
80
  plugin: 'Manage plugin packs (install, remove, update, clean, list, status)',
79
81
  sync: 'Sync config to/from GitHub Gist (--export, --push, --pull, --import)',
80
82
  'cursor-rules': 'Generate .cursorrules for Cursor IDE (legacy)',
@@ -376,6 +378,17 @@ function handleMcp(args) {
376
378
  run(scriptPath('mcp_manager.py'), args);
377
379
  }
378
380
 
381
+ /**
382
+ * Handle `ai-toolkit config <subcommand>` -- config inheritance management.
383
+ * @param {string[]} args - Subcommand and its arguments
384
+ */
385
+ function handleConfig(args) {
386
+ if (args.length === 0) {
387
+ args = ['--help'];
388
+ }
389
+ run(scriptPath('config_cli.py'), args);
390
+ }
391
+
379
392
  /**
380
393
  * Handle `ai-toolkit generate-all` -- runs every generator plus llms-txt.
381
394
  * @param {string[]} _args - Unused, kept for signature consistency
@@ -413,6 +426,7 @@ function handleStatus(_args) {
413
426
  * @param {string[]} args
414
427
  */
415
428
  function handleUpdate(args) {
429
+ const isLocal = args.includes('--local');
416
430
  const statePath = path.join(process.env.HOME, '.ai-toolkit', 'state.json');
417
431
  let stateArgs = [];
418
432
 
@@ -435,6 +449,27 @@ function handleUpdate(args) {
435
449
 
436
450
  // User-provided args override state-derived args
437
451
  run(scriptPath('install.py'), [...stateArgs, ...args]);
452
+
453
+ // After global update (not --local), propagate to all registered projects
454
+ if (!isLocal) {
455
+ const registryPath = path.join(process.env.HOME, '.ai-toolkit', 'projects.json');
456
+ if (fs.existsSync(registryPath)) {
457
+ try {
458
+ const registry = JSON.parse(fs.readFileSync(registryPath, 'utf8'));
459
+ const projects = registry.projects || [];
460
+ if (projects.length > 0) {
461
+ console.log('');
462
+ console.log('## Updating registered projects');
463
+ console.log('');
464
+ // Pass through --skip, --refresh-base flags to project updates
465
+ const passthrough = args.filter(a => a.startsWith('--skip') || a === '--refresh-base');
466
+ run(scriptPath('update_projects.py'), passthrough);
467
+ }
468
+ } catch (_err) {
469
+ // Registry corrupt -- skip project updates
470
+ }
471
+ }
472
+ }
438
473
  }
439
474
 
440
475
  /** @type {Record<string, (args: string[]) => void>} */
@@ -446,6 +481,8 @@ const SPECIAL_HANDLERS = {
446
481
  'create': handleCreate,
447
482
  'sync': handleSync,
448
483
  'mcp': handleMcp,
484
+ 'config': handleConfig,
485
+ 'projects': (args) => run(scriptPath('projects_cli.py'), args),
449
486
  'plugin': (args) => run(scriptPath('plugin.py'), args),
450
487
  'remove-rule': handleRemoveRule,
451
488
  'add-rule': handleAddRule,
@@ -11,10 +11,10 @@ tags:
11
11
  - team-management
12
12
  - monorepo
13
13
  doc_type: plan
14
- status: proposed
14
+ status: completed
15
15
  created: "2026-04-10"
16
- last_updated: "2026-04-10"
17
- completion: "0%"
16
+ last_updated: "2026-04-11"
17
+ completion: "100%"
18
18
  description: "Configuration inheritance system for ai-toolkit. Enables organizations to define a shared base config (agents, rules, hooks, profiles, constitution overrides) published as an npm package or local path, which individual projects extend via an `extends` field. Changes to the base config propagate automatically on `ai-toolkit update`. Targets enterprises managing 10-100+ repositories with uniform AI governance."
19
19
  ---
20
20
 
@@ -121,21 +121,21 @@ Merge Pipeline:
121
121
 
122
122
  | # | Feature | Priority | Status | Est. Time | Notes |
123
123
  |---|---------|----------|--------|-----------|-------|
124
- | 1.1 | `.ai-toolkit.json` schema definition | P0 | Proposed | 1d | JSON Schema with `extends` field |
125
- | 1.2 | Config resolver (npm, git, local path) | P0 | Proposed | 3d | Fetch + cache + validate base configs |
126
- | 1.3 | Merge engine (layered merge with override semantics) | P0 | Proposed | 3d | Deep merge with `override: true` gates |
127
- | 1.4 | Constitution immutability guard | P0 | Proposed | 1d | Block weakening of safety articles |
128
- | 2.1 | Install/update integration | P0 | Proposed | 2d | Resolve extends during install/update |
129
- | 2.2 | `ai-toolkit config diff` command | P0 | Proposed | 1.5d | Show project vs base differences — primary debugging tool |
130
- | 2.3 | `ai-toolkit config validate` command | P0 | Proposed | 1d | Validate .ai-toolkit.json schema + extends resolution |
131
- | 2.4 | `ai-toolkit config init` command | P1 | Proposed | 1.5d | Interactive project config setup |
132
- | 2.5 | `ai-toolkit config create-base` command | P1 | Proposed | 2d | Scaffold base config package |
133
- | 3.1 | Audit trail in state.json | P1 | Proposed | 1d | Record resolved config provenance |
134
- | 3.2 | Lock file (`.ai-toolkit.lock.json`) | P1 | Proposed | 1.5d | Pin resolved versions for reproducibility |
135
- | 3.3 | Base config scaffolder (npm package template) | P1 | Proposed | 1.5d | Ready-to-publish template |
136
- | 3.4 | CI enforcement (`ai-toolkit config check`) | P2 | Proposed | 1d | Verify project adheres to base + no unapproved overrides |
137
- | 4.1 | Tests | P1 | Proposed | 3d | Unit: resolution, merge, immutability, override, CLI commands. Integration: `install --local` with `.ai-toolkit.json` containing `extends`, verify resolved `CLAUDE.md` has base + project rules merged end-to-end |
138
- | 4.2 | Documentation | P1 | Proposed | 3d | Enterprise setup guide + all 9 docs per CLAUDE.md: README, CLAUDE.md, ARCHITECTURE.md, package.json, llms.txt, llms-full.txt, AGENTS.md, skills-catalog.md, architecture-overview.md |
124
+ | 1.1 | `.ai-toolkit.json` schema definition | P0 | **Done** | 1d | `scripts/schemas/ai-toolkit-config.schema.json` |
125
+ | 1.2 | Config resolver (npm, git, local path) | P0 | **Done** | 3d | `scripts/config_resolver.py` (~330 LOC) |
126
+ | 1.3 | Merge engine (layered merge with override semantics) | P0 | **Done** | 3d | `scripts/config_merger.py` (~340 LOC) |
127
+ | 1.4 | Constitution immutability guard | P0 | **Done** | 1d | In config_merger.py `_merge_constitution()` |
128
+ | 2.1 | Install/update integration | P0 | **Done** | 2d | `install.py` + `ai_tools.py` auto-detect, resolve, merge, inject |
129
+ | 2.2 | `ai-toolkit config diff` command | P0 | **Done** | 1.5d | `scripts/config_cli.py` `cmd_diff()` |
130
+ | 2.3 | `ai-toolkit config validate` command | P0 | **Done** | 1d | `scripts/config_cli.py` `cmd_validate()` |
131
+ | 2.4 | `ai-toolkit config init` command | P1 | **Done** | 1.5d | Interactive + flag-driven, validates extends |
132
+ | 2.5 | `ai-toolkit config create-base` command | P1 | **Done** | 2d | `scripts/config_scaffold.py` full npm package scaffold |
133
+ | 3.1 | Audit trail in state.json | P1 | **Done** | 1d | `install_state.py` extends field + `.ai-toolkit-extends.json` |
134
+ | 3.2 | Lock file (`.ai-toolkit.lock.json`) | P1 | **Done** | 1.5d | `scripts/config_lock.py` generate/consume/staleness check |
135
+ | 3.3 | Base config scaffolder (npm package template) | P1 | **Done** | 1.5d | Part of `config_scaffold.py` `create_base_package()` |
136
+ | 3.4 | CI enforcement (`ai-toolkit config check`) | P2 | **Done** | 1d | `config_cli.py` `cmd_check()` JSON output, exit codes |
137
+ | 4.1 | Tests | P1 | **Done** | 3d | 39 tests: resolver (7), merger (13), CLI (10), install integration (9) |
138
+ | 4.2 | Documentation | P1 | **Done** | 3d | `kb/reference/enterprise-config-guide.md` comprehensive guide |
139
139
 
140
140
  **Phasing (MVP-first):**
141
141
  - **MVP Phase 1 (week 1-2):** Core engine — schema (1.1), resolver (1.2), merge engine (1.3), constitution guard (1.4)
@@ -864,25 +864,27 @@ v1 ships with a minimal schema. Each additional field adds merge logic, validati
864
864
  ## 11. Next Actions
865
865
 
866
866
  **MVP (ship first, ~3.5 weeks):**
867
- 1. [ ] Approve plan
868
- 2. [ ] Define `.ai-toolkit.json` JSON Schema — v1 scope only (1.1)
869
- 3. [ ] Implement config resolver (npm, git, local) with caching (1.2)
870
- 4. [ ] Implement merge engine with override validation (1.3)
871
- 5. [ ] Implement constitution immutability guard (1.4)
872
- 6. [ ] Integrate into install.py flow (2.1)
873
- 7. [ ] Create `config diff` viewer (2.2) — primary debugging tool
874
- 8. [ ] Create `config validate` checker (2.3)
875
- 9. [ ] Tests for above (4.1 partial)
876
- 10. [ ] **Ship MVP → announce → measure adoption**
877
-
878
- **Post-MVP (if demand validated):**
879
- 11. [ ] Create `config init` interactive command (2.4)
880
- 12. [ ] Create `config create-base` scaffolder (2.5)
881
- 13. [ ] Add audit trail to state.json (3.1)
882
- 14. [ ] Implement lock file generation + resolution (3.2)
883
- 15. [ ] Create base config npm package template (3.3)
884
- 16. [ ] Create CI enforcement command `config check` (3.4)
885
- 17. [ ] Full tests + documentation — all 9 docs per CLAUDE.md (4.1, 4.2)
867
+ 1. [x] Approve plan
868
+ 2. [x] Define `.ai-toolkit.json` JSON Schema — v1 scope only (1.1)
869
+ 3. [x] Implement config resolver (npm, git, local) with caching (1.2)
870
+ 4. [x] Implement merge engine with override validation (1.3)
871
+ 5. [x] Implement constitution immutability guard (1.4)
872
+ 6. [x] Integrate into install.py flow (2.1)
873
+ 7. [x] Create `config diff` viewer (2.2) — primary debugging tool
874
+ 8. [x] Create `config validate` checker (2.3)
875
+ 9. [x] Tests for above (4.1 partial)
876
+ 10. [x] **Ship MVP → announce → measure adoption**
877
+
878
+ **Post-MVP:**
879
+ 11. [x] Create `config init` interactive command (2.4)
880
+ 12. [x] Create `config create-base` scaffolder (2.5)
881
+ 13. [x] Add audit trail to state.json (3.1)
882
+ 14. [x] Implement lock file generation + resolution (3.2)
883
+ 15. [x] Create base config npm package template (3.3)
884
+ 16. [x] Create CI enforcement command `config check` (3.4)
885
+ 17. [x] Full tests + documentation (4.1, 4.2)
886
+
887
+ **All 17 items completed — 2026-04-11.**
886
888
 
887
889
  ---
888
890