@phuc1403/musketeer 0.3.0 → 0.5.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.
Files changed (114) hide show
  1. package/README.md +49 -49
  2. package/manifest.json +301 -253
  3. package/package.json +1 -1
  4. package/template/.claude/hooks/block-unsafe-adr-title.cjs +70 -0
  5. package/template/.claude/hooks/init-adr-dir.cjs +110 -0
  6. package/template/.claude/hooks/inject-adr-env.cjs +82 -0
  7. package/template/.claude/hooks/lib/characteristics/checker.cjs +357 -0
  8. package/template/.claude/hooks/sync-adr-toc.cjs +111 -0
  9. package/template/.claude/hooks/validate-characteristics-hook.cjs +66 -0
  10. package/template/.claude/hooks/warn-missing-characteristics.cjs +32 -0
  11. package/template/.claude/skills/adr-writer/SKILL.md +24 -101
  12. package/template/.claude/skills/adr-writer/references/adr-example.md +0 -5
  13. package/template/.claude/skills/adr-writer/references/adr-template.md +0 -12
  14. package/template/.claude/skills/architecture-characteristic-writer/SKILL.md +197 -99
  15. package/template/.claude/skills/architecture-characteristic-writer/assets/worksheet-template.md +18 -29
  16. package/template/.claude/skills/architecture-characteristic-writer/references/characteristics-catalog.md +22 -88
  17. package/template/.claude/skills/architecture-characteristic-writer/scripts/ranking-table.cjs +171 -0
  18. package/template/dotnet-scaffold/src/__SolutionName__.Api/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs +4 -0
  19. package/template/dotnet-scaffold/src/__SolutionName__.Api/obj/Debug/net10.0/__SolutionName__.Api.AssemblyInfo.cs +22 -0
  20. package/template/dotnet-scaffold/src/__SolutionName__.Api/obj/Debug/net10.0/__SolutionName__.Api.AssemblyInfoInputs.cache +1 -0
  21. package/template/dotnet-scaffold/src/__SolutionName__.Api/obj/Debug/net10.0/__SolutionName__.Api.GeneratedMSBuildEditorConfig.editorconfig +23 -0
  22. package/template/dotnet-scaffold/src/__SolutionName__.Api/obj/Debug/net10.0/__SolutionName__.Api.GlobalUsings.g.cs +17 -0
  23. package/template/dotnet-scaffold/src/__SolutionName__.Api/obj/Debug/net10.0/__SolutionName__.Api.assets.cache +0 -0
  24. package/template/dotnet-scaffold/src/__SolutionName__.Api/obj/__SolutionName__.Api.csproj.nuget.dgspec.json +1536 -0
  25. package/template/dotnet-scaffold/src/__SolutionName__.Api/obj/__SolutionName__.Api.csproj.nuget.g.props +16 -0
  26. package/template/dotnet-scaffold/src/__SolutionName__.Api/obj/__SolutionName__.Api.csproj.nuget.g.targets +2 -0
  27. package/template/dotnet-scaffold/src/__SolutionName__.Api/obj/project.assets.json +559 -0
  28. package/template/dotnet-scaffold/src/__SolutionName__.Api/obj/project.nuget.cache +8 -0
  29. package/template/dotnet-scaffold/src/__SolutionName__.Application/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs +4 -0
  30. package/template/dotnet-scaffold/src/__SolutionName__.Application/obj/Debug/net10.0/__SolutionName__.Application.AssemblyInfo.cs +22 -0
  31. package/template/dotnet-scaffold/src/__SolutionName__.Application/obj/Debug/net10.0/__SolutionName__.Application.AssemblyInfoInputs.cache +1 -0
  32. package/template/dotnet-scaffold/src/__SolutionName__.Application/obj/Debug/net10.0/__SolutionName__.Application.GeneratedMSBuildEditorConfig.editorconfig +17 -0
  33. package/template/dotnet-scaffold/src/__SolutionName__.Application/obj/Debug/net10.0/__SolutionName__.Application.GlobalUsings.g.cs +8 -0
  34. package/template/dotnet-scaffold/src/__SolutionName__.Application/obj/Debug/net10.0/__SolutionName__.Application.assets.cache +0 -0
  35. package/template/dotnet-scaffold/src/__SolutionName__.Application/obj/__SolutionName__.Application.csproj.nuget.dgspec.json +690 -0
  36. package/template/dotnet-scaffold/src/__SolutionName__.Application/obj/__SolutionName__.Application.csproj.nuget.g.props +16 -0
  37. package/template/dotnet-scaffold/src/__SolutionName__.Application/obj/__SolutionName__.Application.csproj.nuget.g.targets +2 -0
  38. package/template/dotnet-scaffold/src/__SolutionName__.Application/obj/project.assets.json +376 -0
  39. package/template/dotnet-scaffold/src/__SolutionName__.Application/obj/project.nuget.cache +8 -0
  40. package/template/dotnet-scaffold/src/__SolutionName__.Domain/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs +4 -0
  41. package/template/dotnet-scaffold/src/__SolutionName__.Domain/obj/Debug/net10.0/__SolutionName__.Domain.AssemblyInfo.cs +22 -0
  42. package/template/dotnet-scaffold/src/__SolutionName__.Domain/obj/Debug/net10.0/__SolutionName__.Domain.AssemblyInfoInputs.cache +1 -0
  43. package/template/dotnet-scaffold/src/__SolutionName__.Domain/obj/Debug/net10.0/__SolutionName__.Domain.GeneratedMSBuildEditorConfig.editorconfig +17 -0
  44. package/template/dotnet-scaffold/src/__SolutionName__.Domain/obj/Debug/net10.0/__SolutionName__.Domain.GlobalUsings.g.cs +8 -0
  45. package/template/dotnet-scaffold/src/__SolutionName__.Domain/obj/Debug/net10.0/__SolutionName__.Domain.assets.cache +0 -0
  46. package/template/dotnet-scaffold/src/__SolutionName__.Domain/obj/__SolutionName__.Domain.csproj.nuget.dgspec.json +347 -0
  47. package/template/dotnet-scaffold/src/__SolutionName__.Domain/obj/__SolutionName__.Domain.csproj.nuget.g.props +16 -0
  48. package/template/dotnet-scaffold/src/__SolutionName__.Domain/obj/__SolutionName__.Domain.csproj.nuget.g.targets +2 -0
  49. package/template/dotnet-scaffold/src/__SolutionName__.Domain/obj/project.assets.json +353 -0
  50. package/template/dotnet-scaffold/src/__SolutionName__.Domain/obj/project.nuget.cache +8 -0
  51. package/template/dotnet-scaffold/src/__SolutionName__.Infrastructure/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs +4 -0
  52. package/template/dotnet-scaffold/src/__SolutionName__.Infrastructure/obj/Debug/net10.0/__SolutionName__.Infrastructure.AssemblyInfo.cs +22 -0
  53. package/template/dotnet-scaffold/src/__SolutionName__.Infrastructure/obj/Debug/net10.0/__SolutionName__.Infrastructure.AssemblyInfoInputs.cache +1 -0
  54. package/template/dotnet-scaffold/src/__SolutionName__.Infrastructure/obj/Debug/net10.0/__SolutionName__.Infrastructure.GeneratedMSBuildEditorConfig.editorconfig +17 -0
  55. package/template/dotnet-scaffold/src/__SolutionName__.Infrastructure/obj/Debug/net10.0/__SolutionName__.Infrastructure.GlobalUsings.g.cs +8 -0
  56. package/template/dotnet-scaffold/src/__SolutionName__.Infrastructure/obj/Debug/net10.0/__SolutionName__.Infrastructure.assets.cache +0 -0
  57. package/template/dotnet-scaffold/src/__SolutionName__.Infrastructure/obj/Debug/net10.0/__SolutionName__.Infrastructure.csproj.AssemblyReference.cache +0 -0
  58. package/template/dotnet-scaffold/src/__SolutionName__.Infrastructure/obj/__SolutionName__.Infrastructure.csproj.nuget.dgspec.json +1047 -0
  59. package/template/dotnet-scaffold/src/__SolutionName__.Infrastructure/obj/__SolutionName__.Infrastructure.csproj.nuget.g.props +16 -0
  60. package/template/dotnet-scaffold/src/__SolutionName__.Infrastructure/obj/__SolutionName__.Infrastructure.csproj.nuget.g.targets +7 -0
  61. package/template/dotnet-scaffold/src/__SolutionName__.Infrastructure/obj/project.assets.json +858 -0
  62. package/template/dotnet-scaffold/src/__SolutionName__.Infrastructure/obj/project.nuget.cache +17 -0
  63. package/template/dotnet-scaffold/tests/__SolutionName__.Api.Tests/bin/Debug/net10.0/.msCoverageSourceRootsMapping___SolutionName__.Api.Tests +0 -0
  64. package/template/dotnet-scaffold/tests/__SolutionName__.Api.Tests/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs +4 -0
  65. package/template/dotnet-scaffold/tests/__SolutionName__.Api.Tests/obj/Debug/net10.0/__SolutionName__.Api.Tests.AssemblyInfo.cs +22 -0
  66. package/template/dotnet-scaffold/tests/__SolutionName__.Api.Tests/obj/Debug/net10.0/__SolutionName__.Api.Tests.AssemblyInfoInputs.cache +1 -0
  67. package/template/dotnet-scaffold/tests/__SolutionName__.Api.Tests/obj/Debug/net10.0/__SolutionName__.Api.Tests.GeneratedMSBuildEditorConfig.editorconfig +17 -0
  68. package/template/dotnet-scaffold/tests/__SolutionName__.Api.Tests/obj/Debug/net10.0/__SolutionName__.Api.Tests.GlobalUsings.g.cs +9 -0
  69. package/template/dotnet-scaffold/tests/__SolutionName__.Api.Tests/obj/Debug/net10.0/__SolutionName__.Api.Tests.assets.cache +0 -0
  70. package/template/dotnet-scaffold/tests/__SolutionName__.Api.Tests/obj/Debug/net10.0/__SolutionName__.Api.Tests.csproj.AssemblyReference.cache +0 -0
  71. package/template/dotnet-scaffold/tests/__SolutionName__.Api.Tests/obj/__SolutionName__.Api.Tests.csproj.nuget.dgspec.json +1908 -0
  72. package/template/dotnet-scaffold/tests/__SolutionName__.Api.Tests/obj/__SolutionName__.Api.Tests.csproj.nuget.g.props +27 -0
  73. package/template/dotnet-scaffold/tests/__SolutionName__.Api.Tests/obj/__SolutionName__.Api.Tests.csproj.nuget.g.targets +16 -0
  74. package/template/dotnet-scaffold/tests/__SolutionName__.Api.Tests/obj/project.assets.json +3283 -0
  75. package/template/dotnet-scaffold/tests/__SolutionName__.Api.Tests/obj/project.nuget.cache +60 -0
  76. package/template/dotnet-scaffold/tests/__SolutionName__.Application.Tests/bin/Debug/net10.0/.msCoverageSourceRootsMapping___SolutionName__.Application.Tests +0 -0
  77. package/template/dotnet-scaffold/tests/__SolutionName__.Application.Tests/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs +4 -0
  78. package/template/dotnet-scaffold/tests/__SolutionName__.Application.Tests/obj/Debug/net10.0/__SolutionName__.Application.Tests.AssemblyInfo.cs +22 -0
  79. package/template/dotnet-scaffold/tests/__SolutionName__.Application.Tests/obj/Debug/net10.0/__SolutionName__.Application.Tests.AssemblyInfoInputs.cache +1 -0
  80. package/template/dotnet-scaffold/tests/__SolutionName__.Application.Tests/obj/Debug/net10.0/__SolutionName__.Application.Tests.GeneratedMSBuildEditorConfig.editorconfig +17 -0
  81. package/template/dotnet-scaffold/tests/__SolutionName__.Application.Tests/obj/Debug/net10.0/__SolutionName__.Application.Tests.GlobalUsings.g.cs +9 -0
  82. package/template/dotnet-scaffold/tests/__SolutionName__.Application.Tests/obj/Debug/net10.0/__SolutionName__.Application.Tests.assets.cache +0 -0
  83. package/template/dotnet-scaffold/tests/__SolutionName__.Application.Tests/obj/Debug/net10.0/__SolutionName__.Application.Tests.csproj.AssemblyReference.cache +0 -0
  84. package/template/dotnet-scaffold/tests/__SolutionName__.Application.Tests/obj/__SolutionName__.Application.Tests.csproj.nuget.dgspec.json +1055 -0
  85. package/template/dotnet-scaffold/tests/__SolutionName__.Application.Tests/obj/__SolutionName__.Application.Tests.csproj.nuget.g.props +26 -0
  86. package/template/dotnet-scaffold/tests/__SolutionName__.Application.Tests/obj/__SolutionName__.Application.Tests.csproj.nuget.g.targets +11 -0
  87. package/template/dotnet-scaffold/tests/__SolutionName__.Application.Tests/obj/project.assets.json +1662 -0
  88. package/template/dotnet-scaffold/tests/__SolutionName__.Application.Tests/obj/project.nuget.cache +30 -0
  89. package/template/dotnet-scaffold/tests/__SolutionName__.Domain.Tests/bin/Debug/net10.0/.msCoverageSourceRootsMapping___SolutionName__.Domain.Tests +0 -0
  90. package/template/dotnet-scaffold/tests/__SolutionName__.Domain.Tests/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs +4 -0
  91. package/template/dotnet-scaffold/tests/__SolutionName__.Domain.Tests/obj/Debug/net10.0/__SolutionName__.Domain.Tests.AssemblyInfo.cs +22 -0
  92. package/template/dotnet-scaffold/tests/__SolutionName__.Domain.Tests/obj/Debug/net10.0/__SolutionName__.Domain.Tests.AssemblyInfoInputs.cache +1 -0
  93. package/template/dotnet-scaffold/tests/__SolutionName__.Domain.Tests/obj/Debug/net10.0/__SolutionName__.Domain.Tests.GeneratedMSBuildEditorConfig.editorconfig +17 -0
  94. package/template/dotnet-scaffold/tests/__SolutionName__.Domain.Tests/obj/Debug/net10.0/__SolutionName__.Domain.Tests.GlobalUsings.g.cs +9 -0
  95. package/template/dotnet-scaffold/tests/__SolutionName__.Domain.Tests/obj/Debug/net10.0/__SolutionName__.Domain.Tests.assets.cache +0 -0
  96. package/template/dotnet-scaffold/tests/__SolutionName__.Domain.Tests/obj/Debug/net10.0/__SolutionName__.Domain.Tests.csproj.AssemblyReference.cache +0 -0
  97. package/template/dotnet-scaffold/tests/__SolutionName__.Domain.Tests/obj/__SolutionName__.Domain.Tests.csproj.nuget.dgspec.json +712 -0
  98. package/template/dotnet-scaffold/tests/__SolutionName__.Domain.Tests/obj/__SolutionName__.Domain.Tests.csproj.nuget.g.props +26 -0
  99. package/template/dotnet-scaffold/tests/__SolutionName__.Domain.Tests/obj/__SolutionName__.Domain.Tests.csproj.nuget.g.targets +11 -0
  100. package/template/dotnet-scaffold/tests/__SolutionName__.Domain.Tests/obj/project.assets.json +1644 -0
  101. package/template/dotnet-scaffold/tests/__SolutionName__.Domain.Tests/obj/project.nuget.cache +30 -0
  102. package/template/dotnet-scaffold/tests/__SolutionName__.Infrastructure.Tests/bin/Debug/net10.0/.msCoverageSourceRootsMapping___SolutionName__.Infrastructure.Tests +0 -0
  103. package/template/dotnet-scaffold/tests/__SolutionName__.Infrastructure.Tests/obj/Debug/net10.0/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs +4 -0
  104. package/template/dotnet-scaffold/tests/__SolutionName__.Infrastructure.Tests/obj/Debug/net10.0/__SolutionName__.Infrastructure.Tests.AssemblyInfo.cs +22 -0
  105. package/template/dotnet-scaffold/tests/__SolutionName__.Infrastructure.Tests/obj/Debug/net10.0/__SolutionName__.Infrastructure.Tests.AssemblyInfoInputs.cache +1 -0
  106. package/template/dotnet-scaffold/tests/__SolutionName__.Infrastructure.Tests/obj/Debug/net10.0/__SolutionName__.Infrastructure.Tests.GeneratedMSBuildEditorConfig.editorconfig +17 -0
  107. package/template/dotnet-scaffold/tests/__SolutionName__.Infrastructure.Tests/obj/Debug/net10.0/__SolutionName__.Infrastructure.Tests.GlobalUsings.g.cs +9 -0
  108. package/template/dotnet-scaffold/tests/__SolutionName__.Infrastructure.Tests/obj/Debug/net10.0/__SolutionName__.Infrastructure.Tests.assets.cache +0 -0
  109. package/template/dotnet-scaffold/tests/__SolutionName__.Infrastructure.Tests/obj/Debug/net10.0/__SolutionName__.Infrastructure.Tests.csproj.AssemblyReference.cache +0 -0
  110. package/template/dotnet-scaffold/tests/__SolutionName__.Infrastructure.Tests/obj/__SolutionName__.Infrastructure.Tests.csproj.nuget.dgspec.json +1412 -0
  111. package/template/dotnet-scaffold/tests/__SolutionName__.Infrastructure.Tests/obj/__SolutionName__.Infrastructure.Tests.csproj.nuget.g.props +26 -0
  112. package/template/dotnet-scaffold/tests/__SolutionName__.Infrastructure.Tests/obj/__SolutionName__.Infrastructure.Tests.csproj.nuget.g.targets +13 -0
  113. package/template/dotnet-scaffold/tests/__SolutionName__.Infrastructure.Tests/obj/project.assets.json +2130 -0
  114. package/template/dotnet-scaffold/tests/__SolutionName__.Infrastructure.Tests/obj/project.nuget.cache +38 -0
package/manifest.json CHANGED
@@ -1,253 +1,301 @@
1
- {
2
- "version": 1,
3
- "musketeers": {
4
- "core": {
5
- "label": "core",
6
- "description": "Always-on foundation: research, handoff, skill-creator, git (+ git-manager) + statusline, usage-context & format-json hooks.",
7
- "locked": true,
8
- "deps": [],
9
- "files": [
10
- "skills/research/**",
11
- "skills/handoff/**",
12
- "skills/skill-creator/**",
13
- "skills/git/**",
14
- "skills/install.ps1",
15
- "skills/install.sh",
16
- "agents/researcher.md",
17
- "agents/git-manager.md",
18
- "statusline.cjs",
19
- "hooks/usage-context-awareness.cjs",
20
- "hooks/lib/**",
21
- "hooks/format-json-hook.js"
22
- ],
23
- "settings": [
24
- {
25
- "event": "statusLine",
26
- "command": "node \"${CLAUDE_PROJECT_DIR}/.claude/statusline.cjs\"",
27
- "padding": 0
28
- },
29
- {
30
- "event": "UserPromptSubmit",
31
- "matcher": null,
32
- "command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/usage-context-awareness.cjs\"",
33
- "order": 1
34
- },
35
- {
36
- "event": "PostToolUse",
37
- "matcher": null,
38
- "command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/usage-context-awareness.cjs\"",
39
- "order": 1
40
- },
41
- {
42
- "event": "PostToolUse",
43
- "matcher": "Write|Edit|MultiEdit",
44
- "command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/format-json-hook.js\"",
45
- "order": 2
46
- }
47
- ],
48
- "prereqs": ["node", "git", "gh", "python", "venv-anthropic", "claude-cli"]
49
- },
50
- "architecture": {
51
- "label": "architecture",
52
- "description": "DDD architecture authoring: adr-writer, architecture-characteristic-writer, context-map (CML) + validation hook.",
53
- "locked": false,
54
- "deps": [],
55
- "files": [
56
- "skills/adr-writer/**",
57
- "skills/architecture-characteristic-writer/**",
58
- "skills/context-map/**",
59
- "hooks/validate-cml-hook.js"
60
- ],
61
- "settings": [
62
- {
63
- "event": "PostToolUse",
64
- "matcher": "Write|Edit|MultiEdit",
65
- "command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/validate-cml-hook.js\"",
66
- "order": 1
67
- }
68
- ],
69
- "prereqs": ["java", "cm-cli", "adr-tools"]
70
- },
71
- "hallmark": {
72
- "label": "hallmark",
73
- "description": "Hallmark design system: hallmark rubric, hallmark-explore, hallmark-loop + auditor/explorer agents.",
74
- "locked": false,
75
- "deps": [],
76
- "files": [
77
- "skills/hallmark/**",
78
- "skills/hallmark-explore/**",
79
- "skills/hallmark-loop/**",
80
- "agents/hallmark-auditor.md",
81
- "agents/hallmark-explorer.md"
82
- ],
83
- "settings": [],
84
- "prereqs": ["python", "playwright-mcp"]
85
- },
86
- "code-review": {
87
- "label": "code-review",
88
- "description": "Adversarial code review skill + code-reviewer agent (commit / pending / PR modes).",
89
- "locked": false,
90
- "deps": [],
91
- "files": [
92
- "skills/code-review/**",
93
- "agents/code-reviewer.md"
94
- ],
95
- "settings": [],
96
- "prereqs": ["git", "gh"]
97
- },
98
- "dotnet": {
99
- "label": "dotnet",
100
- "description": ".NET extras: tdd, knowledge-crunching + EF migration-guard & CONTEXT auto-load hooks. Muster also always merges 4 quality-gate MSBuild properties into root Directory.Build.props (any dotnet-selected project, set MUSKETEER_SKIP_DOTNET_PROPS=1 to skip) and scaffolds a generic src/tests Clean Architecture skeleton when the project is genuinely blank.",
101
- "locked": false,
102
- "deps": [],
103
- "files": [
104
- "skills/tdd/**",
105
- "skills/knowledge-crunching/**",
106
- "hooks/block-migration-edits.cjs",
107
- "hooks/inject-context.cjs"
108
- ],
109
- "settings": [
110
- {
111
- "event": "PreToolUse",
112
- "matcher": "Write|Edit|MultiEdit",
113
- "command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/block-migration-edits.cjs\"",
114
- "order": 1,
115
- "statusMessage": "Checking for EF migration edits"
116
- },
117
- {
118
- "event": "SessionStart",
119
- "matcher": "startup|resume|clear|compact",
120
- "command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/inject-context.cjs\"",
121
- "order": 1,
122
- "statusMessage": "Loading domain CONTEXT"
123
- }
124
- ],
125
- "prereqs": []
126
- },
127
- "design-docs": {
128
- "label": "design-docs",
129
- "description": "SessionStart hook that injects architecture/context-map/adr docs/ outputs into context.",
130
- "locked": false,
131
- "deps": [],
132
- "files": [
133
- "hooks/inject-design-docs.cjs"
134
- ],
135
- "settings": [
136
- {
137
- "event": "SessionStart",
138
- "matcher": "startup|resume|clear|compact",
139
- "command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/inject-design-docs.cjs\"",
140
- "order": 1,
141
- "statusMessage": "Injecting design artifacts"
142
- }
143
- ],
144
- "prereqs": []
145
- }
146
- },
147
- "prereqs": {
148
- "node": {
149
- "detect": "node --version",
150
- "minVersion": "18",
151
- "kind": "package",
152
- "install": {
153
- "win": "winget install -e --id OpenJS.NodeJS.LTS",
154
- "mac": "brew install node",
155
- "linux": {
156
- "apt": "sudo apt-get install -y nodejs npm",
157
- "dnf": "sudo dnf install -y nodejs",
158
- "pacman": "sudo pacman -S --noconfirm nodejs npm"
159
- }
160
- }
161
- },
162
- "git": {
163
- "detect": "git --version",
164
- "kind": "package",
165
- "install": {
166
- "win": "winget install -e --id Git.Git",
167
- "mac": "brew install git",
168
- "linux": {
169
- "apt": "sudo apt-get install -y git",
170
- "dnf": "sudo dnf install -y git",
171
- "pacman": "sudo pacman -S --noconfirm git"
172
- }
173
- }
174
- },
175
- "python": {
176
- "detect": "python --version",
177
- "minVersion": "3.8",
178
- "kind": "package",
179
- "install": {
180
- "win": "winget install -e --id Python.Python.3.12",
181
- "mac": "brew install python@3.12",
182
- "linux": {
183
- "apt": "sudo apt-get install -y python3 python3-pip python3-venv",
184
- "dnf": "sudo dnf install -y python3 python3-pip",
185
- "pacman": "sudo pacman -S --noconfirm python python-pip"
186
- }
187
- }
188
- },
189
- "venv-anthropic": {
190
- "kind": "venv",
191
- "needs": ["python"]
192
- },
193
- "claude-cli": {
194
- "detect": "claude --version",
195
- "kind": "package",
196
- "install": {
197
- "win": "powershell -NoProfile -Command \"irm https://claude.ai/install.ps1 | iex\"",
198
- "mac": "brew install --cask claude-code",
199
- "linux": "curl -fsSL https://claude.ai/install.sh | bash"
200
- }
201
- },
202
- "java": {
203
- "detect": "java -version",
204
- "minVersion": "8",
205
- "kind": "package",
206
- "install": {
207
- "win": "winget install -e --id Microsoft.OpenJDK.17",
208
- "mac": "brew install --cask temurin",
209
- "linux": {
210
- "apt": "sudo apt-get install -y openjdk-17-jdk",
211
- "dnf": "sudo dnf install -y java-17-openjdk",
212
- "pacman": "sudo pacman -S --noconfirm jdk-openjdk"
213
- }
214
- }
215
- },
216
- "cm-cli": {
217
- "kind": "note",
218
- "needs": ["java"]
219
- },
220
- "adr-tools": {
221
- "detect": "adr config",
222
- "kind": "package",
223
- "needs": ["git"],
224
- "install": {
225
- "mac": "brew install adr-tools",
226
- "linux": {
227
- "apt": "sudo apt-get install -y adr-tools"
228
- }
229
- }
230
- },
231
- "gh": {
232
- "detect": "gh --version",
233
- "kind": "package",
234
- "install": {
235
- "win": "winget install -e --id GitHub.cli",
236
- "mac": "brew install gh",
237
- "linux": {
238
- "apt": "sudo apt-get install -y gh",
239
- "dnf": "sudo dnf install -y gh",
240
- "pacman": "sudo pacman -S --noconfirm github-cli"
241
- }
242
- }
243
- },
244
- "playwright-mcp": {
245
- "kind": "mcp",
246
- "needs": ["node", "claude-cli"]
247
- },
248
- "anthropic-api-key": {
249
- "kind": "secret",
250
- "guideOnly": true
251
- }
252
- }
253
- }
1
+ {
2
+ "version": 1,
3
+ "musketeers": {
4
+ "core": {
5
+ "label": "core",
6
+ "description": "Always-on foundation: research, handoff, skill-creator, git (+ git-manager) + statusline, usage-context & format-json hooks.",
7
+ "locked": true,
8
+ "deps": [],
9
+ "files": [
10
+ "skills/research/**",
11
+ "skills/handoff/**",
12
+ "skills/skill-creator/**",
13
+ "skills/git/**",
14
+ "skills/install.ps1",
15
+ "skills/install.sh",
16
+ "agents/researcher.md",
17
+ "agents/git-manager.md",
18
+ "statusline.cjs",
19
+ "hooks/usage-context-awareness.cjs",
20
+ "hooks/lib/**",
21
+ "hooks/format-json-hook.js"
22
+ ],
23
+ "settings": [
24
+ {
25
+ "event": "statusLine",
26
+ "command": "node \"${CLAUDE_PROJECT_DIR}/.claude/statusline.cjs\"",
27
+ "padding": 0
28
+ },
29
+ {
30
+ "event": "UserPromptSubmit",
31
+ "matcher": null,
32
+ "command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/usage-context-awareness.cjs\"",
33
+ "order": 1
34
+ },
35
+ {
36
+ "event": "PostToolUse",
37
+ "matcher": null,
38
+ "command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/usage-context-awareness.cjs\"",
39
+ "order": 1
40
+ },
41
+ {
42
+ "event": "PostToolUse",
43
+ "matcher": "Write|Edit|MultiEdit",
44
+ "command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/format-json-hook.js\"",
45
+ "order": 2
46
+ }
47
+ ],
48
+ "prereqs": ["node", "git", "gh", "python", "venv-anthropic", "claude-cli"]
49
+ },
50
+ "architecture": {
51
+ "label": "architecture",
52
+ "description": "DDD architecture authoring: adr-writer, architecture-characteristic-writer, context-map (CML) + validation hook.",
53
+ "locked": false,
54
+ "deps": [],
55
+ "files": [
56
+ "skills/adr-writer/**",
57
+ "skills/architecture-characteristic-writer/**",
58
+ "skills/context-map/**",
59
+ "hooks/validate-cml-hook.js",
60
+ "hooks/validate-characteristics-hook.cjs",
61
+ "hooks/lib/characteristics/**",
62
+ "hooks/sync-adr-toc.cjs",
63
+ "hooks/warn-missing-characteristics.cjs",
64
+ "hooks/block-unsafe-adr-title.cjs",
65
+ "hooks/init-adr-dir.cjs",
66
+ "hooks/inject-adr-env.cjs"
67
+ ],
68
+ "settings": [
69
+ {
70
+ "event": "PostToolUse",
71
+ "matcher": "Write|Edit|MultiEdit",
72
+ "command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/validate-cml-hook.js\"",
73
+ "order": 1
74
+ },
75
+ {
76
+ "event": "PostToolUse",
77
+ "matcher": "Write|Edit|MultiEdit",
78
+ "command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/validate-characteristics-hook.cjs\"",
79
+ "order": 2,
80
+ "statusMessage": "Checking architecture characteristics"
81
+ },
82
+ {
83
+ "event": "PostToolUse",
84
+ "matcher": "Bash",
85
+ "command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/sync-adr-toc.cjs\"",
86
+ "order": 2,
87
+ "statusMessage": "Syncing ADR index"
88
+ },
89
+ {
90
+ "event": "PreToolUse",
91
+ "matcher": "Bash",
92
+ "command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/inject-adr-env.cjs\"",
93
+ "order": 3,
94
+ "statusMessage": "Filling in adr new env vars"
95
+ },
96
+ {
97
+ "event": "PreToolUse",
98
+ "matcher": "Bash",
99
+ "command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/warn-missing-characteristics.cjs\"",
100
+ "order": 4
101
+ },
102
+ {
103
+ "event": "PreToolUse",
104
+ "matcher": "Bash",
105
+ "command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/block-unsafe-adr-title.cjs\"",
106
+ "order": 5,
107
+ "statusMessage": "Checking ADR title safety"
108
+ },
109
+ {
110
+ "event": "PreToolUse",
111
+ "matcher": "Bash",
112
+ "command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/init-adr-dir.cjs\"",
113
+ "order": 6,
114
+ "statusMessage": "Checking ADR directory setup"
115
+ }
116
+ ],
117
+ "prereqs": ["java", "cm-cli", "adr-tools"]
118
+ },
119
+ "hallmark": {
120
+ "label": "hallmark",
121
+ "description": "Hallmark design system: hallmark rubric, hallmark-explore, hallmark-loop + auditor/explorer agents.",
122
+ "locked": false,
123
+ "deps": [],
124
+ "files": [
125
+ "skills/hallmark/**",
126
+ "skills/hallmark-explore/**",
127
+ "skills/hallmark-loop/**",
128
+ "agents/hallmark-auditor.md",
129
+ "agents/hallmark-explorer.md"
130
+ ],
131
+ "settings": [],
132
+ "prereqs": ["python", "playwright-mcp"]
133
+ },
134
+ "code-review": {
135
+ "label": "code-review",
136
+ "description": "Adversarial code review skill + code-reviewer agent (commit / pending / PR modes).",
137
+ "locked": false,
138
+ "deps": [],
139
+ "files": [
140
+ "skills/code-review/**",
141
+ "agents/code-reviewer.md"
142
+ ],
143
+ "settings": [],
144
+ "prereqs": ["git", "gh"]
145
+ },
146
+ "dotnet": {
147
+ "label": "dotnet",
148
+ "description": ".NET extras: tdd, knowledge-crunching + EF migration-guard & CONTEXT auto-load hooks. Muster also always merges 4 quality-gate MSBuild properties into root Directory.Build.props (any dotnet-selected project, set MUSKETEER_SKIP_DOTNET_PROPS=1 to skip) and scaffolds a generic src/tests Clean Architecture skeleton when the project is genuinely blank.",
149
+ "locked": false,
150
+ "deps": [],
151
+ "files": [
152
+ "skills/tdd/**",
153
+ "skills/knowledge-crunching/**",
154
+ "hooks/block-migration-edits.cjs",
155
+ "hooks/inject-context.cjs"
156
+ ],
157
+ "settings": [
158
+ {
159
+ "event": "PreToolUse",
160
+ "matcher": "Write|Edit|MultiEdit",
161
+ "command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/block-migration-edits.cjs\"",
162
+ "order": 1,
163
+ "statusMessage": "Checking for EF migration edits"
164
+ },
165
+ {
166
+ "event": "SessionStart",
167
+ "matcher": "startup|resume|clear|compact",
168
+ "command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/inject-context.cjs\"",
169
+ "order": 1,
170
+ "statusMessage": "Loading domain CONTEXT"
171
+ }
172
+ ],
173
+ "prereqs": []
174
+ },
175
+ "design-docs": {
176
+ "label": "design-docs",
177
+ "description": "SessionStart hook that injects architecture/context-map/adr docs/ outputs into context.",
178
+ "locked": false,
179
+ "deps": [],
180
+ "files": [
181
+ "hooks/inject-design-docs.cjs"
182
+ ],
183
+ "settings": [
184
+ {
185
+ "event": "SessionStart",
186
+ "matcher": "startup|resume|clear|compact",
187
+ "command": "node \"${CLAUDE_PROJECT_DIR}/.claude/hooks/inject-design-docs.cjs\"",
188
+ "order": 1,
189
+ "statusMessage": "Injecting design artifacts"
190
+ }
191
+ ],
192
+ "prereqs": []
193
+ }
194
+ },
195
+ "prereqs": {
196
+ "node": {
197
+ "detect": "node --version",
198
+ "minVersion": "18",
199
+ "kind": "package",
200
+ "install": {
201
+ "win": "winget install -e --id OpenJS.NodeJS.LTS",
202
+ "mac": "brew install node",
203
+ "linux": {
204
+ "apt": "sudo apt-get install -y nodejs npm",
205
+ "dnf": "sudo dnf install -y nodejs",
206
+ "pacman": "sudo pacman -S --noconfirm nodejs npm"
207
+ }
208
+ }
209
+ },
210
+ "git": {
211
+ "detect": "git --version",
212
+ "kind": "package",
213
+ "install": {
214
+ "win": "winget install -e --id Git.Git",
215
+ "mac": "brew install git",
216
+ "linux": {
217
+ "apt": "sudo apt-get install -y git",
218
+ "dnf": "sudo dnf install -y git",
219
+ "pacman": "sudo pacman -S --noconfirm git"
220
+ }
221
+ }
222
+ },
223
+ "python": {
224
+ "detect": "python --version",
225
+ "minVersion": "3.8",
226
+ "kind": "package",
227
+ "install": {
228
+ "win": "winget install -e --id Python.Python.3.12",
229
+ "mac": "brew install python@3.12",
230
+ "linux": {
231
+ "apt": "sudo apt-get install -y python3 python3-pip python3-venv",
232
+ "dnf": "sudo dnf install -y python3 python3-pip",
233
+ "pacman": "sudo pacman -S --noconfirm python python-pip"
234
+ }
235
+ }
236
+ },
237
+ "venv-anthropic": {
238
+ "kind": "venv",
239
+ "needs": ["python"]
240
+ },
241
+ "claude-cli": {
242
+ "detect": "claude --version",
243
+ "kind": "package",
244
+ "install": {
245
+ "win": "powershell -NoProfile -Command \"irm https://claude.ai/install.ps1 | iex\"",
246
+ "mac": "brew install --cask claude-code",
247
+ "linux": "curl -fsSL https://claude.ai/install.sh | bash"
248
+ }
249
+ },
250
+ "java": {
251
+ "detect": "java -version",
252
+ "minVersion": "8",
253
+ "kind": "package",
254
+ "install": {
255
+ "win": "winget install -e --id Microsoft.OpenJDK.17",
256
+ "mac": "brew install --cask temurin",
257
+ "linux": {
258
+ "apt": "sudo apt-get install -y openjdk-17-jdk",
259
+ "dnf": "sudo dnf install -y java-17-openjdk",
260
+ "pacman": "sudo pacman -S --noconfirm jdk-openjdk"
261
+ }
262
+ }
263
+ },
264
+ "cm-cli": {
265
+ "kind": "note",
266
+ "needs": ["java"]
267
+ },
268
+ "adr-tools": {
269
+ "detect": "adr config",
270
+ "kind": "package",
271
+ "needs": ["git"],
272
+ "install": {
273
+ "mac": "brew install adr-tools",
274
+ "linux": {
275
+ "apt": "sudo apt-get install -y adr-tools"
276
+ }
277
+ }
278
+ },
279
+ "gh": {
280
+ "detect": "gh --version",
281
+ "kind": "package",
282
+ "install": {
283
+ "win": "winget install -e --id GitHub.cli",
284
+ "mac": "brew install gh",
285
+ "linux": {
286
+ "apt": "sudo apt-get install -y gh",
287
+ "dnf": "sudo dnf install -y gh",
288
+ "pacman": "sudo pacman -S --noconfirm github-cli"
289
+ }
290
+ }
291
+ },
292
+ "playwright-mcp": {
293
+ "kind": "mcp",
294
+ "needs": ["node", "claude-cli"]
295
+ },
296
+ "anthropic-api-key": {
297
+ "kind": "secret",
298
+ "guideOnly": true
299
+ }
300
+ }
301
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@phuc1403/musketeer",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "description": "Distributable custom Claude Code harness — one declarative command scaffolds a curated company of musketeers (skills/agents/hooks) into any project's .claude/.",
5
5
  "type": "commonjs",
6
6
  "bin": {
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env node
2
+ // PreToolUse guard: block an `adr new` title that adr-tools' own script cannot
3
+ // handle safely.
4
+ //
5
+ // adr-new builds the ADR file with `sed -e "s|TITLE|$title|"`, substituting the
6
+ // title in unescaped and using `|` as the delimiter. Two failure modes follow,
7
+ // verified directly against /usr/bin/adr-new:
8
+ // - `|` in the title breaks sed's own syntax: it exits 1, but only after
9
+ // creating a zero-byte ADR file that already burned that number.
10
+ // - `&` in a sed replacement means "the whole match" — it does NOT error.
11
+ // "Use Kafka & Queues" silently becomes the title "Use Kafka TITLE Queues",
12
+ // written straight into the file and the generated index.
13
+ // A title starting with `-` is a third case: adr-new parses its own flags with
14
+ // getopts, so without a `--` separator the title is read as an unknown option
15
+ // and the ADR is silently never created (clean failure, still worth catching
16
+ // early with a clearer reason than adr-tools' own "no title given").
17
+ //
18
+ // Blocking, not warning: `|` wastes an ADR number and `&` corrupts data with no
19
+ // error at all, so there is nothing later in the pipeline that will catch it.
20
+
21
+ let raw = "";
22
+ process.stdin.on("data", (chunk) => (raw += chunk));
23
+ process.stdin.on("end", () => {
24
+ let input;
25
+ try {
26
+ input = JSON.parse(raw || "{}");
27
+ } catch {
28
+ process.exit(0); // unparseable payload — fail open, don't block legit work
29
+ }
30
+
31
+ const command = (input && input.tool_input && input.tool_input.command) || "";
32
+ if (!/\badr\s+new\b/.test(command)) process.exit(0);
33
+
34
+ // The skill always places `--` immediately before a quoted title. Extract
35
+ // that argument; anything else about the command's shape is not this hook's
36
+ // concern.
37
+ const afterDashDash = command.match(/--\s+(["'])((?:(?!\1).)*)\1/);
38
+ const title = afterDashDash ? afterDashDash[2] : null;
39
+
40
+ let reason = null;
41
+ if (!afterDashDash) {
42
+ reason =
43
+ "no `--` before the title (or no quoted title found after it). Without `--`, " +
44
+ "adr-new's getopts can read a title starting with `-` as a flag and silently " +
45
+ "create nothing. Always: adr new [-s STEM]... -- \"Title\".";
46
+ } else if (title.includes("|")) {
47
+ reason =
48
+ "the title contains `|`. adr-new substitutes it into `sed -e \"s|TITLE|$title|\"`, " +
49
+ "using `|` as sed's own delimiter — this breaks sed's syntax and exits non-zero, " +
50
+ "but only after creating a zero-byte ADR file that already consumed that number.";
51
+ } else if (title.includes("&")) {
52
+ reason =
53
+ "the title contains `&`. In a sed replacement `&` means \"the whole match\", so " +
54
+ "adr-new writes it as literal text into the title (e.g. \"Use Kafka & Queues\" " +
55
+ "becomes \"Use Kafka TITLE Queues\") and exits 0 — nothing else will catch this.";
56
+ }
57
+
58
+ if (reason) {
59
+ process.stdout.write(
60
+ JSON.stringify({
61
+ hookSpecificOutput: {
62
+ hookEventName: "PreToolUse",
63
+ permissionDecision: "deny",
64
+ permissionDecisionReason: `Refusing this \`adr new\` call: ${reason} Rename the title and retry.`,
65
+ },
66
+ })
67
+ );
68
+ }
69
+ process.exit(0);
70
+ });