@softspark/ai-toolkit 1.9.0 → 2.0.1
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 +40 -14
- package/README.md +18 -18
- package/app/ARCHITECTURE.md +3 -3
- package/app/hooks/governance-capture.sh +1 -1
- package/app/hooks/pre-compact-save.sh +1 -1
- package/app/hooks/session-context.sh +1 -1
- package/app/hooks/track-usage.sh +2 -2
- package/app/hooks.json +20 -20
- package/app/plugins/memory-pack/README.md +1 -1
- package/app/plugins/memory-pack/hooks/observation-capture.sh +2 -2
- package/app/plugins/memory-pack/hooks/session-summary.sh +1 -1
- package/app/plugins/memory-pack/scripts/init_db.py +2 -2
- package/app/plugins/memory-pack/skills/mem-search/SKILL.md +3 -3
- package/app/skills/hook-creator/SKILL.md +2 -2
- package/app/skills/mem-search/SKILL.md +3 -3
- package/app/skills/repeat/SKILL.md +1 -1
- package/bin/ai-toolkit.js +9 -4
- package/kb/history/completed/enterprise-config-inheritance-plan-20260412.md +32 -34
- package/kb/history/completed/offline-slm-profile-plan-20260411.md +12 -12
- package/kb/planning/cloud-security-pack-plan.md +3 -3
- package/kb/procedures/maintenance-sop.md +3 -3
- package/kb/reference/architecture-overview.md +5 -5
- package/kb/reference/benchmark-config.md +1 -1
- package/kb/reference/competitive-features-implementation.md +2 -2
- package/kb/reference/enterprise-config-guide.md +9 -9
- package/kb/reference/extension-api.md +1 -1
- package/kb/reference/global-install-model.md +2 -2
- package/kb/reference/hooks-catalog.md +30 -30
- package/kb/reference/integrations.md +3 -3
- package/kb/reference/manifest-install.md +4 -4
- package/kb/reference/plugin-pack-conventions.md +5 -5
- package/kb/reference/stats.md +3 -3
- package/kb/reference/sync.md +3 -3
- package/llms-full.txt +118 -899
- package/llms.txt +0 -1
- package/manifest.json +3 -3
- package/package.json +1 -1
- package/scripts/add_rule.py +3 -2
- package/scripts/benchmark_config.py +3 -1
- package/scripts/compile_slm.py +9 -7
- package/scripts/config_cli.py +7 -7
- package/scripts/config_lock.py +12 -4
- package/scripts/config_merger.py +1 -1
- package/scripts/config_resolver.py +20 -7
- package/scripts/config_scaffold.py +4 -4
- package/scripts/config_validator.py +3 -3
- package/scripts/dir_rules_shared.py +1 -1
- package/scripts/doctor.py +3 -2
- package/scripts/install.py +12 -7
- package/scripts/install_git_hooks.py +1 -1
- package/scripts/install_steps/ai_tools.py +4 -4
- package/scripts/install_steps/hooks.py +1 -1
- package/scripts/install_steps/install_state.py +8 -6
- package/scripts/install_steps/project_registry.py +5 -5
- package/scripts/migrate.py +241 -0
- package/scripts/paths.py +50 -0
- package/scripts/plugin.py +8 -6
- package/scripts/remove_rule.py +5 -4
- package/scripts/stats.py +3 -2
- package/scripts/sync.py +3 -2
- package/scripts/update_projects.py +1 -1
- package/scripts/version_check.py +5 -2
- package/kb/planning/local-dashboard-plan.md +0 -773
|
@@ -15,7 +15,7 @@ $ARGUMENTS
|
|
|
15
15
|
|
|
16
16
|
## How It Works
|
|
17
17
|
|
|
18
|
-
This skill queries the SQLite FTS5 full-text search index at `~/.ai-toolkit/memory.db` to find relevant observations from past sessions.
|
|
18
|
+
This skill queries the SQLite FTS5 full-text search index at `~/.softspark/ai-toolkit/memory.db` to find relevant observations from past sessions.
|
|
19
19
|
|
|
20
20
|
## Instructions
|
|
21
21
|
|
|
@@ -23,12 +23,12 @@ This skill queries the SQLite FTS5 full-text search index at `~/.ai-toolkit/memo
|
|
|
23
23
|
|
|
24
24
|
2. **Initialize the database** if it does not exist:
|
|
25
25
|
```bash
|
|
26
|
-
python3 "$HOME/.ai-toolkit/hooks/../plugins/memory-pack/scripts/init_db.py" 2>/dev/null || true
|
|
26
|
+
python3 "$HOME/.softspark/ai-toolkit/hooks/../plugins/memory-pack/scripts/init_db.py" 2>/dev/null || true
|
|
27
27
|
```
|
|
28
28
|
|
|
29
29
|
3. **Run the FTS5 search** against the observations table:
|
|
30
30
|
```bash
|
|
31
|
-
sqlite3 ~/.ai-toolkit/memory.db "
|
|
31
|
+
sqlite3 ~/.softspark/ai-toolkit/memory.db "
|
|
32
32
|
SELECT o.id, o.session_id, o.tool_name, o.content, o.created_at,
|
|
33
33
|
s.project_dir, s.summary
|
|
34
34
|
FROM observations_fts fts
|
package/bin/ai-toolkit.js
CHANGED
|
@@ -62,8 +62,8 @@ const COMMANDS = {
|
|
|
62
62
|
status: 'Show installed modules, version, and profile from state.json',
|
|
63
63
|
reset: 'Wipe and recreate project-local configs from scratch (requires --local)',
|
|
64
64
|
uninstall: 'Remove ai-toolkit from ~/.claude/',
|
|
65
|
-
'add-rule': 'Register a rule file in ~/.ai-toolkit/rules/ (applied on every install/update)',
|
|
66
|
-
'remove-rule': 'Unregister a rule from ~/.ai-toolkit/rules/ and remove its block from CLAUDE.md',
|
|
65
|
+
'add-rule': 'Register a rule file in ~/.softspark/ai-toolkit/rules/ (applied on every install/update)',
|
|
66
|
+
'remove-rule': 'Unregister a rule from ~/.softspark/ai-toolkit/rules/ and remove its block from CLAUDE.md',
|
|
67
67
|
'inject-hook': 'Inject external hooks into ~/.claude/settings.json (tagged with _source for idempotent updates)',
|
|
68
68
|
'remove-hook': 'Remove injected hooks by source name from ~/.claude/settings.json',
|
|
69
69
|
validate: 'Verify toolkit integrity',
|
|
@@ -427,7 +427,12 @@ function handleStatus(_args) {
|
|
|
427
427
|
*/
|
|
428
428
|
function handleUpdate(args) {
|
|
429
429
|
const isLocal = args.includes('--local');
|
|
430
|
-
|
|
430
|
+
let statePath = path.join(process.env.HOME, '.softspark', 'ai-toolkit', 'state.json');
|
|
431
|
+
// Fallback to legacy path for first run after upgrade (before migration runs)
|
|
432
|
+
if (!fs.existsSync(statePath)) {
|
|
433
|
+
const legacyState = path.join(process.env.HOME, '.ai-toolkit', 'state.json');
|
|
434
|
+
if (fs.existsSync(legacyState)) statePath = legacyState;
|
|
435
|
+
}
|
|
431
436
|
let stateArgs = [];
|
|
432
437
|
|
|
433
438
|
if (fs.existsSync(statePath)) {
|
|
@@ -452,7 +457,7 @@ function handleUpdate(args) {
|
|
|
452
457
|
|
|
453
458
|
// After global update (not --local), propagate to all registered projects
|
|
454
459
|
if (!isLocal) {
|
|
455
|
-
const registryPath = path.join(process.env.HOME, '.ai-toolkit', 'projects.json');
|
|
460
|
+
const registryPath = path.join(process.env.HOME, '.softspark', 'ai-toolkit', 'projects.json');
|
|
456
461
|
if (fs.existsSync(registryPath)) {
|
|
457
462
|
try {
|
|
458
463
|
const registry = JSON.parse(fs.readFileSync(registryPath, 'utf8'));
|
|
@@ -53,10 +53,10 @@ Create a configuration inheritance system where projects can extend a shared bas
|
|
|
53
53
|
| FR3 | Constitution immutability — Articles I-V cannot be modified | Must | 100% block rate on modification attempts |
|
|
54
54
|
| FR4 | Override validation with `override: true` + `justification` | Must | Missing justification → error |
|
|
55
55
|
| FR5 | `enforce` block constraints (minHookProfile, requiredPlugins, forbidOverride, requiredAgents) | Must | All 4 constraint types enforced |
|
|
56
|
-
| FR6 | Install/update integration — resolve extends during install | Must | `install --local` detects `.
|
|
56
|
+
| FR6 | Install/update integration — resolve extends during install | Must | `install --local` detects `.softspark-toolkit.json` |
|
|
57
57
|
| FR7 | `config diff` command — show project vs base differences | Must | All merge layers visible |
|
|
58
58
|
| FR8 | `config validate` command — schema + enforcement validation | Must | Exit 0/1 for pass/fail |
|
|
59
|
-
| FR9 | `config init` — interactive project config setup | Should | Guided flow produces valid `.
|
|
59
|
+
| FR9 | `config init` — interactive project config setup | Should | Guided flow produces valid `.softspark-toolkit.json` |
|
|
60
60
|
| FR10 | `config create-base` — scaffold npm base config package | Should | Ready-to-publish package with `package.json` |
|
|
61
61
|
| FR11 | Lock file for reproducible installs | Should | Identical resolved config across team members |
|
|
62
62
|
| FR12 | Audit trail in `state.json` | Should | Resolved version + overrides recorded |
|
|
@@ -84,7 +84,7 @@ Project Level (per-repository):
|
|
|
84
84
|
══════════════════════════════
|
|
85
85
|
|
|
86
86
|
my-service/
|
|
87
|
-
├── .
|
|
87
|
+
├── .softspark-toolkit.json ← project config with "extends"
|
|
88
88
|
├── .claude/
|
|
89
89
|
│ ├── CLAUDE.md ← generated (base + project merged)
|
|
90
90
|
│ └── settings.json ← generated (base hooks + project hooks merged)
|
|
@@ -99,7 +99,7 @@ Merge Pipeline:
|
|
|
99
99
|
ai-toolkit defaults (manifest.json) ← Layer 1: toolkit defaults
|
|
100
100
|
│
|
|
101
101
|
▼
|
|
102
|
-
.
|
|
102
|
+
.softspark-toolkit.json ← Layer 2: project overrides
|
|
103
103
|
│
|
|
104
104
|
▼
|
|
105
105
|
Resolved Configuration ← Final: CLAUDE.md, settings.json, etc.
|
|
@@ -110,7 +110,7 @@ Merge Pipeline:
|
|
|
110
110
|
```
|
|
111
111
|
1. Load base config from "extends" (npm package, git URL, or local path)
|
|
112
112
|
2. Merge with ai-toolkit defaults (manifest.json profiles)
|
|
113
|
-
3. Apply project-level overrides from .
|
|
113
|
+
3. Apply project-level overrides from .softspark-toolkit.json
|
|
114
114
|
4. Validate merged config (constitution immutability, schema validation)
|
|
115
115
|
5. Generate output files (CLAUDE.md, settings.json, agent symlinks, etc.)
|
|
116
116
|
```
|
|
@@ -121,7 +121,7 @@ Merge Pipeline:
|
|
|
121
121
|
|
|
122
122
|
| # | Feature | Priority | Status | Est. Time | Notes |
|
|
123
123
|
|---|---------|----------|--------|-----------|-------|
|
|
124
|
-
| 1.1 | `.
|
|
124
|
+
| 1.1 | `.softspark-toolkit.json` schema definition | P0 | **Done** | 1d | `scripts/schemas/ai-toolkit-config.schema.json` |
|
|
125
125
|
| 1.2 | Config resolver (npm, git, local path) | P0 | **Done** | 3d | `scripts/config_resolver.py` (~330 LOC) |
|
|
126
126
|
| 1.3 | Merge engine (layered merge with override semantics) | P0 | **Done** | 3d | `scripts/config_merger.py` (~340 LOC) |
|
|
127
127
|
| 1.4 | Constitution immutability guard | P0 | **Done** | 1d | In config_merger.py `_merge_constitution()` |
|
|
@@ -130,8 +130,8 @@ Merge Pipeline:
|
|
|
130
130
|
| 2.3 | `ai-toolkit config validate` command | P0 | **Done** | 1d | `scripts/config_cli.py` `cmd_validate()` |
|
|
131
131
|
| 2.4 | `ai-toolkit config init` command | P1 | **Done** | 1.5d | Interactive + flag-driven, validates extends |
|
|
132
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 + `.
|
|
134
|
-
| 3.2 | Lock file (`.
|
|
133
|
+
| 3.1 | Audit trail in state.json | P1 | **Done** | 1d | `install_state.py` extends field + `.softspark-toolkit-extends.json` |
|
|
134
|
+
| 3.2 | Lock file (`.softspark-toolkit.lock.json`) | P1 | **Done** | 1.5d | `scripts/config_lock.py` — generate/consume/staleness check |
|
|
135
135
|
| 3.3 | Base config scaffolder (npm package template) | P1 | **Done** | 1.5d | Part of `config_scaffold.py` `create_base_package()` |
|
|
136
136
|
| 3.4 | CI enforcement (`ai-toolkit config check`) | P2 | **Done** | 1d | `config_cli.py` `cmd_check()` — JSON output, exit codes |
|
|
137
137
|
| 4.1 | Tests | P1 | **Done** | 3d | 39 tests: resolver (7), merger (13), CLI (10), install integration (9) |
|
|
@@ -189,7 +189,7 @@ Audit trail (3.1) ──┐
|
|
|
189
189
|
|
|
190
190
|
### Phase 1: Core Engine (week 1-2)
|
|
191
191
|
|
|
192
|
-
#### 1.1 Configuration Schema (`.
|
|
192
|
+
#### 1.1 Configuration Schema (`.softspark-toolkit.json`)
|
|
193
193
|
|
|
194
194
|
> **v1 scope:** The full schema below shows the target state. v1 implements only: `extends`, `profile`, `agents`, `rules`, `constitution`, and `enforce`. See section 6a for the v1/v2 field breakdown.
|
|
195
195
|
|
|
@@ -331,9 +331,9 @@ Audit trail (3.1) ──┐
|
|
|
331
331
|
| Local path | `"extends": "../shared-config"` | Resolve relative to project root |
|
|
332
332
|
| ~~Multiple bases~~ | ~~`"extends": ["@mycompany/base", "@mycompany/typescript-extra"]`~~ | Deferred to v2 — multi-base merge ordering is a complexity trap |
|
|
333
333
|
|
|
334
|
-
**Cache directory:** `~/.ai-toolkit/config-cache/`
|
|
334
|
+
**Cache directory:** `~/.softspark/ai-toolkit/config-cache/`
|
|
335
335
|
```
|
|
336
|
-
~/.ai-toolkit/config-cache/
|
|
336
|
+
~/.softspark/ai-toolkit/config-cache/
|
|
337
337
|
@mycompany/
|
|
338
338
|
ai-toolkit-config/
|
|
339
339
|
2.1.0/
|
|
@@ -391,7 +391,7 @@ def resolve_extends(extends_value: str, project_root: str,
|
|
|
391
391
|
**Max recursion depth:** 5 levels (prevent circular extends). Circular detection via visited set.
|
|
392
392
|
|
|
393
393
|
**Offline handling:** If the npm/git source is unavailable:
|
|
394
|
-
1. Check cache (`~/.ai-toolkit/config-cache/`)
|
|
394
|
+
1. Check cache (`~/.softspark/ai-toolkit/config-cache/`)
|
|
395
395
|
2. If cached version found → use with warning: "Using cached config v2.1.0 (offline)"
|
|
396
396
|
3. If not cached → error with instructions: "Run `ai-toolkit config update` when online"
|
|
397
397
|
|
|
@@ -532,7 +532,7 @@ def merge_constitution(base: dict, project: dict) -> dict:
|
|
|
532
532
|
|
|
533
533
|
```python
|
|
534
534
|
# During install --local:
|
|
535
|
-
# 1. Check for .
|
|
535
|
+
# 1. Check for .softspark-toolkit.json in project root
|
|
536
536
|
# 2. If found and has "extends":
|
|
537
537
|
# a. Resolve base config(s)
|
|
538
538
|
# b. Merge base → project
|
|
@@ -543,7 +543,7 @@ def merge_constitution(base: dict, project: dict) -> dict:
|
|
|
543
543
|
|
|
544
544
|
**CLI flags:**
|
|
545
545
|
```bash
|
|
546
|
-
ai-toolkit install --local # auto-detect .
|
|
546
|
+
ai-toolkit install --local # auto-detect .softspark-toolkit.json
|
|
547
547
|
ai-toolkit install --local --config ./custom.json # explicit config file
|
|
548
548
|
ai-toolkit update --local # re-resolve extends + update
|
|
549
549
|
ai-toolkit update --local --refresh-base # force re-fetch base config
|
|
@@ -591,7 +591,7 @@ ai-toolkit config diff
|
|
|
591
591
|
ai-toolkit config validate
|
|
592
592
|
|
|
593
593
|
# Checks:
|
|
594
|
-
# ✓ .
|
|
594
|
+
# ✓ .softspark-toolkit.json schema valid
|
|
595
595
|
# ✓ extends: @mycompany/ai-toolkit-config@2.1.0 resolved
|
|
596
596
|
# ✓ No forbidden overrides
|
|
597
597
|
# ✓ Required plugins installed: security-pack
|
|
@@ -616,12 +616,12 @@ ai-toolkit config init
|
|
|
616
616
|
# Flow:
|
|
617
617
|
# 1. "Does your organization have a shared ai-toolkit config? [y/n]"
|
|
618
618
|
# → y: "npm package name or git URL:" → resolves + validates
|
|
619
|
-
# → n: creates minimal .
|
|
619
|
+
# → n: creates minimal .softspark-toolkit.json without extends
|
|
620
620
|
# 2. "Which profile? [minimal/standard/strict]" → default from base or standard
|
|
621
621
|
# 3. "Which persona? [none/backend-lead/frontend-lead/devops-eng/junior-dev]"
|
|
622
622
|
# 4. Auto-detect languages from project
|
|
623
623
|
# 5. Auto-detect editors from project files
|
|
624
|
-
# 6. Write .
|
|
624
|
+
# 6. Write .softspark-toolkit.json
|
|
625
625
|
# 7. Run ai-toolkit install --local
|
|
626
626
|
```
|
|
627
627
|
|
|
@@ -685,7 +685,7 @@ ai-toolkit config create-base @mycompany/ai-toolkit-config
|
|
|
685
685
|
|
|
686
686
|
---
|
|
687
687
|
|
|
688
|
-
#### 3.2 Lock File (`.
|
|
688
|
+
#### 3.2 Lock File (`.softspark-toolkit.lock.json`)
|
|
689
689
|
|
|
690
690
|
**Purpose:** Pin the exact resolved version of base configs for reproducible installs across team members and CI.
|
|
691
691
|
|
|
@@ -697,7 +697,7 @@ ai-toolkit config create-base @mycompany/ai-toolkit-config
|
|
|
697
697
|
"version": "2.1.0",
|
|
698
698
|
"resolved": "https://registry.npmjs.org/@mycompany/ai-toolkit-config/-/ai-toolkit-config-2.1.0.tgz",
|
|
699
699
|
"integrity": "sha512-abc123...",
|
|
700
|
-
"cached": "~/.ai-toolkit/config-cache/@mycompany/ai-toolkit-config/2.1.0/"
|
|
700
|
+
"cached": "~/.softspark/ai-toolkit/config-cache/@mycompany/ai-toolkit-config/2.1.0/"
|
|
701
701
|
}
|
|
702
702
|
},
|
|
703
703
|
"generated_at": "2026-04-10T10:30:00Z",
|
|
@@ -709,7 +709,7 @@ ai-toolkit config create-base @mycompany/ai-toolkit-config
|
|
|
709
709
|
- `ai-toolkit install --local` → uses lock file if present (like `npm ci`)
|
|
710
710
|
- `ai-toolkit update --local` → re-resolves and updates lock file (like `npm install`)
|
|
711
711
|
- `ai-toolkit update --local --refresh-base` → force re-fetch ignoring cache
|
|
712
|
-
- `.
|
|
712
|
+
- `.softspark-toolkit.lock.json` should be committed to git (team synchronization)
|
|
713
713
|
|
|
714
714
|
---
|
|
715
715
|
|
|
@@ -723,7 +723,7 @@ ai-toolkit config check
|
|
|
723
723
|
# Exit codes:
|
|
724
724
|
# 0 — project complies with base config
|
|
725
725
|
# 1 — violations found (missing required plugins, forbidden overrides, etc.)
|
|
726
|
-
# 2 — .
|
|
726
|
+
# 2 — .softspark-toolkit.json not found
|
|
727
727
|
```
|
|
728
728
|
|
|
729
729
|
**GitHub Actions example:**
|
|
@@ -796,7 +796,7 @@ v1 ships with a minimal schema. Each additional field adds merge logic, validati
|
|
|
796
796
|
| **Offline** | Cached configs used when registry unavailable, with clear warning. |
|
|
797
797
|
| **Security** | No secret exposure in config files or audit trail. npm auth via `.npmrc` (user-managed). `execFile` for npm CLI (no shell injection). |
|
|
798
798
|
| **Error messages** | Every validation error includes: what failed, which config layer caused it, and what to do (e.g., "Contact your team lead to request an exemption"). |
|
|
799
|
-
| **Backward compatibility** | 100% — projects without `.
|
|
799
|
+
| **Backward compatibility** | 100% — projects without `.softspark-toolkit.json` work exactly as today. Zero behavioral changes for existing users. |
|
|
800
800
|
| **Maintainability** | Each new schema field requires: merge logic, validation, diff output, test. Budget 0.5d per new field. |
|
|
801
801
|
| **Quality gates** | `ruff check scripts/config_*.py` (0 errors), `mypy --strict scripts/config_*.py` (0 errors). Run before every commit. |
|
|
802
802
|
| **Type safety** | 100% public API type hints (all function signatures). >60% internal. Use `TypedDict` for config schemas, `dataclass` for resolved configs. |
|
|
@@ -813,7 +813,7 @@ v1 ships with a minimal schema. Each additional field adds merge logic, validati
|
|
|
813
813
|
| Constitution protection | 100% (Articles I-V immutable) |
|
|
814
814
|
| Override justification | Required for all overrides |
|
|
815
815
|
| Enforce constraints | 4 types (minHookProfile, requiredPlugins, forbidOverride, requiredAgents) |
|
|
816
|
-
| Backward compatibility | 100% (projects without .
|
|
816
|
+
| Backward compatibility | 100% (projects without .softspark-toolkit.json work as today) |
|
|
817
817
|
| CI enforcement | Exit code 0/1 for governance compliance |
|
|
818
818
|
| Lock file | Reproducible installs across team members |
|
|
819
819
|
| Scaffold command | Ready-to-publish npm package template |
|
|
@@ -839,7 +839,7 @@ v1 ships with a minimal schema. Each additional field adds merge logic, validati
|
|
|
839
839
|
|
|
840
840
|
## 9. Pre-Mortem
|
|
841
841
|
|
|
842
|
-
1. **"Config file fatigue"** — developers already have `.eslintrc`, `tsconfig.json`, `.prettierrc`. Another `.
|
|
842
|
+
1. **"Config file fatigue"** — developers already have `.eslintrc`, `tsconfig.json`, `.prettierrc`. Another `.softspark-toolkit.json` may feel like bloat. Mitigation: file is optional, all features work without it. The DX gain (organizational governance without per-repo updates) justifies the file.
|
|
843
843
|
2. **"Base config never gets updated"** — team lead creates base config, nobody maintains it. Mitigation: `ai-toolkit config check` in CI catches drift; lock file staleness warnings.
|
|
844
844
|
3. **"Override justification is annoying"** — developers will write "needed" as justification. Mitigation: CI check can enforce minimum justification length (>20 chars); code review culture catches low-effort justifications.
|
|
845
845
|
4. **"Merge semantics are confusing"** — "does project override or extend the base agent list?" Mitigation: explicit semantics documented in schema; `ai-toolkit config diff` shows exactly what happened.
|
|
@@ -865,7 +865,7 @@ v1 ships with a minimal schema. Each additional field adds merge logic, validati
|
|
|
865
865
|
|
|
866
866
|
**MVP (ship first, ~3.5 weeks):**
|
|
867
867
|
1. [x] Approve plan
|
|
868
|
-
2. [x] Define `.
|
|
868
|
+
2. [x] Define `.softspark-toolkit.json` JSON Schema — v1 scope only (1.1)
|
|
869
869
|
3. [x] Implement config resolver (npm, git, local) with caching (1.2)
|
|
870
870
|
4. [x] Implement merge engine with override validation (1.3)
|
|
871
871
|
5. [x] Implement constitution immutability guard (1.4)
|
|
@@ -902,17 +902,15 @@ v1 ships with a minimal schema. Each additional field adds merge logic, validati
|
|
|
902
902
|
|
|
903
903
|
## 13. Cross-Plan Dependencies
|
|
904
904
|
|
|
905
|
-
This plan shares modification targets with
|
|
905
|
+
This plan shares modification targets with the Offline SLM plan:
|
|
906
906
|
|
|
907
|
-
| Shared File | This Plan |
|
|
908
|
-
|
|
909
|
-
| `scripts/install.py` | +80 LOC (extends resolution) |
|
|
910
|
-
| `manifest.json` | +10 LOC (schema refs) |
|
|
911
|
-
| `bin/ai-toolkit.js` | +40 LOC (config subcommands) | +
|
|
907
|
+
| Shared File | This Plan | Offline SLM Plan |
|
|
908
|
+
|-------------|-----------|-----------------|
|
|
909
|
+
| `scripts/install.py` | +80 LOC (extends resolution) | +30 LOC (offline-slm profile) |
|
|
910
|
+
| `manifest.json` | +10 LOC (schema refs) | +5 LOC (offline-slm profile) |
|
|
911
|
+
| `bin/ai-toolkit.js` | +40 LOC (config subcommands) | +10 LOC (compile-slm command) |
|
|
912
912
|
|
|
913
|
-
**If implementing in parallel:** coordinate merge order for shared files. Recommended sequence: Offline SLM (smallest changes) → Enterprise Config
|
|
914
|
-
|
|
915
|
-
**Dashboard integration note:** If this plan ships before the Dashboard plan, the Dashboard's Config page (2.6) should display `.ai-toolkit.json` / `extends` status and the `config diff` output.
|
|
913
|
+
**If implementing in parallel:** coordinate merge order for shared files. Recommended sequence: Offline SLM (smallest changes) → Enterprise Config.
|
|
916
914
|
|
|
917
915
|
---
|
|
918
916
|
|
|
@@ -88,8 +88,8 @@ ai-toolkit compile-slm [--budget 4096] [--persona backend-lead] [--lang typescri
|
|
|
88
88
|
│ extended (16K) — near-full toolkit (for 32B+ models) │
|
|
89
89
|
│ │
|
|
90
90
|
│ Output Files: │
|
|
91
|
-
│ ~/.ai-toolkit/compiled/slm-system-prompt.md │
|
|
92
|
-
│ ~/.ai-toolkit/compiled/slm-skills-reference.md │
|
|
91
|
+
│ ~/.softspark/ai-toolkit/compiled/slm-system-prompt.md │
|
|
92
|
+
│ ~/.softspark/ai-toolkit/compiled/slm-skills-reference.md │
|
|
93
93
|
│ CLAUDE.md (or equivalent) — auto-generated │
|
|
94
94
|
│ │
|
|
95
95
|
│ Integration Targets: │
|
|
@@ -429,7 +429,7 @@ ai-toolkit install --profile offline-slm
|
|
|
429
429
|
# What happens:
|
|
430
430
|
# 1. Standard install of core components
|
|
431
431
|
# 2. Runs compile_slm.py with auto-detected settings
|
|
432
|
-
# 3. Writes compiled output to ~/.ai-toolkit/compiled/
|
|
432
|
+
# 3. Writes compiled output to ~/.softspark/ai-toolkit/compiled/
|
|
433
433
|
# 4. Generates integration instructions for detected local model tools
|
|
434
434
|
# 5. state.json records profile as "offline-slm"
|
|
435
435
|
```
|
|
@@ -532,7 +532,7 @@ ollama run my-coder "implement the payment API"
|
|
|
532
532
|
```
|
|
533
533
|
1. ai-toolkit compile-slm --model-size 14b
|
|
534
534
|
2. Open LM Studio → Chat → System Prompt
|
|
535
|
-
3. Paste contents of ~/.ai-toolkit/compiled/slm-system-prompt.md
|
|
535
|
+
3. Paste contents of ~/.softspark/ai-toolkit/compiled/slm-system-prompt.md
|
|
536
536
|
```
|
|
537
537
|
|
|
538
538
|
**Aider:**
|
|
@@ -603,7 +603,7 @@ Post-compilation checks:
|
|
|
603
603
|
|
|
604
604
|
## 6b. Cache Invalidation & Recompile Triggers
|
|
605
605
|
|
|
606
|
-
Compiled output (`~/.ai-toolkit/compiled/slm-system-prompt.md`) is a **derived artifact** — it must be recompiled when inputs change:
|
|
606
|
+
Compiled output (`~/.softspark/ai-toolkit/compiled/slm-system-prompt.md`) is a **derived artifact** — it must be recompiled when inputs change:
|
|
607
607
|
|
|
608
608
|
| Trigger | Action |
|
|
609
609
|
|---------|--------|
|
|
@@ -622,7 +622,7 @@ The offline-slm feature is purely additive — removing it is trivial:
|
|
|
622
622
|
1. Delete `scripts/compile_slm.py`, `scripts/slm_token_counter.py`, `scripts/slm_compression.py`, `scripts/slm_integration.py`
|
|
623
623
|
2. Remove `"offline-slm"` and `"offline-slm-extended"` from `manifest.json` profiles
|
|
624
624
|
3. Remove `compile-slm` from `SCRIPT_COMMANDS` in `bin/ai-toolkit.js`
|
|
625
|
-
4. Delete `~/.ai-toolkit/compiled/` directory (user-side)
|
|
625
|
+
4. Delete `~/.softspark/ai-toolkit/compiled/` directory (user-side)
|
|
626
626
|
5. No hooks, no state files, no config entries to clean up
|
|
627
627
|
|
|
628
628
|
---
|
|
@@ -727,13 +727,13 @@ For teams needing enforcement, recommend `--profile offline-slm` combined with a
|
|
|
727
727
|
|
|
728
728
|
## 13. Cross-Plan Dependencies
|
|
729
729
|
|
|
730
|
-
This plan shares modification targets with
|
|
730
|
+
This plan shares modification targets with the Enterprise Config plan:
|
|
731
731
|
|
|
732
|
-
| Shared File | This Plan | Enterprise Config Plan |
|
|
733
|
-
|
|
734
|
-
| `scripts/install.py` | +30 LOC (offline-slm profile) | +80 LOC (extends resolution) |
|
|
735
|
-
| `manifest.json` | +5 LOC (offline-slm profile) | +10 LOC (schema refs) |
|
|
736
|
-
| `bin/ai-toolkit.js` | +10 LOC (compile-slm command) | +40 LOC (config subcommands) |
|
|
732
|
+
| Shared File | This Plan | Enterprise Config Plan |
|
|
733
|
+
|-------------|-----------|----------------------|
|
|
734
|
+
| `scripts/install.py` | +30 LOC (offline-slm profile) | +80 LOC (extends resolution) |
|
|
735
|
+
| `manifest.json` | +5 LOC (offline-slm profile) | +10 LOC (schema refs) |
|
|
736
|
+
| `bin/ai-toolkit.js` | +10 LOC (compile-slm command) | +40 LOC (config subcommands) |
|
|
737
737
|
|
|
738
738
|
**If implementing in parallel:** this plan has the smallest changes to shared files — merge first to minimize conflicts.
|
|
739
739
|
|
|
@@ -39,7 +39,7 @@ Create `cloud-security-pack` plugin pack that provides deterministic, read-only
|
|
|
39
39
|
- **Deterministic** — reproducible results, no LLM-driven regex (same pattern as `hipaa_scan.py`)
|
|
40
40
|
- **False positive aware** — context graph resolves "public endpoint behind gateway/App Check/WAF"
|
|
41
41
|
- **CI-ready** — `--output json` + `--output sarif` (SARIF v2.1.0 for GitHub Advanced Security), exit code 1 on HIGH, 0 otherwise
|
|
42
|
-
- **Credential isolation** — keys stored in `~/.ai-toolkit/credentials/`, accessible only by this pack's scripts
|
|
42
|
+
- **Credential isolation** — keys stored in `~/.softspark/ai-toolkit/credentials/`, accessible only by this pack's scripts
|
|
43
43
|
- **Static-first** — static mode (no credentials) is the default, live mode is opt-in upgrade
|
|
44
44
|
- **Incremental** — `--changed` flag scans only files modified since last commit (PR workflow)
|
|
45
45
|
- **IaC via `terraform show -json`** — wraps Terraform's own JSON output instead of parsing HCL directly
|
|
@@ -200,7 +200,7 @@ ai-toolkit credentials test aws
|
|
|
200
200
|
|
|
201
201
|
**Storage structure:**
|
|
202
202
|
```
|
|
203
|
-
~/.ai-toolkit/
|
|
203
|
+
~/.softspark/ai-toolkit/
|
|
204
204
|
credentials/
|
|
205
205
|
gcp.json # SA key file (copied, chmod 0600)
|
|
206
206
|
gcp.meta.json # { project_id, added_at, method: "file"|"gcloud" }
|
|
@@ -225,7 +225,7 @@ ai-toolkit credentials test aws
|
|
|
225
225
|
- Connection works (GCP: `gcloud auth list`, AWS: `aws sts get-caller-identity`, Azure: `az account show`)
|
|
226
226
|
- SA/role has **only read permissions** — **REFUSE to store** if write access detected (orchestration-review: warn-only is ignored by users). Override: `--force` flag with explicit acknowledgment
|
|
227
227
|
- Project/subscription exists
|
|
228
|
-
- `.gitignore`-proof — lives in `~/.ai-toolkit/`, never in project directory
|
|
228
|
+
- `.gitignore`-proof — lives in `~/.softspark/ai-toolkit/`, never in project directory
|
|
229
229
|
- Scripts access credentials via `gcp_auth.py` helper — single entry point, no direct file reads
|
|
230
230
|
|
|
231
231
|
**Files to create/modify:**
|
|
@@ -43,7 +43,7 @@ ai-toolkit install --local --lang python,typescript
|
|
|
43
43
|
ai-toolkit install --local --lang python --editors all # language rules propagated to all editors
|
|
44
44
|
```
|
|
45
45
|
|
|
46
|
-
When `--editors` is combined with `--lang` (or auto-detected languages), language rules are propagated to all configured editors as `ai-toolkit-lang-<lang>` files — not just Claude's `CLAUDE.md`. Similarly, registered custom rules (`~/.ai-toolkit/rules/`) are propagated to directory-based editor configs as `ai-toolkit-custom-<name>` files.
|
|
46
|
+
When `--editors` is combined with `--lang` (or auto-detected languages), language rules are propagated to all configured editors as `ai-toolkit-lang-<lang>` files — not just Claude's `CLAUDE.md`. Similarly, registered custom rules (`~/.softspark/ai-toolkit/rules/`) are propagated to directory-based editor configs as `ai-toolkit-custom-<name>` files.
|
|
47
47
|
|
|
48
48
|
**Note:** Hooks are global-only — merged into `~/.claude/settings.json` by `ai-toolkit install`. Project-local `--local` does not install hooks; any legacy `.claude/hooks.json` is removed automatically.
|
|
49
49
|
|
|
@@ -121,7 +121,7 @@ Third-party repos (jira-mcp, rag-mcp, etc.) can register their own rules globall
|
|
|
121
121
|
|
|
122
122
|
```bash
|
|
123
123
|
ai-toolkit add-rule ./my-project-rules.md
|
|
124
|
-
# → copies to ~/.ai-toolkit/rules/my-project-rules.md
|
|
124
|
+
# → copies to ~/.softspark/ai-toolkit/rules/my-project-rules.md
|
|
125
125
|
|
|
126
126
|
ai-toolkit update
|
|
127
127
|
# → injects the rule into ~/.claude/CLAUDE.md and all global editor configs
|
|
@@ -209,7 +209,7 @@ Install copies hooks/scripts, verifies agents+skills are linked, merges hooks in
|
|
|
209
209
|
|
|
210
210
|
Memory-pack auto-prunes observations older than 90 days on every session end (configurable via `MEMORY_RETENTION_DAYS`).
|
|
211
211
|
|
|
212
|
-
State tracked in `~/.ai-toolkit/plugins.json`.
|
|
212
|
+
State tracked in `~/.softspark/ai-toolkit/plugins.json`.
|
|
213
213
|
|
|
214
214
|
## Adding a KB Document
|
|
215
215
|
|
|
@@ -33,7 +33,7 @@ ai-toolkit/
|
|
|
33
33
|
agents/ # Agent definitions (.md + YAML frontmatter)
|
|
34
34
|
skills/ # skills: task, hybrid, knowledge
|
|
35
35
|
rules/ # Rules auto-injected into ~/.claude/CLAUDE.md
|
|
36
|
-
hooks/ # Hook scripts (copied to ~/.ai-toolkit/hooks/)
|
|
36
|
+
hooks/ # Hook scripts (copied to ~/.softspark/ai-toolkit/hooks/)
|
|
37
37
|
hooks.json # Hook definitions (merged into ~/.claude/settings.json)
|
|
38
38
|
constitution.md # Immutable safety rules, 5 articles (marker-injected)
|
|
39
39
|
ARCHITECTURE.md # System architecture reference (marker-injected)
|
|
@@ -80,7 +80,7 @@ All components use merge-friendly strategies — user content is never overwritt
|
|
|
80
80
|
```
|
|
81
81
|
Machine (global) Project (local)
|
|
82
82
|
────────────────────────────────────────── ──────────────────────────────────────
|
|
83
|
-
~/.claude/ ~/.ai-toolkit/
|
|
83
|
+
~/.claude/ ~/.softspark/ai-toolkit/
|
|
84
84
|
agents/*.md → per-file symlinks rules/ ← registered rules
|
|
85
85
|
skills/*/ → per-dir symlinks hooks/ ← hook scripts (copied)
|
|
86
86
|
settings.json ← hooks merged here
|
|
@@ -120,8 +120,8 @@ Each editor gets directory-based format (`.cursor/rules/*.mdc`, `.windsurf/rules
|
|
|
120
120
|
| `update` | `~/.claude/` | Re-apply after npm update or after add-rule/remove-rule |
|
|
121
121
|
| `update --local` | `./` | Re-apply + refresh project-local configs |
|
|
122
122
|
| `uninstall` | `~/.claude/` | Strips toolkit components (preserves user content) |
|
|
123
|
-
| `add-rule <file>` | `~/.ai-toolkit/rules/` | Register rule — auto-applied on every `update` |
|
|
124
|
-
| `remove-rule <name>` | `~/.ai-toolkit/rules/` + `~/.claude/CLAUDE.md` | Unregister rule and remove its block |
|
|
123
|
+
| `add-rule <file>` | `~/.softspark/ai-toolkit/rules/` | Register rule — auto-applied on every `update` |
|
|
124
|
+
| `remove-rule <name>` | `~/.softspark/ai-toolkit/rules/` + `~/.claude/CLAUDE.md` | Unregister rule and remove its block |
|
|
125
125
|
| `validate` | toolkit | Integrity check |
|
|
126
126
|
| `doctor` | toolkit | Install health, hooks, benchmark freshness, and artifact drift diagnostics |
|
|
127
127
|
| `benchmark-ecosystem` | toolkit | Benchmark snapshot for official Claude Code and external ecosystem repos |
|
|
@@ -251,7 +251,7 @@ Agents (code-reviewer, debugger, devops-implementer, ...)
|
|
|
251
251
|
| PreCompact | Before compaction | `pre-compact-save.sh` | Timestamped context snapshot to audit trail |
|
|
252
252
|
| SessionEnd | Session end | `session-end.sh` | Persist handoff note for the next session |
|
|
253
253
|
|
|
254
|
-
Scripts at `~/.ai-toolkit/hooks/`. See [hooks-catalog.md](hooks-catalog.md) for details.
|
|
254
|
+
Scripts at `~/.softspark/ai-toolkit/hooks/`. See [hooks-catalog.md](hooks-catalog.md) for details.
|
|
255
255
|
|
|
256
256
|
## Constitution (5 Articles)
|
|
257
257
|
|
|
@@ -57,6 +57,6 @@ affaan-m/everything-claude-code 152 397 2
|
|
|
57
57
|
|
|
58
58
|
## Data Sources
|
|
59
59
|
|
|
60
|
-
- User config: `~/.claude/agents/`, `~/.claude/skills/`, `~/.ai-toolkit/hooks/`
|
|
60
|
+
- User config: `~/.claude/agents/`, `~/.claude/skills/`, `~/.softspark/ai-toolkit/hooks/`
|
|
61
61
|
- Toolkit: `app/agents/`, `app/skills/`, `app/hooks/`
|
|
62
62
|
- Ecosystem: `benchmarks/ecosystem-dashboard.json`
|
|
@@ -347,7 +347,7 @@ All entries are tagged with "_source": "<source-name>" for idempotent updates.
|
|
|
347
347
|
| `remove-rule <name>` | `~/.claude/CLAUDE.md` | Strip markers | Yes |
|
|
348
348
|
| `inject-hook <file.json>` | `~/.claude/settings.json` | JSON `_source` tag | Yes |
|
|
349
349
|
| `remove-hook <name>` | `~/.claude/settings.json` | Strip by `_source` | Yes |
|
|
350
|
-
| `add-rule <file.md>` | `~/.ai-toolkit/rules/` | File copy + re-inject all | Yes |
|
|
350
|
+
| `add-rule <file.md>` | `~/.softspark/ai-toolkit/rules/` | File copy + re-inject all | Yes |
|
|
351
351
|
|
|
352
352
|
**Success Criteria:**
|
|
353
353
|
- [x] `inject-hook ./my-hooks.json` merges hooks with auto-derived `_source` tag
|
|
@@ -426,7 +426,7 @@ All entries are tagged with "_source": "<source-name>" for idempotent updates.
|
|
|
426
426
|
}
|
|
427
427
|
```
|
|
428
428
|
|
|
429
|
-
**State tracking (~/.ai-toolkit/state.json):**
|
|
429
|
+
**State tracking (~/.softspark/ai-toolkit/state.json):**
|
|
430
430
|
```json
|
|
431
431
|
{
|
|
432
432
|
"installed_version": "1.2.1",
|
|
@@ -18,7 +18,7 @@ description: "Comprehensive guide for setting up and using ai-toolkit configurat
|
|
|
18
18
|
|
|
19
19
|
## Overview
|
|
20
20
|
|
|
21
|
-
Configuration inheritance enables organizations to define a shared base config published as an npm package, Git URL, or local path. Individual projects extend this base via an `extends` field in `.
|
|
21
|
+
Configuration inheritance enables organizations to define a shared base config published as an npm package, Git URL, or local path. Individual projects extend this base via an `extends` field in `.softspark-toolkit.json`. Changes to the base propagate automatically on `ai-toolkit update --local`.
|
|
22
22
|
|
|
23
23
|
**Pattern:** Mirrors ESLint's `extends`, TypeScript's `extends`, and Prettier's shared configs.
|
|
24
24
|
|
|
@@ -47,7 +47,7 @@ ai-toolkit config init --extends @mycompany/ai-toolkit-config
|
|
|
47
47
|
ai-toolkit install --local
|
|
48
48
|
```
|
|
49
49
|
|
|
50
|
-
Or manually create `.
|
|
50
|
+
Or manually create `.softspark-toolkit.json`:
|
|
51
51
|
|
|
52
52
|
```json
|
|
53
53
|
{
|
|
@@ -71,7 +71,7 @@ ai-toolkit config check # CI enforcement check
|
|
|
71
71
|
|
|
72
72
|
## Configuration Reference
|
|
73
73
|
|
|
74
|
-
### Project config (`.
|
|
74
|
+
### Project config (`.softspark-toolkit.json`)
|
|
75
75
|
|
|
76
76
|
| Field | Type | Description |
|
|
77
77
|
|-------|------|-------------|
|
|
@@ -195,7 +195,7 @@ Requirements:
|
|
|
195
195
|
|
|
196
196
|
### `ai-toolkit config validate [path]`
|
|
197
197
|
|
|
198
|
-
Validates `.
|
|
198
|
+
Validates `.softspark-toolkit.json` schema, resolves extends, checks enforcement.
|
|
199
199
|
|
|
200
200
|
```bash
|
|
201
201
|
ai-toolkit config validate
|
|
@@ -220,7 +220,7 @@ ai-toolkit config diff
|
|
|
220
220
|
|
|
221
221
|
### `ai-toolkit config init [flags]`
|
|
222
222
|
|
|
223
|
-
Create `.
|
|
223
|
+
Create `.softspark-toolkit.json` interactively or with flags.
|
|
224
224
|
|
|
225
225
|
```bash
|
|
226
226
|
ai-toolkit config init # interactive
|
|
@@ -261,12 +261,12 @@ GitHub Actions example:
|
|
|
261
261
|
|
|
262
262
|
## Lock File
|
|
263
263
|
|
|
264
|
-
`.
|
|
264
|
+
`.softspark-toolkit.lock.json` pins exact resolved versions for reproducible installs.
|
|
265
265
|
|
|
266
266
|
- `install --local` → creates/updates lock file
|
|
267
267
|
- `update --local` → re-resolves and updates lock file
|
|
268
268
|
- `update --local --refresh-base` → force re-fetch ignoring cache
|
|
269
|
-
- Commit `.
|
|
269
|
+
- Commit `.softspark-toolkit.lock.json` to git for team synchronization
|
|
270
270
|
|
|
271
271
|
```json
|
|
272
272
|
{
|
|
@@ -275,7 +275,7 @@ GitHub Actions example:
|
|
|
275
275
|
"@mycompany/ai-toolkit-config": {
|
|
276
276
|
"version": "2.1.0",
|
|
277
277
|
"integrity": "sha256:abc123...",
|
|
278
|
-
"cached": "~/.ai-toolkit/config-cache/@mycompany/ai-toolkit-config/2.1.0/"
|
|
278
|
+
"cached": "~/.softspark/ai-toolkit/config-cache/@mycompany/ai-toolkit-config/2.1.0/"
|
|
279
279
|
}
|
|
280
280
|
}
|
|
281
281
|
}
|
|
@@ -287,7 +287,7 @@ GitHub Actions example:
|
|
|
287
287
|
|
|
288
288
|
When npm/git is unavailable:
|
|
289
289
|
|
|
290
|
-
1. Checks cache (`~/.ai-toolkit/config-cache/`)
|
|
290
|
+
1. Checks cache (`~/.softspark/ai-toolkit/config-cache/`)
|
|
291
291
|
2. If cached version found → uses with warning
|
|
292
292
|
3. If not cached → error with instructions
|
|
293
293
|
|
|
@@ -25,7 +25,7 @@ This design is intentional: ai-toolkit is a generic toolkit. Consumers (MCP serv
|
|
|
25
25
|
| `remove-rule <name>` | `~/.claude/CLAUDE.md` | Strip markers by block name | Yes |
|
|
26
26
|
| `inject-hook <file.json>` | `~/.claude/settings.json` | JSON `_source` tag per entry | Yes |
|
|
27
27
|
| `remove-hook <name>` | `~/.claude/settings.json` | Strip all entries with matching `_source` | Yes |
|
|
28
|
-
| `add-rule <file.md>` | `~/.ai-toolkit/rules/` | File copy + re-inject all rules on next `update` | Yes |
|
|
28
|
+
| `add-rule <file.md>` | `~/.softspark/ai-toolkit/rules/` | File copy + re-inject all rules on next `update` | Yes |
|
|
29
29
|
| `mcp add <name...>` | `.mcp.json` | Merge `mcpServers` block from template | Yes |
|
|
30
30
|
|
|
31
31
|
## inject-rule
|
|
@@ -27,8 +27,8 @@ That means one machine-level install provides agents, skills, hooks, and rules t
|
|
|
27
27
|
| `ai-toolkit install --local --lang <lang>` | current project | explicit language selection for rules (e.g. `--lang typescript`, `--lang go,python`); auto-detected when omitted |
|
|
28
28
|
| `ai-toolkit install --modules <list>` | `~/.claude/` | selective module install (e.g. `--modules core,agents,rules-typescript`) |
|
|
29
29
|
| `ai-toolkit update --local` | current project | refresh project configs; auto-detects editors from existing files |
|
|
30
|
-
| `ai-toolkit add-rule` | `~/.ai-toolkit/rules/` | register a global rule |
|
|
31
|
-
| `ai-toolkit remove-rule` | `~/.ai-toolkit/rules/` | unregister a global rule |
|
|
30
|
+
| `ai-toolkit add-rule` | `~/.softspark/ai-toolkit/rules/` | register a global rule |
|
|
31
|
+
| `ai-toolkit remove-rule` | `~/.softspark/ai-toolkit/rules/` | unregister a global rule |
|
|
32
32
|
|
|
33
33
|
## Why global install is the default
|
|
34
34
|
|