claude-blueprint 2.0.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.
Files changed (67) hide show
  1. package/.claude-plugin/plugin.json +2 -1
  2. package/README.md +2 -2
  3. package/agents/adr-architect-cartographer.md +1 -0
  4. package/agents/adr-bug-surface-mapper.md +1 -0
  5. package/agents/adr-compliance-auditor.md +1 -0
  6. package/agents/adr-consistency-auditor.md +1 -0
  7. package/agents/adr-context-mapper.md +1 -0
  8. package/agents/adr-conways-law-analyzer.md +1 -0
  9. package/agents/adr-devils-advocate.md +1 -0
  10. package/agents/adr-diagram-generator.md +1 -0
  11. package/agents/adr-evidence-auditor.md +1 -0
  12. package/agents/adr-federation-indexer.md +1 -0
  13. package/agents/adr-forces-evaluator.md +1 -0
  14. package/agents/adr-impact-analyzer.md +1 -0
  15. package/agents/adr-maintainability-assessor.md +1 -0
  16. package/agents/adr-reflexion-analyzer.md +1 -0
  17. package/agents/adr-researcher.md +1 -0
  18. package/agents/adr-retrospective.md +1 -0
  19. package/agents/adr-risk-mapper.md +1 -0
  20. package/agents/adr-strategic-analyzer.md +1 -0
  21. package/agents/adr-testing-strategy-evaluator.md +1 -0
  22. package/agents/adr-tradeoff-analyzer.md +1 -0
  23. package/config/taxonomy.toml +9 -0
  24. package/hooks/hooks.json +58 -0
  25. package/package.json +3 -2
  26. package/{commands → skills}/debt.md +4 -3
  27. package/skills/persona/SKILL.md +43 -0
  28. package/{commands → skills}/status.md +2 -2
  29. package/src/install.js +5 -5
  30. package/src/verify.js +5 -5
  31. /package/{commands → skills}/advise.md +0 -0
  32. /package/{commands → skills}/architect.md +0 -0
  33. /package/{commands → skills}/audit.md +0 -0
  34. /package/{commands → skills}/blueprint.md +0 -0
  35. /package/{commands → skills}/challenge.md +0 -0
  36. /package/{commands → skills}/diagram.md +0 -0
  37. /package/{commands → skills}/digest.md +0 -0
  38. /package/{commands → skills}/drift.md +0 -0
  39. /package/{commands → skills}/eli5.md +0 -0
  40. /package/{commands → skills}/evaluate.md +0 -0
  41. /package/{commands → skills}/evidence.md +0 -0
  42. /package/{commands → skills}/export.md +0 -0
  43. /package/{commands → skills}/federate.md +0 -0
  44. /package/{commands → skills}/fitness.md +0 -0
  45. /package/{commands → skills}/govern.md +0 -0
  46. /package/{commands → skills}/guard.md +0 -0
  47. /package/{commands → skills}/health.md +0 -0
  48. /package/{commands → skills}/help.md +0 -0
  49. /package/{commands → skills}/hooks.md +0 -0
  50. /package/{commands → skills}/impact.md +0 -0
  51. /package/{commands → skills}/init.md +0 -0
  52. /package/{commands → skills}/list.md +0 -0
  53. /package/{commands → skills}/map.md +0 -0
  54. /package/{commands → skills}/new.md +0 -0
  55. /package/{commands → skills}/radar.md +0 -0
  56. /package/{commands → skills}/rearchitect.md +0 -0
  57. /package/{commands → skills}/reflect.md +0 -0
  58. /package/{commands → skills}/retro.md +0 -0
  59. /package/{commands → skills}/review.md +0 -0
  60. /package/{commands → skills}/risk.md +0 -0
  61. /package/{commands → skills}/scope.md +0 -0
  62. /package/{commands → skills}/search.md +0 -0
  63. /package/{commands → skills}/timeline.md +0 -0
  64. /package/{commands → skills}/trace.md +0 -0
  65. /package/{commands → skills}/tradeoff.md +0 -0
  66. /package/{commands → skills}/transition.md +0 -0
  67. /package/{commands → skills}/views.md +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blueprint",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "Architecture Decision Records with teeth — 39 commands, 21 agents, 15 architecture paradigms. DDD bounded contexts, DCAR forces evaluation, reflexion model conformance, epistemic status tracking, Wardley strategic analysis, C4 diagrams, ATAM tradeoff analysis, risk heat maps, cross-repo federation, and configurable governance tiers. All with a cranky senior engineer persona.",
5
5
  "author": {
6
6
  "name": "pragnition"
@@ -8,6 +8,7 @@
8
8
  "homepage": "https://github.com/pragnition/blueprint",
9
9
  "repository": "https://github.com/pragnition/blueprint",
10
10
  "license": "MIT",
11
+ "hooks": "./hooks/hooks.json",
11
12
  "keywords": [
12
13
  "adr",
13
14
  "architecture",
package/README.md CHANGED
@@ -357,13 +357,13 @@ npm link
357
357
  claude-blueprint install --global
358
358
  ```
359
359
 
360
- The installer deploys 39 commands, 21 agents, and 8 config files to `~/.claude/commands/blueprint/`, and inserts a managed section into `CLAUDE.md` with the command reference.
360
+ The installer deploys 39 skills, 21 agents, and 8 config files to `~/.claude/commands/blueprint/`, and inserts a managed section into `CLAUDE.md` with the command reference.
361
361
 
362
362
  ## Architecture of Blueprint Itself
363
363
 
364
364
  ```
365
365
  blueprint/
366
- ├── commands/ 39 skill files
366
+ ├── skills/ 39 skill files
367
367
  │ ├── blueprint.md Thin router
368
368
  │ ├── init.md Bootstrap from existing codebase
369
369
  │ ├── help.md Contextual command reference
@@ -3,6 +3,7 @@ name: adr-architect-cartographer
3
3
  description: Generates and maintains ARCHITECTURE.md — a bird's-eye map of the codebase following matklad's philosophy. Produces codemap, invariants, cross-cutting concerns, and layer boundaries. References ADRs as the canonical source for why things are the way they are.
4
4
  tools: Read, Grep, Glob, Bash
5
5
  model: inherit
6
+ skills: ["persona"]
6
7
  color: white
7
8
  ---
8
9
 
@@ -3,6 +3,7 @@ name: adr-bug-surface-mapper
3
3
  description: Maps the architectural bug surface — identifies where bugs are structurally likely to emerge based on complexity, coupling, missing boundaries, and state management. Does NOT hunt for specific bugs.
4
4
  tools: Read, Grep, Glob, Bash
5
5
  model: inherit
6
+ skills: ["persona"]
6
7
  color: orange
7
8
  ---
8
9
 
@@ -3,6 +3,7 @@ name: adr-compliance-auditor
3
3
  description: Audits the codebase against accepted ADRs to verify decisions are being followed. Detects violations, drift, and non-compliance with evidence.
4
4
  tools: Read, Grep, Glob, Bash
5
5
  model: inherit
6
+ skills: ["persona"]
6
7
  color: blue
7
8
  ---
8
9
 
@@ -3,6 +3,7 @@ name: adr-consistency-auditor
3
3
  description: Evaluates structural consistency across a codebase — pattern adherence, layering discipline, naming conventions, dependency direction, and error handling uniformity.
4
4
  tools: Read, Grep, Glob, Bash
5
5
  model: inherit
6
+ skills: ["persona"]
6
7
  color: green
7
8
  ---
8
9
 
@@ -3,6 +3,7 @@ name: adr-context-mapper
3
3
  description: Analyzes codebase to infer bounded contexts from module structure, package boundaries, naming patterns, and git ownership. Maps ADRs to contexts and generates context maps showing inter-context relationships.
4
4
  tools: Read, Grep, Glob, Bash
5
5
  model: inherit
6
+ skills: ["persona"]
6
7
  color: green
7
8
  ---
8
9
 
@@ -3,6 +3,7 @@ name: adr-conways-law-analyzer
3
3
  description: Analyzes alignment between system architecture and team/organizational structure (Conway's Law). Identifies where module boundaries, ownership, and communication overhead create friction or enable velocity.
4
4
  tools: Read, Grep, Glob, Bash
5
5
  model: inherit
6
+ skills: ["persona"]
6
7
  color: teal
7
8
  ---
8
9
 
@@ -3,6 +3,7 @@ name: adr-devils-advocate
3
3
  description: Critically challenges a proposed ADR before acceptance. Identifies unconsidered alternatives, hidden risks, faulty assumptions, and missing consequences. Produces a challenge report.
4
4
  tools: Read, Grep, Glob, Bash, WebSearch, WebFetch
5
5
  model: inherit
6
+ skills: ["persona"]
6
7
  color: red
7
8
  ---
8
9
 
@@ -3,6 +3,7 @@ name: adr-diagram-generator
3
3
  description: Generates C4 Model diagrams (System Context, Container, Component) from accepted ADRs and the relationship graph. Outputs Mermaid, Structurizr DSL, or PlantUML.
4
4
  tools: Read, Grep, Glob, Bash
5
5
  model: inherit
6
+ skills: ["persona"]
6
7
  color: cyan
7
8
  ---
8
9
 
@@ -3,6 +3,7 @@ name: adr-evidence-auditor
3
3
  description: Audits the epistemic status and temporal validity of evidence supporting accepted ADRs. Detects stale evidence, unverified AI-generated research, and decisions whose supporting context has changed.
4
4
  tools: Read, Grep, Glob, Bash, WebSearch, WebFetch
5
5
  model: inherit
6
+ skills: ["persona"]
6
7
  color: magenta
7
8
  ---
8
9
 
@@ -3,6 +3,7 @@ name: adr-federation-indexer
3
3
  description: Aggregates ADRs across multiple repositories into a unified index. Detects cross-repo conflicts, duplicates, and missing cross-references. Addresses the top practitioner criticism of repo-scoped ADRs.
4
4
  tools: Read, Grep, Glob, Bash
5
5
  model: inherit
6
+ skills: ["persona"]
6
7
  color: green
7
8
  ---
8
9
 
@@ -3,6 +3,7 @@ name: adr-forces-evaluator
3
3
  description: Evaluates an ADR using DCAR's structured forces template — systematically weighs arguments for and against a decision, generates force-balance reports, and scores decisions as confirmed or needs-re-evaluation.
4
4
  tools: Read, Grep, Glob, Bash, WebSearch, WebFetch
5
5
  model: inherit
6
+ skills: ["persona"]
6
7
  color: yellow
7
8
  ---
8
9
 
@@ -3,6 +3,7 @@ name: adr-impact-analyzer
3
3
  description: Analyzes a new or existing ADR against all other accepted ADRs and the codebase. Detects conflicts, duplicates, dependencies, and affected components.
4
4
  tools: Read, Grep, Glob, Bash
5
5
  model: inherit
6
+ skills: ["persona"]
6
7
  color: yellow
7
8
  ---
8
9
 
@@ -3,6 +3,7 @@ name: adr-maintainability-assessor
3
3
  description: Evaluates long-term maintainability — dependency health, abstraction quality, change amplification, cognitive complexity, and technical debt indicators.
4
4
  tools: Read, Grep, Glob, Bash
5
5
  model: inherit
6
+ skills: ["persona"]
6
7
  color: purple
7
8
  ---
8
9
 
@@ -3,6 +3,7 @@ name: adr-reflexion-analyzer
3
3
  description: Computes reflexion models by comparing the intended architecture (from accepted ADRs + ARCHITECTURE.md) against actual source code structure. Reports convergences, divergences, and absences for rigorous drift detection.
4
4
  tools: Read, Grep, Glob, Bash
5
5
  model: inherit
6
+ skills: ["persona"]
6
7
  color: red
7
8
  ---
8
9
 
@@ -3,6 +3,7 @@ name: adr-researcher
3
3
  description: Researches technology options, alternatives, and trade-offs for a proposed architectural decision. Produces a structured research brief consumed by the ADR drafting flow.
4
4
  tools: Read, Grep, Glob, Bash, WebSearch, WebFetch
5
5
  model: inherit
6
+ skills: ["persona"]
6
7
  color: cyan
7
8
  ---
8
9
 
@@ -3,6 +3,7 @@ name: adr-retrospective
3
3
  description: Post-fix retrospective agent that evaluates recent changes for band-aid vs systemic fixes, identifies root cause classes, and proposes ADRs for architectural improvements worth formalizing.
4
4
  tools: Read, Grep, Glob, Bash, WebSearch, WebFetch
5
5
  model: inherit
6
+ skills: ["persona"]
6
7
  color: amber
7
8
  ---
8
9
 
@@ -3,6 +3,7 @@ name: adr-risk-mapper
3
3
  description: Generates automated risk heat maps by analyzing ADR coverage gaps, component complexity, git churn, coupling density, and missing governance. Identifies architectural risk concentrations.
4
4
  tools: Read, Grep, Glob, Bash
5
5
  model: inherit
6
+ skills: ["persona"]
6
7
  color: red
7
8
  ---
8
9
 
@@ -3,6 +3,7 @@ name: adr-strategic-analyzer
3
3
  description: Analyzes ADRs against Wardley Map evolution stages to detect strategic misalignment — building custom solutions for commodity problems, or using commodity tools for genesis-stage differentiators.
4
4
  tools: Read, Grep, Glob, Bash, WebSearch, WebFetch
5
5
  model: inherit
6
+ skills: ["persona"]
6
7
  color: blue
7
8
  ---
8
9
 
@@ -3,6 +3,7 @@ name: adr-testing-strategy-evaluator
3
3
  description: Evaluates testing strategy completeness — coverage architecture, anti-pattern tests, testing pyramid health, test quality, and alignment between test structure and system risk areas.
4
4
  tools: Read, Grep, Glob, Bash
5
5
  model: inherit
6
+ skills: ["persona"]
6
7
  color: magenta
7
8
  ---
8
9
 
@@ -3,6 +3,7 @@ name: adr-tradeoff-analyzer
3
3
  description: Generates ATAM-style quality attribute utility trees from accepted ADRs. Identifies sensitivity points, tradeoff points, risks, and non-risks across the decision landscape.
4
4
  tools: Read, Grep, Glob, Bash, WebSearch
5
5
  model: inherit
6
+ skills: ["persona"]
6
7
  color: yellow
7
8
  ---
8
9
 
@@ -165,6 +165,15 @@ L0 = "Unverified — AI-generated, unsourced, or unconfirmed"
165
165
  L1 = "Logically Consistent — sourced, sound reasoning, not project-tested"
166
166
  L2 = "Empirically Validated — tested and confirmed in this project"
167
167
 
168
+ # --- Decision Debt Scoring ---
169
+ # Single source of truth for debt calculation. Used by /blueprint:debt and /blueprint:status.
170
+
171
+ [debt_scoring]
172
+ formula = "severity_weight × age_months × dependency_count"
173
+ severity_weights = { High = 3, Medium = 2, Low = 1 }
174
+ thresholds = { nominal = 10, elevated = 25, critical = 50 }
175
+ evidence_debt_multiplier = 1.5 # Expired evidence scores 1.5x vs deferred decisions
176
+
168
177
  # --- Decision Categories ---
169
178
 
170
179
  decision_categories = [
@@ -0,0 +1,58 @@
1
+ {
2
+ "description": "Blueprint architecture governance hooks. Pre-commit guard is opt-in (disabled by default). All others suggest actions without blocking.",
3
+ "hooks": {
4
+ "PreToolUse": [
5
+ {
6
+ "matcher": "Write|Edit",
7
+ "hooks": [
8
+ {
9
+ "type": "prompt",
10
+ "prompt": "Check if this file change violates any accepted ADR invariant. If it does, warn the user with the specific ADR reference. If no ADRs exist or no violation is detected, approve silently.",
11
+ "timeout": 10
12
+ }
13
+ ],
14
+ "disabled": true,
15
+ "_comment": "Pre-commit architecture guard (ADR-0026). Enable with /blueprint:hooks install guard"
16
+ }
17
+ ],
18
+ "PostToolUse": [
19
+ {
20
+ "matcher": "Bash",
21
+ "hooks": [
22
+ {
23
+ "type": "prompt",
24
+ "prompt": "If the command output indicates a bug fix was just applied (commit message contains 'fix', 'bugfix', 'hotfix', or 'patch'), suggest: 'Run /blueprint:retro to check if this fix warrants an ADR.' Do not block — just suggest.",
25
+ "timeout": 5
26
+ }
27
+ ],
28
+ "_comment": "Retro-suggest after fix workflows (ADR-0034)"
29
+ }
30
+ ],
31
+ "Stop": [
32
+ {
33
+ "matcher": ".*",
34
+ "hooks": [
35
+ {
36
+ "type": "prompt",
37
+ "prompt": "If an ADR was just accepted, rejected, or transitioned during this session, suggest: 'Run /blueprint:architect to update ARCHITECTURE.md and /blueprint:fitness to regenerate fitness functions.' Do not block.",
38
+ "timeout": 5
39
+ }
40
+ ],
41
+ "_comment": "Architecture-sync after ADR transitions (ADR-0034)"
42
+ }
43
+ ],
44
+ "FileChanged": [
45
+ {
46
+ "matcher": "package\\.json|requirements\\.txt|pyproject\\.toml|Cargo\\.toml|go\\.mod",
47
+ "hooks": [
48
+ {
49
+ "type": "prompt",
50
+ "prompt": "A dependency manifest was modified. If a new dependency was added, suggest: 'Consider /blueprint:new to document this technology choice as an ADR.' Do not block.",
51
+ "timeout": 5
52
+ }
53
+ ],
54
+ "_comment": "Dependency-watch on package changes (ADR-0034)"
55
+ }
56
+ ]
57
+ }
58
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-blueprint",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "type": "module",
5
5
  "description": "Architecture Decision Records with teeth — lifecycle management, 15 architecture paradigms, DDD context scoping, DCAR forces evaluation, reflexion models, Wardley mapping, C4 diagrams, ATAM tradeoff analysis, and 19 specialized agents for Claude Code.",
6
6
  "bin": {
@@ -11,7 +11,8 @@
11
11
  "bin/",
12
12
  "src/",
13
13
  ".claude-plugin/",
14
- "commands/",
14
+ "skills/",
15
+ "hooks/",
15
16
  "agents/",
16
17
  "config/"
17
18
  ],
@@ -58,9 +58,10 @@ For each deferred decision, check if the trigger condition has been met:
58
58
 
59
59
  ### Step 3: Calculate Decision Debt Score
60
60
 
61
- ```
62
- Decision Debt = Σ (severity × age_months × dependency_count)
63
- ```
61
+ Read the formula and weights from `config/taxonomy.toml` `[debt_scoring]` section.
62
+ Default formula: `severity_weight × age_months × dependency_count`
63
+ Severity weights: High=3, Medium=2, Low=1
64
+ Thresholds: nominal < 10, elevated < 25, critical ≥ 50
64
65
 
65
66
  Higher score = more urgent. A high-severity decision deferred 8 months ago with
66
67
  3 other decisions depending on it is more urgent than a low-severity decision
@@ -0,0 +1,43 @@
1
+ ---
2
+ name: persona
3
+ description: Senior Engineer Persona — shared personality for all Blueprint agents
4
+ user-invocable: false
5
+ disable-model-invocation: true
6
+ ---
7
+
8
+ # Senior Engineer Persona
9
+
10
+ You are a senior engineer with 20 years of production experience and zero patience for
11
+ sloppiness. You've been paged at 3 AM because someone thought "it's fine, we'll fix it
12
+ later." You've watched "temporary" workarounds survive three team turnovers. You've debugged
13
+ race conditions caused by developers who thought shared mutable state was "simpler."
14
+
15
+ You are not mean. You are direct. There is a difference.
16
+
17
+ **Your principles:**
18
+
19
+ - Say what you mean. "Consider using const" is weak. "This should be const — it's never
20
+ reassigned, and let signals mutation intent you don't have" is clear.
21
+ - Small things matter because they compound. One inconsistent naming convention is a style
22
+ choice. Fifty is a codebase that nobody can navigate.
23
+ - "It works" is not a quality bar. Code that works but violates conventions, has no error
24
+ handling, or is untested is a landmine with a longer fuse.
25
+ - Be specific with criticism. "This is messy" is unhelpful. "This function is 80 lines with
26
+ 6 levels of nesting — extract the validation logic" is actionable.
27
+ - Credit good work when you see it. Not everything is broken. When the architecture is solid,
28
+ say so — briefly, then move on to what isn't.
29
+
30
+ **Your tone:**
31
+
32
+ - Blunt but not cruel. You respect the developer, not the code.
33
+ - Opinionated with receipts. Strong opinions backed by evidence, not vibes.
34
+ - Zero hedging. Not "you might want to consider..." but "do this, here's why."
35
+ - Petty about the right things. Naming matters. Consistency matters. Error handling matters.
36
+ Whitespace doesn't.
37
+ - Dry humor is fine. Sarcasm directed at patterns, never at people.
38
+
39
+ **Apply this persona to your functional role.** You are still doing your specific job
40
+ (researching, reviewing, auditing, analyzing) — the persona shapes HOW you communicate
41
+ findings, not WHAT you look for. Your structured output format stays the same. Your verdicts
42
+ and recommendations stay evidence-based. But your prose should read like it was written by
43
+ someone who has strong opinions because they've earned them the hard way.
@@ -69,8 +69,8 @@ Read from parent `blueprint/` skill directory:
69
69
 
70
70
  **Decision debt:**
71
71
  - Count Deferred ADRs
72
- - For each, check trigger conditions against codebase (same logic as `/blueprint:debt`)
73
- - Calculate debt score: Σ(severity × age_months × dependency_count)
72
+ - For each, check trigger conditions against codebase (delegate to `/blueprint:debt` logic)
73
+ - Read debt score formula from `config/taxonomy.toml` `[debt_scoring]` section
74
74
  - Flag any with triggered conditions
75
75
 
76
76
  **Operations recency:**
package/src/install.js CHANGED
@@ -45,20 +45,20 @@ export async function install(opts) {
45
45
  // Copy root command (router)
46
46
  spinner.start('Installing router...');
47
47
  await copyFile(
48
- join(PLUGIN_ROOT, 'commands', 'blueprint.md'),
48
+ join(PLUGIN_ROOT, 'skills', 'blueprint.md'),
49
49
  join(paths.commands, 'SKILL.md'),
50
50
  );
51
51
  spinner.succeed('Router installed');
52
52
 
53
- // Copy sub-commands as SKILL.md in their directories
54
- spinner.start('Installing commands...');
53
+ // Copy sub-skills as SKILL.md in their directories
54
+ spinner.start('Installing skills...');
55
55
  for (const cmd of SUB_COMMANDS) {
56
56
  await copyFile(
57
- join(PLUGIN_ROOT, 'commands', `${cmd}.md`),
57
+ join(PLUGIN_ROOT, 'skills', `${cmd}.md`),
58
58
  join(paths.commands, cmd, 'SKILL.md'),
59
59
  );
60
60
  }
61
- spinner.succeed(`${SUB_COMMANDS.length} commands installed`);
61
+ spinner.succeed(`${SUB_COMMANDS.length} skills installed`);
62
62
 
63
63
  // Copy agents
64
64
  spinner.start('Installing agents...');
package/src/verify.js CHANGED
@@ -2,9 +2,9 @@ import { access } from 'fs/promises';
2
2
  import { join } from 'path';
3
3
  import { getTargetPaths } from './paths.js';
4
4
 
5
- const EXPECTED_COMMANDS = [
5
+ const EXPECTED_SKILLS = [
6
6
  'SKILL.md',
7
- // v1 commands
7
+ // v1 skills
8
8
  'help/SKILL.md',
9
9
  'list/SKILL.md',
10
10
  'new/SKILL.md',
@@ -28,7 +28,7 @@ const EXPECTED_COMMANDS = [
28
28
  'status/SKILL.md',
29
29
  'health/SKILL.md',
30
30
  'hooks/SKILL.md',
31
- // v2 commands
31
+ // v2 skills
32
32
  'scope/SKILL.md',
33
33
  'challenge/SKILL.md',
34
34
  'reflect/SKILL.md',
@@ -111,8 +111,8 @@ export async function verify(opts) {
111
111
 
112
112
  let missing = 0;
113
113
 
114
- // Check commands
115
- for (const cmd of EXPECTED_COMMANDS) {
114
+ // Check skills
115
+ for (const cmd of EXPECTED_SKILLS) {
116
116
  const ok = await fileExists(join(paths.commands, cmd));
117
117
  console.log(` ${ok ? '✓' : '✗'} commands/${cmd}`);
118
118
  if (!ok) missing++;
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes