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.
- package/README.md +251 -0
- package/dist/analyzers/anti-pattern.d.ts +21 -0
- package/dist/analyzers/anti-pattern.d.ts.map +1 -0
- package/dist/analyzers/anti-pattern.js +130 -0
- package/dist/analyzers/anti-pattern.js.map +1 -0
- package/dist/analyzers/completeness.d.ts +15 -0
- package/dist/analyzers/completeness.d.ts.map +1 -0
- package/dist/analyzers/completeness.js +207 -0
- package/dist/analyzers/completeness.js.map +1 -0
- package/dist/analyzers/folder-structure.d.ts +35 -0
- package/dist/analyzers/folder-structure.d.ts.map +1 -0
- package/dist/analyzers/folder-structure.js +151 -0
- package/dist/analyzers/folder-structure.js.map +1 -0
- package/dist/analyzers/package-json.d.ts +22 -0
- package/dist/analyzers/package-json.d.ts.map +1 -0
- package/dist/analyzers/package-json.js +229 -0
- package/dist/analyzers/package-json.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/dist/registry/composer.d.ts +32 -0
- package/dist/registry/composer.d.ts.map +1 -0
- package/dist/registry/composer.js +169 -0
- package/dist/registry/composer.js.map +1 -0
- package/dist/registry/loader.d.ts +37 -0
- package/dist/registry/loader.d.ts.map +1 -0
- package/dist/registry/loader.js +278 -0
- package/dist/registry/loader.js.map +1 -0
- package/dist/registry/renderer.d.ts +53 -0
- package/dist/registry/renderer.d.ts.map +1 -0
- package/dist/registry/renderer.js +275 -0
- package/dist/registry/renderer.js.map +1 -0
- package/dist/shared/config/index.d.ts +15 -0
- package/dist/shared/config/index.d.ts.map +1 -0
- package/dist/shared/config/index.js +16 -0
- package/dist/shared/config/index.js.map +1 -0
- package/dist/shared/errors/index.d.ts +30 -0
- package/dist/shared/errors/index.d.ts.map +1 -0
- package/dist/shared/errors/index.js +44 -0
- package/dist/shared/errors/index.js.map +1 -0
- package/dist/shared/logger/index.d.ts +27 -0
- package/dist/shared/logger/index.d.ts.map +1 -0
- package/dist/shared/logger/index.js +59 -0
- package/dist/shared/logger/index.js.map +1 -0
- package/dist/shared/types.d.ts +212 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +30 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/tools/add-hook.d.ts +26 -0
- package/dist/tools/add-hook.d.ts.map +1 -0
- package/dist/tools/add-hook.js +82 -0
- package/dist/tools/add-hook.js.map +1 -0
- package/dist/tools/add-module.d.ts +29 -0
- package/dist/tools/add-module.d.ts.map +1 -0
- package/dist/tools/add-module.js +244 -0
- package/dist/tools/add-module.js.map +1 -0
- package/dist/tools/audit.d.ts +26 -0
- package/dist/tools/audit.d.ts.map +1 -0
- package/dist/tools/audit.js +111 -0
- package/dist/tools/audit.js.map +1 -0
- package/dist/tools/classify.d.ts +23 -0
- package/dist/tools/classify.d.ts.map +1 -0
- package/dist/tools/classify.js +73 -0
- package/dist/tools/classify.js.map +1 -0
- package/dist/tools/configure-mcp.d.ts +49 -0
- package/dist/tools/configure-mcp.d.ts.map +1 -0
- package/dist/tools/configure-mcp.js +127 -0
- package/dist/tools/configure-mcp.js.map +1 -0
- package/dist/tools/convert.d.ts +27 -0
- package/dist/tools/convert.d.ts.map +1 -0
- package/dist/tools/convert.js +154 -0
- package/dist/tools/convert.js.map +1 -0
- package/dist/tools/generate-claude-md.d.ts +29 -0
- package/dist/tools/generate-claude-md.d.ts.map +1 -0
- package/dist/tools/generate-claude-md.js +116 -0
- package/dist/tools/generate-claude-md.js.map +1 -0
- package/dist/tools/get-nfr.d.ts +20 -0
- package/dist/tools/get-nfr.d.ts.map +1 -0
- package/dist/tools/get-nfr.js +53 -0
- package/dist/tools/get-nfr.js.map +1 -0
- package/dist/tools/list.d.ts +33 -0
- package/dist/tools/list.d.ts.map +1 -0
- package/dist/tools/list.js +155 -0
- package/dist/tools/list.js.map +1 -0
- package/dist/tools/refresh-project.d.ts +34 -0
- package/dist/tools/refresh-project.d.ts.map +1 -0
- package/dist/tools/refresh-project.js +257 -0
- package/dist/tools/refresh-project.js.map +1 -0
- package/dist/tools/review.d.ts +31 -0
- package/dist/tools/review.d.ts.map +1 -0
- package/dist/tools/review.js +62 -0
- package/dist/tools/review.js.map +1 -0
- package/dist/tools/scaffold.d.ts +32 -0
- package/dist/tools/scaffold.d.ts.map +1 -0
- package/dist/tools/scaffold.js +160 -0
- package/dist/tools/scaffold.js.map +1 -0
- package/dist/tools/setup-project.d.ts +37 -0
- package/dist/tools/setup-project.d.ts.map +1 -0
- package/dist/tools/setup-project.js +270 -0
- package/dist/tools/setup-project.js.map +1 -0
- package/package.json +69 -0
- package/templates/analytics/claude-md.yaml +37 -0
- package/templates/analytics/structure.yaml +25 -0
- package/templates/api/claude-md.yaml +85 -0
- package/templates/api/nfr.yaml +23 -0
- package/templates/api/review.yaml +103 -0
- package/templates/api/structure.yaml +34 -0
- package/templates/cli/claude-md.yaml +31 -0
- package/templates/cli/review.yaml +53 -0
- package/templates/cli/structure.yaml +16 -0
- package/templates/data-pipeline/claude-md.yaml +42 -0
- package/templates/data-pipeline/nfr.yaml +39 -0
- package/templates/data-pipeline/structure.yaml +23 -0
- package/templates/fintech/claude-md.yaml +42 -0
- package/templates/fintech/nfr.yaml +46 -0
- package/templates/game/claude-md.yaml +42 -0
- package/templates/healthcare/claude-md.yaml +42 -0
- package/templates/healthcare/nfr.yaml +47 -0
- package/templates/infra/claude-md.yaml +104 -0
- package/templates/infra/nfr.yaml +46 -0
- package/templates/infra/review.yaml +65 -0
- package/templates/infra/structure.yaml +25 -0
- package/templates/library/claude-md.yaml +36 -0
- package/templates/library/review.yaml +56 -0
- package/templates/library/structure.yaml +19 -0
- package/templates/ml/claude-md.yaml +42 -0
- package/templates/ml/nfr.yaml +39 -0
- package/templates/ml/structure.yaml +25 -0
- package/templates/mobile/claude-md.yaml +44 -0
- package/templates/mobile/nfr.yaml +49 -0
- package/templates/mobile/structure.yaml +27 -0
- package/templates/realtime/claude-md.yaml +42 -0
- package/templates/social/claude-md.yaml +43 -0
- package/templates/state-machine/claude-md.yaml +42 -0
- package/templates/universal/claude-md.yaml +477 -0
- package/templates/universal/hooks.yaml +196 -0
- package/templates/universal/nfr.yaml +197 -0
- package/templates/universal/review.yaml +164 -0
- package/templates/universal/structure.yaml +52 -0
- package/templates/web-react/claude-md.yaml +110 -0
- package/templates/web-react/hooks.yaml +44 -0
- package/templates/web-react/nfr.yaml +27 -0
- package/templates/web-react/review.yaml +94 -0
- package/templates/web-react/structure.yaml +46 -0
- package/templates/web-static/claude-md.yaml +73 -0
- package/templates/web3/claude-md.yaml +44 -0
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* refresh_project tool handler.
|
|
3
|
+
*
|
|
4
|
+
* Re-analyzes an existing project that has forgecraft.yaml,
|
|
5
|
+
* detects drift (new tags, changed scope), and proposes updates.
|
|
6
|
+
* Can optionally apply updates to config and CLAUDE.md.
|
|
7
|
+
*/
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
import { writeFileSync } from "node:fs";
|
|
10
|
+
import { join } from "node:path";
|
|
11
|
+
import yaml from "js-yaml";
|
|
12
|
+
import { ALL_TAGS, CONTENT_TIERS } from "../shared/types.js";
|
|
13
|
+
import { analyzeProject } from "../analyzers/package-json.js";
|
|
14
|
+
import { checkCompleteness } from "../analyzers/completeness.js";
|
|
15
|
+
import { loadAllTemplatesWithExtras, loadUserOverrides } from "../registry/loader.js";
|
|
16
|
+
import { composeTemplates } from "../registry/composer.js";
|
|
17
|
+
import { renderClaudeMd } from "../registry/renderer.js";
|
|
18
|
+
import { createLogger } from "../shared/logger/index.js";
|
|
19
|
+
const logger = createLogger("tools/refresh-project");
|
|
20
|
+
/** Minimum confidence to suggest a new tag. */
|
|
21
|
+
const SUGGEST_THRESHOLD = 0.5;
|
|
22
|
+
// ── Schema ───────────────────────────────────────────────────────────
|
|
23
|
+
export const refreshProjectSchema = z.object({
|
|
24
|
+
project_dir: z
|
|
25
|
+
.string()
|
|
26
|
+
.describe("Absolute path to the project root directory."),
|
|
27
|
+
apply: z
|
|
28
|
+
.boolean()
|
|
29
|
+
.default(false)
|
|
30
|
+
.describe("If true, apply recommended changes to forgecraft.yaml and CLAUDE.md."),
|
|
31
|
+
tier: z
|
|
32
|
+
.enum(CONTENT_TIERS)
|
|
33
|
+
.optional()
|
|
34
|
+
.describe("Override tier level. If omitted, uses current config value."),
|
|
35
|
+
add_tags: z
|
|
36
|
+
.array(z.enum(ALL_TAGS))
|
|
37
|
+
.optional()
|
|
38
|
+
.describe("Explicitly add these tags during refresh."),
|
|
39
|
+
remove_tags: z
|
|
40
|
+
.array(z.enum(ALL_TAGS))
|
|
41
|
+
.optional()
|
|
42
|
+
.describe("Explicitly remove these tags during refresh."),
|
|
43
|
+
});
|
|
44
|
+
// ── Handler ──────────────────────────────────────────────────────────
|
|
45
|
+
export async function refreshProjectHandler(args) {
|
|
46
|
+
const projectDir = args.project_dir;
|
|
47
|
+
logger.info("Refresh project starting", { projectDir, apply: args.apply });
|
|
48
|
+
// ── Step 1: Load current config ────────────────────────────────
|
|
49
|
+
const existingConfig = loadUserOverrides(projectDir);
|
|
50
|
+
if (!existingConfig) {
|
|
51
|
+
return {
|
|
52
|
+
content: [{
|
|
53
|
+
type: "text",
|
|
54
|
+
text: buildNoConfigOutput(projectDir),
|
|
55
|
+
}],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// ── Step 2: Re-analyze project ─────────────────────────────────
|
|
59
|
+
const drift = analyzeDrift(projectDir, existingConfig, args);
|
|
60
|
+
// ── Step 3: Build updated config ───────────────────────────────
|
|
61
|
+
const updatedTags = computeUpdatedTags(drift.currentTags, drift.newTagSuggestions, args.add_tags, args.remove_tags);
|
|
62
|
+
const updatedTier = args.tier ?? existingConfig.tier ?? "recommended";
|
|
63
|
+
const updatedConfig = {
|
|
64
|
+
...existingConfig,
|
|
65
|
+
tags: updatedTags,
|
|
66
|
+
tier: updatedTier,
|
|
67
|
+
};
|
|
68
|
+
// ── Step 4: Compose with updated config ────────────────────────
|
|
69
|
+
const allTemplates = await loadAllTemplatesWithExtras(undefined, updatedConfig.templateDirs);
|
|
70
|
+
const composed = composeTemplates(updatedTags, allTemplates, { config: updatedConfig });
|
|
71
|
+
// ── Step 5: Apply or preview ───────────────────────────────────
|
|
72
|
+
if (!args.apply) {
|
|
73
|
+
return {
|
|
74
|
+
content: [{
|
|
75
|
+
type: "text",
|
|
76
|
+
text: buildPreviewOutput(drift, updatedTags, updatedConfig, composed, updatedTier),
|
|
77
|
+
}],
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
// Write updated config
|
|
81
|
+
const configYaml = yaml.dump(updatedConfig, { lineWidth: 100, noRefs: true });
|
|
82
|
+
writeFileSync(join(projectDir, "forgecraft.yaml"), configYaml, "utf-8");
|
|
83
|
+
// Regenerate CLAUDE.md
|
|
84
|
+
const context = {
|
|
85
|
+
projectName: updatedConfig.projectName ?? inferProjectName(projectDir),
|
|
86
|
+
language: "typescript",
|
|
87
|
+
tags: updatedTags,
|
|
88
|
+
};
|
|
89
|
+
const claudeContent = renderClaudeMd(composed.claudeMdBlocks, context);
|
|
90
|
+
writeFileSync(join(projectDir, "CLAUDE.md"), claudeContent, "utf-8");
|
|
91
|
+
return {
|
|
92
|
+
content: [{
|
|
93
|
+
type: "text",
|
|
94
|
+
text: buildAppliedOutput(drift, updatedTags, updatedConfig, composed, updatedTier),
|
|
95
|
+
}],
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
// ── Drift Analysis ───────────────────────────────────────────────────
|
|
99
|
+
/**
|
|
100
|
+
* Analyze how the project has drifted from its current config.
|
|
101
|
+
*/
|
|
102
|
+
function analyzeDrift(projectDir, config, args) {
|
|
103
|
+
const currentTags = config.tags ?? ["UNIVERSAL"];
|
|
104
|
+
const currentTier = (config.tier ?? "recommended");
|
|
105
|
+
const requestedTier = (args.tier ?? currentTier);
|
|
106
|
+
// Re-detect tags from code
|
|
107
|
+
const detections = analyzeProject(projectDir);
|
|
108
|
+
const newTagSuggestions = [];
|
|
109
|
+
const detectedTagSet = new Set();
|
|
110
|
+
for (const d of detections) {
|
|
111
|
+
detectedTagSet.add(d.tag);
|
|
112
|
+
if (d.confidence >= SUGGEST_THRESHOLD && !currentTags.includes(d.tag)) {
|
|
113
|
+
newTagSuggestions.push({ tag: d.tag, confidence: d.confidence, evidence: d.evidence });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Tags in config that code analysis no longer supports
|
|
117
|
+
const droppedTagCandidates = currentTags.filter((t) => t !== "UNIVERSAL" && !detectedTagSet.has(t));
|
|
118
|
+
// Completeness re-check
|
|
119
|
+
const completeness = checkCompleteness(projectDir, currentTags);
|
|
120
|
+
const completenessGaps = completeness.failing.map((f) => f.check);
|
|
121
|
+
const completenessFixed = completeness.passing.map((p) => p.check);
|
|
122
|
+
// Tier change
|
|
123
|
+
const tierChange = requestedTier !== currentTier
|
|
124
|
+
? { from: currentTier, to: requestedTier }
|
|
125
|
+
: null;
|
|
126
|
+
// Block count comparison (before vs after)
|
|
127
|
+
const allTemplates = loadAllTemplatesWithExtras(undefined, config.templateDirs);
|
|
128
|
+
const beforeComposed = composeTemplates(currentTags, allTemplates, { config });
|
|
129
|
+
const proposedTags = computeUpdatedTags(currentTags, newTagSuggestions, args.add_tags, args.remove_tags);
|
|
130
|
+
const afterConfig = { ...config, tags: proposedTags, tier: requestedTier };
|
|
131
|
+
const afterComposed = composeTemplates(proposedTags, allTemplates, { config: afterConfig });
|
|
132
|
+
return {
|
|
133
|
+
currentTags,
|
|
134
|
+
newTagSuggestions,
|
|
135
|
+
droppedTagCandidates,
|
|
136
|
+
completenessGaps,
|
|
137
|
+
completenessFixed,
|
|
138
|
+
tierChange,
|
|
139
|
+
blockCountDelta: {
|
|
140
|
+
before: beforeComposed.claudeMdBlocks.length,
|
|
141
|
+
after: afterComposed.claudeMdBlocks.length,
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
// ── Tag Computation ──────────────────────────────────────────────────
|
|
146
|
+
/**
|
|
147
|
+
* Compute the updated tag set from current tags, suggestions, and explicit adds/removes.
|
|
148
|
+
*/
|
|
149
|
+
function computeUpdatedTags(currentTags, suggestions, addTags, removeTags) {
|
|
150
|
+
const tagSet = new Set(currentTags);
|
|
151
|
+
// Add high-confidence suggestions
|
|
152
|
+
for (const s of suggestions) {
|
|
153
|
+
if (s.confidence >= 0.6) {
|
|
154
|
+
tagSet.add(s.tag);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Explicit adds
|
|
158
|
+
if (addTags) {
|
|
159
|
+
for (const t of addTags) {
|
|
160
|
+
tagSet.add(t);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Explicit removes (never remove UNIVERSAL)
|
|
164
|
+
if (removeTags) {
|
|
165
|
+
for (const t of removeTags) {
|
|
166
|
+
if (t !== "UNIVERSAL") {
|
|
167
|
+
tagSet.delete(t);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// Ensure UNIVERSAL
|
|
172
|
+
tagSet.add("UNIVERSAL");
|
|
173
|
+
return Array.from(tagSet);
|
|
174
|
+
}
|
|
175
|
+
// ── Output Formatting ────────────────────────────────────────────────
|
|
176
|
+
/**
|
|
177
|
+
* Infer project name from directory path.
|
|
178
|
+
*/
|
|
179
|
+
function inferProjectName(projectDir) {
|
|
180
|
+
const parts = projectDir.replace(/\\/g, "/").split("/").filter(Boolean);
|
|
181
|
+
return parts[parts.length - 1] ?? "my-project";
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Output when no forgecraft.yaml exists.
|
|
185
|
+
*/
|
|
186
|
+
function buildNoConfigOutput(projectDir) {
|
|
187
|
+
return (`# No Configuration Found\n\n` +
|
|
188
|
+
`No forgecraft.yaml or .forgecraft.json found in \`${projectDir}\`.\n\n` +
|
|
189
|
+
`Run \`setup_project\` first to initialize your project configuration.\n`);
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Build the preview (dry-run) output for proposed changes.
|
|
193
|
+
*/
|
|
194
|
+
function buildPreviewOutput(drift, updatedTags, _config, composed, tier) {
|
|
195
|
+
let text = `# Refresh Preview\n\n`;
|
|
196
|
+
text += `**Current Tags:** ${drift.currentTags.map((t) => `[${t}]`).join(" ")}\n`;
|
|
197
|
+
text += `**Proposed Tags:** ${updatedTags.map((t) => `[${t}]`).join(" ")}\n`;
|
|
198
|
+
text += `**Tier:** ${tier}\n\n`;
|
|
199
|
+
// New tag suggestions
|
|
200
|
+
if (drift.newTagSuggestions.length > 0) {
|
|
201
|
+
text += `## New Tags Detected\n`;
|
|
202
|
+
for (const s of drift.newTagSuggestions) {
|
|
203
|
+
const marker = s.confidence >= 0.6 ? "✅ auto-add" : "💡 suggest";
|
|
204
|
+
text += `- **[${s.tag}]** (${Math.round(s.confidence * 100)}%) — ${marker}: ${s.evidence.join(", ")}\n`;
|
|
205
|
+
}
|
|
206
|
+
text += "\n";
|
|
207
|
+
}
|
|
208
|
+
// Dropped tag candidates
|
|
209
|
+
if (drift.droppedTagCandidates.length > 0) {
|
|
210
|
+
text += `## Tags No Longer Detected\n`;
|
|
211
|
+
text += `_These tags are in your config but not detected in code. Consider removing if no longer relevant._\n`;
|
|
212
|
+
text += drift.droppedTagCandidates.map((t) => `- [${t}]`).join("\n");
|
|
213
|
+
text += "\n\n";
|
|
214
|
+
}
|
|
215
|
+
// Tier change
|
|
216
|
+
if (drift.tierChange) {
|
|
217
|
+
text += `## Tier Change\n`;
|
|
218
|
+
text += `${drift.tierChange.from} → ${drift.tierChange.to}\n\n`;
|
|
219
|
+
}
|
|
220
|
+
// Block delta
|
|
221
|
+
text += `## Content Impact\n`;
|
|
222
|
+
text += `- CLAUDE.md blocks: ${drift.blockCountDelta.before} → ${drift.blockCountDelta.after}\n`;
|
|
223
|
+
text += `- Total available: ${composed.claudeMdBlocks.length} blocks, ${composed.nfrBlocks.length} NFRs, ${composed.hooks.length} hooks\n\n`;
|
|
224
|
+
// Gaps
|
|
225
|
+
if (drift.completenessGaps.length > 0) {
|
|
226
|
+
text += `## Remaining Gaps\n`;
|
|
227
|
+
text += drift.completenessGaps.map((g) => `- ${g}`).join("\n");
|
|
228
|
+
text += "\n\n";
|
|
229
|
+
}
|
|
230
|
+
text += `_Run again with apply=true to write changes._`;
|
|
231
|
+
return text;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Build the output after applying changes.
|
|
235
|
+
*/
|
|
236
|
+
function buildAppliedOutput(drift, updatedTags, config, composed, tier) {
|
|
237
|
+
const configYaml = yaml.dump(config, { lineWidth: 100, noRefs: true });
|
|
238
|
+
let text = `# Project Refreshed\n\n`;
|
|
239
|
+
text += `**Tags:** ${updatedTags.map((t) => `[${t}]`).join(" ")}\n`;
|
|
240
|
+
text += `**Tier:** ${tier}\n\n`;
|
|
241
|
+
text += `## Changes Applied\n`;
|
|
242
|
+
text += `- forgecraft.yaml — updated\n`;
|
|
243
|
+
text += `- CLAUDE.md — regenerated (${composed.claudeMdBlocks.length} blocks)\n\n`;
|
|
244
|
+
if (drift.newTagSuggestions.length > 0) {
|
|
245
|
+
const added = drift.newTagSuggestions.filter((s) => s.confidence >= 0.6);
|
|
246
|
+
if (added.length > 0) {
|
|
247
|
+
text += `## New Tags Added\n`;
|
|
248
|
+
text += added.map((s) => `- [${s.tag}] — ${s.evidence.join(", ")}`).join("\n");
|
|
249
|
+
text += "\n\n";
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
text += `## Updated Config\n`;
|
|
253
|
+
text += `\`\`\`yaml\n${configYaml}\`\`\`\n\n`;
|
|
254
|
+
text += `⚠️ **Restart required** to pick up CLAUDE.md changes.`;
|
|
255
|
+
return text;
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=refresh-project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh-project.js","sourceRoot":"","sources":["../../src/tools/refresh-project.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* review_project tool handler.
|
|
3
|
+
*
|
|
4
|
+
* Returns a structured code review checklist composed from review templates
|
|
5
|
+
* for the project's active tags. Supports comprehensive (all items) or
|
|
6
|
+
* focused (critical-only) scope.
|
|
7
|
+
*/
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
export declare const reviewProjectSchema: z.ZodObject<{
|
|
10
|
+
tags: z.ZodArray<z.ZodEnum<[string, ...string[]]>, "many">;
|
|
11
|
+
scope: z.ZodDefault<z.ZodEnum<["comprehensive", "focused"]>>;
|
|
12
|
+
}, "strip", z.ZodTypeAny, {
|
|
13
|
+
tags: string[];
|
|
14
|
+
scope: "comprehensive" | "focused";
|
|
15
|
+
}, {
|
|
16
|
+
tags: string[];
|
|
17
|
+
scope?: "comprehensive" | "focused" | undefined;
|
|
18
|
+
}>;
|
|
19
|
+
/**
|
|
20
|
+
* Generate a structured code review checklist for the given tags and scope.
|
|
21
|
+
*
|
|
22
|
+
* @param args - Validated tool input with tags and scope.
|
|
23
|
+
* @returns MCP tool response with rendered review checklist.
|
|
24
|
+
*/
|
|
25
|
+
export declare function reviewProjectHandler(args: z.infer<typeof reviewProjectSchema>): Promise<{
|
|
26
|
+
content: Array<{
|
|
27
|
+
type: "text";
|
|
28
|
+
text: string;
|
|
29
|
+
}>;
|
|
30
|
+
}>;
|
|
31
|
+
//# sourceMappingURL=review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/tools/review.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,eAAO,MAAM,mBAAmB;;;;;;;;;EAY9B,CAAC;AAIH;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,GACxC,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CA8C7D"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* review_project tool handler.
|
|
3
|
+
*
|
|
4
|
+
* Returns a structured code review checklist composed from review templates
|
|
5
|
+
* for the project's active tags. Supports comprehensive (all items) or
|
|
6
|
+
* focused (critical-only) scope.
|
|
7
|
+
*/
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
import { ALL_TAGS } from "../shared/types.js";
|
|
10
|
+
import { loadAllTemplates } from "../registry/loader.js";
|
|
11
|
+
import { composeTemplates } from "../registry/composer.js";
|
|
12
|
+
import { renderReviewChecklist } from "../registry/renderer.js";
|
|
13
|
+
// ── Schema ───────────────────────────────────────────────────────────
|
|
14
|
+
export const reviewProjectSchema = z.object({
|
|
15
|
+
tags: z
|
|
16
|
+
.array(z.enum(ALL_TAGS))
|
|
17
|
+
.min(1)
|
|
18
|
+
.describe("Active project tags to generate review checklist for."),
|
|
19
|
+
scope: z
|
|
20
|
+
.enum(["comprehensive", "focused"])
|
|
21
|
+
.default("comprehensive")
|
|
22
|
+
.describe("Review scope: 'comprehensive' covers all severity levels across all 4 dimensions. " +
|
|
23
|
+
"'focused' limits to critical items only — ideal for quick pre-merge reviews."),
|
|
24
|
+
});
|
|
25
|
+
// ── Handler ──────────────────────────────────────────────────────────
|
|
26
|
+
/**
|
|
27
|
+
* Generate a structured code review checklist for the given tags and scope.
|
|
28
|
+
*
|
|
29
|
+
* @param args - Validated tool input with tags and scope.
|
|
30
|
+
* @returns MCP tool response with rendered review checklist.
|
|
31
|
+
*/
|
|
32
|
+
export async function reviewProjectHandler(args) {
|
|
33
|
+
const tags = args.tags.includes("UNIVERSAL")
|
|
34
|
+
? args.tags
|
|
35
|
+
: ["UNIVERSAL", ...args.tags];
|
|
36
|
+
const templateSets = loadAllTemplates();
|
|
37
|
+
const composed = composeTemplates(tags, templateSets);
|
|
38
|
+
if (composed.reviewBlocks.length === 0) {
|
|
39
|
+
return {
|
|
40
|
+
content: [
|
|
41
|
+
{
|
|
42
|
+
type: "text",
|
|
43
|
+
text: "No review templates found for the specified tags.",
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const reviewContent = renderReviewChecklist(composed.reviewBlocks, args.scope);
|
|
49
|
+
const scopeLabel = args.scope === "comprehensive"
|
|
50
|
+
? "Comprehensive (all severity levels)"
|
|
51
|
+
: "Focused (critical items only)";
|
|
52
|
+
const dimensionCount = new Set(composed.reviewBlocks.map((block) => block.dimension)).size;
|
|
53
|
+
const totalChecks = composed.reviewBlocks.reduce((sum, block) => sum + block.checklist.length, 0);
|
|
54
|
+
let text = `# Code Review Checklist\n\n`;
|
|
55
|
+
text += `**Tags:** ${tags.map((t) => `[${t}]`).join(" ")}\n`;
|
|
56
|
+
text += `**Scope:** ${scopeLabel}\n`;
|
|
57
|
+
text += `**Dimensions:** ${dimensionCount}\n`;
|
|
58
|
+
text += `**Total checks:** ${totalChecks}\n\n`;
|
|
59
|
+
text += reviewContent;
|
|
60
|
+
return { content: [{ type: "text", text }] };
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/tools/review.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,wEAAwE;AAExE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,IAAI,EAAE,CAAC;SACJ,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAA4C,CAAC,CAAC;SAC3D,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,uDAAuD,CAAC;IACpE,KAAK,EAAE,CAAC;SACL,IAAI,CAAC,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;SAClC,OAAO,CAAC,eAAe,CAAC;SACxB,QAAQ,CACP,oFAAoF;QACpF,8EAA8E,CAC/E;CACJ,CAAC,CAAC;AAEH,wEAAwE;AAExE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAyC;IAEzC,MAAM,IAAI,GAAU,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;QACjD,CAAC,CAAE,IAAI,CAAC,IAAc;QACtB,CAAC,CAAE,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,IAAI,CAAW,CAAC;IAE3C,MAAM,YAAY,GAAG,gBAAgB,EAAE,CAAC;IACxC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAEtD,IAAI,QAAQ,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,mDAAmD;iBAC1D;aACF;SACF,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAAG,qBAAqB,CACzC,QAAQ,CAAC,YAAY,EACrB,IAAI,CAAC,KAAK,CACX,CAAC;IAEF,MAAM,UAAU,GACd,IAAI,CAAC,KAAK,KAAK,eAAe;QAC5B,CAAC,CAAC,qCAAqC;QACvC,CAAC,CAAC,+BAA+B,CAAC;IAEtC,MAAM,cAAc,GAAG,IAAI,GAAG,CAC5B,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CACtD,CAAC,IAAI,CAAC;IAEP,MAAM,WAAW,GAAG,QAAQ,CAAC,YAAY,CAAC,MAAM,CAC9C,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,EAC5C,CAAC,CACF,CAAC;IAEF,IAAI,IAAI,GAAG,6BAA6B,CAAC;IACzC,IAAI,IAAI,aAAa,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IAC7D,IAAI,IAAI,cAAc,UAAU,IAAI,CAAC;IACrC,IAAI,IAAI,mBAAmB,cAAc,IAAI,CAAC;IAC9C,IAAI,IAAI,qBAAqB,WAAW,MAAM,CAAC;IAC/C,IAAI,IAAI,aAAa,CAAC;IAEtB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scaffold_project tool handler.
|
|
3
|
+
*
|
|
4
|
+
* Generates full project structure from classified tags.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
export declare const scaffoldProjectSchema: z.ZodObject<{
|
|
8
|
+
tags: z.ZodArray<z.ZodEnum<[string, ...string[]]>, "many">;
|
|
9
|
+
project_dir: z.ZodString;
|
|
10
|
+
project_name: z.ZodString;
|
|
11
|
+
language: z.ZodDefault<z.ZodEnum<["typescript", "python"]>>;
|
|
12
|
+
dry_run: z.ZodDefault<z.ZodBoolean>;
|
|
13
|
+
}, "strip", z.ZodTypeAny, {
|
|
14
|
+
tags: string[];
|
|
15
|
+
project_dir: string;
|
|
16
|
+
language: "typescript" | "python";
|
|
17
|
+
project_name: string;
|
|
18
|
+
dry_run: boolean;
|
|
19
|
+
}, {
|
|
20
|
+
tags: string[];
|
|
21
|
+
project_dir: string;
|
|
22
|
+
project_name: string;
|
|
23
|
+
language?: "typescript" | "python" | undefined;
|
|
24
|
+
dry_run?: boolean | undefined;
|
|
25
|
+
}>;
|
|
26
|
+
export declare function scaffoldProjectHandler(args: z.infer<typeof scaffoldProjectSchema>): Promise<{
|
|
27
|
+
content: Array<{
|
|
28
|
+
type: "text";
|
|
29
|
+
text: string;
|
|
30
|
+
}>;
|
|
31
|
+
}>;
|
|
32
|
+
//# sourceMappingURL=scaffold.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/tools/scaffold.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAmBxB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;EAmBhC,CAAC;AAIH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,GAC1C,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAqH7D"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* scaffold_project tool handler.
|
|
3
|
+
*
|
|
4
|
+
* Generates full project structure from classified tags.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { mkdirSync, writeFileSync, chmodSync } from "node:fs";
|
|
8
|
+
import { join, dirname } from "node:path";
|
|
9
|
+
import { ALL_TAGS } from "../shared/types.js";
|
|
10
|
+
import { loadAllTemplatesWithExtras, loadUserOverrides } from "../registry/loader.js";
|
|
11
|
+
import { composeTemplates } from "../registry/composer.js";
|
|
12
|
+
import { renderClaudeMd, renderStatusMd, renderPrdSkeleton, renderTechSpecSkeleton, } from "../registry/renderer.js";
|
|
13
|
+
import { createLogger } from "../shared/logger/index.js";
|
|
14
|
+
const logger = createLogger("tools/scaffold");
|
|
15
|
+
// ── Schema ───────────────────────────────────────────────────────────
|
|
16
|
+
export const scaffoldProjectSchema = z.object({
|
|
17
|
+
tags: z
|
|
18
|
+
.array(z.enum(ALL_TAGS))
|
|
19
|
+
.min(1)
|
|
20
|
+
.describe("Project classification tags. UNIVERSAL is always included."),
|
|
21
|
+
project_dir: z
|
|
22
|
+
.string()
|
|
23
|
+
.describe("Absolute path to the project root directory."),
|
|
24
|
+
project_name: z
|
|
25
|
+
.string()
|
|
26
|
+
.describe("Human-readable project name."),
|
|
27
|
+
language: z
|
|
28
|
+
.enum(["typescript", "python"])
|
|
29
|
+
.default("typescript")
|
|
30
|
+
.describe("Primary programming language."),
|
|
31
|
+
dry_run: z
|
|
32
|
+
.boolean()
|
|
33
|
+
.default(false)
|
|
34
|
+
.describe("If true, return the plan without writing files."),
|
|
35
|
+
});
|
|
36
|
+
// ── Handler ──────────────────────────────────────────────────────────
|
|
37
|
+
export async function scaffoldProjectHandler(args) {
|
|
38
|
+
const tags = args.tags.includes("UNIVERSAL")
|
|
39
|
+
? args.tags
|
|
40
|
+
: ["UNIVERSAL", ...args.tags];
|
|
41
|
+
logger.info("Scaffolding project", {
|
|
42
|
+
tags,
|
|
43
|
+
projectDir: args.project_dir,
|
|
44
|
+
dryRun: args.dry_run,
|
|
45
|
+
});
|
|
46
|
+
// Load and compose templates (respects forgecraft.yaml config if present)
|
|
47
|
+
const userConfig = loadUserOverrides(args.project_dir);
|
|
48
|
+
const templateSets = await loadAllTemplatesWithExtras(undefined, userConfig?.templateDirs);
|
|
49
|
+
const composed = composeTemplates(tags, templateSets, {
|
|
50
|
+
config: userConfig ?? undefined,
|
|
51
|
+
});
|
|
52
|
+
const context = {
|
|
53
|
+
projectName: args.project_name,
|
|
54
|
+
language: args.language,
|
|
55
|
+
tags,
|
|
56
|
+
};
|
|
57
|
+
const filesCreated = [];
|
|
58
|
+
// Render content
|
|
59
|
+
const claudeMdContent = renderClaudeMd(composed.claudeMdBlocks, context);
|
|
60
|
+
const statusMdContent = renderStatusMd(context);
|
|
61
|
+
const prdContent = renderPrdSkeleton(context);
|
|
62
|
+
const techSpecContent = renderTechSpecSkeleton(context);
|
|
63
|
+
if (args.dry_run) {
|
|
64
|
+
const plan = buildDryRunPlan(composed, tags);
|
|
65
|
+
return { content: [{ type: "text", text: plan }] };
|
|
66
|
+
}
|
|
67
|
+
// Create directories from structure entries
|
|
68
|
+
for (const entry of composed.structureEntries) {
|
|
69
|
+
const fullPath = join(args.project_dir, entry.path);
|
|
70
|
+
if (entry.type === "directory") {
|
|
71
|
+
mkdirSync(fullPath, { recursive: true });
|
|
72
|
+
filesCreated.push(`${entry.path}/`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Write CLAUDE.md
|
|
76
|
+
writeFileSafe(join(args.project_dir, "CLAUDE.md"), claudeMdContent);
|
|
77
|
+
filesCreated.push("CLAUDE.md");
|
|
78
|
+
// Write Status.md
|
|
79
|
+
writeFileSafe(join(args.project_dir, "Status.md"), statusMdContent);
|
|
80
|
+
filesCreated.push("Status.md");
|
|
81
|
+
// Write docs
|
|
82
|
+
mkdirSync(join(args.project_dir, "docs"), { recursive: true });
|
|
83
|
+
writeFileSafe(join(args.project_dir, "docs", "PRD.md"), prdContent);
|
|
84
|
+
filesCreated.push("docs/PRD.md");
|
|
85
|
+
writeFileSafe(join(args.project_dir, "docs", "TechSpec.md"), techSpecContent);
|
|
86
|
+
filesCreated.push("docs/TechSpec.md");
|
|
87
|
+
// Write .env.example
|
|
88
|
+
writeFileSafe(join(args.project_dir, ".env.example"), "NODE_ENV=development\nLOG_LEVEL=info\n");
|
|
89
|
+
filesCreated.push(".env.example");
|
|
90
|
+
// Write hooks
|
|
91
|
+
const hooksDir = join(args.project_dir, ".claude", "hooks");
|
|
92
|
+
mkdirSync(hooksDir, { recursive: true });
|
|
93
|
+
for (const hook of composed.hooks) {
|
|
94
|
+
const hookPath = join(hooksDir, hook.filename);
|
|
95
|
+
writeFileSafe(hookPath, hook.script);
|
|
96
|
+
try {
|
|
97
|
+
chmodSync(hookPath, 0o755);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// chmod may fail on Windows, that's OK
|
|
101
|
+
}
|
|
102
|
+
filesCreated.push(`.claude/hooks/${hook.filename}`);
|
|
103
|
+
}
|
|
104
|
+
// Write .gitignore if not present
|
|
105
|
+
const gitignorePath = join(args.project_dir, ".gitignore");
|
|
106
|
+
writeFileSafe(gitignorePath, "node_modules/\ndist/\n.env\ncoverage/\n*.log\n");
|
|
107
|
+
filesCreated.push(".gitignore");
|
|
108
|
+
const result = {
|
|
109
|
+
filesCreated,
|
|
110
|
+
mcpServersConfigured: [],
|
|
111
|
+
nextSteps: [
|
|
112
|
+
"Review and adjust CLAUDE.md for your project specifics",
|
|
113
|
+
"Fill in docs/PRD.md with your actual requirements",
|
|
114
|
+
"Fill in docs/TechSpec.md with your architecture decisions",
|
|
115
|
+
"Run `npm install` or equivalent to install dependencies",
|
|
116
|
+
"Start implementing your first feature module",
|
|
117
|
+
],
|
|
118
|
+
restartRequired: true,
|
|
119
|
+
};
|
|
120
|
+
let text = `# Project Scaffolded Successfully\n\n`;
|
|
121
|
+
text += `**Tags:** ${tags.map((t) => `[${t}]`).join(" ")}\n`;
|
|
122
|
+
text += `**Files Created:** ${filesCreated.length}\n\n`;
|
|
123
|
+
text += `## Created Files\n`;
|
|
124
|
+
text += filesCreated.map((f) => `- \`${f}\``).join("\n");
|
|
125
|
+
text += `\n\n## Next Steps\n`;
|
|
126
|
+
text += result.nextSteps.map((s, i) => `${i + 1}. ${s}`).join("\n");
|
|
127
|
+
text += `\n\n⚠️ **Restart required** to pick up CLAUDE.md and hooks.`;
|
|
128
|
+
return { content: [{ type: "text", text }] };
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Write a file, creating parent directories as needed.
|
|
132
|
+
*/
|
|
133
|
+
function writeFileSafe(filePath, content) {
|
|
134
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
135
|
+
writeFileSync(filePath, content, "utf-8");
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Build a dry-run plan without writing files.
|
|
139
|
+
*/
|
|
140
|
+
function buildDryRunPlan(composed, tags) {
|
|
141
|
+
let text = `# Scaffold Plan (Dry Run)\n\n`;
|
|
142
|
+
text += `**Tags:** ${tags.map((t) => `[${t}]`).join(" ")}\n\n`;
|
|
143
|
+
text += `## Directories to Create\n`;
|
|
144
|
+
const dirs = composed.structureEntries.filter((e) => e.type === "directory");
|
|
145
|
+
text += dirs.map((d) => `- \`${d.path}/\`${d.description ? ` — ${d.description}` : ""}`).join("\n");
|
|
146
|
+
text += `\n\n## Files to Generate\n`;
|
|
147
|
+
text += `- CLAUDE.md (${composed.claudeMdBlocks.length} blocks)\n`;
|
|
148
|
+
text += `- Status.md\n`;
|
|
149
|
+
text += `- docs/PRD.md (skeleton)\n`;
|
|
150
|
+
text += `- docs/TechSpec.md (skeleton with ${composed.nfrBlocks.length} NFR sections)\n`;
|
|
151
|
+
text += `- .env.example\n`;
|
|
152
|
+
text += `- .gitignore\n`;
|
|
153
|
+
text += `\n## Hooks to Install (${composed.hooks.length})\n`;
|
|
154
|
+
text += composed.hooks
|
|
155
|
+
.map((h) => `- \`${h.filename}\` (${h.trigger}) — ${h.description}`)
|
|
156
|
+
.join("\n");
|
|
157
|
+
text += `\n\n_Run again with dry_run=false to write files._`;
|
|
158
|
+
return text;
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/tools/scaffold.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* setup_project tool handler.
|
|
3
|
+
*
|
|
4
|
+
* Unified entry point that analyzes a project, detects tags,
|
|
5
|
+
* loads/creates a forgecraft.yaml config, and orchestrates scaffolding.
|
|
6
|
+
* Works for both new and existing projects.
|
|
7
|
+
*/
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
export declare const setupProjectSchema: z.ZodObject<{
|
|
10
|
+
project_dir: z.ZodString;
|
|
11
|
+
project_name: z.ZodOptional<z.ZodString>;
|
|
12
|
+
description: z.ZodOptional<z.ZodString>;
|
|
13
|
+
tier: z.ZodDefault<z.ZodEnum<[string, ...string[]]>>;
|
|
14
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodEnum<[string, ...string[]]>, "many">>;
|
|
15
|
+
dry_run: z.ZodDefault<z.ZodBoolean>;
|
|
16
|
+
}, "strip", z.ZodTypeAny, {
|
|
17
|
+
project_dir: string;
|
|
18
|
+
tier: string;
|
|
19
|
+
dry_run: boolean;
|
|
20
|
+
tags?: string[] | undefined;
|
|
21
|
+
description?: string | undefined;
|
|
22
|
+
project_name?: string | undefined;
|
|
23
|
+
}, {
|
|
24
|
+
project_dir: string;
|
|
25
|
+
tags?: string[] | undefined;
|
|
26
|
+
description?: string | undefined;
|
|
27
|
+
tier?: string | undefined;
|
|
28
|
+
project_name?: string | undefined;
|
|
29
|
+
dry_run?: boolean | undefined;
|
|
30
|
+
}>;
|
|
31
|
+
export declare function setupProjectHandler(args: z.infer<typeof setupProjectSchema>): Promise<{
|
|
32
|
+
content: Array<{
|
|
33
|
+
type: "text";
|
|
34
|
+
text: string;
|
|
35
|
+
}>;
|
|
36
|
+
}>;
|
|
37
|
+
//# sourceMappingURL=setup-project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-project.d.ts","sourceRoot":"","sources":["../../src/tools/setup-project.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAoBxB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;EA0B7B,CAAC;AAiBH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,GACvC,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAmD7D"}
|