@softspark/ai-toolkit 4.20.0 → 4.21.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,47 @@ Versioning follows [Semantic Versioning](https://semver.org/).
7
7
 
8
8
  ---
9
9
 
10
+ ## v4.21.0 — one KB taxonomy, in one place (2026-07-28)
11
+
12
+ ### Fixed
13
+
14
+ - **The `documentation-standards` skill contradicted itself.** Its frontmatter
15
+ said "5-category taxonomy", its table listed those five, and three paragraphs
16
+ below a "Valid categories" line named six — adding `planning`. An author
17
+ reading the table and a validator reading the code disagreed about what was
18
+ legal, and only the validator got a vote.
19
+ - **`decisions` and `runbooks` were not valid categories**, while the
20
+ `kb-migration` SOP had been instructing people to create exactly those
21
+ directories for months. A correctly-filed ADR failed `scripts/validate.py`.
22
+ Both are now in the taxonomy, which is eight: `reference`, `howto`,
23
+ `procedures`, `troubleshooting`, `best-practices`, `decisions`, `runbooks`,
24
+ `planning`.
25
+ - **`procedures` and `runbooks` no longer describe each other.** The table gave
26
+ "SOPs, runbooks, operational processes" for `procedures`, which left no way to
27
+ choose between them. `procedures` is a process a person follows; `runbooks`
28
+ are run against a live system, usually under pressure.
29
+
30
+ ### Added
31
+
32
+ - **`section:` is documented as what it is: a legacy alias for `category:`.**
33
+ Older documents and the `kb-migration` SOP write `section:`; both names are
34
+ read in the wild. A document may carry both, and `validate.py` now rejects it
35
+ when they disagree — a document filed as `category: reference` and
36
+ `section: howto` is indexed twice and found once.
37
+ - **`validate.py` checks that a document's category names its directory.** The
38
+ rule is scoped to directories that *are* category names, deliberately:
39
+ `kb/history/completed/` is a lifecycle location rather than a type, and a
40
+ finished plan filed there is still a `planning` document. Fifteen of this
41
+ project's own documents are in exactly that position.
42
+
43
+ ### Changed
44
+
45
+ - `VALID_KB_CATEGORIES` in `scripts/validate.py` and the taxonomy table in
46
+ `app/skills/documentation-standards/SKILL.md` are one list in two places, and
47
+ each now says so. They were previously two lists that had drifted.
48
+
49
+ ---
50
+
10
51
  ## v4.20.0 — Apache-2.0, nine plugin packs removed (2026-07-27)
11
52
 
12
53
  ### Changed — licence: MIT to Apache-2.0
package/README.md CHANGED
@@ -8,24 +8,30 @@
8
8
  [![Agents](https://img.shields.io/badge/agents-44-blue)](app/agents/)
9
9
  [![Tests](https://img.shields.io/badge/tests-1473%20passing-success)](tests/)
10
10
 
11
- ## What's New in v4.20.0
12
-
13
- v4.20.0 relicenses the project to Apache-2.0 and removes nine plugin packs that installed nothing. Plugin count: 11 → 2.
14
-
15
- - **Licence: MIT → Apache-2.0.** Still permissive — fork it, modify it, ship it commercially. The change is what a redistributor owes back: the contents of [NOTICE](NOTICE) must travel with any redistribution (§4d), modified files must say they were modified (§4b), and there is now an express patent grant and a trademark reservation. Releases up to v4.20.0 stay available under MIT; nothing already granted is revoked. See [LICENSE](LICENSE) and [NOTICE](NOTICE).
16
-
17
- - **Nine packs removed**: `csharp`, `java`, `kotlin`, `ruby`, `rust`, `swift`, `frontend`, `research`, `security`. Each declared only skills and agents that already ship in the core install, so `plugin install` reported `(0 file items)` and wrote no file — on both runtimes and all three profiles. Eight owned nothing but a `README.md`. See [the measurement](kb/history/completed/no-op-plugin-packs-removed-20260727.md).
18
- - **Nothing is lost by the removal.** `rust-patterns`, `java-patterns`, `security-patterns`, `research-mastery` and the rest are **core skills**, still installed, still triggering as before. The packs never held them — they only listed them.
19
- - **`memory-pack` and `enterprise-pack` stay**: the two packs that ship files of their own hooks, scripts, and in memory-pack's case its own skill and a SQLite store.
20
- - **A pack must now earn its existence**: `plugin-creator`'s authoring rule required referencing core assets rather than forking them, which against a core install that ships everything produced a no-op every time. It now requires that a pack install files the core does not, with a verification step in the checklist.
21
- - **`rtk-pack` retired in v4.19.0**: it broke every command it rewrote — exit 127 on `git`, `ls`, `cat`, `find`, `grep`. Measured value was 0.0615% of input tokens against a 0.05% kill number. See [the retirement note](kb/history/completed/rtk-pack-retirement-20260727.md).
22
-
23
- If you installed any removed pack, run `ai-toolkit plugin remove <name>` to drop its bookkeeping entry. No skill or agent disappears.
11
+ ## What's New in v4.21.0
12
+
13
+ v4.21.0 makes the KB taxonomy one list instead of three, and teaches
14
+ `validate.py` to enforce it.
15
+
16
+ - **The taxonomy is eight categories**: `reference`, `howto`, `procedures`,
17
+ `troubleshooting`, `best-practices`, `decisions`, `runbooks`, `planning`.
18
+ `decisions` and `runbooks` were missing while the `kb-migration` SOP had been
19
+ telling people to create those directories for monthsa correctly-filed ADR
20
+ failed validation.
21
+ - **The `documentation-standards` skill no longer contradicts itself.** Its
22
+ frontmatter said "5-category", its table listed five, and a line below named
23
+ six. Author and validator disagreed, and only the validator got a vote.
24
+ - **`section:` is documented as a legacy alias for `category:`**, and
25
+ `validate.py` rejects a document carrying both with different values — that
26
+ document is indexed twice and found once.
27
+ - **A document's category must name its directory**, checked only for
28
+ directories that are category names: `kb/history/completed/` is a lifecycle
29
+ location, not a type, and a finished plan filed there is still `planning`.
30
+ - **`procedures` and `runbooks` stopped describing each other.** A procedure is
31
+ followed by a person; a runbook is run against a live system.
24
32
 
25
33
  See [CHANGELOG.md](CHANGELOG.md) for full history.
26
34
 
27
- ---
28
-
29
35
  ## Table of Contents
30
36
 
31
37
  - [Install](#install)
@@ -3,7 +3,7 @@
3
3
  "name": "ai-toolkit",
4
4
  "displayName": "AI Toolkit",
5
5
  "description": "Professional-grade engineering skills, agents, rules, and lifecycle guardrails for Claude Code, Claude Chat, and Cowork.",
6
- "version": "4.20.0",
6
+ "version": "4.21.0",
7
7
  "author": {
8
8
  "name": "SoftSpark",
9
9
  "url": "https://github.com/softspark"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: documentation-standards
3
- description: "KB conventions: YAML frontmatter, 5-category taxonomy (reference/howto/procedures/troubleshooting/best-practices). Triggers: kb/, SOP, runbook, howto, frontmatter, knowledge base."
3
+ description: "KB conventions: YAML frontmatter, 8-category taxonomy (reference/howto/procedures/troubleshooting/best-practices/decisions/runbooks/planning). Triggers: kb/, SOP, runbook, howto, frontmatter, knowledge base."
4
4
  effort: medium
5
5
  user-invocable: false
6
6
  allowed-tools: Read
@@ -27,7 +27,19 @@ version: "1.0.0" # optional — semver
27
27
  ---
28
28
  ```
29
29
 
30
- **All 7 fields above are REQUIRED.** Documents without valid frontmatter **fail `validate.sh` and block CI**.
30
+ **All 7 fields above are REQUIRED.** Documents without valid frontmatter **fail
31
+ `scripts/validate.py` and block CI**.
32
+
33
+ ### `section`: a legacy alias, not a second field
34
+
35
+ Older documents and the `kb-migration` SOP write `section:` where this
36
+ specification writes `category:`. Both names are read in the wild, so a document
37
+ may carry both — and when it does **they must hold the same value**. A document
38
+ filed as `category: reference` and `section: howto` is indexed twice, found
39
+ once, and the reader gets whichever the index ranked higher.
40
+
41
+ New documents should write `category:`. `section:` is accepted, never required,
42
+ and never authoritative on its own.
31
43
 
32
44
  ## Category Taxonomy
33
45
 
@@ -35,11 +47,17 @@ version: "1.0.0" # optional — semver
35
47
  |----------|-----------|---------|----------|
36
48
  | `reference` | `kb/reference/` | Technical specifications, catalogs, architecture notes, API docs | `agents-catalog.md`, `architecture-overview.md` |
37
49
  | `howto` | `kb/howto/` | Step-by-step task guides | `use-corrective-rag.md`, `configure-mcp-server.md` |
38
- | `procedures` | `kb/procedures/` | SOPs, runbooks, operational processes | `maintenance-sop.md`, `incident-response.md` |
50
+ | `procedures` | `kb/procedures/` | SOPs a person follows: release, migration, review | `maintenance-sop.md`, `sop-release.md` |
39
51
  | `troubleshooting` | `kb/troubleshooting/` | Problem resolution, debugging guides | `database-connection-issues.md` |
40
52
  | `best-practices` | `kb/best-practices/` | Guidelines, recommendations, standards | `security-checklist.md` |
53
+ | `decisions` | `kb/decisions/` | Architecture decision records and design rationale | `adr-004-kb-migration.md` |
54
+ | `runbooks` | `kb/runbooks/` | Procedures run against a live system, usually under pressure | `deployment.md`, `incident-response.md` |
55
+ | `planning` | `kb/planning/` | Roadmaps, PRDs, work not yet done | `q3-roadmap.md` |
41
56
 
42
- **Rule:** The `category:` frontmatter field MUST match the directory the file lives in.
57
+ **Rule:** A document filed under one of the directories above MUST declare that
58
+ category. The rule is scoped to those directories deliberately: `kb/history/`
59
+ and similar are lifecycle locations rather than types, and a finished plan filed
60
+ under `history/completed/` is still a `planning` document.
43
61
 
44
62
  ## Naming Conventions
45
63
 
@@ -178,7 +196,9 @@ scripts/validate.py
178
196
  # Checks: required fields present, category is valid, tags non-empty
179
197
  ```
180
198
 
181
- Valid categories: `reference`, `howto`, `procedures`, `troubleshooting`, `best-practices`, `planning`.
199
+ Valid categories are the eight in the table above. `scripts/validate.py` holds
200
+ the same set in `VALID_KB_CATEGORIES`; the two are the same list in two places
201
+ and a change belongs in both.
182
202
 
183
203
  ## Anti-Patterns
184
204
 
package/llms-full.txt CHANGED
@@ -108,7 +108,7 @@
108
108
  - **design-engineering**: UI craftsmanship: animation rules, easing, micro-interactions, state polish. Triggers: animation, transition, ease-out, motion, micro-interaction, hover, loading state, UI polish.
109
109
  - **docker-devops**: Docker/K8s: Dockerfile, multi-stage, compose, manifests, Helm. Triggers: Docker, Dockerfile, container, Kubernetes, k8s, compose, Helm, pod.
110
110
  - **docs**: Generates/updates README, API docs, architecture notes. Triggers: docs, README, API docs, architecture note, documentation.
111
- - **documentation-standards**: KB conventions: YAML frontmatter, 5-category taxonomy (reference/howto/procedures/troubleshooting/best-practices). Triggers: kb/, SOP, runbook, howto, frontmatter, knowledge base.
111
+ - **documentation-standards**: KB conventions: YAML frontmatter, 8-category taxonomy (reference/howto/procedures/troubleshooting/best-practices/decisions/runbooks/planning). Triggers: kb/, SOP, runbook, howto, frontmatter, knowledge base.
112
112
  - **ecommerce-patterns**: E-commerce: cart, checkout, payments (Stripe/Adyen), order state, inventory, promos, tax. Triggers: cart, checkout, SKU, payment, Stripe, Shopify, Medusa, Magento, coupon, refund.
113
113
  - **evaluate**: Evaluates RAG retrieval and LLM-as-judge metrics (faithfulness, relevancy, context precision). Triggers: measure RAG quality, knowledge gap, RAG eval, golden dataset.
114
114
  - **evolve**: Analyzes agent/skill failures, drafts prompt/permission fixes. Triggers: improve agent, refine skill, system prompt, optimize agent.
package/manifest.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "4.20.0",
2
+ "version": "4.21.0",
3
3
  "components": {
4
4
  "agents": {
5
5
  "description": "44 specialized agents (orchestrator, backend, frontend, security, devops, etc.)",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@softspark/ai-toolkit",
3
- "version": "4.20.0",
3
+ "version": "4.21.0",
4
4
  "description": "AI coding toolkit: 108 skills, 44 agents, 12 developer-tool integrations, recoverable native tool-output filtering, Claude Chat/Cowork export, safety constitution, SARIF audit, and signed npm provenance.",
5
5
  "keywords": [
6
6
  "claude",
@@ -95,9 +95,16 @@ HOOK_REQUIRED_FIELDS = {
95
95
  "mcp_tool": ("server", "tool", "arguments"),
96
96
  }
97
97
 
98
+ # The taxonomy. `app/skills/documentation-standards/SKILL.md` documents the same
99
+ # eight and is what authors read; this set is what rejects a typo. They are one
100
+ # list in two places, so a change belongs in both.
101
+ #
102
+ # `decisions` and `runbooks` were missing until v4.21.0 while the kb-migration
103
+ # SOP had been telling people to create those directories for months, so a
104
+ # correctly-filed ADR failed validation.
98
105
  VALID_KB_CATEGORIES = frozenset({
99
106
  "reference", "howto", "procedures", "troubleshooting", "best-practices",
100
- "planning",
107
+ "decisions", "runbooks", "planning",
101
108
  })
102
109
 
103
110
  VALID_RULE_CATEGORIES = frozenset({
@@ -730,6 +737,31 @@ def validate_kb_documents(tk_dir: Path, vr: ValidationResult) -> None:
730
737
  vr.error(f"{kb_name} - Invalid category '{kb_category}' (valid: {', '.join(sorted(VALID_KB_CATEGORIES))})")
731
738
  kb_errors += 1
732
739
 
740
+ # `section` is a legacy alias for `category`, not a second axis. A
741
+ # document carrying both with different values is indexed twice and
742
+ # found once, and nothing about that is visible to its author.
743
+ kb_section = _fm_field(fm_lines, "section").strip()
744
+ if kb_section and kb_category and kb_section != kb_category:
745
+ vr.error(
746
+ f"{kb_name} - section '{kb_section}' disagrees with category "
747
+ f"'{kb_category}'; section is an alias and must match"
748
+ )
749
+ kb_errors += 1
750
+
751
+ # A document filed under a taxonomy directory must declare that
752
+ # category, or a browsing reader and a search hit disagree about what it
753
+ # is. The rule is scoped to directories that ARE category names on
754
+ # purpose: `kb/history/completed/` is a lifecycle location, not a type,
755
+ # and a finished plan is still a `planning` document.
756
+ relative = kb_file.relative_to(kb_dir).parts
757
+ top = relative[0] if len(relative) > 1 else ""
758
+ if kb_category and top in VALID_KB_CATEGORIES and top != kb_category:
759
+ vr.error(
760
+ f"{kb_name} - is in {top}/ but declares category "
761
+ f"'{kb_category}'; they must agree"
762
+ )
763
+ kb_errors += 1
764
+
733
765
  # Validate tags is not empty
734
766
  tags_val = _fm_field(fm_lines, "tags")
735
767
  if tags_val: