forgecraft-mcp 0.4.0 → 0.5.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/README.md +99 -63
- package/dist/cli.d.ts +15 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +347 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -14
- package/dist/index.js.map +1 -1
- package/dist/registry/renderer.d.ts +25 -1
- package/dist/registry/renderer.d.ts.map +1 -1
- package/dist/registry/renderer.js +41 -18
- package/dist/registry/renderer.js.map +1 -1
- package/dist/shared/types.d.ts +6 -0
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/tools/audit.js +2 -2
- package/dist/tools/audit.js.map +1 -1
- package/dist/tools/convert.js +4 -4
- package/dist/tools/convert.js.map +1 -1
- package/dist/tools/forgecraft-router.d.ts +23 -20
- package/dist/tools/forgecraft-router.d.ts.map +1 -1
- package/dist/tools/forgecraft-router.js +5 -0
- package/dist/tools/forgecraft-router.js.map +1 -1
- package/dist/tools/generate-claude-md.d.ts +6 -0
- package/dist/tools/generate-claude-md.d.ts.map +1 -1
- package/dist/tools/generate-claude-md.js +8 -2
- package/dist/tools/generate-claude-md.js.map +1 -1
- package/dist/tools/refresh-project.js +6 -3
- package/dist/tools/refresh-project.js.map +1 -1
- package/dist/tools/scaffold.js +1 -1
- package/dist/tools/scaffold.js.map +1 -1
- package/dist/tools/sentinel.d.ts +28 -0
- package/dist/tools/sentinel.d.ts.map +1 -0
- package/dist/tools/sentinel.js +45 -0
- package/dist/tools/sentinel.js.map +1 -0
- package/dist/tools/setup-project.js +9 -7
- package/dist/tools/setup-project.js.map +1 -1
- package/package.json +2 -2
- package/templates/game/instructions.yaml +113 -0
- package/templates/game/mcp-servers.yaml +27 -0
- package/templates/game/nfr.yaml +64 -0
- package/templates/game/review.yaml +97 -0
- package/templates/game/structure.yaml +67 -0
package/README.md
CHANGED
|
@@ -12,19 +12,15 @@
|
|
|
12
12
|
|
|
13
13
|
---
|
|
14
14
|
|
|
15
|
-
AI coding assistants work better with clear engineering standards. Most start with a generic instruction file — ForgeCraft replaces that with production-grade standards: SOLID principles, testing pyramids, architecture patterns, CI/CD pipelines, domain-specific rules, and quality-gate hooks — all composed from
|
|
15
|
+
AI coding assistants work better with clear engineering standards. Most start with a generic instruction file — ForgeCraft replaces that with production-grade standards: SOLID principles, testing pyramids, architecture patterns, CI/CD pipelines, domain-specific rules, and quality-gate hooks — all composed from 116 curated template blocks matched to your actual stack.
|
|
16
16
|
|
|
17
17
|
**Supports:** Claude (CLAUDE.md) · Cursor (.cursor/rules/) · GitHub Copilot (.github/copilot-instructions.md) · Windsurf (.windsurfrules) · Cline (.clinerules) · Aider (CONVENTIONS.md)
|
|
18
18
|
|
|
19
19
|
```bash
|
|
20
|
-
|
|
20
|
+
npx forgecraft-mcp setup .
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
> "Set up this project for production"
|
|
26
|
-
|
|
27
|
-
Done. Your AI assistant now has tailored instruction files with SOLID principles, testing standards, architecture patterns, CI/CD guidance, and quality-gate hooks — all matched to your stack.
|
|
23
|
+
That's it. ForgeCraft scans your project, auto-detects your stack, and generates tailored instruction files in seconds.
|
|
28
24
|
|
|
29
25
|
## `claude init` vs ForgeCraft
|
|
30
26
|
|
|
@@ -39,54 +35,35 @@ Done. Your AI assistant now has tailored instruction files with SOLID principles
|
|
|
39
35
|
| **Quality gates** | None | Pre-commit hooks that enforce standards |
|
|
40
36
|
| **CI/CD** | None | Pipeline stages, environments, deploy guidance |
|
|
41
37
|
| **Session continuity** | None | `Status.md` + `forgecraft.yaml` persist context |
|
|
42
|
-
| **Drift detection** | None | `
|
|
43
|
-
| **Compliance scoring** | None | `
|
|
38
|
+
| **Drift detection** | None | `refresh` detects scope changes |
|
|
39
|
+
| **Compliance scoring** | None | `audit` scores 0-100 |
|
|
44
40
|
|
|
45
41
|
## How It Works
|
|
46
42
|
|
|
43
|
+
```bash
|
|
44
|
+
# First-time setup — auto-detects your stack
|
|
45
|
+
npx forgecraft-mcp setup .
|
|
46
|
+
|
|
47
|
+
# → scans your code → detects [API] + [WEB-REACT]
|
|
48
|
+
# → creates forgecraft.yaml
|
|
49
|
+
# → generates CLAUDE.md, .cursor/rules/, etc.
|
|
50
|
+
# → adds quality-gate hooks
|
|
51
|
+
# → done
|
|
47
52
|
```
|
|
48
|
-
You: "Set up this project for production"
|
|
49
|
-
|
|
50
|
-
Claude calls setup_project → scans your code → detects [API] + [WEB-REACT]
|
|
51
|
-
→ creates forgecraft.yaml
|
|
52
|
-
→ generates instruction files for your AI assistant(s)
|
|
53
|
-
→ adds quality-gate hooks
|
|
54
|
-
→ done
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
ForgeCraft is an [MCP server](https://modelcontextprotocol.io/) — it gives Claude 14 specialized tools. Claude picks the right ones automatically. You just describe what you want in plain English.
|
|
58
|
-
|
|
59
|
-
> **Already ran `claude init`?** ForgeCraft's `generate_instructions` can merge with your existing CLAUDE.md (`merge_with_existing: true`), keeping your custom sections while adding production standards.
|
|
60
53
|
|
|
61
|
-
|
|
54
|
+
ForgeCraft is a **setup-time CLI tool**. Run it once to configure your project, then remove it — it has no runtime footprint.
|
|
62
55
|
|
|
63
|
-
|
|
56
|
+
optional: add the MCP sentinel to let your AI assistant diagnose and recommend commands:
|
|
64
57
|
|
|
65
58
|
```bash
|
|
66
59
|
claude mcp add forgecraft -- npx -y forgecraft-mcp
|
|
67
60
|
```
|
|
68
61
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
<details>
|
|
72
|
-
<summary>Alternative: manual config</summary>
|
|
73
|
-
|
|
74
|
-
Add to `.claude/settings.json`:
|
|
75
|
-
```json
|
|
76
|
-
{
|
|
77
|
-
"mcpServers": {
|
|
78
|
-
"forgecraft": {
|
|
79
|
-
"command": "npx",
|
|
80
|
-
"args": ["-y", "forgecraft-mcp"]
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
```
|
|
85
|
-
</details>
|
|
62
|
+
The sentinel is a single lightweight tool (~200 tokens) that checks your project state and tells your AI what CLI command to run next. [Remove it](#mcp-sentinel) after initial setup to save tokens.
|
|
86
63
|
|
|
87
64
|
## What You Get
|
|
88
65
|
|
|
89
|
-
After `
|
|
66
|
+
After `npx forgecraft-mcp setup`, your project has:
|
|
90
67
|
|
|
91
68
|
```
|
|
92
69
|
your-project/
|
|
@@ -135,7 +112,7 @@ Tags are domain classifiers. ForgeCraft auto-detects them from your code, or you
|
|
|
135
112
|
| `HEALTHCARE` | HIPAA, PHI handling, audit logs, encryption |
|
|
136
113
|
| `MOBILE` | React Native/Flutter, offline-first, native APIs |
|
|
137
114
|
| `REALTIME` | WebSockets, presence, conflict resolution |
|
|
138
|
-
| `GAME` | Game loop, ECS,
|
|
115
|
+
| `GAME` | Game loop, ECS, Phaser 3, PixiJS, Three.js/WebGL, performance budgets |
|
|
139
116
|
| `SOCIAL` | Feeds, connections, messaging, moderation |
|
|
140
117
|
| `ANALYTICS` | Event tracking, dashboards, data warehousing |
|
|
141
118
|
| `STATE-MACHINE` | Transitions, guards, event-driven workflows |
|
|
@@ -164,24 +141,75 @@ tags: [UNIVERSAL, API]
|
|
|
164
141
|
tier: recommended
|
|
165
142
|
```
|
|
166
143
|
|
|
167
|
-
##
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
|
174
|
-
|
|
175
|
-
| `
|
|
176
|
-
| `
|
|
177
|
-
| `
|
|
178
|
-
| `
|
|
179
|
-
| `
|
|
180
|
-
| `
|
|
181
|
-
| `
|
|
182
|
-
| `
|
|
183
|
-
| `
|
|
184
|
-
| `
|
|
144
|
+
## CLI Commands
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
npx forgecraft-mcp <command> [dir] [flags]
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
| Command | Purpose |
|
|
151
|
+
|---------|--------|
|
|
152
|
+
| `setup <dir>` | **Start here.** Analyze → auto-detect stack → generate instruction files + hooks |
|
|
153
|
+
| `refresh <dir>` | Re-scan after project changes. Detects new tags, shows before/after diff. |
|
|
154
|
+
| `refresh <dir> --apply` | Apply the refresh (default is preview-only) |
|
|
155
|
+
| `audit <dir>` | Score compliance (0-100). Reads tags from `forgecraft.yaml`. |
|
|
156
|
+
| `scaffold <dir> --tags ...` | Generate full folder structure + instruction files |
|
|
157
|
+
| `review [dir] --tags ...` | Structured code review checklist (4 dimensions) |
|
|
158
|
+
| `list tags` | Show all 24 available tags |
|
|
159
|
+
| `list hooks --tags ...` | Show quality-gate hooks for given tags |
|
|
160
|
+
| `list skills --tags ...` | Show skill files for given tags |
|
|
161
|
+
| `classify [dir]` | Analyze code to suggest tags |
|
|
162
|
+
| `generate <dir>` | Regenerate instruction files only |
|
|
163
|
+
| `convert <dir>` | Phased migration plan for legacy code |
|
|
164
|
+
| `add-hook <name> <dir>` | Add a quality-gate hook |
|
|
165
|
+
| `add-module <name> <dir>` | Scaffold a feature module |
|
|
166
|
+
|
|
167
|
+
### Common flags
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
--tags UNIVERSAL API Project classification tags (or read from forgecraft.yaml)
|
|
171
|
+
--tier core|recommended Content depth (default: recommended)
|
|
172
|
+
--targets claude cursor AI assistant targets (default: claude)
|
|
173
|
+
--dry-run Preview without writing files
|
|
174
|
+
--compact Strip explanatory bullet tails and deduplicate lines (~20-40% smaller output)
|
|
175
|
+
--apply Apply changes (for refresh)
|
|
176
|
+
--language typescript typescript | python (default: typescript)
|
|
177
|
+
--scope focused comprehensive | focused (for review)
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## MCP Sentinel
|
|
181
|
+
|
|
182
|
+
Optionally add the ForgeCraft MCP sentinel to let your AI assistant diagnose your project and suggest the right CLI command:
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
claude mcp add forgecraft -- npx -y forgecraft-mcp
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
The sentinel is a **single minimal tool** (~200 tokens per request, vs ~1,500 for a full MCP tool suite). It checks whether `forgecraft.yaml`, `CLAUDE.md`, and `.claude/hooks` exist, then returns targeted CLI commands to run.
|
|
189
|
+
|
|
190
|
+
**Recommended workflow:**
|
|
191
|
+
1. Add the sentinel temporarily
|
|
192
|
+
2. Let Claude run `npx forgecraft-mcp setup .`
|
|
193
|
+
3. Remove the sentinel: `claude mcp remove forgecraft`
|
|
194
|
+
4. Re-add it when you need to refresh or audit
|
|
195
|
+
|
|
196
|
+
<details>
|
|
197
|
+
<summary>Manual MCP config</summary>
|
|
198
|
+
|
|
199
|
+
Add to `.claude/settings.json`:
|
|
200
|
+
```json
|
|
201
|
+
{
|
|
202
|
+
"mcpServers": {
|
|
203
|
+
"forgecraft": {
|
|
204
|
+
"command": "npx",
|
|
205
|
+
"args": ["-y", "forgecraft-mcp"]
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
```
|
|
210
|
+
</details>
|
|
211
|
+
|
|
212
|
+
> **Already ran `claude init`?** Use `npx forgecraft-mcp generate . --merge` to merge with your existing CLAUDE.md, keeping your custom sections while adding production standards.
|
|
185
213
|
|
|
186
214
|
## Configuration
|
|
187
215
|
|
|
@@ -193,6 +221,7 @@ projectName: my-api
|
|
|
193
221
|
tags: [UNIVERSAL, API, FINTECH]
|
|
194
222
|
tier: recommended
|
|
195
223
|
outputTargets: [claude, cursor, copilot] # Generate for multiple assistants
|
|
224
|
+
compact: true # Slim output (~20-40% fewer tokens)
|
|
196
225
|
|
|
197
226
|
exclude:
|
|
198
227
|
- cqrs-event-patterns # Don't need this yet
|
|
@@ -227,7 +256,14 @@ Score: 72/100 Grade: C
|
|
|
227
256
|
|
|
228
257
|
### Refresh (project scope changed?)
|
|
229
258
|
|
|
230
|
-
|
|
259
|
+
```bash
|
|
260
|
+
npx forgecraft-mcp refresh . --apply
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
Or in preview mode first (default):
|
|
264
|
+
```bash
|
|
265
|
+
npx forgecraft-mcp refresh . # shows before/after diff without writing
|
|
266
|
+
```
|
|
231
267
|
|
|
232
268
|
## Contributing
|
|
233
269
|
|
|
@@ -247,7 +283,7 @@ PRs welcome. See [`templates/universal/`](templates/universal/) for the format.
|
|
|
247
283
|
|
|
248
284
|
### MCP Server Discovery
|
|
249
285
|
|
|
250
|
-
`
|
|
286
|
+
`npx forgecraft-mcp configure-mcp` dynamically discovers recommended MCP servers matching your project tags. Servers are curated in `mcp-servers.yaml` per tag — community-contributable via PRs.
|
|
251
287
|
|
|
252
288
|
Built-in recommendations include Context7 (docs), Playwright (testing), Chrome DevTools (debugging), Stripe (fintech), Docker/K8s (infra), and more across all 24 tags.
|
|
253
289
|
|
|
@@ -265,7 +301,7 @@ git clone https://github.com/jghiringhelli/forgecraft-mcp.git
|
|
|
265
301
|
cd forgecraft-mcp
|
|
266
302
|
npm install
|
|
267
303
|
npm run build
|
|
268
|
-
npm test #
|
|
304
|
+
npm test # 237 tests, 16 suites
|
|
269
305
|
```
|
|
270
306
|
|
|
271
307
|
## License
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI mode for ForgeCraft.
|
|
3
|
+
*
|
|
4
|
+
* Handles `npx forgecraft-mcp <command> [args]` invocations.
|
|
5
|
+
* Each subcommand maps directly to an existing handler function.
|
|
6
|
+
* Returns `true` when a command is handled so the caller skips MCP server startup.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Run CLI mode. Returns `true` when a command was handled, `false` to fall
|
|
10
|
+
* through to MCP server startup.
|
|
11
|
+
*
|
|
12
|
+
* @param argv - Raw process.argv (will be sliced from index 2)
|
|
13
|
+
*/
|
|
14
|
+
export declare function runCli(argv: string[]): Promise<boolean>;
|
|
15
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAoTH;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAuC7D"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI mode for ForgeCraft.
|
|
3
|
+
*
|
|
4
|
+
* Handles `npx forgecraft-mcp <command> [args]` invocations.
|
|
5
|
+
* Each subcommand maps directly to an existing handler function.
|
|
6
|
+
* Returns `true` when a command is handled so the caller skips MCP server startup.
|
|
7
|
+
*/
|
|
8
|
+
import { resolve } from "node:path";
|
|
9
|
+
import { loadUserOverrides } from "./registry/loader.js";
|
|
10
|
+
import { setupProjectHandler } from "./tools/setup-project.js";
|
|
11
|
+
import { refreshProjectHandler } from "./tools/refresh-project.js";
|
|
12
|
+
import { auditProjectHandler } from "./tools/audit.js";
|
|
13
|
+
import { scaffoldProjectHandler } from "./tools/scaffold.js";
|
|
14
|
+
import { reviewProjectHandler } from "./tools/review.js";
|
|
15
|
+
import { listTagsHandler, listHooksHandler, listSkillsHandler } from "./tools/list.js";
|
|
16
|
+
import { classifyProjectHandler } from "./tools/classify.js";
|
|
17
|
+
import { generateInstructionsHandler } from "./tools/generate-claude-md.js";
|
|
18
|
+
import { convertExistingHandler } from "./tools/convert.js";
|
|
19
|
+
import { addHookHandler } from "./tools/add-hook.js";
|
|
20
|
+
import { addModuleHandler } from "./tools/add-module.js";
|
|
21
|
+
/**
|
|
22
|
+
* Minimal argv parser — no external dependencies.
|
|
23
|
+
* `--flag val1 val2` → `flags["flag"] = ["val1", "val2"]`
|
|
24
|
+
* `--flag` alone → `flags["flag"] = true`
|
|
25
|
+
* `--no-flag` → `flags["flag"] = false`
|
|
26
|
+
*/
|
|
27
|
+
function parseCliArgs(argv) {
|
|
28
|
+
const [command = "serve", ...rest] = argv;
|
|
29
|
+
const positional = [];
|
|
30
|
+
const flags = {};
|
|
31
|
+
let i = 0;
|
|
32
|
+
while (i < rest.length) {
|
|
33
|
+
const arg = rest[i];
|
|
34
|
+
if (arg.startsWith("--no-")) {
|
|
35
|
+
flags[arg.slice(5)] = false;
|
|
36
|
+
i++;
|
|
37
|
+
}
|
|
38
|
+
else if (arg.startsWith("--")) {
|
|
39
|
+
const key = arg.slice(2);
|
|
40
|
+
const values = [];
|
|
41
|
+
i++;
|
|
42
|
+
while (i < rest.length && !rest[i].startsWith("--")) {
|
|
43
|
+
values.push(rest[i]);
|
|
44
|
+
i++;
|
|
45
|
+
}
|
|
46
|
+
flags[key] = values.length === 0 ? true : values;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
positional.push(arg);
|
|
50
|
+
i++;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return { command, positional, flags };
|
|
54
|
+
}
|
|
55
|
+
/** Extract first value of an array flag, or undefined. */
|
|
56
|
+
function str(flags, key) {
|
|
57
|
+
const v = flags[key];
|
|
58
|
+
return Array.isArray(v) ? v[0] : undefined;
|
|
59
|
+
}
|
|
60
|
+
/** Extract array flag values, or undefined if absent/empty. */
|
|
61
|
+
function arr(flags, key) {
|
|
62
|
+
const v = flags[key];
|
|
63
|
+
return Array.isArray(v) && v.length > 0 ? v : undefined;
|
|
64
|
+
}
|
|
65
|
+
/** Extract boolean flag, falling back to a default. */
|
|
66
|
+
function bool(flags, key, defaultVal) {
|
|
67
|
+
const v = flags[key];
|
|
68
|
+
return typeof v === "boolean" ? v : defaultVal;
|
|
69
|
+
}
|
|
70
|
+
// ── Config Resolution ────────────────────────────────────────────────
|
|
71
|
+
/**
|
|
72
|
+
* Resolve tags from explicit flags or fall back to forgecraft.yaml.
|
|
73
|
+
*
|
|
74
|
+
* @param dir - Project directory to read config from
|
|
75
|
+
* @param flagTags - Explicitly provided tags from --tags flag
|
|
76
|
+
* @returns Resolved tags, or undefined if none found
|
|
77
|
+
*/
|
|
78
|
+
function resolveTagsFromConfig(dir, flagTags) {
|
|
79
|
+
if (flagTags && flagTags.length > 0)
|
|
80
|
+
return flagTags;
|
|
81
|
+
const config = loadUserOverrides(resolve(dir));
|
|
82
|
+
return config?.tags ?? undefined;
|
|
83
|
+
}
|
|
84
|
+
// ── Output ───────────────────────────────────────────────────────────
|
|
85
|
+
/** Extract text from MCP-style handler result and print to stdout. */
|
|
86
|
+
function printResult(result) {
|
|
87
|
+
console.log(result.content[0]?.text ?? "");
|
|
88
|
+
}
|
|
89
|
+
// ── Commands ─────────────────────────────────────────────────────────
|
|
90
|
+
async function cmdSetup(pos, flags) {
|
|
91
|
+
const projectDir = resolve(pos[0] ?? ".");
|
|
92
|
+
const result = await setupProjectHandler({
|
|
93
|
+
project_dir: projectDir,
|
|
94
|
+
project_name: str(flags, "name"),
|
|
95
|
+
description: str(flags, "description"),
|
|
96
|
+
tier: str(flags, "tier") ?? "recommended",
|
|
97
|
+
tags: arr(flags, "tags"),
|
|
98
|
+
dry_run: bool(flags, "dry-run", false),
|
|
99
|
+
output_targets: arr(flags, "targets") ?? ["claude"],
|
|
100
|
+
});
|
|
101
|
+
printResult(result);
|
|
102
|
+
}
|
|
103
|
+
async function cmdRefresh(pos, flags) {
|
|
104
|
+
const projectDir = resolve(pos[0] ?? ".");
|
|
105
|
+
const result = await refreshProjectHandler({
|
|
106
|
+
project_dir: projectDir,
|
|
107
|
+
apply: bool(flags, "apply", false),
|
|
108
|
+
tier: str(flags, "tier"),
|
|
109
|
+
add_tags: arr(flags, "add-tags"),
|
|
110
|
+
remove_tags: arr(flags, "remove-tags"),
|
|
111
|
+
output_targets: arr(flags, "targets"),
|
|
112
|
+
});
|
|
113
|
+
printResult(result);
|
|
114
|
+
}
|
|
115
|
+
async function cmdAudit(pos, flags) {
|
|
116
|
+
const projectDir = resolve(pos[0] ?? ".");
|
|
117
|
+
const tags = resolveTagsFromConfig(projectDir, arr(flags, "tags"));
|
|
118
|
+
if (!tags || tags.length === 0) {
|
|
119
|
+
console.error("Error: --tags required (or add forgecraft.yaml with tags)");
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
const result = await auditProjectHandler({
|
|
123
|
+
tags,
|
|
124
|
+
project_dir: projectDir,
|
|
125
|
+
include_anti_patterns: bool(flags, "anti-patterns", true),
|
|
126
|
+
});
|
|
127
|
+
printResult(result);
|
|
128
|
+
}
|
|
129
|
+
async function cmdScaffold(pos, flags) {
|
|
130
|
+
const projectDir = resolve(pos[0] ?? ".");
|
|
131
|
+
const tags = resolveTagsFromConfig(projectDir, arr(flags, "tags"));
|
|
132
|
+
if (!tags || tags.length === 0) {
|
|
133
|
+
console.error("Error: --tags required (or add forgecraft.yaml with tags)");
|
|
134
|
+
process.exit(1);
|
|
135
|
+
}
|
|
136
|
+
const result = await scaffoldProjectHandler({
|
|
137
|
+
tags,
|
|
138
|
+
project_dir: projectDir,
|
|
139
|
+
project_name: str(flags, "name") ?? "My Project",
|
|
140
|
+
language: str(flags, "language") ?? "typescript",
|
|
141
|
+
dry_run: bool(flags, "dry-run", false),
|
|
142
|
+
force: bool(flags, "force", false),
|
|
143
|
+
output_targets: arr(flags, "targets") ?? ["claude"],
|
|
144
|
+
});
|
|
145
|
+
printResult(result);
|
|
146
|
+
}
|
|
147
|
+
async function cmdReview(pos, flags) {
|
|
148
|
+
const projectDir = pos[0] ? resolve(pos[0]) : process.cwd();
|
|
149
|
+
const tags = resolveTagsFromConfig(projectDir, arr(flags, "tags"));
|
|
150
|
+
if (!tags || tags.length === 0) {
|
|
151
|
+
console.error("Error: --tags required (or add forgecraft.yaml with tags)");
|
|
152
|
+
process.exit(1);
|
|
153
|
+
}
|
|
154
|
+
const result = await reviewProjectHandler({
|
|
155
|
+
tags,
|
|
156
|
+
scope: str(flags, "scope") ?? "comprehensive",
|
|
157
|
+
});
|
|
158
|
+
printResult(result);
|
|
159
|
+
}
|
|
160
|
+
async function cmdList(pos, flags) {
|
|
161
|
+
const resource = pos[0] ?? "tags";
|
|
162
|
+
const filterTags = arr(flags, "tags");
|
|
163
|
+
if (resource === "hooks") {
|
|
164
|
+
printResult(await listHooksHandler({ tags: filterTags }));
|
|
165
|
+
}
|
|
166
|
+
else if (resource === "skills") {
|
|
167
|
+
printResult(await listSkillsHandler({ tags: filterTags }));
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
printResult(await listTagsHandler());
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
async function cmdClassify(pos, flags) {
|
|
174
|
+
const result = await classifyProjectHandler({
|
|
175
|
+
project_dir: pos[0] ? resolve(pos[0]) : undefined,
|
|
176
|
+
description: str(flags, "description"),
|
|
177
|
+
});
|
|
178
|
+
printResult(result);
|
|
179
|
+
}
|
|
180
|
+
async function cmdGenerate(pos, flags) {
|
|
181
|
+
const projectDir = resolve(pos[0] ?? ".");
|
|
182
|
+
const tags = resolveTagsFromConfig(projectDir, arr(flags, "tags"));
|
|
183
|
+
if (!tags || tags.length === 0) {
|
|
184
|
+
console.error("Error: --tags required (or add forgecraft.yaml with tags)");
|
|
185
|
+
process.exit(1);
|
|
186
|
+
}
|
|
187
|
+
const result = await generateInstructionsHandler({
|
|
188
|
+
tags,
|
|
189
|
+
project_dir: projectDir,
|
|
190
|
+
project_name: str(flags, "name") ?? "My Project",
|
|
191
|
+
output_targets: arr(flags, "targets") ?? ["claude"],
|
|
192
|
+
merge_with_existing: bool(flags, "merge", true),
|
|
193
|
+
compact: bool(flags, "compact", false),
|
|
194
|
+
});
|
|
195
|
+
printResult(result);
|
|
196
|
+
}
|
|
197
|
+
async function cmdConvert(pos, flags) {
|
|
198
|
+
const projectDir = resolve(pos[0] ?? ".");
|
|
199
|
+
const tags = resolveTagsFromConfig(projectDir, arr(flags, "tags"));
|
|
200
|
+
if (!tags || tags.length === 0) {
|
|
201
|
+
console.error("Error: --tags required (or add forgecraft.yaml with tags)");
|
|
202
|
+
process.exit(1);
|
|
203
|
+
}
|
|
204
|
+
const result = await convertExistingHandler({
|
|
205
|
+
tags,
|
|
206
|
+
project_dir: projectDir,
|
|
207
|
+
scan_depth: str(flags, "scan-depth") ?? "quick",
|
|
208
|
+
});
|
|
209
|
+
printResult(result);
|
|
210
|
+
}
|
|
211
|
+
async function cmdAddHook(pos, flags) {
|
|
212
|
+
const hookName = pos[0];
|
|
213
|
+
const projectDir = resolve(pos[1] ?? ".");
|
|
214
|
+
if (!hookName) {
|
|
215
|
+
console.error("Error: hook name required — npx forgecraft-mcp add-hook <name> <dir>");
|
|
216
|
+
process.exit(1);
|
|
217
|
+
}
|
|
218
|
+
const result = await addHookHandler({
|
|
219
|
+
hook: hookName,
|
|
220
|
+
project_dir: projectDir,
|
|
221
|
+
tag: str(flags, "tag"),
|
|
222
|
+
});
|
|
223
|
+
printResult(result);
|
|
224
|
+
}
|
|
225
|
+
async function cmdAddModule(pos, flags) {
|
|
226
|
+
const moduleName = pos[0];
|
|
227
|
+
const projectDir = resolve(pos[1] ?? ".");
|
|
228
|
+
if (!moduleName) {
|
|
229
|
+
console.error("Error: module name required — npx forgecraft-mcp add-module <name> <dir>");
|
|
230
|
+
process.exit(1);
|
|
231
|
+
}
|
|
232
|
+
const result = await addModuleHandler({
|
|
233
|
+
module_name: moduleName,
|
|
234
|
+
project_dir: projectDir,
|
|
235
|
+
tags: arr(flags, "tags") ?? ["UNIVERSAL"],
|
|
236
|
+
language: str(flags, "language") ?? "typescript",
|
|
237
|
+
});
|
|
238
|
+
printResult(result);
|
|
239
|
+
}
|
|
240
|
+
// ── Help ─────────────────────────────────────────────────────────────
|
|
241
|
+
function showHelp() {
|
|
242
|
+
console.log(`
|
|
243
|
+
ForgeCraft MCP — engineering standards for AI coding assistants
|
|
244
|
+
|
|
245
|
+
USAGE
|
|
246
|
+
npx forgecraft-mcp <command> [arguments] [flags]
|
|
247
|
+
npx forgecraft-mcp serve (default — starts MCP server)
|
|
248
|
+
|
|
249
|
+
COMMANDS
|
|
250
|
+
setup <dir> First-time project setup (auto-detects stack)
|
|
251
|
+
refresh <dir> Re-sync instruction files after project changes
|
|
252
|
+
audit <dir> Check project against configured standards
|
|
253
|
+
scaffold <dir> Generate project structure and instruction files
|
|
254
|
+
review [dir] Generate code review checklist
|
|
255
|
+
list [tags|hooks|skills] Discover available resources
|
|
256
|
+
classify [dir] Suggest tags for a project
|
|
257
|
+
generate <dir> Generate instruction files only
|
|
258
|
+
convert <dir> Generate migration plan
|
|
259
|
+
add-hook <name> <dir> Install a quality-gate hook
|
|
260
|
+
add-module <name> <dir> Scaffold a feature module
|
|
261
|
+
|
|
262
|
+
FLAGS (vary by command)
|
|
263
|
+
--tags <tags...> Project classification tags (or read from forgecraft.yaml)
|
|
264
|
+
--tier <tier> Content depth: core | recommended | optional
|
|
265
|
+
--targets <targets...> AI assistant targets: claude cursor copilot windsurf cline aider
|
|
266
|
+
--name <name> Project name
|
|
267
|
+
--description <text> Project description for tag detection
|
|
268
|
+
--dry-run Preview without writing files
|
|
269
|
+
--apply Apply changes (for refresh, default is preview)
|
|
270
|
+
--add-tags <tags...> Add tags during refresh
|
|
271
|
+
--remove-tags <tags...> Remove tags during refresh
|
|
272
|
+
--no-anti-patterns Skip anti-pattern scanning (for audit)
|
|
273
|
+
--language <lang> typescript | python (default: typescript)
|
|
274
|
+
--scope <scope> comprehensive | focused (for review)
|
|
275
|
+
--force Overwrite existing files
|
|
276
|
+
--compact Strip explanatory bullet tails and deduplicate lines (~20-40% smaller output)
|
|
277
|
+
--tag <tag> Single tag filter (for add-hook)
|
|
278
|
+
`);
|
|
279
|
+
}
|
|
280
|
+
// ── Entry Point ──────────────────────────────────────────────────────
|
|
281
|
+
/**
|
|
282
|
+
* Run CLI mode. Returns `true` when a command was handled, `false` to fall
|
|
283
|
+
* through to MCP server startup.
|
|
284
|
+
*
|
|
285
|
+
* @param argv - Raw process.argv (will be sliced from index 2)
|
|
286
|
+
*/
|
|
287
|
+
export async function runCli(argv) {
|
|
288
|
+
const args = argv.slice(2);
|
|
289
|
+
if (args.length === 0)
|
|
290
|
+
return false; // no args → start MCP server
|
|
291
|
+
// Help flag at any position
|
|
292
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
293
|
+
showHelp();
|
|
294
|
+
return true;
|
|
295
|
+
}
|
|
296
|
+
const { command, positional, flags } = parseCliArgs(args);
|
|
297
|
+
if (command === "serve")
|
|
298
|
+
return false; // explicit serve → MCP server
|
|
299
|
+
try {
|
|
300
|
+
switch (command) {
|
|
301
|
+
case "setup":
|
|
302
|
+
await cmdSetup(positional, flags);
|
|
303
|
+
break;
|
|
304
|
+
case "refresh":
|
|
305
|
+
await cmdRefresh(positional, flags);
|
|
306
|
+
break;
|
|
307
|
+
case "audit":
|
|
308
|
+
await cmdAudit(positional, flags);
|
|
309
|
+
break;
|
|
310
|
+
case "scaffold":
|
|
311
|
+
await cmdScaffold(positional, flags);
|
|
312
|
+
break;
|
|
313
|
+
case "review":
|
|
314
|
+
await cmdReview(positional, flags);
|
|
315
|
+
break;
|
|
316
|
+
case "list":
|
|
317
|
+
await cmdList(positional, flags);
|
|
318
|
+
break;
|
|
319
|
+
case "classify":
|
|
320
|
+
await cmdClassify(positional, flags);
|
|
321
|
+
break;
|
|
322
|
+
case "generate":
|
|
323
|
+
await cmdGenerate(positional, flags);
|
|
324
|
+
break;
|
|
325
|
+
case "convert":
|
|
326
|
+
await cmdConvert(positional, flags);
|
|
327
|
+
break;
|
|
328
|
+
case "add-hook":
|
|
329
|
+
await cmdAddHook(positional, flags);
|
|
330
|
+
break;
|
|
331
|
+
case "add-module":
|
|
332
|
+
await cmdAddModule(positional, flags);
|
|
333
|
+
break;
|
|
334
|
+
default:
|
|
335
|
+
console.error(`Unknown command: ${command}`);
|
|
336
|
+
showHelp();
|
|
337
|
+
process.exit(1);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
catch (err) {
|
|
341
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
342
|
+
console.error(`Error: ${message}`);
|
|
343
|
+
process.exit(1);
|
|
344
|
+
}
|
|
345
|
+
return true;
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* ForgeCraft
|
|
3
|
+
* ForgeCraft — Entry Point.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* Dual-mode binary: runs as a CLI tool when subcommands are provided,
|
|
6
|
+
* or starts the MCP server in stdio mode when invoked without subcommands.
|
|
7
|
+
*
|
|
8
|
+
* CLI usage: npx forgecraft-mcp setup .
|
|
9
|
+
* MCP usage: npx forgecraft-mcp (or: npx forgecraft-mcp serve)
|
|
7
10
|
*/
|
|
8
11
|
export {};
|
|
9
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG"}
|