forgecraft-mcp 0.1.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 (147) hide show
  1. package/README.md +251 -0
  2. package/dist/analyzers/anti-pattern.d.ts +21 -0
  3. package/dist/analyzers/anti-pattern.d.ts.map +1 -0
  4. package/dist/analyzers/anti-pattern.js +130 -0
  5. package/dist/analyzers/anti-pattern.js.map +1 -0
  6. package/dist/analyzers/completeness.d.ts +15 -0
  7. package/dist/analyzers/completeness.d.ts.map +1 -0
  8. package/dist/analyzers/completeness.js +207 -0
  9. package/dist/analyzers/completeness.js.map +1 -0
  10. package/dist/analyzers/folder-structure.d.ts +35 -0
  11. package/dist/analyzers/folder-structure.d.ts.map +1 -0
  12. package/dist/analyzers/folder-structure.js +151 -0
  13. package/dist/analyzers/folder-structure.js.map +1 -0
  14. package/dist/analyzers/package-json.d.ts +22 -0
  15. package/dist/analyzers/package-json.d.ts.map +1 -0
  16. package/dist/analyzers/package-json.js +229 -0
  17. package/dist/analyzers/package-json.js.map +1 -0
  18. package/dist/index.d.ts +9 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +59 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/registry/composer.d.ts +32 -0
  23. package/dist/registry/composer.d.ts.map +1 -0
  24. package/dist/registry/composer.js +169 -0
  25. package/dist/registry/composer.js.map +1 -0
  26. package/dist/registry/loader.d.ts +37 -0
  27. package/dist/registry/loader.d.ts.map +1 -0
  28. package/dist/registry/loader.js +278 -0
  29. package/dist/registry/loader.js.map +1 -0
  30. package/dist/registry/renderer.d.ts +53 -0
  31. package/dist/registry/renderer.d.ts.map +1 -0
  32. package/dist/registry/renderer.js +275 -0
  33. package/dist/registry/renderer.js.map +1 -0
  34. package/dist/shared/config/index.d.ts +15 -0
  35. package/dist/shared/config/index.d.ts.map +1 -0
  36. package/dist/shared/config/index.js +16 -0
  37. package/dist/shared/config/index.js.map +1 -0
  38. package/dist/shared/errors/index.d.ts +30 -0
  39. package/dist/shared/errors/index.d.ts.map +1 -0
  40. package/dist/shared/errors/index.js +44 -0
  41. package/dist/shared/errors/index.js.map +1 -0
  42. package/dist/shared/logger/index.d.ts +27 -0
  43. package/dist/shared/logger/index.d.ts.map +1 -0
  44. package/dist/shared/logger/index.js +59 -0
  45. package/dist/shared/logger/index.js.map +1 -0
  46. package/dist/shared/types.d.ts +212 -0
  47. package/dist/shared/types.d.ts.map +1 -0
  48. package/dist/shared/types.js +30 -0
  49. package/dist/shared/types.js.map +1 -0
  50. package/dist/tools/add-hook.d.ts +26 -0
  51. package/dist/tools/add-hook.d.ts.map +1 -0
  52. package/dist/tools/add-hook.js +82 -0
  53. package/dist/tools/add-hook.js.map +1 -0
  54. package/dist/tools/add-module.d.ts +29 -0
  55. package/dist/tools/add-module.d.ts.map +1 -0
  56. package/dist/tools/add-module.js +244 -0
  57. package/dist/tools/add-module.js.map +1 -0
  58. package/dist/tools/audit.d.ts +26 -0
  59. package/dist/tools/audit.d.ts.map +1 -0
  60. package/dist/tools/audit.js +111 -0
  61. package/dist/tools/audit.js.map +1 -0
  62. package/dist/tools/classify.d.ts +23 -0
  63. package/dist/tools/classify.d.ts.map +1 -0
  64. package/dist/tools/classify.js +73 -0
  65. package/dist/tools/classify.js.map +1 -0
  66. package/dist/tools/configure-mcp.d.ts +49 -0
  67. package/dist/tools/configure-mcp.d.ts.map +1 -0
  68. package/dist/tools/configure-mcp.js +127 -0
  69. package/dist/tools/configure-mcp.js.map +1 -0
  70. package/dist/tools/convert.d.ts +27 -0
  71. package/dist/tools/convert.d.ts.map +1 -0
  72. package/dist/tools/convert.js +154 -0
  73. package/dist/tools/convert.js.map +1 -0
  74. package/dist/tools/generate-claude-md.d.ts +29 -0
  75. package/dist/tools/generate-claude-md.d.ts.map +1 -0
  76. package/dist/tools/generate-claude-md.js +116 -0
  77. package/dist/tools/generate-claude-md.js.map +1 -0
  78. package/dist/tools/get-nfr.d.ts +20 -0
  79. package/dist/tools/get-nfr.d.ts.map +1 -0
  80. package/dist/tools/get-nfr.js +53 -0
  81. package/dist/tools/get-nfr.js.map +1 -0
  82. package/dist/tools/list.d.ts +33 -0
  83. package/dist/tools/list.d.ts.map +1 -0
  84. package/dist/tools/list.js +155 -0
  85. package/dist/tools/list.js.map +1 -0
  86. package/dist/tools/refresh-project.d.ts +34 -0
  87. package/dist/tools/refresh-project.d.ts.map +1 -0
  88. package/dist/tools/refresh-project.js +257 -0
  89. package/dist/tools/refresh-project.js.map +1 -0
  90. package/dist/tools/review.d.ts +31 -0
  91. package/dist/tools/review.d.ts.map +1 -0
  92. package/dist/tools/review.js +62 -0
  93. package/dist/tools/review.js.map +1 -0
  94. package/dist/tools/scaffold.d.ts +32 -0
  95. package/dist/tools/scaffold.d.ts.map +1 -0
  96. package/dist/tools/scaffold.js +160 -0
  97. package/dist/tools/scaffold.js.map +1 -0
  98. package/dist/tools/setup-project.d.ts +37 -0
  99. package/dist/tools/setup-project.d.ts.map +1 -0
  100. package/dist/tools/setup-project.js +270 -0
  101. package/dist/tools/setup-project.js.map +1 -0
  102. package/package.json +69 -0
  103. package/templates/analytics/claude-md.yaml +37 -0
  104. package/templates/analytics/structure.yaml +25 -0
  105. package/templates/api/claude-md.yaml +85 -0
  106. package/templates/api/nfr.yaml +23 -0
  107. package/templates/api/review.yaml +103 -0
  108. package/templates/api/structure.yaml +34 -0
  109. package/templates/cli/claude-md.yaml +31 -0
  110. package/templates/cli/review.yaml +53 -0
  111. package/templates/cli/structure.yaml +16 -0
  112. package/templates/data-pipeline/claude-md.yaml +42 -0
  113. package/templates/data-pipeline/nfr.yaml +39 -0
  114. package/templates/data-pipeline/structure.yaml +23 -0
  115. package/templates/fintech/claude-md.yaml +42 -0
  116. package/templates/fintech/nfr.yaml +46 -0
  117. package/templates/game/claude-md.yaml +42 -0
  118. package/templates/healthcare/claude-md.yaml +42 -0
  119. package/templates/healthcare/nfr.yaml +47 -0
  120. package/templates/infra/claude-md.yaml +104 -0
  121. package/templates/infra/nfr.yaml +46 -0
  122. package/templates/infra/review.yaml +65 -0
  123. package/templates/infra/structure.yaml +25 -0
  124. package/templates/library/claude-md.yaml +36 -0
  125. package/templates/library/review.yaml +56 -0
  126. package/templates/library/structure.yaml +19 -0
  127. package/templates/ml/claude-md.yaml +42 -0
  128. package/templates/ml/nfr.yaml +39 -0
  129. package/templates/ml/structure.yaml +25 -0
  130. package/templates/mobile/claude-md.yaml +44 -0
  131. package/templates/mobile/nfr.yaml +49 -0
  132. package/templates/mobile/structure.yaml +27 -0
  133. package/templates/realtime/claude-md.yaml +42 -0
  134. package/templates/social/claude-md.yaml +43 -0
  135. package/templates/state-machine/claude-md.yaml +42 -0
  136. package/templates/universal/claude-md.yaml +477 -0
  137. package/templates/universal/hooks.yaml +196 -0
  138. package/templates/universal/nfr.yaml +197 -0
  139. package/templates/universal/review.yaml +164 -0
  140. package/templates/universal/structure.yaml +52 -0
  141. package/templates/web-react/claude-md.yaml +110 -0
  142. package/templates/web-react/hooks.yaml +44 -0
  143. package/templates/web-react/nfr.yaml +27 -0
  144. package/templates/web-react/review.yaml +94 -0
  145. package/templates/web-react/structure.yaml +46 -0
  146. package/templates/web-static/claude-md.yaml +73 -0
  147. package/templates/web3/claude-md.yaml +44 -0
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Folder structure analyzer.
3
+ *
4
+ * Scans existing project directory structure to detect patterns,
5
+ * existing infrastructure, and suggest improvements.
6
+ */
7
+ /** A node in the project's folder tree. */
8
+ export interface FolderNode {
9
+ readonly name: string;
10
+ readonly path: string;
11
+ readonly type: "file" | "directory";
12
+ readonly children?: FolderNode[];
13
+ }
14
+ /**
15
+ * Scan a project directory and return its folder tree.
16
+ * Respects a max depth to avoid excessive recursion.
17
+ */
18
+ export declare function scanFolderStructure(projectDir: string, maxDepth?: number): FolderNode;
19
+ /**
20
+ * Render a folder tree as an indented text representation.
21
+ */
22
+ export declare function renderFolderTree(node: FolderNode, indent?: string): string;
23
+ /**
24
+ * Get a flat list of all files in the project.
25
+ */
26
+ export declare function listAllFiles(projectDir: string, maxDepth?: number): string[];
27
+ /**
28
+ * Check if a directory exists in the project.
29
+ */
30
+ export declare function directoryExists(projectDir: string, relativePath: string): boolean;
31
+ /**
32
+ * Check if a file exists in the project.
33
+ */
34
+ export declare function fileExists(projectDir: string, relativePath: string): boolean;
35
+ //# sourceMappingURL=folder-structure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folder-structure.d.ts","sourceRoot":"","sources":["../../src/analyzers/folder-structure.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,2CAA2C;AAC3C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;CAClC;AAmBD;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,QAAQ,GAAE,MAAU,GACnB,UAAU,CAGZ;AA4DD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,GAAE,MAAW,GAAG,MAAM,CAwB9E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,UAAU,EAAE,MAAM,EAClB,QAAQ,GAAE,MAAU,GACnB,MAAM,EAAE,CAIV;AAmCD;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAGjF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAG5E"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Folder structure analyzer.
3
+ *
4
+ * Scans existing project directory structure to detect patterns,
5
+ * existing infrastructure, and suggest improvements.
6
+ */
7
+ import { readdirSync, existsSync, statSync } from "node:fs";
8
+ import { join, relative } from "node:path";
9
+ import { createLogger } from "../shared/logger/index.js";
10
+ const logger = createLogger("analyzers/folder-structure");
11
+ /** Directories to skip during scanning. */
12
+ const SKIP_DIRS = new Set([
13
+ "node_modules",
14
+ ".git",
15
+ "dist",
16
+ "build",
17
+ "out",
18
+ ".next",
19
+ "__pycache__",
20
+ ".venv",
21
+ "venv",
22
+ ".tox",
23
+ "coverage",
24
+ ".nyc_output",
25
+ ".cache",
26
+ ]);
27
+ /**
28
+ * Scan a project directory and return its folder tree.
29
+ * Respects a max depth to avoid excessive recursion.
30
+ */
31
+ export function scanFolderStructure(projectDir, maxDepth = 4) {
32
+ logger.info("Scanning folder structure", { projectDir, maxDepth });
33
+ return scanDirectory(projectDir, projectDir, 0, maxDepth);
34
+ }
35
+ /**
36
+ * Recursively scan a directory.
37
+ */
38
+ function scanDirectory(dir, rootDir, depth, maxDepth) {
39
+ const name = depth === 0 ? relative(join(rootDir, ".."), dir) || "." : relative(join(dir, ".."), dir);
40
+ const relativePath = relative(rootDir, dir) || ".";
41
+ if (depth >= maxDepth) {
42
+ return { name, path: relativePath, type: "directory" };
43
+ }
44
+ const children = [];
45
+ try {
46
+ const entries = readdirSync(dir, { withFileTypes: true });
47
+ // Sort: directories first, then files, alphabetical within each group
48
+ const sorted = entries.sort((a, b) => {
49
+ if (a.isDirectory() && !b.isDirectory())
50
+ return -1;
51
+ if (!a.isDirectory() && b.isDirectory())
52
+ return 1;
53
+ return a.name.localeCompare(b.name);
54
+ });
55
+ for (const entry of sorted) {
56
+ if (SKIP_DIRS.has(entry.name) || entry.name.startsWith(".")) {
57
+ continue;
58
+ }
59
+ const entryPath = join(dir, entry.name);
60
+ const entryRelativePath = relative(rootDir, entryPath);
61
+ if (entry.isDirectory()) {
62
+ children.push(scanDirectory(entryPath, rootDir, depth + 1, maxDepth));
63
+ }
64
+ else {
65
+ children.push({
66
+ name: entry.name,
67
+ path: entryRelativePath,
68
+ type: "file",
69
+ });
70
+ }
71
+ }
72
+ }
73
+ catch (error) {
74
+ logger.warn("Failed to read directory", {
75
+ dir,
76
+ error: error instanceof Error ? error.message : String(error),
77
+ });
78
+ }
79
+ return { name, path: relativePath, type: "directory", children };
80
+ }
81
+ /**
82
+ * Render a folder tree as an indented text representation.
83
+ */
84
+ export function renderFolderTree(node, indent = "") {
85
+ const lines = [];
86
+ if (indent === "") {
87
+ lines.push(`${node.name}/`);
88
+ }
89
+ if (node.children) {
90
+ for (let i = 0; i < node.children.length; i++) {
91
+ const child = node.children[i];
92
+ const isLast = i === node.children.length - 1;
93
+ const prefix = isLast ? "└── " : "├── ";
94
+ const childIndent = isLast ? " " : "│ ";
95
+ const suffix = child.type === "directory" ? "/" : "";
96
+ lines.push(`${indent}${prefix}${child.name}${suffix}`);
97
+ if (child.type === "directory" && child.children && child.children.length > 0) {
98
+ lines.push(renderFolderTree(child, indent + childIndent));
99
+ }
100
+ }
101
+ }
102
+ return lines.join("\n");
103
+ }
104
+ /**
105
+ * Get a flat list of all files in the project.
106
+ */
107
+ export function listAllFiles(projectDir, maxDepth = 6) {
108
+ const files = [];
109
+ collectFiles(projectDir, projectDir, 0, maxDepth, files);
110
+ return files;
111
+ }
112
+ /**
113
+ * Recursively collect file paths.
114
+ */
115
+ function collectFiles(dir, rootDir, depth, maxDepth, result) {
116
+ if (depth >= maxDepth)
117
+ return;
118
+ try {
119
+ const entries = readdirSync(dir, { withFileTypes: true });
120
+ for (const entry of entries) {
121
+ if (SKIP_DIRS.has(entry.name) || entry.name.startsWith(".")) {
122
+ continue;
123
+ }
124
+ const entryPath = join(dir, entry.name);
125
+ if (entry.isDirectory()) {
126
+ collectFiles(entryPath, rootDir, depth + 1, maxDepth, result);
127
+ }
128
+ else {
129
+ result.push(relative(rootDir, entryPath));
130
+ }
131
+ }
132
+ }
133
+ catch {
134
+ // Skip unreadable directories
135
+ }
136
+ }
137
+ /**
138
+ * Check if a directory exists in the project.
139
+ */
140
+ export function directoryExists(projectDir, relativePath) {
141
+ const fullPath = join(projectDir, relativePath);
142
+ return existsSync(fullPath) && statSync(fullPath).isDirectory();
143
+ }
144
+ /**
145
+ * Check if a file exists in the project.
146
+ */
147
+ export function fileExists(projectDir, relativePath) {
148
+ const fullPath = join(projectDir, relativePath);
149
+ return existsSync(fullPath) && statSync(fullPath).isFile();
150
+ }
151
+ //# sourceMappingURL=folder-structure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folder-structure.js","sourceRoot":"","sources":["../../src/analyzers/folder-structure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Package.json analyzer.
3
+ *
4
+ * Detects frameworks, languages, and project characteristics from
5
+ * package.json, tsconfig.json, pyproject.toml, and similar config files.
6
+ */
7
+ import type { Tag } from "../shared/types.js";
8
+ /** Detection result with confidence and evidence. */
9
+ export interface Detection {
10
+ readonly tag: Tag;
11
+ readonly confidence: number;
12
+ readonly evidence: string[];
13
+ }
14
+ /**
15
+ * Analyze a project directory and detect likely tags from config files.
16
+ */
17
+ export declare function analyzeProject(projectDir: string): Detection[];
18
+ /**
19
+ * Analyze a text description for tag mentions.
20
+ */
21
+ export declare function analyzeDescription(description: string): Detection[];
22
+ //# sourceMappingURL=package-json.d.ts.map
@@ -0,0 +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;AAoCD;;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"}
@@ -0,0 +1,229 @@
1
+ /**
2
+ * Package.json analyzer.
3
+ *
4
+ * Detects frameworks, languages, and project characteristics from
5
+ * package.json, tsconfig.json, pyproject.toml, and similar config files.
6
+ */
7
+ import { readFileSync, existsSync } from "node:fs";
8
+ import { join } from "node:path";
9
+ import { createLogger } from "../shared/logger/index.js";
10
+ const logger = createLogger("analyzers/package-json");
11
+ /** Framework/dependency patterns that map to tags. */
12
+ const DEPENDENCY_PATTERNS = [
13
+ { packages: ["react", "react-dom"], tag: "WEB-REACT", evidence: "react in dependencies" },
14
+ { packages: ["next"], tag: "WEB-REACT", evidence: "next.js in dependencies" },
15
+ { packages: ["@remix-run/react"], tag: "WEB-REACT", evidence: "remix in dependencies" },
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
+ { packages: ["ethers", "web3", "viem", "@solana/web3.js"], tag: "WEB3", evidence: "blockchain library in dependencies" },
19
+ { packages: ["socket.io", "ws", "pusher"], tag: "REALTIME", evidence: "WebSocket library in dependencies" },
20
+ { packages: ["xstate", "robot3"], tag: "STATE-MACHINE", evidence: "state machine library in dependencies" },
21
+ { packages: ["phaser", "pixi.js", "three", "babylon"], tag: "GAME", evidence: "game engine in dependencies" },
22
+ { packages: ["commander", "yargs", "meow", "oclif"], tag: "CLI", evidence: "CLI framework in dependencies" },
23
+ { packages: ["react-native", "expo"], tag: "MOBILE", evidence: "mobile framework in dependencies" },
24
+ { packages: ["@tensorflow/tfjs", "onnxruntime-node"], tag: "ML", evidence: "ML library in dependencies" },
25
+ { packages: ["terraform-cdk", "pulumi", "@aws-cdk"], tag: "INFRA", evidence: "IaC library in dependencies" },
26
+ ];
27
+ /** File patterns that indicate tags. */
28
+ const FILE_PATTERNS = [
29
+ { files: ["next.config.js", "next.config.mjs", "next.config.ts"], tag: "WEB-REACT", evidence: "next.config found" },
30
+ { files: ["tsconfig.json"], tag: "LIBRARY", evidence: "TypeScript project" },
31
+ { files: ["pyproject.toml", "setup.py", "setup.cfg"], tag: "API", evidence: "Python project config found" },
32
+ { files: [".solhint.json", "hardhat.config.ts", "foundry.toml"], tag: "WEB3", evidence: "smart contract tooling found" },
33
+ { files: ["Dockerfile", "docker-compose.yml", "docker-compose.yaml"], tag: "INFRA", evidence: "Docker config found" },
34
+ ];
35
+ /**
36
+ * Analyze a project directory and detect likely tags from config files.
37
+ */
38
+ export function analyzeProject(projectDir) {
39
+ const detections = [];
40
+ // Check package.json
41
+ const packageJsonPath = join(projectDir, "package.json");
42
+ if (existsSync(packageJsonPath)) {
43
+ const packageDetections = analyzePackageJson(packageJsonPath);
44
+ detections.push(...packageDetections);
45
+ }
46
+ // Check for file-based indicators
47
+ const fileDetections = analyzeFilePresence(projectDir);
48
+ detections.push(...fileDetections);
49
+ // Check for Python project
50
+ const pyDetections = analyzePythonProject(projectDir);
51
+ detections.push(...pyDetections);
52
+ // Check if it has bin entry (CLI indicator)
53
+ if (existsSync(packageJsonPath)) {
54
+ const binDetection = analyzeBinEntry(packageJsonPath);
55
+ if (binDetection) {
56
+ detections.push(binDetection);
57
+ }
58
+ }
59
+ // Deduplicate by tag, keeping highest confidence
60
+ const deduped = deduplicateDetections(detections);
61
+ logger.info("Project analysis complete", {
62
+ projectDir,
63
+ detections: deduped.length,
64
+ tags: deduped.map((d) => d.tag),
65
+ });
66
+ return deduped;
67
+ }
68
+ /**
69
+ * Analyze package.json dependencies for framework detection.
70
+ */
71
+ function analyzePackageJson(filePath) {
72
+ try {
73
+ const content = readFileSync(filePath, "utf-8");
74
+ const pkg = JSON.parse(content);
75
+ const allDeps = {
76
+ ...pkg["dependencies"],
77
+ ...pkg["devDependencies"],
78
+ };
79
+ const depNames = Object.keys(allDeps);
80
+ const detections = [];
81
+ for (const pattern of DEPENDENCY_PATTERNS) {
82
+ const found = pattern.packages.filter((p) => depNames.includes(p));
83
+ if (found.length > 0) {
84
+ detections.push({
85
+ tag: pattern.tag,
86
+ confidence: Math.min(0.6 + found.length * 0.15, 0.95),
87
+ evidence: [pattern.evidence, `found: ${found.join(", ")}`],
88
+ });
89
+ }
90
+ }
91
+ return detections;
92
+ }
93
+ catch (error) {
94
+ logger.warn("Failed to parse package.json", {
95
+ path: filePath,
96
+ error: error instanceof Error ? error.message : String(error),
97
+ });
98
+ return [];
99
+ }
100
+ }
101
+ /**
102
+ * Check for presence of indicator files.
103
+ */
104
+ function analyzeFilePresence(projectDir) {
105
+ const detections = [];
106
+ for (const pattern of FILE_PATTERNS) {
107
+ const found = pattern.files.filter((f) => existsSync(join(projectDir, f)));
108
+ if (found.length > 0) {
109
+ detections.push({
110
+ tag: pattern.tag,
111
+ confidence: 0.7,
112
+ evidence: [pattern.evidence, `found: ${found.join(", ")}`],
113
+ });
114
+ }
115
+ }
116
+ return detections;
117
+ }
118
+ /**
119
+ * Analyze Python project configuration files.
120
+ */
121
+ function analyzePythonProject(projectDir) {
122
+ const detections = [];
123
+ const pyprojectPath = join(projectDir, "pyproject.toml");
124
+ if (existsSync(pyprojectPath)) {
125
+ try {
126
+ const content = readFileSync(pyprojectPath, "utf-8");
127
+ if (content.includes("fastapi") || content.includes("flask") || content.includes("django")) {
128
+ detections.push({
129
+ tag: "API",
130
+ confidence: 0.85,
131
+ evidence: ["Python web framework in pyproject.toml"],
132
+ });
133
+ }
134
+ if (content.includes("pandas") || content.includes("apache-airflow") || content.includes("prefect")) {
135
+ detections.push({
136
+ tag: "DATA-PIPELINE",
137
+ confidence: 0.8,
138
+ evidence: ["Data processing library in pyproject.toml"],
139
+ });
140
+ }
141
+ if (content.includes("scikit-learn") || content.includes("torch") || content.includes("tensorflow")) {
142
+ detections.push({
143
+ tag: "ML",
144
+ confidence: 0.85,
145
+ evidence: ["ML framework in pyproject.toml"],
146
+ });
147
+ }
148
+ }
149
+ catch {
150
+ // pyproject.toml parsing failed, skip
151
+ }
152
+ }
153
+ return detections;
154
+ }
155
+ /**
156
+ * Check if package.json has a bin entry (CLI indicator).
157
+ */
158
+ function analyzeBinEntry(filePath) {
159
+ try {
160
+ const content = readFileSync(filePath, "utf-8");
161
+ const pkg = JSON.parse(content);
162
+ if (pkg["bin"]) {
163
+ return {
164
+ tag: "CLI",
165
+ confidence: 0.8,
166
+ evidence: ["bin entry found in package.json"],
167
+ };
168
+ }
169
+ return null;
170
+ }
171
+ catch {
172
+ return null;
173
+ }
174
+ }
175
+ /**
176
+ * Deduplicate detections by tag, keeping highest confidence per tag.
177
+ */
178
+ function deduplicateDetections(detections) {
179
+ const byTag = new Map();
180
+ for (const detection of detections) {
181
+ const existing = byTag.get(detection.tag);
182
+ if (!existing || detection.confidence > existing.confidence) {
183
+ byTag.set(detection.tag, {
184
+ ...detection,
185
+ evidence: existing
186
+ ? [...existing.evidence, ...detection.evidence]
187
+ : detection.evidence,
188
+ });
189
+ }
190
+ }
191
+ return Array.from(byTag.values());
192
+ }
193
+ /**
194
+ * Analyze a text description for tag mentions.
195
+ */
196
+ export function analyzeDescription(description) {
197
+ const detections = [];
198
+ const lower = description.toLowerCase();
199
+ const descriptionPatterns = [
200
+ { keywords: ["react", "next.js", "nextjs", "frontend", "ui component"], tag: "WEB-REACT", evidence: "React/frontend mentioned in description" },
201
+ { keywords: ["api", "rest", "graphql", "backend", "server", "endpoint"], tag: "API", evidence: "API/backend mentioned in description" },
202
+ { keywords: ["blockchain", "crypto", "defi", "web3", "solidity", "ethereum", "smart contract"], tag: "WEB3", evidence: "Blockchain/Web3 mentioned in description" },
203
+ { keywords: ["game", "arcade", "gameplay", "player"], tag: "GAME", evidence: "Game mentioned in description" },
204
+ { keywords: ["social", "networking", "linkedin", "profile", "feed", "connection"], tag: "SOCIAL", evidence: "Social features mentioned in description" },
205
+ { keywords: ["realtime", "real-time", "websocket", "live", "streaming"], tag: "REALTIME", evidence: "Real-time features mentioned in description" },
206
+ { keywords: ["state machine", "workflow", "finite state", "transition"], tag: "STATE-MACHINE", evidence: "State machine mentioned in description" },
207
+ { keywords: ["cli", "command-line", "command line", "terminal tool"], tag: "CLI", evidence: "CLI tool mentioned in description" },
208
+ { keywords: ["library", "package", "npm", "sdk", "module"], tag: "LIBRARY", evidence: "Library/package mentioned in description" },
209
+ { keywords: ["data pipeline", "etl", "data processing", "batch"], tag: "DATA-PIPELINE", evidence: "Data pipeline mentioned in description" },
210
+ { keywords: ["machine learning", "ml model", "training", "inference", "neural"], tag: "ML", evidence: "ML mentioned in description" },
211
+ { keywords: ["hipaa", "phi", "healthcare", "medical", "patient"], tag: "HEALTHCARE", evidence: "Healthcare mentioned in description" },
212
+ { keywords: ["financial", "fintech", "payment", "transaction", "banking"], tag: "FINTECH", evidence: "Fintech mentioned in description" },
213
+ { keywords: ["analytics", "dashboard", "reporting", "metrics", "data warehouse"], tag: "ANALYTICS", evidence: "Analytics mentioned in description" },
214
+ { keywords: ["mobile", "react native", "flutter", "ios", "android"], tag: "MOBILE", evidence: "Mobile mentioned in description" },
215
+ { keywords: ["infrastructure", "terraform", "kubernetes", "devops", "deploy"], tag: "INFRA", evidence: "Infrastructure mentioned in description" },
216
+ ];
217
+ for (const pattern of descriptionPatterns) {
218
+ const found = pattern.keywords.filter((kw) => lower.includes(kw));
219
+ if (found.length > 0) {
220
+ detections.push({
221
+ tag: pattern.tag,
222
+ confidence: Math.min(0.5 + found.length * 0.15, 0.9),
223
+ evidence: [pattern.evidence],
224
+ });
225
+ }
226
+ }
227
+ return deduplicateDetections(detections);
228
+ }
229
+ //# sourceMappingURL=package-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-json.js","sourceRoot":"","sources":["../../src/analyzers/package-json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * ForgeCraft MCP Server — Entry Point.
4
+ *
5
+ * Registers all tools and starts the MCP server over stdio transport.
6
+ * This is the binary entry point run via `npx forgecraft-mcp`.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
package/dist/index.js ADDED
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * ForgeCraft MCP Server — Entry Point.
4
+ *
5
+ * Registers all tools and starts the MCP server over stdio transport.
6
+ * This is the binary entry point run via `npx forgecraft-mcp`.
7
+ */
8
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
9
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
10
+ import { createLogger } from "./shared/logger/index.js";
11
+ // ── Tool imports ─────────────────────────────────────────────────────
12
+ import { listTagsSchema, listTagsHandler, listHooksSchema, listHooksHandler, } from "./tools/list.js";
13
+ import { classifyProjectSchema, classifyProjectHandler, } from "./tools/classify.js";
14
+ import { scaffoldProjectSchema, scaffoldProjectHandler, } from "./tools/scaffold.js";
15
+ import { generateClaudeMdSchema, generateClaudeMdHandler, } from "./tools/generate-claude-md.js";
16
+ import { auditProjectSchema, auditProjectHandler, } from "./tools/audit.js";
17
+ import { addHookSchema, addHookHandler, } from "./tools/add-hook.js";
18
+ import { addModuleSchema, addModuleHandler, } from "./tools/add-module.js";
19
+ import { configureMcpSchema, configureMcpHandler, } from "./tools/configure-mcp.js";
20
+ import { getNfrTemplateSchema, getNfrTemplateHandler, } from "./tools/get-nfr.js";
21
+ import { convertExistingSchema, convertExistingHandler, } from "./tools/convert.js";
22
+ import { reviewProjectSchema, reviewProjectHandler, } from "./tools/review.js";
23
+ import { setupProjectSchema, setupProjectHandler, } from "./tools/setup-project.js";
24
+ import { refreshProjectSchema, refreshProjectHandler, } from "./tools/refresh-project.js";
25
+ // ── Server Setup ─────────────────────────────────────────────────────
26
+ const logger = createLogger("server");
27
+ async function main() {
28
+ logger.info("Starting ForgeCraft MCP server");
29
+ const server = new McpServer({
30
+ name: "forgecraft",
31
+ version: "0.1.0",
32
+ });
33
+ // ── Register Tools ───────────────────────────────────────────────
34
+ server.tool("list_tags", "List all available project classification tags with descriptions.", listTagsSchema.shape, listTagsHandler);
35
+ server.tool("list_hooks", "List available hooks, optionally filtered by tags.", listHooksSchema.shape, listHooksHandler);
36
+ 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 (CLAUDE.md, Status.md, hooks, folders) from tags.", scaffoldProjectSchema.shape, scaffoldProjectHandler);
38
+ server.tool("generate_claude_md", "Generate or regenerate a production-grade CLAUDE.md for given tags. Goes far beyond what 'claude init' produces — adds SOLID principles, testing pyramid, architecture patterns, CI/CD, and domain-specific standards from 112 curated blocks. Can merge with an existing CLAUDE.md to preserve custom sections.", generateClaudeMdSchema.shape, generateClaudeMdHandler);
39
+ server.tool("audit_project", "Audit project against template standards and report violations with a score.", auditProjectSchema.shape, auditProjectHandler);
40
+ server.tool("add_hook", "Add a specific quality-gate hook script to the project.", addHookSchema.shape, addHookHandler);
41
+ server.tool("add_module", "Scaffold a new feature module following established patterns.", addModuleSchema.shape, addModuleHandler);
42
+ server.tool("configure_mcp", "Generate .claude/settings.json with recommended MCP servers for active tags.", configureMcpSchema.shape, configureMcpHandler);
43
+ server.tool("get_nfr_template", "Get NFR (Non-Functional Requirement) sections for specific tags.", getNfrTemplateSchema.shape, getNfrTemplateHandler);
44
+ server.tool("convert_existing", "Analyze an existing codebase and generate a phased migration plan.", convertExistingSchema.shape, convertExistingHandler);
45
+ 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
+ server.tool("setup_project", "RECOMMENDED FIRST STEP — goes beyond 'claude init' by generating production-grade CLAUDE.md from 112 curated template blocks. 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). Call this when starting a new project, onboarding an existing codebase, or when 'claude init' gave you a basic CLAUDE.md and you want real standards. Works for new and existing projects. Supports tier-based content filtering (core/recommended/optional).", setupProjectSchema.shape, setupProjectHandler);
47
+ server.tool("refresh_project", "Re-analyze a project that already has forgecraft.yaml. Detects tag drift (e.g. new framework added), proposes adding/removing tags, shows content impact. Use when project scope changes, new dependencies are added, or to upgrade content tier. Preview changes before applying.", refreshProjectSchema.shape, refreshProjectHandler);
48
+ // ── Start Stdio Transport ────────────────────────────────────────
49
+ const transport = new StdioServerTransport();
50
+ await server.connect(transport);
51
+ logger.info("ForgeCraft MCP server running on stdio");
52
+ }
53
+ main().catch((error) => {
54
+ logger.error("Fatal server error", {
55
+ error: error instanceof Error ? error.message : String(error),
56
+ });
57
+ process.exit(1);
58
+ });
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Template composer.
3
+ *
4
+ * Given a set of active tags, composes CLAUDE.md blocks, folder structures,
5
+ * hooks, and NFRs from all matching templates into unified outputs.
6
+ * Handles merge, deduplication, ordering, and tier-based filtering.
7
+ */
8
+ import type { Tag, TagTemplateSet, ClaudeMdBlock, StructureEntry, NfrBlock, HookTemplate, ReviewBlock, ForgeCraftConfig } from "../shared/types.js";
9
+ /** Composed output for a set of active tags. */
10
+ export interface ComposedTemplates {
11
+ readonly claudeMdBlocks: ClaudeMdBlock[];
12
+ readonly structureEntries: StructureEntry[];
13
+ readonly nfrBlocks: NfrBlock[];
14
+ readonly hooks: HookTemplate[];
15
+ readonly reviewBlocks: ReviewBlock[];
16
+ }
17
+ /** Options for controlling template composition. */
18
+ export interface ComposeOptions {
19
+ /** ForgeCraft project config with tier preferences and include/exclude. */
20
+ readonly config?: ForgeCraftConfig;
21
+ }
22
+ /**
23
+ * Compose templates for a given set of active tags.
24
+ * UNIVERSAL is always included first regardless of whether it's in the tags list.
25
+ *
26
+ * @param activeTags - Tags to compose for
27
+ * @param allTemplates - Full template map from the loader
28
+ * @param options - Optional composition config (tier filtering, include/exclude)
29
+ * @returns Composed and filtered templates
30
+ */
31
+ export declare function composeTemplates(activeTags: Tag[], allTemplates: Map<Tag, TagTemplateSet>, options?: ComposeOptions): ComposedTemplates;
32
+ //# sourceMappingURL=composer.d.ts.map
@@ -0,0 +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,aAAa,EACb,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,WAAW,EAEX,gBAAgB,EACjB,MAAM,oBAAoB,CAAC;AAoB5B,gDAAgD;AAChD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,cAAc,EAAE,aAAa,EAAE,CAAC;IACzC,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,YAAY,EAAE,WAAW,EAAE,CAAC;CACtC;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,CAuGnB"}