forgecraft-mcp 0.2.0 → 0.3.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/README.md +25 -5
- package/dist/analyzers/language-detector.d.ts +17 -0
- package/dist/analyzers/language-detector.d.ts.map +1 -0
- package/dist/analyzers/language-detector.js +89 -0
- package/dist/analyzers/language-detector.js.map +1 -0
- package/dist/analyzers/package-json.d.ts.map +1 -1
- package/dist/analyzers/package-json.js +5 -5
- package/dist/analyzers/package-json.js.map +1 -1
- package/dist/analyzers/project-context.d.ts +23 -0
- package/dist/analyzers/project-context.d.ts.map +1 -0
- package/dist/analyzers/project-context.js +181 -0
- package/dist/analyzers/project-context.js.map +1 -0
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/registry/composer.d.ts +3 -1
- package/dist/registry/composer.d.ts.map +1 -1
- package/dist/registry/composer.js +28 -0
- package/dist/registry/composer.js.map +1 -1
- package/dist/registry/loader.d.ts.map +1 -1
- package/dist/registry/loader.js +65 -1
- package/dist/registry/loader.js.map +1 -1
- package/dist/registry/mcp-discovery.d.ts +82 -0
- package/dist/registry/mcp-discovery.d.ts.map +1 -0
- package/dist/registry/mcp-discovery.js +203 -0
- package/dist/registry/mcp-discovery.js.map +1 -0
- package/dist/registry/renderer.d.ts +19 -2
- package/dist/registry/renderer.d.ts.map +1 -1
- package/dist/registry/renderer.js +64 -2
- package/dist/registry/renderer.js.map +1 -1
- package/dist/shared/errors/index.d.ts +4 -0
- package/dist/shared/errors/index.d.ts.map +1 -1
- package/dist/shared/errors/index.js +6 -0
- package/dist/shared/errors/index.js.map +1 -1
- package/dist/shared/filesystem.d.ts +45 -0
- package/dist/shared/filesystem.d.ts.map +1 -0
- package/dist/shared/filesystem.js +122 -0
- package/dist/shared/filesystem.js.map +1 -0
- package/dist/shared/types.d.ts +92 -1
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/shared/types.js +6 -0
- package/dist/shared/types.js.map +1 -1
- package/dist/tools/configure-mcp.d.ts +24 -0
- package/dist/tools/configure-mcp.d.ts.map +1 -1
- package/dist/tools/configure-mcp.js +123 -24
- package/dist/tools/configure-mcp.js.map +1 -1
- package/dist/tools/generate-claude-md.d.ts +1 -0
- package/dist/tools/generate-claude-md.d.ts.map +1 -1
- package/dist/tools/generate-claude-md.js +23 -57
- package/dist/tools/generate-claude-md.js.map +1 -1
- package/dist/tools/get-reference.d.ts +28 -0
- package/dist/tools/get-reference.d.ts.map +1 -0
- package/dist/tools/get-reference.js +63 -0
- package/dist/tools/get-reference.js.map +1 -0
- package/dist/tools/list.d.ts +18 -2
- package/dist/tools/list.d.ts.map +1 -1
- package/dist/tools/list.js +74 -2
- package/dist/tools/list.js.map +1 -1
- package/dist/tools/refresh-project.d.ts.map +1 -1
- package/dist/tools/refresh-project.js +8 -10
- package/dist/tools/refresh-project.js.map +1 -1
- package/dist/tools/scaffold.d.ts +4 -0
- package/dist/tools/scaffold.d.ts.map +1 -1
- package/dist/tools/scaffold.js +58 -31
- package/dist/tools/scaffold.js.map +1 -1
- package/dist/tools/setup-project.d.ts.map +1 -1
- package/dist/tools/setup-project.js +5 -1
- package/dist/tools/setup-project.js.map +1 -1
- package/package.json +7 -3
- package/templates/analytics/mcp-servers.yaml +11 -0
- package/templates/api/mcp-servers.yaml +13 -0
- package/templates/api/skills.yaml +54 -0
- package/templates/cli/mcp-servers.yaml +11 -0
- package/templates/data-lineage/instructions.yaml +28 -0
- package/templates/data-lineage/mcp-servers.yaml +22 -0
- package/templates/data-pipeline/mcp-servers.yaml +13 -0
- package/templates/data-pipeline/skills.yaml +56 -0
- package/templates/fintech/mcp-servers.yaml +13 -0
- package/templates/fintech/skills.yaml +35 -0
- package/templates/game/mcp-servers.yaml +11 -0
- package/templates/healthcare/mcp-servers.yaml +13 -0
- package/templates/healthcare/skills.yaml +35 -0
- package/templates/hipaa/instructions.yaml +41 -0
- package/templates/hipaa/mcp-servers.yaml +13 -0
- package/templates/hipaa/skills.yaml +39 -0
- package/templates/infra/mcp-servers.yaml +20 -0
- package/templates/library/mcp-servers.yaml +20 -0
- package/templates/medallion-architecture/instructions.yaml +41 -0
- package/templates/medallion-architecture/mcp-servers.yaml +22 -0
- package/templates/ml/mcp-servers.yaml +11 -0
- package/templates/mobile/mcp-servers.yaml +11 -0
- package/templates/observability-xray/instructions.yaml +40 -0
- package/templates/observability-xray/mcp-servers.yaml +15 -0
- package/templates/realtime/mcp-servers.yaml +13 -0
- package/templates/soc2/instructions.yaml +41 -0
- package/templates/soc2/mcp-servers.yaml +24 -0
- package/templates/social/mcp-servers.yaml +24 -0
- package/templates/state-machine/mcp-servers.yaml +11 -0
- package/templates/universal/hooks.yaml +63 -0
- package/templates/universal/instructions.yaml +41 -118
- package/templates/universal/mcp-servers.yaml +38 -0
- package/templates/universal/nfr.yaml +1 -1
- package/templates/universal/reference.yaml +111 -0
- package/templates/universal/review.yaml +2 -2
- package/templates/universal/skills.yaml +106 -0
- package/templates/web-react/mcp-servers.yaml +20 -0
- package/templates/web-react/skills.yaml +56 -0
- package/templates/web-static/mcp-servers.yaml +20 -0
- package/templates/web3/mcp-servers.yaml +11 -0
- package/templates/zero-trust/instructions.yaml +41 -0
- package/templates/zero-trust/mcp-servers.yaml +15 -0
package/README.md
CHANGED
|
@@ -116,7 +116,7 @@ This is the core value. Assembled from curated blocks covering:
|
|
|
116
116
|
|
|
117
117
|
Every block is sourced from established engineering literature (Martin, Evans, Wiggins) and adapted for AI-assisted development.
|
|
118
118
|
|
|
119
|
-
##
|
|
119
|
+
## 24 Tags — Pick What Fits
|
|
120
120
|
|
|
121
121
|
Tags are domain classifiers. ForgeCraft auto-detects them from your code, or you choose manually. Combine freely — blocks merge without conflicts.
|
|
122
122
|
|
|
@@ -140,6 +140,12 @@ Tags are domain classifiers. ForgeCraft auto-detects them from your code, or you
|
|
|
140
140
|
| `ANALYTICS` | Event tracking, dashboards, data warehousing |
|
|
141
141
|
| `STATE-MACHINE` | Transitions, guards, event-driven workflows |
|
|
142
142
|
| `WEB3` | Smart contracts, gas optimization, wallet security |
|
|
143
|
+
| `HIPAA` | PII masking, encryption checks, audit logging |
|
|
144
|
+
| `SOC2` | Access control, change management, incident response |
|
|
145
|
+
| `DATA-LINEAGE` | 100% field coverage, lineage tracking decorators |
|
|
146
|
+
| `OBSERVABILITY-XRAY` | Auto X-Ray instrumentation for Lambdas |
|
|
147
|
+
| `MEDALLION-ARCHITECTURE` | Bronze=immutable, Silver=validated, Gold=aggregated |
|
|
148
|
+
| `ZERO-TRUST` | Deny-by-default IAM, explicit allow rules |
|
|
143
149
|
|
|
144
150
|
## Content Tiers
|
|
145
151
|
|
|
@@ -172,14 +178,14 @@ tier: recommended
|
|
|
172
178
|
| `convert_existing` | Phased migration plan for legacy code |
|
|
173
179
|
| `add_hook` | Add quality-gate hooks |
|
|
174
180
|
| `add_module` | Scaffold a feature module |
|
|
175
|
-
| `configure_mcp` |
|
|
181
|
+
| `configure_mcp` | Discover & configure recommended MCP servers |
|
|
176
182
|
| `get_nfr_template` | NFR sections for tech specs |
|
|
177
183
|
| `list_tags` | Show all available tags |
|
|
178
184
|
| `list_hooks` | Show hooks, filterable by tag |
|
|
179
185
|
|
|
180
186
|
## Configuration
|
|
181
187
|
|
|
182
|
-
### Fine-tune what
|
|
188
|
+
### Fine-tune what your AI assistant sees
|
|
183
189
|
|
|
184
190
|
```yaml
|
|
185
191
|
# forgecraft.yaml
|
|
@@ -233,11 +239,25 @@ templates/your-tag/
|
|
|
233
239
|
├── structure.yaml # Folder structure
|
|
234
240
|
├── nfr.yaml # Non-functional requirements
|
|
235
241
|
├── hooks.yaml # Quality gate scripts
|
|
236
|
-
|
|
242
|
+
├── review.yaml # Code review checklists
|
|
243
|
+
└── mcp-servers.yaml # Recommended MCP servers for this tag
|
|
237
244
|
```
|
|
238
245
|
|
|
239
246
|
PRs welcome. See [`templates/universal/`](templates/universal/) for the format.
|
|
240
247
|
|
|
248
|
+
### MCP Server Discovery
|
|
249
|
+
|
|
250
|
+
`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
|
+
|
|
252
|
+
Built-in recommendations include Context7 (docs), Playwright (testing), Chrome DevTools (debugging), Stripe (fintech), Docker/K8s (infra), and more across all 24 tags.
|
|
253
|
+
|
|
254
|
+
Optionally fetch from a remote registry at setup time:
|
|
255
|
+
```yaml
|
|
256
|
+
# In forgecraft.yaml or via tool parameter
|
|
257
|
+
include_remote: true
|
|
258
|
+
remote_registry_url: https://your-org.com/mcp-registry.json
|
|
259
|
+
```
|
|
260
|
+
|
|
241
261
|
## Development
|
|
242
262
|
|
|
243
263
|
```bash
|
|
@@ -245,7 +265,7 @@ git clone https://github.com/jghiringhelli/forgecraft-mcp.git
|
|
|
245
265
|
cd forgecraft-mcp
|
|
246
266
|
npm install
|
|
247
267
|
npm run build
|
|
248
|
-
npm test #
|
|
268
|
+
npm test # 128 tests, 10 suites
|
|
249
269
|
```
|
|
250
270
|
|
|
251
271
|
## License
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Language detector.
|
|
3
|
+
*
|
|
4
|
+
* Detects the primary programming language of a project from filesystem
|
|
5
|
+
* indicators. Falls back to "typescript" when no clear signal is found.
|
|
6
|
+
*/
|
|
7
|
+
/** Languages supported by ForgeCraft template rendering. */
|
|
8
|
+
export type SupportedLanguage = "typescript" | "python";
|
|
9
|
+
/**
|
|
10
|
+
* Detect the primary language of a project from filesystem indicators.
|
|
11
|
+
* Falls back to "typescript" when no clear signal is found.
|
|
12
|
+
*
|
|
13
|
+
* @param projectDir - Absolute path to project root
|
|
14
|
+
* @returns Detected language
|
|
15
|
+
*/
|
|
16
|
+
export declare function detectLanguage(projectDir: string): SupportedLanguage;
|
|
17
|
+
//# sourceMappingURL=language-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"language-detector.d.ts","sourceRoot":"","sources":["../../src/analyzers/language-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,4DAA4D;AAC5D,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,QAAQ,CAAC;AAgBxD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,iBAAiB,CAkCpE"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Language detector.
|
|
3
|
+
*
|
|
4
|
+
* Detects the primary programming language of a project from filesystem
|
|
5
|
+
* indicators. Falls back to "typescript" when no clear signal is found.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, readdirSync } from "node:fs";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import { createLogger } from "../shared/logger/index.js";
|
|
10
|
+
const logger = createLogger("analyzers/language-detector");
|
|
11
|
+
/** File indicators for each language. */
|
|
12
|
+
const PYTHON_INDICATORS = [
|
|
13
|
+
"pyproject.toml",
|
|
14
|
+
"setup.py",
|
|
15
|
+
"setup.cfg",
|
|
16
|
+
"requirements.txt",
|
|
17
|
+
"Pipfile",
|
|
18
|
+
];
|
|
19
|
+
const TYPESCRIPT_INDICATORS = [
|
|
20
|
+
"tsconfig.json",
|
|
21
|
+
"package.json",
|
|
22
|
+
];
|
|
23
|
+
/**
|
|
24
|
+
* Detect the primary language of a project from filesystem indicators.
|
|
25
|
+
* Falls back to "typescript" when no clear signal is found.
|
|
26
|
+
*
|
|
27
|
+
* @param projectDir - Absolute path to project root
|
|
28
|
+
* @returns Detected language
|
|
29
|
+
*/
|
|
30
|
+
export function detectLanguage(projectDir) {
|
|
31
|
+
const hasPython = PYTHON_INDICATORS.some((f) => existsSync(join(projectDir, f)));
|
|
32
|
+
const hasTypeScript = TYPESCRIPT_INDICATORS.some((f) => existsSync(join(projectDir, f)));
|
|
33
|
+
// Clear signal: only one language present
|
|
34
|
+
if (hasPython && !hasTypeScript) {
|
|
35
|
+
logger.info("Detected Python project", { projectDir });
|
|
36
|
+
return "python";
|
|
37
|
+
}
|
|
38
|
+
if (hasTypeScript && !hasPython) {
|
|
39
|
+
logger.info("Detected TypeScript project", { projectDir });
|
|
40
|
+
return "typescript";
|
|
41
|
+
}
|
|
42
|
+
// Both present (monorepo or mixed): count source files in src/
|
|
43
|
+
if (hasPython && hasTypeScript) {
|
|
44
|
+
const language = countSourceFiles(projectDir);
|
|
45
|
+
logger.info("Mixed project, detected by file count", {
|
|
46
|
+
projectDir,
|
|
47
|
+
language,
|
|
48
|
+
});
|
|
49
|
+
return language;
|
|
50
|
+
}
|
|
51
|
+
// No indicators found — default to TypeScript
|
|
52
|
+
logger.info("No language indicators found, defaulting to typescript", {
|
|
53
|
+
projectDir,
|
|
54
|
+
});
|
|
55
|
+
return "typescript";
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Count source files in src/ to determine majority language.
|
|
59
|
+
* Shallow scan only (max 100 entries) to keep it fast.
|
|
60
|
+
*/
|
|
61
|
+
function countSourceFiles(projectDir) {
|
|
62
|
+
const srcDir = join(projectDir, "src");
|
|
63
|
+
if (!existsSync(srcDir)) {
|
|
64
|
+
return "typescript";
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
const entries = readdirSync(srcDir, { recursive: false });
|
|
68
|
+
const limited = entries.slice(0, 100);
|
|
69
|
+
let pyCount = 0;
|
|
70
|
+
let tsCount = 0;
|
|
71
|
+
for (const entry of limited) {
|
|
72
|
+
const name = String(entry);
|
|
73
|
+
if (name.endsWith(".py")) {
|
|
74
|
+
pyCount++;
|
|
75
|
+
}
|
|
76
|
+
else if (name.endsWith(".ts") ||
|
|
77
|
+
name.endsWith(".tsx") ||
|
|
78
|
+
name.endsWith(".js") ||
|
|
79
|
+
name.endsWith(".jsx")) {
|
|
80
|
+
tsCount++;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return pyCount > tsCount ? "python" : "typescript";
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return "typescript";
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=language-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"language-detector.js","sourceRoot":"","sources":["../../src/analyzers/language-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-json.d.ts","sourceRoot":"","sources":["../../src/analyzers/package-json.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAI9C,qDAAqD;AACrD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAClB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;CAC7B;
|
|
1
|
+
{"version":3,"file":"package-json.d.ts","sourceRoot":"","sources":["../../src/analyzers/package-json.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAI9C,qDAAqD;AACrD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAClB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;CAC7B;AAqCD;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,CAoC9D;AAgJD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,CAuCnE"}
|
|
@@ -14,7 +14,6 @@ const DEPENDENCY_PATTERNS = [
|
|
|
14
14
|
{ packages: ["next"], tag: "WEB-REACT", evidence: "next.js in dependencies" },
|
|
15
15
|
{ packages: ["@remix-run/react"], tag: "WEB-REACT", evidence: "remix in dependencies" },
|
|
16
16
|
{ packages: ["express", "fastify", "koa", "hapi", "nestjs"], tag: "API", evidence: "HTTP framework in dependencies" },
|
|
17
|
-
{ packages: ["@modelcontextprotocol/sdk"], tag: "API", evidence: "MCP SDK in dependencies" },
|
|
18
17
|
{ packages: ["ethers", "web3", "viem", "@solana/web3.js"], tag: "WEB3", evidence: "blockchain library in dependencies" },
|
|
19
18
|
{ packages: ["socket.io", "ws", "pusher"], tag: "REALTIME", evidence: "WebSocket library in dependencies" },
|
|
20
19
|
{ packages: ["xstate", "robot3"], tag: "STATE-MACHINE", evidence: "state machine library in dependencies" },
|
|
@@ -24,13 +23,14 @@ const DEPENDENCY_PATTERNS = [
|
|
|
24
23
|
{ packages: ["@tensorflow/tfjs", "onnxruntime-node"], tag: "ML", evidence: "ML library in dependencies" },
|
|
25
24
|
{ packages: ["terraform-cdk", "pulumi", "@aws-cdk"], tag: "INFRA", evidence: "IaC library in dependencies" },
|
|
26
25
|
];
|
|
27
|
-
/** File patterns that indicate tags. */
|
|
26
|
+
/** File patterns that indicate tags. Optional confidence overrides the default 0.7. */
|
|
28
27
|
const FILE_PATTERNS = [
|
|
29
28
|
{ files: ["next.config.js", "next.config.mjs", "next.config.ts"], tag: "WEB-REACT", evidence: "next.config found" },
|
|
30
29
|
{ files: ["tsconfig.json"], tag: "LIBRARY", evidence: "TypeScript project" },
|
|
31
|
-
{ files: ["pyproject.toml", "setup.py", "setup.cfg"], tag: "API", evidence: "Python project config found" },
|
|
32
30
|
{ files: [".solhint.json", "hardhat.config.ts", "foundry.toml"], tag: "WEB3", evidence: "smart contract tooling found" },
|
|
33
|
-
|
|
31
|
+
// Docker alone is insufficient for INFRA — set below 0.6 threshold.
|
|
32
|
+
// IaC deps (terraform-cdk, pulumi, @aws-cdk) in DEPENDENCY_PATTERNS correctly trigger INFRA at 0.6+.
|
|
33
|
+
{ files: ["Dockerfile", "docker-compose.yml", "docker-compose.yaml"], tag: "INFRA", evidence: "Docker config found", confidence: 0.45 },
|
|
34
34
|
];
|
|
35
35
|
/**
|
|
36
36
|
* Analyze a project directory and detect likely tags from config files.
|
|
@@ -108,7 +108,7 @@ function analyzeFilePresence(projectDir) {
|
|
|
108
108
|
if (found.length > 0) {
|
|
109
109
|
detections.push({
|
|
110
110
|
tag: pattern.tag,
|
|
111
|
-
confidence: 0.7,
|
|
111
|
+
confidence: pattern.confidence ?? 0.7,
|
|
112
112
|
evidence: [pattern.evidence, `found: ${found.join(", ")}`],
|
|
113
113
|
});
|
|
114
114
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-json.js","sourceRoot":"","sources":["../../src/analyzers/package-json.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,MAAM,MAAM,GAAG,YAAY,CAAC,wBAAwB,CAAC,CAAC;AAStD,sDAAsD;AACtD,MAAM,mBAAmB,GAIpB;IACH,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,uBAAuB,EAAE;IACzF,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,yBAAyB,EAAE;IAC7E,EAAE,QAAQ,EAAE,CAAC,kBAAkB,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,uBAAuB,EAAE;IACvF,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,gCAAgC,EAAE;IACrH,EAAE,QAAQ,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"package-json.js","sourceRoot":"","sources":["../../src/analyzers/package-json.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project context detector.
|
|
3
|
+
*
|
|
4
|
+
* Auto-fills RenderContext fields from the project filesystem and
|
|
5
|
+
* optional description. Resolves {{repo_url}}, {{framework}}, {{domain}},
|
|
6
|
+
* and {{sensitive_data}} placeholders that would otherwise remain unsubstituted.
|
|
7
|
+
*/
|
|
8
|
+
import type { RenderContext } from "../registry/renderer.js";
|
|
9
|
+
import type { Tag } from "../shared/types.js";
|
|
10
|
+
/**
|
|
11
|
+
* Detect project context from filesystem and optional description.
|
|
12
|
+
* Auto-fills RenderContext fields for template variable substitution.
|
|
13
|
+
* Falls back gracefully — returns partial context, never throws.
|
|
14
|
+
*
|
|
15
|
+
* @param projectDir - Absolute path to project root
|
|
16
|
+
* @param projectName - Known project name
|
|
17
|
+
* @param language - Detected language
|
|
18
|
+
* @param tags - Active tags
|
|
19
|
+
* @param description - Optional project description for domain extraction
|
|
20
|
+
* @returns Populated render context
|
|
21
|
+
*/
|
|
22
|
+
export declare function detectProjectContext(projectDir: string, projectName: string, language: string, tags: Tag[], description?: string): RenderContext;
|
|
23
|
+
//# sourceMappingURL=project-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-context.d.ts","sourceRoot":"","sources":["../../src/analyzers/project-context.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAI9C;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,GAAG,EAAE,EACX,WAAW,CAAC,EAAE,MAAM,GACnB,aAAa,CAuBf"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project context detector.
|
|
3
|
+
*
|
|
4
|
+
* Auto-fills RenderContext fields from the project filesystem and
|
|
5
|
+
* optional description. Resolves {{repo_url}}, {{framework}}, {{domain}},
|
|
6
|
+
* and {{sensitive_data}} placeholders that would otherwise remain unsubstituted.
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
9
|
+
import { execSync } from "node:child_process";
|
|
10
|
+
import { join } from "node:path";
|
|
11
|
+
import { createLogger } from "../shared/logger/index.js";
|
|
12
|
+
const logger = createLogger("analyzers/project-context");
|
|
13
|
+
/**
|
|
14
|
+
* Detect project context from filesystem and optional description.
|
|
15
|
+
* Auto-fills RenderContext fields for template variable substitution.
|
|
16
|
+
* Falls back gracefully — returns partial context, never throws.
|
|
17
|
+
*
|
|
18
|
+
* @param projectDir - Absolute path to project root
|
|
19
|
+
* @param projectName - Known project name
|
|
20
|
+
* @param language - Detected language
|
|
21
|
+
* @param tags - Active tags
|
|
22
|
+
* @param description - Optional project description for domain extraction
|
|
23
|
+
* @returns Populated render context
|
|
24
|
+
*/
|
|
25
|
+
export function detectProjectContext(projectDir, projectName, language, tags, description) {
|
|
26
|
+
const repoUrl = detectRepoUrl(projectDir);
|
|
27
|
+
const framework = detectFramework(projectDir, language);
|
|
28
|
+
const domain = description ?? undefined;
|
|
29
|
+
const sensitiveData = detectSensitiveData(tags);
|
|
30
|
+
logger.info("Project context detected", {
|
|
31
|
+
projectDir,
|
|
32
|
+
repoUrl: repoUrl ? "detected" : "not found",
|
|
33
|
+
framework: framework ?? "not detected",
|
|
34
|
+
hasDomain: !!domain,
|
|
35
|
+
sensitiveData,
|
|
36
|
+
});
|
|
37
|
+
return {
|
|
38
|
+
projectName,
|
|
39
|
+
language,
|
|
40
|
+
tags,
|
|
41
|
+
repoUrl,
|
|
42
|
+
framework,
|
|
43
|
+
domain,
|
|
44
|
+
sensitiveData,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Detect the git remote URL for the project.
|
|
49
|
+
*/
|
|
50
|
+
function detectRepoUrl(projectDir) {
|
|
51
|
+
try {
|
|
52
|
+
const url = execSync("git remote get-url origin", {
|
|
53
|
+
cwd: projectDir,
|
|
54
|
+
timeout: 5_000,
|
|
55
|
+
encoding: "utf-8",
|
|
56
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
57
|
+
}).trim();
|
|
58
|
+
// Convert SSH URLs to HTTPS for display
|
|
59
|
+
if (url.startsWith("git@")) {
|
|
60
|
+
return url
|
|
61
|
+
.replace("git@", "https://")
|
|
62
|
+
.replace(":", "/")
|
|
63
|
+
.replace(/\.git$/, "");
|
|
64
|
+
}
|
|
65
|
+
return url.replace(/\.git$/, "");
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return "";
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Detect the primary framework from project config files.
|
|
73
|
+
*/
|
|
74
|
+
function detectFramework(projectDir, language) {
|
|
75
|
+
if (language === "typescript") {
|
|
76
|
+
return detectTypeScriptFramework(projectDir);
|
|
77
|
+
}
|
|
78
|
+
if (language === "python") {
|
|
79
|
+
return detectPythonFramework(projectDir);
|
|
80
|
+
}
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
/** Framework patterns for TypeScript/JavaScript projects. */
|
|
84
|
+
const TS_FRAMEWORK_PATTERNS = [
|
|
85
|
+
{ packages: ["next"], name: "Next.js" },
|
|
86
|
+
{ packages: ["@remix-run/react"], name: "Remix" },
|
|
87
|
+
{ packages: ["nuxt"], name: "Nuxt" },
|
|
88
|
+
{ packages: ["@angular/core"], name: "Angular" },
|
|
89
|
+
{ packages: ["vue"], name: "Vue" },
|
|
90
|
+
{ packages: ["svelte"], name: "Svelte" },
|
|
91
|
+
{ packages: ["fastify"], name: "Fastify" },
|
|
92
|
+
{ packages: ["express"], name: "Express" },
|
|
93
|
+
{ packages: ["nestjs", "@nestjs/core"], name: "NestJS" },
|
|
94
|
+
{ packages: ["hono"], name: "Hono" },
|
|
95
|
+
{ packages: ["react"], name: "React" },
|
|
96
|
+
];
|
|
97
|
+
/**
|
|
98
|
+
* Detect TypeScript framework from package.json dependencies.
|
|
99
|
+
*/
|
|
100
|
+
function detectTypeScriptFramework(projectDir) {
|
|
101
|
+
const pkgPath = join(projectDir, "package.json");
|
|
102
|
+
if (!existsSync(pkgPath)) {
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
const content = readFileSync(pkgPath, "utf-8");
|
|
107
|
+
const pkg = JSON.parse(content);
|
|
108
|
+
const allDeps = {
|
|
109
|
+
...pkg["dependencies"],
|
|
110
|
+
...pkg["devDependencies"],
|
|
111
|
+
};
|
|
112
|
+
const depNames = Object.keys(allDeps);
|
|
113
|
+
for (const pattern of TS_FRAMEWORK_PATTERNS) {
|
|
114
|
+
if (pattern.packages.some((p) => depNames.includes(p))) {
|
|
115
|
+
return pattern.name;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// Invalid package.json — skip
|
|
121
|
+
}
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
/** Framework patterns for Python projects. */
|
|
125
|
+
const PY_FRAMEWORK_PATTERNS = [
|
|
126
|
+
{ keyword: "fastapi", name: "FastAPI" },
|
|
127
|
+
{ keyword: "django", name: "Django" },
|
|
128
|
+
{ keyword: "flask", name: "Flask" },
|
|
129
|
+
{ keyword: "streamlit", name: "Streamlit" },
|
|
130
|
+
{ keyword: "gradio", name: "Gradio" },
|
|
131
|
+
{ keyword: "pytorch", name: "PyTorch" },
|
|
132
|
+
{ keyword: "torch", name: "PyTorch" },
|
|
133
|
+
{ keyword: "tensorflow", name: "TensorFlow" },
|
|
134
|
+
{ keyword: "pandas", name: "Pandas" },
|
|
135
|
+
{ keyword: "prefect", name: "Prefect" },
|
|
136
|
+
{ keyword: "airflow", name: "Airflow" },
|
|
137
|
+
];
|
|
138
|
+
/**
|
|
139
|
+
* Detect Python framework from pyproject.toml or requirements.txt.
|
|
140
|
+
*/
|
|
141
|
+
function detectPythonFramework(projectDir) {
|
|
142
|
+
// Try pyproject.toml first
|
|
143
|
+
const pyprojectPath = join(projectDir, "pyproject.toml");
|
|
144
|
+
if (existsSync(pyprojectPath)) {
|
|
145
|
+
try {
|
|
146
|
+
const content = readFileSync(pyprojectPath, "utf-8").toLowerCase();
|
|
147
|
+
for (const pattern of PY_FRAMEWORK_PATTERNS) {
|
|
148
|
+
if (content.includes(pattern.keyword)) {
|
|
149
|
+
return pattern.name;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
// skip
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Try requirements.txt
|
|
158
|
+
const reqPath = join(projectDir, "requirements.txt");
|
|
159
|
+
if (existsSync(reqPath)) {
|
|
160
|
+
try {
|
|
161
|
+
const content = readFileSync(reqPath, "utf-8").toLowerCase();
|
|
162
|
+
for (const pattern of PY_FRAMEWORK_PATTERNS) {
|
|
163
|
+
if (content.includes(pattern.keyword)) {
|
|
164
|
+
return pattern.name;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
// skip
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return undefined;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Determine sensitive data flag from active tags.
|
|
176
|
+
*/
|
|
177
|
+
function detectSensitiveData(tags) {
|
|
178
|
+
const sensitiveTags = ["HEALTHCARE", "HIPAA", "FINTECH", "SOC2"];
|
|
179
|
+
return tags.some((t) => sensitiveTags.includes(t)) ? "YES" : "NO";
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=project-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-context.js","sourceRoot":"","sources":["../../src/analyzers/project-context.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -9,7 +9,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
9
9
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
10
10
|
import { createLogger } from "./shared/logger/index.js";
|
|
11
11
|
// ── Tool imports ─────────────────────────────────────────────────────
|
|
12
|
-
import { listTagsSchema, listTagsHandler, listHooksSchema, listHooksHandler, } from "./tools/list.js";
|
|
12
|
+
import { listTagsSchema, listTagsHandler, listHooksSchema, listHooksHandler, listSkillsSchema, listSkillsHandler, } from "./tools/list.js";
|
|
13
13
|
import { classifyProjectSchema, classifyProjectHandler, } from "./tools/classify.js";
|
|
14
14
|
import { scaffoldProjectSchema, scaffoldProjectHandler, } from "./tools/scaffold.js";
|
|
15
15
|
import { generateInstructionsSchema, generateInstructionsHandler, } from "./tools/generate-claude-md.js";
|
|
@@ -18,6 +18,7 @@ import { addHookSchema, addHookHandler, } from "./tools/add-hook.js";
|
|
|
18
18
|
import { addModuleSchema, addModuleHandler, } from "./tools/add-module.js";
|
|
19
19
|
import { configureMcpSchema, configureMcpHandler, } from "./tools/configure-mcp.js";
|
|
20
20
|
import { getNfrTemplateSchema, getNfrTemplateHandler, } from "./tools/get-nfr.js";
|
|
21
|
+
import { getDesignReferenceSchema, getDesignReferenceHandler, } from "./tools/get-reference.js";
|
|
21
22
|
import { convertExistingSchema, convertExistingHandler, } from "./tools/convert.js";
|
|
22
23
|
import { reviewProjectSchema, reviewProjectHandler, } from "./tools/review.js";
|
|
23
24
|
import { setupProjectSchema, setupProjectHandler, } from "./tools/setup-project.js";
|
|
@@ -28,19 +29,21 @@ async function main() {
|
|
|
28
29
|
logger.info("Starting ForgeCraft MCP server");
|
|
29
30
|
const server = new McpServer({
|
|
30
31
|
name: "forgecraft",
|
|
31
|
-
version: "0.
|
|
32
|
+
version: "0.3.0",
|
|
32
33
|
});
|
|
33
34
|
// ── Register Tools ───────────────────────────────────────────────
|
|
34
35
|
server.tool("list_tags", "List all available project classification tags with descriptions.", listTagsSchema.shape, listTagsHandler);
|
|
35
36
|
server.tool("list_hooks", "List available hooks, optionally filtered by tags.", listHooksSchema.shape, listHooksHandler);
|
|
37
|
+
server.tool("list_skills", "List available skills (Claude Code custom commands), optionally filtered by tags. Skills are reusable workflow prompts installed to .claude/commands/ and invoked via /project:<name>.", listSkillsSchema.shape, listSkillsHandler);
|
|
36
38
|
server.tool("classify_project", "Analyze a project directory and/or description to suggest classification tags.", classifyProjectSchema.shape, classifyProjectHandler);
|
|
37
|
-
server.tool("scaffold_project", "Generate full project structure (instruction files, Status.md, hooks, folders) from tags. Supports multiple AI assistant targets.", scaffoldProjectSchema.shape, scaffoldProjectHandler);
|
|
39
|
+
server.tool("scaffold_project", "Generate full project structure (instruction files, Status.md, hooks, skills, folders) from tags. Supports multiple AI assistant targets.", scaffoldProjectSchema.shape, scaffoldProjectHandler);
|
|
38
40
|
server.tool("generate_instructions", "Generate AI assistant instruction files for given tags. Supports multiple targets: Claude (CLAUDE.md), Cursor (.cursor/rules/), GitHub Copilot (.github/copilot-instructions.md), Windsurf (.windsurfrules), Cline (.clinerules), Aider (CONVENTIONS.md). Adds SOLID principles, testing pyramid, architecture patterns, CI/CD, and domain-specific standards from 112 curated blocks. Can merge with existing files to preserve custom sections.", generateInstructionsSchema.shape, generateInstructionsHandler);
|
|
39
41
|
server.tool("audit_project", "Audit project against template standards and report violations with a score.", auditProjectSchema.shape, auditProjectHandler);
|
|
40
42
|
server.tool("add_hook", "Add a specific quality-gate hook script to the project.", addHookSchema.shape, addHookHandler);
|
|
41
43
|
server.tool("add_module", "Scaffold a new feature module following established patterns.", addModuleSchema.shape, addModuleHandler);
|
|
42
44
|
server.tool("configure_mcp", "Generate .claude/settings.json with recommended MCP servers for active tags.", configureMcpSchema.shape, configureMcpHandler);
|
|
43
45
|
server.tool("get_nfr_template", "Get NFR (Non-Functional Requirement) sections for specific tags.", getNfrTemplateSchema.shape, getNfrTemplateHandler);
|
|
46
|
+
server.tool("get_design_reference", "Get design reference patterns (DDD, CQRS, GoF) on demand. These are NOT included in instruction files to save tokens — request them when you need architectural guidance.", getDesignReferenceSchema.shape, getDesignReferenceHandler);
|
|
44
47
|
server.tool("convert_existing", "Analyze an existing codebase and generate a phased migration plan.", convertExistingSchema.shape, convertExistingHandler);
|
|
45
48
|
server.tool("review_project", "Generate a structured code review checklist for active tags. Covers architecture, code quality, tests, and performance with per-issue guidance format.", reviewProjectSchema.shape, reviewProjectHandler);
|
|
46
49
|
server.tool("setup_project", "RECOMMENDED FIRST STEP — generates production-grade AI assistant instruction files from 112 curated template blocks. Supports Claude, Cursor, Copilot, Windsurf, Cline, and Aider. Analyzes project, auto-detects tags from code/dependencies, creates forgecraft.yaml config, and adds engineering standards (SOLID, testing pyramid, architecture patterns, CI/CD, domain rules). Works for new and existing projects. Supports tier-based content filtering (core/recommended/optional).", setupProjectSchema.shape, setupProjectHandler);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,wEAAwE;AACxE,OAAO,EACL,cAAc,EACd,eAAe,EACf,eAAe,EACf,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,14 +5,16 @@
|
|
|
5
5
|
* hooks, and NFRs from all matching templates into unified outputs.
|
|
6
6
|
* Handles merge, deduplication, ordering, and tier-based filtering.
|
|
7
7
|
*/
|
|
8
|
-
import type { Tag, TagTemplateSet, InstructionBlock, StructureEntry, NfrBlock, HookTemplate, ReviewBlock, ForgeCraftConfig } from "../shared/types.js";
|
|
8
|
+
import type { Tag, TagTemplateSet, InstructionBlock, StructureEntry, NfrBlock, HookTemplate, SkillTemplate, ReviewBlock, ReferenceBlock, ForgeCraftConfig } from "../shared/types.js";
|
|
9
9
|
/** Composed output for a set of active tags. */
|
|
10
10
|
export interface ComposedTemplates {
|
|
11
11
|
readonly instructionBlocks: InstructionBlock[];
|
|
12
12
|
readonly structureEntries: StructureEntry[];
|
|
13
13
|
readonly nfrBlocks: NfrBlock[];
|
|
14
14
|
readonly hooks: HookTemplate[];
|
|
15
|
+
readonly skills: SkillTemplate[];
|
|
15
16
|
readonly reviewBlocks: ReviewBlock[];
|
|
17
|
+
readonly referenceBlocks: ReferenceBlock[];
|
|
16
18
|
/**
|
|
17
19
|
* @deprecated Use `instructionBlocks` instead. Alias for backward compatibility.
|
|
18
20
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"composer.d.ts","sourceRoot":"","sources":["../../src/registry/composer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EACV,GAAG,EACH,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,WAAW,
|
|
1
|
+
{"version":3,"file":"composer.d.ts","sourceRoot":"","sources":["../../src/registry/composer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EACV,GAAG,EACH,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,WAAW,EACX,cAAc,EAEd,gBAAgB,EACjB,MAAM,oBAAoB,CAAC;AAoB5B,gDAAgD;AAChD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IAC/C,QAAQ,CAAC,gBAAgB,EAAE,cAAc,EAAE,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,cAAc,EAAE,CAAC;IAC3C;;OAEG;IACH,QAAQ,CAAC,cAAc,EAAE,gBAAgB,EAAE,CAAC;CAC7C;AAED,oDAAoD;AACpD,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;CACpC;AAwCD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,GAAG,EAAE,EACjB,YAAY,EAAE,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,EACtC,OAAO,CAAC,EAAE,cAAc,GACvB,iBAAiB,CAgJnB"}
|