forgecraft-mcp 1.0.1 → 1.0.2

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 CHANGED
@@ -413,6 +413,8 @@ The quality gate library grows through community contribution. If you propose a
413
413
 
414
414
  [Open a gate proposal →](.github/ISSUE_TEMPLATE/quality-gate-proposal.md) · [See contributors →](CONTRIBUTORS.md)
415
415
 
416
+ Running this with a team? → [forgeworkshop.dev](https://forgeworkshop.dev)
417
+
416
418
  ---
417
419
 
418
420
  ## Theoretical foundation
@@ -1 +1 @@
1
- {"version":3,"file":"anti-pattern.d.ts","sourceRoot":"","sources":["../../src/analyzers/anti-pattern.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIrD,uCAAuC;AACvC,UAAU,UAAU;IAClB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACpC;AAOD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,OAAO,CAAC,UAAU,CAAM,GAC/B;IAAE,UAAU,EAAE,UAAU,EAAE,CAAC;IAAC,QAAQ,EAAE,UAAU,EAAE,CAAA;CAAE,CAoGtD"}
1
+ {"version":3,"file":"anti-pattern.d.ts","sourceRoot":"","sources":["../../src/analyzers/anti-pattern.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIrD,uCAAuC;AACvC,UAAU,UAAU;IAClB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACpC;AAOD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,OAAO,CAAC,UAAU,CAAM,GAC/B;IAAE,UAAU,EAAE,UAAU,EAAE,CAAC;IAAC,QAAQ,EAAE,UAAU,EAAE,CAAA;CAAE,CAsGtD"}
@@ -92,12 +92,40 @@ export function scanAntiPatterns(projectDir, config = {}) {
92
92
  // Skip unreadable files
93
93
  }
94
94
  }
95
+ checkRedundantDeployPipeline(projectDir, warnings);
95
96
  logger.info("Anti-pattern scan complete", {
96
97
  violations: violations.length,
97
98
  warnings: warnings.length,
98
99
  });
99
100
  return { violations, warnings };
100
101
  }
102
+ /** Platform deploy config filenames that indicate Railway/Vercel/Fly/Render deploys. */
103
+ const PLATFORM_DEPLOY_CONFIGS = [
104
+ "railway.toml",
105
+ "railway.json",
106
+ "vercel.json",
107
+ "fly.toml",
108
+ "render.yaml",
109
+ "render.yml",
110
+ ];
111
+ /**
112
+ * Warn when a project has both a platform deploy config and .github/workflows/.
113
+ * Both will trigger on push — the CI/CD is duplicated and one should be removed.
114
+ */
115
+ function checkRedundantDeployPipeline(projectDir, warnings) {
116
+ const hasPlatformConfig = PLATFORM_DEPLOY_CONFIGS.some((f) => existsSync(join(projectDir, f)));
117
+ if (!hasPlatformConfig)
118
+ return;
119
+ const hasGithubWorkflows = existsSync(join(projectDir, ".github", "workflows"));
120
+ if (!hasGithubWorkflows)
121
+ return;
122
+ const platformFile = PLATFORM_DEPLOY_CONFIGS.find((f) => existsSync(join(projectDir, f)));
123
+ warnings.push({
124
+ check: "redundant_deploy_pipeline",
125
+ message: `${platformFile} and .github/workflows/ both exist. Platform deploy (Railway/Vercel/Fly/Render) and GitHub Actions may both trigger on push — remove the redundant pipeline.`,
126
+ severity: "warning",
127
+ });
128
+ }
101
129
  /**
102
130
  * Check if a file is a source code file.
103
131
  */
@@ -1 +1 @@
1
- {"version":3,"file":"anti-pattern.js","sourceRoot":"","sources":["../../src/analyzers/anti-pattern.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"anti-pattern.js","sourceRoot":"","sources":["../../src/analyzers/anti-pattern.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGrD,MAAM,MAAM,GAAG,YAAY,CAAC,wBAAwB,CAAC,CAAC;AAQtD,MAAM,cAAc,GAAe;IACjC,aAAa,EAAE,GAAG;IAClB,iBAAiB,EAAE,CAAC;CACrB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,UAAkB,EAClB,SAA8B,EAAE;IAEhC,MAAM,GAAG,GAAe,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;IACzD,MAAM,UAAU,GAAiB,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAiB,EAAE,CAAC;IAElC,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9E,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;QACxC,UAAU,EAAE,QAAQ,CAAC,MAAM;QAC3B,WAAW,EAAE,WAAW,CAAC,MAAM;KAChC,CAAC,CAAC;IAEH,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,SAAS;QAEpC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAChD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAElC,oBAAoB;YACpB,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,aAAa,EAAE,CAAC;gBACrC,QAAQ,CAAC,IAAI,CAAC;oBACZ,KAAK,EAAE,aAAa;oBACpB,OAAO,EAAE,GAAG,OAAO,KAAK,KAAK,CAAC,MAAM,eAAe,GAAG,CAAC,aAAa,wBAAwB;oBAC5F,QAAQ,EAAE,SAAS;iBACpB,CAAC,CAAC;YACL,CAAC;YAED,+CAA+C;YAC/C,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,MAAM,UAAU,GAAG,WAAW,CAC5B,KAAK,EACL,qCAAqC;gBACrC,2DAA2D;gBAC3D,kEAAkE;gBAClE,0EAA0E;gBAC1E,sGAAsG,CACvG,CAAC;gBACF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC1B,UAAU,CAAC,IAAI,CAAC;wBACd,KAAK,EAAE,eAAe;wBACtB,OAAO,EAAE,GAAG,OAAO,mCAAmC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB;wBACnG,QAAQ,EAAE,OAAO;qBAClB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,8CAA8C;YAC9C,MAAM,WAAW,GAAG,WAAW,CAC7B,KAAK,EACL,+EAA+E;YAC/E,0EAA0E;YAC1E,0BAA0B,CAC3B,CAAC;YACF,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,UAAU,CAAC,IAAI,CAAC;oBACd,KAAK,EAAE,gBAAgB;oBACvB,OAAO,EAAE,GAAG,OAAO,oCAAoC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,gCAAgC;oBAC7G,QAAQ,EAAE,OAAO;iBAClB,CAAC,CAAC;YACL,CAAC;YAED,gDAAgD;YAChD,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvD,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAAC;gBAC/D,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC3B,QAAQ,CAAC,IAAI,CAAC;wBACZ,KAAK,EAAE,gBAAgB;wBACvB,OAAO,EAAE,GAAG,OAAO,6BAA6B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,6BAA6B;wBACnG,QAAQ,EAAE,SAAS;qBACpB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,kCAAkC;YAClC,MAAM,WAAW,GAAG,WAAW,CAC7B,KAAK,EACL,yDAAyD,EACzD,yDAAyD,CAC1D,CAAC;YACF,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,UAAU,CAAC,IAAI,CAAC;oBACd,KAAK,EAAE,sBAAsB;oBAC7B,OAAO,EAAE,GAAG,OAAO,8CAA8C,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;oBAC1F,QAAQ,EAAE,OAAO;iBAClB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAED,4BAA4B,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAEnD,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;QACxC,UAAU,EAAE,UAAU,CAAC,MAAM;QAC7B,QAAQ,EAAE,QAAQ,CAAC,MAAM;KAC1B,CAAC,CAAC;IAEH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AAClC,CAAC;AAED,wFAAwF;AACxF,MAAM,uBAAuB,GAAG;IAC9B,cAAc;IACd,cAAc;IACd,aAAa;IACb,UAAU;IACV,aAAa;IACb,YAAY;CACJ,CAAC;AAEX;;;GAGG;AACH,SAAS,4BAA4B,CACnC,UAAkB,EAClB,QAAsB;IAEtB,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC3D,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAChC,CAAC;IACF,IAAI,CAAC,iBAAiB;QAAE,OAAO;IAE/B,MAAM,kBAAkB,GAAG,UAAU,CACnC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,WAAW,CAAC,CACzC,CAAC;IACF,IAAI,CAAC,kBAAkB;QAAE,OAAO;IAEhC,MAAM,YAAY,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CACtD,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CACtB,CAAC;IAEZ,QAAQ,CAAC,IAAI,CAAC;QACZ,KAAK,EAAE,2BAA2B;QAClC,OAAO,EAAE,GAAG,YAAY,8JAA8J;QACtL,QAAQ,EAAE,SAAS;KACpB,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,QAAgB;IACpC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9B,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAC1E,GAAG,CACJ,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,QAAgB;IAClC,OAAO,mGAAmG,CAAC,IAAI,CAC7G,QAAQ,CACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,QAAgB;IACpC,OAAO,oDAAoD,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC7E,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAClB,KAAe,EACf,OAAe,EACf,cAAuB;IAEvB,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAW,CAAC;QAChC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,cAAc,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClD,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * ForgeCraft — Gate Contribution Route.
3
+ *
4
+ * Extracted from http-server.ts so it can be unit-tested without
5
+ * starting a live Express server (which calls app.listen at module load).
6
+ *
7
+ * Usage:
8
+ * app.use(createContributeGateRouter())
9
+ */
10
+ import { Router } from "express";
11
+ export interface ContributeGateRouterOptions {
12
+ /** Max gate proposals per IP per 15-minute window. Default: 5. */
13
+ maxRequestsPerWindow?: number;
14
+ }
15
+ /**
16
+ * Creates an Express Router with POST /contribute/gate.
17
+ * Requires GITHUB_TOKEN env var at request time.
18
+ * Rate-limited to maxRequestsPerWindow per IP per 15 minutes.
19
+ */
20
+ export declare function createContributeGateRouter(options?: ContributeGateRouterOptions): Router;
21
+ //# sourceMappingURL=http-server-contribute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server-contribute.d.ts","sourceRoot":"","sources":["../src/http-server-contribute.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAkGjC,MAAM,WAAW,2BAA2B;IAC1C,kEAAkE;IAClE,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,GAAE,2BAAgC,GACxC,MAAM,CAsFR"}
@@ -0,0 +1,168 @@
1
+ /**
2
+ * ForgeCraft — Gate Contribution Route.
3
+ *
4
+ * Extracted from http-server.ts so it can be unit-tested without
5
+ * starting a live Express server (which calls app.listen at module load).
6
+ *
7
+ * Usage:
8
+ * app.use(createContributeGateRouter())
9
+ */
10
+ import { Router } from "express";
11
+ import { rateLimit } from "express-rate-limit";
12
+ import { z } from "zod";
13
+ const QUALITY_GATES_REPO = "jghiringhelli/generative-specification";
14
+ const GITHUB_API = "https://api.github.com";
15
+ const gateContributionSchema = z.object({
16
+ gate: z.object({
17
+ id: z.string(),
18
+ title: z.string().optional(),
19
+ description: z.string().optional(),
20
+ domain: z.string().optional(),
21
+ gsProperty: z.string().optional(),
22
+ phase: z.string().optional(),
23
+ hook: z.string().optional(),
24
+ check: z.string().optional(),
25
+ passCriterion: z.string().optional(),
26
+ tags: z.array(z.string()).optional(),
27
+ evidence: z.string(),
28
+ convergenceAttributes: z.record(z.boolean()).optional(),
29
+ }),
30
+ mode: z.enum(["anonymous", "attributed"]),
31
+ attribution: z
32
+ .object({
33
+ github: z.string().optional(),
34
+ projectType: z.string().optional(),
35
+ })
36
+ .optional(),
37
+ experimentId: z.string().optional(),
38
+ });
39
+ /**
40
+ * Formats a gate proposal as a GitHub Issue body in Markdown.
41
+ */
42
+ function formatIssueBody(payload) {
43
+ const { gate, mode, attribution, experimentId } = payload;
44
+ const lines = [
45
+ `## Gate Proposal: \`${gate.id}\``,
46
+ "",
47
+ `**Mode:** ${mode}`,
48
+ ];
49
+ if (mode === "attributed" && attribution?.github) {
50
+ lines.push(`**Contributor:** @${attribution.github}`);
51
+ }
52
+ if (attribution?.projectType) {
53
+ lines.push(`**Project type:** ${attribution.projectType}`);
54
+ }
55
+ if (experimentId) {
56
+ lines.push(`**Experiment:** \`${experimentId}\``);
57
+ }
58
+ lines.push("", "---", "");
59
+ if (gate.title)
60
+ lines.push(`### ${gate.title}`, "");
61
+ if (gate.description)
62
+ lines.push(gate.description, "");
63
+ const fields = [
64
+ ["GS Property", gate.gsProperty],
65
+ ["Phase", gate.phase],
66
+ ["Hook", gate.hook],
67
+ ["Domain", gate.domain],
68
+ ["Tags", gate.tags?.join(", ")],
69
+ ];
70
+ const populated = fields.filter(([, v]) => v);
71
+ if (populated.length > 0) {
72
+ lines.push("| Field | Value |", "|---|---|");
73
+ for (const [k, v] of populated)
74
+ lines.push(`| ${k} | ${v} |`);
75
+ lines.push("");
76
+ }
77
+ if (gate.check) {
78
+ lines.push("**Check:**", "```", gate.check, "```", "");
79
+ }
80
+ if (gate.passCriterion) {
81
+ lines.push(`**Pass criterion:** ${gate.passCriterion}`, "");
82
+ }
83
+ if (gate.evidence) {
84
+ lines.push("**Evidence:**", gate.evidence, "");
85
+ }
86
+ if (gate.convergenceAttributes) {
87
+ const attrs = Object.entries(gate.convergenceAttributes)
88
+ .map(([k, v]) => `- ${k}: ${v ? "✅" : "❌"}`)
89
+ .join("\n");
90
+ lines.push("**Convergence attributes:**", attrs, "");
91
+ }
92
+ lines.push("---", "_Submitted via ForgeCraft `contribute_gate`. Review and label `approved` to graduate._");
93
+ return lines.join("\n");
94
+ }
95
+ /**
96
+ * Creates an Express Router with POST /contribute/gate.
97
+ * Requires GITHUB_TOKEN env var at request time.
98
+ * Rate-limited to maxRequestsPerWindow per IP per 15 minutes.
99
+ */
100
+ export function createContributeGateRouter(options = {}) {
101
+ const { maxRequestsPerWindow = 5 } = options;
102
+ const router = Router();
103
+ router.use(rateLimit({
104
+ windowMs: 15 * 60 * 1000,
105
+ max: maxRequestsPerWindow,
106
+ standardHeaders: true,
107
+ legacyHeaders: false,
108
+ message: {
109
+ error: "Too many gate proposals from this IP. Please wait before submitting again.",
110
+ },
111
+ }));
112
+ router.post("/contribute/gate", async (req, res) => {
113
+ const githubToken = process.env.GITHUB_TOKEN;
114
+ if (!githubToken) {
115
+ res.status(503).json({
116
+ error: "Gate contributions unavailable: GITHUB_TOKEN not set",
117
+ });
118
+ return;
119
+ }
120
+ const parsed = gateContributionSchema.safeParse(req.body);
121
+ if (!parsed.success) {
122
+ res
123
+ .status(422)
124
+ .json({ error: "Invalid payload", details: parsed.error.flatten() });
125
+ return;
126
+ }
127
+ const { gate, mode, attribution } = parsed.data;
128
+ const title = `[Gate Proposal] ${gate.id}${mode === "attributed" && attribution?.github
129
+ ? ` — @${attribution.github}`
130
+ : ""}`;
131
+ const body = formatIssueBody(parsed.data);
132
+ const labels = ["gate-proposal", "quarantine", "status:pending-review"];
133
+ try {
134
+ const response = await fetch(`${GITHUB_API}/repos/${QUALITY_GATES_REPO}/issues`, {
135
+ method: "POST",
136
+ headers: {
137
+ Authorization: `Bearer ${githubToken}`,
138
+ Accept: "application/vnd.github+json",
139
+ "Content-Type": "application/json",
140
+ "X-GitHub-Api-Version": "2022-11-28",
141
+ },
142
+ body: JSON.stringify({ title, body, labels }),
143
+ signal: AbortSignal.timeout(10000),
144
+ });
145
+ if (!response.ok) {
146
+ const err = await response.text();
147
+ console.error(`GitHub API error ${response.status}: ${err}`);
148
+ res
149
+ .status(502)
150
+ .json({ error: "GitHub API error", status: response.status });
151
+ return;
152
+ }
153
+ const issue = (await response.json());
154
+ console.log(`Gate proposal submitted: ${gate.id} → ${issue.html_url}`);
155
+ res.status(200).json({
156
+ status: "submitted",
157
+ issueUrl: issue.html_url,
158
+ issueNumber: issue.number,
159
+ });
160
+ }
161
+ catch (err) {
162
+ console.error("Gate contribution failed:", err);
163
+ res.status(503).json({ error: "Failed to reach GitHub API" });
164
+ }
165
+ });
166
+ return router;
167
+ }
168
+ //# sourceMappingURL=http-server-contribute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server-contribute.js","sourceRoot":"","sources":["../src/http-server-contribute.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,9 @@
7
7
  * rather than local paths — the AI agent reads files locally and sends
8
8
  * them here; the server returns CLI command guidance.
9
9
  *
10
+ * Also exposes POST /contribute/gate — receives gate proposals from
11
+ * forgecraft clients and opens GitHub Issues on jghiringhelli/quality-gates.
12
+ *
10
13
  * Local / CLI usage stays on stdio via the main entry point (index.ts).
11
14
  */
12
15
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":";AAEA;;;;;;;;;GASG"}
1
+ {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;GAYG"}
@@ -7,6 +7,9 @@
7
7
  * rather than local paths — the AI agent reads files locally and sends
8
8
  * them here; the server returns CLI command guidance.
9
9
  *
10
+ * Also exposes POST /contribute/gate — receives gate proposals from
11
+ * forgecraft clients and opens GitHub Issues on jghiringhelli/quality-gates.
12
+ *
10
13
  * Local / CLI usage stays on stdio via the main entry point (index.ts).
11
14
  */
12
15
  import express from "express";
@@ -14,6 +17,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
14
17
  import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
15
18
  import { z } from "zod";
16
19
  import { ALL_TAGS } from "./shared/types.js";
20
+ import { createContributeGateRouter } from "./http-server-contribute.js";
17
21
  const PORT = process.env.PORT ? parseInt(process.env.PORT, 10) : 3000;
18
22
  const HOST = process.env.HOST ?? "0.0.0.0";
19
23
  // ── Tool: hosted sentinel ─────────────────────────────────────────────
@@ -82,16 +86,74 @@ function listTagsHandler() {
82
86
  }
83
87
  // ── MCP Server factory ────────────────────────────────────────────────
84
88
  /**
85
- * Create a fresh MCP server instance with all hosted tools registered.
86
- * Called per-request in stateless mode.
89
+ * Create a fresh MCP server instance with all hosted tools, prompts, and
90
+ * resources registered. Called per-request in stateless mode.
87
91
  */
88
92
  function createServer() {
89
93
  const server = new McpServer({
90
94
  name: "forgecraft",
91
95
  version: "1.0.0",
92
96
  });
93
- server.tool("forgecraft", "Diagnose ForgeCraft project state and return CLI commands to run locally. Pass forgecraft.yaml contents and artifact presence flags.", hostedSentinelSchema.shape, (args) => hostedSentinelHandler(args));
94
- server.tool("list_tags", "Return all 24 ForgeCraft classification tags. Use these to pick the right tags for npx forgecraft-mcp setup.", {}, () => listTagsHandler());
97
+ // ── Tools ──────────────────────────────────────────────────────────
98
+ server.tool("forgecraft", "Diagnose ForgeCraft project state and return CLI commands to run locally. Pass forgecraft.yaml contents and artifact presence flags.", hostedSentinelSchema.shape, { readOnlyHint: true, openWorldHint: false }, (args) => hostedSentinelHandler(args));
99
+ server.tool("list_tags", "Return all ForgeCraft classification tags. Use these to pick the right tags for npx forgecraft-mcp setup.", {}, { readOnlyHint: true, openWorldHint: false }, () => listTagsHandler());
100
+ // ── Prompts ────────────────────────────────────────────────────────
101
+ server.prompt("setup-project", "Scaffold ForgeCraft engineering standards for a project. Checks current state then runs setup.", {
102
+ project_dir: z
103
+ .string()
104
+ .describe("Absolute path to the project root directory."),
105
+ }, ({ project_dir }) => ({
106
+ messages: [
107
+ {
108
+ role: "user",
109
+ content: {
110
+ type: "text",
111
+ text: [
112
+ `Set up ForgeCraft engineering standards for the project at: ${project_dir}`,
113
+ "",
114
+ "Steps:",
115
+ "1. Call the `forgecraft` tool with the artifact presence flags for this project.",
116
+ "2. Follow its recommendations: run the suggested npx forgecraft-mcp commands locally.",
117
+ "3. Once setup is complete, remove ForgeCraft from your MCP servers to save tokens.",
118
+ "",
119
+ "Tip: After running `npx forgecraft-mcp setup .`, your project will have a CLAUDE.md",
120
+ "constitution, commit hooks, and a forgecraft.yaml config — all auto-tailored to your stack.",
121
+ ].join("\n"),
122
+ },
123
+ },
124
+ ],
125
+ }));
126
+ // ── Resources ──────────────────────────────────────────────────────
127
+ server.resource("tag-taxonomy", "forgecraft://tags", {
128
+ description: "Complete ForgeCraft tag taxonomy. Use these tags to configure stack-specific engineering standards.",
129
+ mimeType: "text/plain",
130
+ }, () => ({
131
+ contents: [
132
+ {
133
+ uri: "forgecraft://tags",
134
+ mimeType: "text/plain",
135
+ text: [
136
+ "# ForgeCraft Tag Taxonomy",
137
+ "",
138
+ "Use these tags with: npx forgecraft-mcp setup . --tags <TAG1> <TAG2>",
139
+ "",
140
+ ...ALL_TAGS.map((tag) => `- ${tag}`),
141
+ "",
142
+ "Stack tags (UNIVERSAL is always included):",
143
+ " UNIVERSAL — core standards for all projects",
144
+ " API — REST/GraphQL API standards",
145
+ " WEB-REACT — React/Next.js frontend standards",
146
+ " GAME — game development standards",
147
+ " FINTECH — financial/compliance standards",
148
+ " ML — machine learning pipeline standards",
149
+ " MOBILE — React Native / mobile standards",
150
+ " CLI — command-line tool standards",
151
+ " LIBRARY — npm/pip package standards",
152
+ " WEB3 — smart contract / blockchain standards",
153
+ ].join("\n"),
154
+ },
155
+ ],
156
+ }));
95
157
  return server;
96
158
  }
97
159
  // ── Express app ───────────────────────────────────────────────────────
@@ -100,6 +162,8 @@ app.use(express.json());
100
162
  app.get("/health", (_req, res) => {
101
163
  res.json({ status: "ok", version: "1.0.0", transport: "streamable-http" });
102
164
  });
165
+ // ── Gate contribution endpoint (extracted to http-server-contribute.ts) ──
166
+ app.use(createContributeGateRouter());
103
167
  /** Stateless Streamable HTTP — new transport per request, no session state. */
104
168
  app.post("/mcp", async (req, res) => {
105
169
  const transport = new StreamableHTTPServerTransport({
@@ -1 +1 @@
1
- {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
2
2
  import { join } from "path";
3
- const DEFAULT_REGISTRY_URL = "https://raw.githubusercontent.com/jghiringhelli/quality-gates/master/index.json";
3
+ const DEFAULT_REGISTRY_URL = "https://raw.githubusercontent.com/jghiringhelli/generative-specification/main/quality-gates/index.json";
4
4
  const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
5
5
  /**
6
6
  * Fetches the remote quality-gates registry index.
@@ -20,11 +20,11 @@ export async function fetchRemoteGates(projectRoot, registryUrl) {
20
20
  try {
21
21
  const response = await fetch(url, {
22
22
  signal: AbortSignal.timeout(5000), // 5 second timeout
23
- headers: { "Accept": "application/json" },
23
+ headers: { Accept: "application/json" },
24
24
  });
25
25
  if (!response.ok)
26
26
  return emptyIndex();
27
- const data = await response.json();
27
+ const data = (await response.json());
28
28
  writeCache(cachePath, data, projectRoot);
29
29
  return data;
30
30
  }
@@ -75,6 +75,12 @@ function writeCache(cachePath, data, projectRoot) {
75
75
  }
76
76
  }
77
77
  function emptyIndex() {
78
- return { generatedAt: new Date().toISOString(), version: "1", gateCount: 0, tags: [], gates: [] };
78
+ return {
79
+ generatedAt: new Date().toISOString(),
80
+ version: "1",
81
+ gateCount: 0,
82
+ tags: [],
83
+ gates: [],
84
+ };
79
85
  }
80
86
  //# sourceMappingURL=remote-gates.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"remote-gates.js","sourceRoot":"","sources":["../../src/registry/remote-gates.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"remote-gates.js","sourceRoot":"","sources":["../../src/registry/remote-gates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AA2B5B,MAAM,oBAAoB,GACxB,wGAAwG,CAAC;AAE3G,MAAM,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW;AAOrD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,WAAmB,EACnB,WAAoB;IAEpB,MAAM,GAAG,GAAG,WAAW,IAAI,oBAAoB,CAAC;IAChD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,aAAa,EAAE,kBAAkB,CAAC,CAAC;IAEvE,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACpC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC;IAE/B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,mBAAmB;YACtD,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;SACxC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,UAAU,EAAE,CAAC;QAEtC,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAqB,CAAC;QACzD,UAAU,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,6DAA6D;QAC7D,OAAO,UAAU,EAAE,CAAC;IACtB,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAuB,EACvB,IAAc;IAEd,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC;IAC1C,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CACvB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,CAAC,IAAI;QACP,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;QACnB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CACrD,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,SAAiB;IAClC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAe,CAAC;QACzE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;QAC7D,IAAI,GAAG,GAAG,YAAY;YAAE,OAAO,IAAI,CAAC;QACpC,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CACjB,SAAiB,EACjB,IAAsB,EACtB,WAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QAC7C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAe,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC;QACxE,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,mCAAmC;IACrC,CAAC;AACH,CAAC;AAED,SAAS,UAAU;IACjB,OAAO;QACL,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,OAAO,EAAE,GAAG;QACZ,SAAS,EAAE,CAAC;QACZ,IAAI,EAAE,EAAE;QACR,KAAK,EAAE,EAAE;KACV,CAAC;AACJ,CAAC"}
@@ -4,7 +4,7 @@
4
4
  import type { ProjectDeploymentConfig } from "../shared/types.js";
5
5
  export declare const PROJECT_SPECIFIC_TEMPLATE = "# Project-Specific Rules\n<!-- This file is owned by YOU. ForgeCraft will never overwrite it. -->\n<!-- Add project-specific rules, framework choices, conventions, and corrections here. -->\n<!-- The sentinel CLAUDE.md links here so any AI reading your project can find it. -->\n\n## Framework & Stack Choices\n<!-- e.g. We use Prisma for ORM. Deploy target is Railway. Python 3.11+. -->\n\n## Custom Corrections Log\n<!-- Log AI corrections so the pattern isn't repeated. -->\n<!-- Format: - YYYY-MM-DD: [description of correction] -->\n\n## Project-Specific Gates\n<!-- Add quality rules specific to this project that don't belong in universal standards. -->\n";
6
6
  export declare const EXCEPTIONS_TEMPLATE: string;
7
- export declare const PROJECT_GATES_TEMPLATE = "version: \"1\"\n# Project-specific quality gates.\n# Gates you discover while working that should be enforced for this project.\n# Set generalizable: true + fill in evidence to contribute to the community registry.\n# See: https://github.com/genspec-dev/quality-gates/issues/new?template=quality-gate-proposal.md\ngates: []\n";
7
+ export declare const PROJECT_GATES_TEMPLATE = "version: \"1\"\n# Project-specific quality gates.\n# Gates you discover while working that should be enforced for this project.\n# Set generalizable: true + fill in evidence to contribute to the community registry.\n# See: https://github.com/jghiringhelli/quality-gates/issues/new?template=quality-gate-proposal.md\ngates: []\n";
8
8
  export declare const SMOKE_TESTS_README = "# Smoke Tests\n\nGenerated by ForgeCraft scaffold. Fill in the critical paths from your tech spec.\n\n## What smoke tests cover\n- Every API entry point that serves real users\n- Every critical user journey end-to-end\n- Every DB migration (verify schema applied correctly)\n- Every external integration handshake\n\n## Format\nUse the tool configured in forgecraft.yaml deployment.testing.smokeTool (or default to HTTP assertions).\nAll smoke tests must complete in < 60 seconds total.\n\n## Running\nSee forgecraft.yaml tools.test or your project's test runner.\nResults are written to .forgecraft/reports/smoke-latest.json.\n\n## Required before deployment\nAll smoke tests must pass against staging before any production deploy.\nSee verification.yaml deployment-gates phase.\n";
9
9
  export declare const LOAD_TESTS_README = "# Load Tests\n\nGenerated by ForgeCraft scaffold. Fill in the parameters from your tech spec.\n\n## Parameters (fill in from forgecraft.yaml deployment.testing.load)\n- Concurrent users: [TODO: concurrentUsers from forgecraft.yaml]\n- Target RPS: [TODO: targetRps from forgecraft.yaml]\n- p99 ceiling: [TODO: p99CeilingMs ms]\n- Duration: [TODO: durationSeconds seconds minimum]\n\n## When these parameters are missing\nDeploying without stated load test parameters is full deployment with manual monitoring.\nThe paper requires: parameters named in spec BEFORE the test runs, not after.\nAdd them to forgecraft.yaml deployment.testing.load before running.\n\n## Tool\nUse the tool configured in forgecraft.yaml deployment.testing.load.tool (k6, Artillery, Locust, etc.)\nResults are written to .forgecraft/reports/load-latest.json.\n\n## Required before pre-release\nSee verification.yaml pre-release-hardening phase, load-test step.\n";
10
10
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold-templates.d.ts","sourceRoot":"","sources":["../../src/tools/scaffold-templates.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAElE,eAAO,MAAM,yBAAyB,2pBAcrC,CAAC;AAEF,eAAO,MAAM,mBAAmB,QAStB,CAAC;AAEX,eAAO,MAAM,sBAAsB,0UAMlC,CAAC;AAEF,eAAO,MAAM,kBAAkB,kxBAqB9B,CAAC;AAEF,eAAO,MAAM,iBAAiB,66BAqB7B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CA6B5D;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,QAAQ,GAAG,MAAM,CAOzE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,YAAY,GAAG,QAAQ,GAAG,MAAM,CAM3E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAoB3C;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,uBAAuB,GAAG,MAAM,CAMlF;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,uBAAuB,GAAG,MAAM,CAUjF"}
1
+ {"version":3,"file":"scaffold-templates.d.ts","sourceRoot":"","sources":["../../src/tools/scaffold-templates.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAElE,eAAO,MAAM,yBAAyB,2pBAcrC,CAAC;AAEF,eAAO,MAAM,mBAAmB,QAUtB,CAAC;AAEX,eAAO,MAAM,sBAAsB,4UAMlC,CAAC;AAEF,eAAO,MAAM,kBAAkB,kxBAqB9B,CAAC;AAEF,eAAO,MAAM,iBAAiB,66BAqB7B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CA6B5D;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,QAAQ,GAAG,MAAM,CAezE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,YAAY,GAAG,QAAQ,GAAG,MAAM,CAO3E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAoB3C;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,uBAAuB,GAClC,MAAM,CAQR;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,uBAAuB,GAClC,MAAM,CA8BR"}
@@ -25,7 +25,7 @@ export const PROJECT_GATES_TEMPLATE = `version: "1"
25
25
  # Project-specific quality gates.
26
26
  # Gates you discover while working that should be enforced for this project.
27
27
  # Set generalizable: true + fill in evidence to contribute to the community registry.
28
- # See: https://github.com/genspec-dev/quality-gates/issues/new?template=quality-gate-proposal.md
28
+ # See: https://github.com/jghiringhelli/quality-gates/issues/new?template=quality-gate-proposal.md
29
29
  gates: []
30
30
  `;
31
31
  export const SMOKE_TESTS_README = `# Smoke Tests
@@ -118,7 +118,15 @@ export function renderGitignore(language) {
118
118
  const universal = [".env", ".env.*", "coverage/", "*.log", ".DS_Store"];
119
119
  const byLanguage = {
120
120
  typescript: ["node_modules/", "dist/", "build/", ".tsbuildinfo"],
121
- python: ["__pycache__/", "*.pyc", ".venv/", "venv/", "dist/", "*.egg-info/", ".mypy_cache/"],
121
+ python: [
122
+ "__pycache__/",
123
+ "*.pyc",
124
+ ".venv/",
125
+ "venv/",
126
+ "dist/",
127
+ "*.egg-info/",
128
+ ".mypy_cache/",
129
+ ],
122
130
  };
123
131
  return [...(byLanguage[language] ?? []), ...universal].join("\n") + "\n";
124
132
  }
@@ -168,7 +176,8 @@ export function renderGsDisclosure() {
168
176
  * @returns README content string
169
177
  */
170
178
  export function renderSmokeTestsReadme(deployment) {
171
- const smokeTool = deployment.testing?.smokeTool ?? "[TODO: set smokeTool in forgecraft.yaml deployment.testing]";
179
+ const smokeTool = deployment.testing?.smokeTool ??
180
+ "[TODO: set smokeTool in forgecraft.yaml deployment.testing]";
172
181
  return SMOKE_TESTS_README.replace("deployment.testing.smokeTool (or default to HTTP assertions)", `deployment.testing.smokeTool: ${smokeTool}`);
173
182
  }
174
183
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold-templates.js","sourceRoot":"","sources":["../../src/tools/scaffold-templates.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scaffold-templates.js","sourceRoot":"","sources":["../../src/tools/scaffold-templates.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,CAAC,MAAM,yBAAyB,GAAG;;;;;;;;;;;;;;CAcxC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAC9B,IAAI,CAAC,SAAS,CACZ;IACE,OAAO,EAAE,GAAG;IACZ,QAAQ,EACN,iLAAiL;IACnL,UAAU,EAAE,EAAE;CACf,EACD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI,CAAC;AAEX,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;CAMrC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;CAqBjC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;CAqBhC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,OAAO;QACL,qCAAqC,WAAW,EAAE;QAClD,EAAE;QACF,oEAAoE,WAAW,GAAG;QAClF,EAAE;QACF,WAAW;QACX,EAAE;QACF,+DAA+D;QAC/D,EAAE;QACF,kGAAkG;QAClG,2DAA2D;QAC3D,EAAE;QACF,kBAAkB;QAClB,EAAE;QACF,mCAAmC;QACnC,gEAAgE;QAChE,6DAA6D;QAC7D,uCAAuC;QACvC,EAAE;QACF,cAAc;QACd,EAAE;QACF,oFAAoF;QACpF,mFAAmF;QACnF,+EAA+E;QAC/E,EAAE;QACF,KAAK;QACL,qFAAqF;KACtF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,QAAiC;IAC/D,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IACxE,MAAM,UAAU,GAA6B;QAC3C,UAAU,EAAE,CAAC,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,CAAC;QAChE,MAAM,EAAE;YACN,cAAc;YACd,OAAO;YACP,QAAQ;YACR,OAAO;YACP,OAAO;YACP,aAAa;YACb,cAAc;SACf;KACF,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAC3E,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAiC;IACjE,MAAM,KAAK,GAA2B;QACpC,UAAU,EAAE,0DAA0D;QACtE,MAAM,EACJ,qGAAqG;KACxG,CAAC;IACF,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,8BAA8B,CAAC;AAC3D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,EAAE;QACF,EAAE;QACF,wBAAwB;QACxB,EAAE;QACF,4FAA4F;QAC5F,mFAAmF;QACnF,EAAE;QACF,oEAAoE;QACpE,mBAAmB;QACnB,iRAAiR;QACjR,uQAAuQ;QACvQ,wQAAwQ;QACxQ,iLAAiL;QACjL,EAAE;QACF,uFAAuF;QACvF,kFAAkF;QAClF,wFAAwF;KACzF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CACpC,UAAmC;IAEnC,MAAM,SAAS,GACb,UAAU,CAAC,OAAO,EAAE,SAAS;QAC7B,6DAA6D,CAAC;IAChE,OAAO,kBAAkB,CAAC,OAAO,CAC/B,8DAA8D,EAC9D,iCAAiC,SAAS,EAAE,CAC7C,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,UAAmC;IAEnC,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC;IACtC,IAAI,MAAM,GAAG,iBAAiB,CAAC;IAC/B,IAAI,IAAI,EAAE,eAAe,KAAK,SAAS;QACrC,MAAM,GAAG,MAAM,CAAC,OAAO,CACrB,8CAA8C,EAC9C,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAC7B,CAAC;IACJ,IAAI,IAAI,EAAE,SAAS,KAAK,SAAS;QAC/B,MAAM,GAAG,MAAM,CAAC,OAAO,CACrB,wCAAwC,EACxC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CACvB,CAAC;IACJ,IAAI,IAAI,EAAE,YAAY,KAAK,SAAS;QAClC,MAAM,GAAG,MAAM,CAAC,OAAO,CACrB,yBAAyB,EACzB,GAAG,IAAI,CAAC,YAAY,IAAI,CACzB,CAAC;IACJ,IAAI,IAAI,EAAE,eAAe,KAAK,SAAS;QACrC,MAAM,GAAG,MAAM,CAAC,OAAO,CACrB,yCAAyC,EACzC,GAAG,IAAI,CAAC,eAAe,UAAU,CAClC,CAAC;IACJ,MAAM,IAAI,GACR,IAAI,EAAE,IAAI,IAAI,6DAA6D,CAAC;IAC9E,MAAM,GAAG,MAAM,CAAC,OAAO,CACrB,4DAA4D,EAC5D,iCAAiC,IAAI,EAAE,CACxC,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "forgecraft-mcp",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "mcpName": "io.github.jghiringhelli/forgecraft",
5
5
  "description": "CLI + MCP sentinel for engineering standards — SOLID, testing, architecture, CI/CD — auto-tailored to your stack. Minimal MCP footprint (~200 tokens) via CLI-first design.",
6
6
  "type": "module",
@@ -52,7 +52,7 @@
52
52
  "type": "git",
53
53
  "url": "git+https://github.com/jghiringhelli/forgecraft-mcp.git"
54
54
  },
55
- "homepage": "https://github.com/jghiringhelli/forgecraft-mcp#readme",
55
+ "homepage": "https://forgecraft.tools",
56
56
  "bugs": {
57
57
  "url": "https://github.com/jghiringhelli/forgecraft-mcp/issues"
58
58
  },
@@ -66,7 +66,6 @@
66
66
  ],
67
67
  "dependencies": {
68
68
  "@modelcontextprotocol/sdk": "^1.12.1",
69
- "express": "^5.2.1",
70
69
  "js-yaml": "^4.1.0",
71
70
  "zod": "^3.24.2"
72
71
  },
@@ -76,8 +75,11 @@
76
75
  "@types/express": "^5.0.6",
77
76
  "@types/js-yaml": "^4.0.9",
78
77
  "@types/node": "^22.13.4",
78
+ "@types/supertest": "^7.2.0",
79
79
  "@vitest/coverage-v8": "^3.2.4",
80
+ "express": "^5.2.1",
80
81
  "rimraf": "^6.0.1",
82
+ "supertest": "^7.2.2",
81
83
  "typescript": "^5.7.3",
82
84
  "vitest": "^3.0.5"
83
85
  }