@oleksandr.rudnychenko/sync_loop 0.2.4 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -4
- package/bin/cli.js +3 -128
- package/bin/cli.ts +171 -0
- package/dist/bin/cli.d.ts +15 -0
- package/dist/bin/cli.js +137 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/src/init.d.ts +24 -0
- package/dist/src/init.js +404 -0
- package/dist/src/init.js.map +1 -0
- package/dist/src/server.d.ts +13 -0
- package/dist/src/server.js +265 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/template/.agent-loop/README.md +75 -0
- package/dist/src/template/.agent-loop/feedback.md +395 -0
- package/dist/src/template/.agent-loop/glossary.md +113 -0
- package/dist/src/template/.agent-loop/patterns/api-standards.md +132 -0
- package/dist/src/template/.agent-loop/patterns/code-patterns.md +300 -0
- package/dist/src/template/.agent-loop/patterns/refactoring-workflow.md +114 -0
- package/dist/src/template/.agent-loop/patterns/testing-guide.md +258 -0
- package/dist/src/template/.agent-loop/patterns.md +256 -0
- package/dist/src/template/.agent-loop/reasoning-kernel.md +521 -0
- package/dist/src/template/.agent-loop/validate-env.md +332 -0
- package/dist/src/template/.agent-loop/validate-n.md +321 -0
- package/dist/src/template/AGENTS.md +157 -0
- package/dist/src/template/README.md +144 -0
- package/dist/src/template/bootstrap-prompt.md +37 -0
- package/dist/src/template/protocol-summary.md +54 -0
- package/dist/src/template/wiring/api-standards.md +15 -0
- package/dist/src/template/wiring/code-patterns.md +15 -0
- package/dist/src/template/wiring/feedback.md +18 -0
- package/dist/src/template/wiring/glossary.md +11 -0
- package/dist/src/template/wiring/patterns.md +18 -0
- package/dist/src/template/wiring/reasoning-kernel.md +18 -0
- package/dist/src/template/wiring/refactoring-workflow.md +15 -0
- package/dist/src/template/wiring/testing-guide.md +15 -0
- package/dist/src/template/wiring/validate-env.md +17 -0
- package/dist/src/template/wiring/validate-n.md +17 -0
- package/package.json +48 -34
- package/src/template/wiring/api-standards.md +15 -0
- package/src/template/wiring/code-patterns.md +15 -0
- package/src/template/wiring/feedback.md +18 -0
- package/src/template/wiring/glossary.md +11 -0
- package/src/template/wiring/patterns.md +18 -0
- package/src/template/wiring/reasoning-kernel.md +18 -0
- package/src/template/wiring/refactoring-workflow.md +15 -0
- package/src/template/wiring/testing-guide.md +15 -0
- package/src/template/wiring/validate-env.md +17 -0
- package/src/template/wiring/validate-n.md +17 -0
- package/src/init.js +0 -569
- package/src/server.js +0 -289
package/dist/src/init.js
ADDED
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, mkdirSync, cpSync, existsSync, readdirSync, } from "node:fs";
|
|
2
|
+
import { join, dirname, resolve, posix } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
5
|
+
const TEMPLATE_DIR = join(__dirname, "template");
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// Helpers
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
function readTemplate(relativePath) {
|
|
10
|
+
return readFileSync(join(TEMPLATE_DIR, relativePath), "utf-8");
|
|
11
|
+
}
|
|
12
|
+
function toPosixPath(value) {
|
|
13
|
+
return value.replace(/\\/g, "/");
|
|
14
|
+
}
|
|
15
|
+
function readJsonSafe(path) {
|
|
16
|
+
try {
|
|
17
|
+
return JSON.parse(readFileSync(path, "utf-8"));
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function detectPackageManager(dirPath) {
|
|
24
|
+
if (existsSync(join(dirPath, "pnpm-lock.yaml")))
|
|
25
|
+
return "pnpm";
|
|
26
|
+
if (existsSync(join(dirPath, "yarn.lock")))
|
|
27
|
+
return "yarn";
|
|
28
|
+
if (existsSync(join(dirPath, "package-lock.json")))
|
|
29
|
+
return "npm";
|
|
30
|
+
if (existsSync(join(dirPath, "uv.lock")))
|
|
31
|
+
return "uv";
|
|
32
|
+
return "npm";
|
|
33
|
+
}
|
|
34
|
+
function runCommandPrefix(packageManager) {
|
|
35
|
+
if (packageManager === "npm")
|
|
36
|
+
return "npm run";
|
|
37
|
+
if (packageManager === "pnpm")
|
|
38
|
+
return "pnpm";
|
|
39
|
+
if (packageManager === "yarn")
|
|
40
|
+
return "yarn";
|
|
41
|
+
return `${packageManager} run`;
|
|
42
|
+
}
|
|
43
|
+
function detectNodeFrameworks(pkg) {
|
|
44
|
+
const deps = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };
|
|
45
|
+
const frameworks = [];
|
|
46
|
+
const known = [
|
|
47
|
+
["next", "Next.js"],
|
|
48
|
+
["react", "React"],
|
|
49
|
+
["vite", "Vite"],
|
|
50
|
+
["vue", "Vue"],
|
|
51
|
+
["svelte", "Svelte"],
|
|
52
|
+
["tailwindcss", "TailwindCSS"],
|
|
53
|
+
["express", "Express"],
|
|
54
|
+
["fastify", "Fastify"],
|
|
55
|
+
["@nestjs/core", "NestJS"],
|
|
56
|
+
["@modelcontextprotocol/sdk", "MCP SDK"],
|
|
57
|
+
["@tanstack/react-query", "TanStack Query"],
|
|
58
|
+
["zustand", "Zustand"],
|
|
59
|
+
];
|
|
60
|
+
for (const [dep, name] of known) {
|
|
61
|
+
if (deps[dep])
|
|
62
|
+
frameworks.push(name);
|
|
63
|
+
}
|
|
64
|
+
return frameworks;
|
|
65
|
+
}
|
|
66
|
+
function detectNodeStack(projectPath, relativePath = "") {
|
|
67
|
+
const stackRoot = join(projectPath, relativePath);
|
|
68
|
+
const pkgPath = join(stackRoot, "package.json");
|
|
69
|
+
if (!existsSync(pkgPath))
|
|
70
|
+
return null;
|
|
71
|
+
const pkg = readJsonSafe(pkgPath) ?? {};
|
|
72
|
+
const scripts = pkg.scripts ?? {};
|
|
73
|
+
const deps = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };
|
|
74
|
+
const packageManager = detectPackageManager(stackRoot);
|
|
75
|
+
const runPrefix = runCommandPrefix(packageManager);
|
|
76
|
+
const frameworks = detectNodeFrameworks(pkg);
|
|
77
|
+
const usesTypeScript = Boolean(deps.typescript || existsSync(join(stackRoot, "tsconfig.json")));
|
|
78
|
+
const languages = usesTypeScript ? ["TypeScript", "JavaScript"] : ["JavaScript"];
|
|
79
|
+
const stackName = relativePath ? posix.basename(toPosixPath(relativePath)) : "app";
|
|
80
|
+
return {
|
|
81
|
+
name: stackName,
|
|
82
|
+
languages,
|
|
83
|
+
frameworks: frameworks.length > 0 ? frameworks : ["Node.js"],
|
|
84
|
+
testRunner: scripts.test ? `${runPrefix} test` : undefined,
|
|
85
|
+
typeChecker: scripts.typecheck ? `${runPrefix} typecheck` : (usesTypeScript ? "tsc --noEmit" : undefined),
|
|
86
|
+
linter: scripts.lint ? `${runPrefix} lint` : undefined,
|
|
87
|
+
packageManager,
|
|
88
|
+
path: relativePath || undefined,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function detectPythonStack(projectPath, relativePath = "") {
|
|
92
|
+
const stackRoot = join(projectPath, relativePath);
|
|
93
|
+
const pyprojectPath = join(stackRoot, "pyproject.toml");
|
|
94
|
+
const requirementsPath = join(stackRoot, "requirements.txt");
|
|
95
|
+
if (!existsSync(pyprojectPath) && !existsSync(requirementsPath))
|
|
96
|
+
return null;
|
|
97
|
+
const pyproject = existsSync(pyprojectPath) ? readFileSync(pyprojectPath, "utf-8").toLowerCase() : "";
|
|
98
|
+
const reqs = existsSync(requirementsPath) ? readFileSync(requirementsPath, "utf-8").toLowerCase() : "";
|
|
99
|
+
const merged = `${pyproject}\n${reqs}`;
|
|
100
|
+
const frameworks = [];
|
|
101
|
+
if (merged.includes("fastapi"))
|
|
102
|
+
frameworks.push("FastAPI");
|
|
103
|
+
if (merged.includes("django"))
|
|
104
|
+
frameworks.push("Django");
|
|
105
|
+
if (merged.includes("flask"))
|
|
106
|
+
frameworks.push("Flask");
|
|
107
|
+
if (merged.includes("langgraph"))
|
|
108
|
+
frameworks.push("LangGraph");
|
|
109
|
+
if (merged.includes("pydantic"))
|
|
110
|
+
frameworks.push("Pydantic");
|
|
111
|
+
const stackName = relativePath ? posix.basename(toPosixPath(relativePath)) : "app";
|
|
112
|
+
const hasPyright = merged.includes("pyright");
|
|
113
|
+
const hasMypy = merged.includes("mypy");
|
|
114
|
+
const hasRuff = merged.includes("ruff");
|
|
115
|
+
const hasPytest = merged.includes("pytest");
|
|
116
|
+
return {
|
|
117
|
+
name: stackName,
|
|
118
|
+
languages: ["Python"],
|
|
119
|
+
frameworks: frameworks.length > 0 ? frameworks : ["Python"],
|
|
120
|
+
testRunner: hasPytest ? "pytest" : undefined,
|
|
121
|
+
typeChecker: hasPyright ? "pyright" : (hasMypy ? "mypy" : undefined),
|
|
122
|
+
linter: hasRuff ? "ruff check ." : undefined,
|
|
123
|
+
path: relativePath || undefined,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
export function detectStacks(projectPath) {
|
|
127
|
+
const root = resolve(projectPath);
|
|
128
|
+
const candidates = [""];
|
|
129
|
+
for (const entry of readdirSync(root, { withFileTypes: true })) {
|
|
130
|
+
if (!entry.isDirectory())
|
|
131
|
+
continue;
|
|
132
|
+
if (entry.name.startsWith("."))
|
|
133
|
+
continue;
|
|
134
|
+
if (entry.name === "node_modules")
|
|
135
|
+
continue;
|
|
136
|
+
candidates.push(entry.name);
|
|
137
|
+
}
|
|
138
|
+
const stacks = [];
|
|
139
|
+
for (const rel of candidates) {
|
|
140
|
+
const nodeStack = detectNodeStack(root, rel);
|
|
141
|
+
if (nodeStack)
|
|
142
|
+
stacks.push(nodeStack);
|
|
143
|
+
const pythonStack = detectPythonStack(root, rel);
|
|
144
|
+
if (pythonStack)
|
|
145
|
+
stacks.push(pythonStack);
|
|
146
|
+
}
|
|
147
|
+
const deduped = [];
|
|
148
|
+
const seen = new Set();
|
|
149
|
+
for (const stack of stacks) {
|
|
150
|
+
const key = `${stack.name}:${stack.path ?? ""}:${stack.languages.join(",")}`;
|
|
151
|
+
if (seen.has(key))
|
|
152
|
+
continue;
|
|
153
|
+
seen.add(key);
|
|
154
|
+
deduped.push(stack);
|
|
155
|
+
}
|
|
156
|
+
if (deduped.length === 0) {
|
|
157
|
+
return [{
|
|
158
|
+
name: "app",
|
|
159
|
+
languages: ["Unknown"],
|
|
160
|
+
frameworks: ["Unknown"],
|
|
161
|
+
}];
|
|
162
|
+
}
|
|
163
|
+
return deduped;
|
|
164
|
+
}
|
|
165
|
+
function writeOutput(projectPath, relativePath, content, options = {}) {
|
|
166
|
+
const { dryRun = false, overwrite = true } = options;
|
|
167
|
+
const fullPath = join(projectPath, relativePath);
|
|
168
|
+
const alreadyExists = existsSync(fullPath);
|
|
169
|
+
if (alreadyExists && !overwrite) {
|
|
170
|
+
return { path: relativePath, status: "skipped" };
|
|
171
|
+
}
|
|
172
|
+
if (!dryRun) {
|
|
173
|
+
mkdirSync(dirname(fullPath), { recursive: true });
|
|
174
|
+
writeFileSync(fullPath, content, "utf-8");
|
|
175
|
+
}
|
|
176
|
+
if (dryRun) {
|
|
177
|
+
return { path: relativePath, status: alreadyExists ? "would-overwrite" : "would-create" };
|
|
178
|
+
}
|
|
179
|
+
return { path: relativePath, status: alreadyExists ? "overwritten" : "created" };
|
|
180
|
+
}
|
|
181
|
+
function formatWriteResult(result) {
|
|
182
|
+
if (result.status === "skipped")
|
|
183
|
+
return `${result.path} (skipped: exists)`;
|
|
184
|
+
if (result.status.startsWith("would-"))
|
|
185
|
+
return `${result.path} (dry-run)`;
|
|
186
|
+
return result.path;
|
|
187
|
+
}
|
|
188
|
+
function yamlFrontmatter(fields) {
|
|
189
|
+
const lines = ["---"];
|
|
190
|
+
for (const [key, value] of Object.entries(fields)) {
|
|
191
|
+
if (Array.isArray(value)) {
|
|
192
|
+
lines.push(`${key}:`);
|
|
193
|
+
for (const item of value) {
|
|
194
|
+
lines.push(` - "${item}"`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
else if (typeof value === "boolean") {
|
|
198
|
+
lines.push(`${key}: ${value}`);
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
lines.push(`${key}: "${value}"`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
lines.push("---");
|
|
205
|
+
return lines.join("\n");
|
|
206
|
+
}
|
|
207
|
+
// ---------------------------------------------------------------------------
|
|
208
|
+
// Source file list (maps to src/template/.agent-loop/)
|
|
209
|
+
// ---------------------------------------------------------------------------
|
|
210
|
+
const SOURCE_FILES = [
|
|
211
|
+
{ id: "reasoning-kernel", path: ".agent-loop/reasoning-kernel.md" },
|
|
212
|
+
{ id: "feedback", path: ".agent-loop/feedback.md" },
|
|
213
|
+
{ id: "validate-env", path: ".agent-loop/validate-env.md" },
|
|
214
|
+
{ id: "validate-n", path: ".agent-loop/validate-n.md" },
|
|
215
|
+
{ id: "patterns", path: ".agent-loop/patterns.md" },
|
|
216
|
+
{ id: "glossary", path: ".agent-loop/glossary.md" },
|
|
217
|
+
{ id: "code-patterns", path: ".agent-loop/patterns/code-patterns.md" },
|
|
218
|
+
{ id: "testing-guide", path: ".agent-loop/patterns/testing-guide.md" },
|
|
219
|
+
{ id: "refactoring-workflow", path: ".agent-loop/patterns/refactoring-workflow.md" },
|
|
220
|
+
{ id: "api-standards", path: ".agent-loop/patterns/api-standards.md" },
|
|
221
|
+
];
|
|
222
|
+
const WRAPPER_FILES = [
|
|
223
|
+
{ id: "reasoning-kernel", path: "wiring/reasoning-kernel.md" },
|
|
224
|
+
{ id: "feedback", path: "wiring/feedback.md" },
|
|
225
|
+
{ id: "validate-env", path: "wiring/validate-env.md" },
|
|
226
|
+
{ id: "validate-n", path: "wiring/validate-n.md" },
|
|
227
|
+
{ id: "patterns", path: "wiring/patterns.md" },
|
|
228
|
+
{ id: "glossary", path: "wiring/glossary.md" },
|
|
229
|
+
{ id: "code-patterns", path: "wiring/code-patterns.md" },
|
|
230
|
+
{ id: "testing-guide", path: "wiring/testing-guide.md" },
|
|
231
|
+
{ id: "refactoring-workflow", path: "wiring/refactoring-workflow.md" },
|
|
232
|
+
{ id: "api-standards", path: "wiring/api-standards.md" },
|
|
233
|
+
];
|
|
234
|
+
// ---------------------------------------------------------------------------
|
|
235
|
+
// Platform configs
|
|
236
|
+
// ---------------------------------------------------------------------------
|
|
237
|
+
const COPILOT = {
|
|
238
|
+
"reasoning-kernel": { target: ".github/instructions/reasoning-kernel.instructions.md", fm: { name: "SyncLoop: Reasoning Kernel", description: "7-stage agent reasoning loop with context clearage", applyTo: "**/*" } },
|
|
239
|
+
"feedback": { target: ".github/instructions/feedback.instructions.md", fm: { name: "SyncLoop: Feedback Loop", description: "Failure diagnosis, patch protocol, branch pruning", applyTo: "**/*" } },
|
|
240
|
+
"validate-env": { target: ".github/instructions/validate-env.instructions.md", fm: { name: "SyncLoop: Validate Environment", description: "NFR gates: types, tests, layers, complexity", applyTo: "**/*" } },
|
|
241
|
+
"validate-n": { target: ".github/instructions/validate-n.instructions.md", fm: { name: "SyncLoop: Validate Neighbors", description: "Shape, boundary, bridge checks", applyTo: "**/*" } },
|
|
242
|
+
"patterns": { target: ".github/instructions/patterns.instructions.md", fm: { name: "SyncLoop: Pattern Registry", description: "Pattern routing and learned patterns", applyTo: "**/*" } },
|
|
243
|
+
"glossary": { target: ".github/instructions/glossary.instructions.md", fm: { name: "SyncLoop: Glossary", description: "Canonical terminology", applyTo: "**/*" } },
|
|
244
|
+
"code-patterns": { target: ".github/instructions/code-patterns.instructions.md", fm: { name: "SyncLoop: Code Patterns", description: "P1-P11 implementation patterns", applyTo: "{src,app,lib}/**/*.{ts,py,js,jsx,tsx}" } },
|
|
245
|
+
"testing-guide": { target: ".github/instructions/testing-guide.instructions.md", fm: { name: "SyncLoop: Testing Guide", description: "Test patterns and strategies", applyTo: "{tests,test,__tests__}/**/*" } },
|
|
246
|
+
"refactoring-workflow": { target: ".github/instructions/refactoring-workflow.instructions.md", fm: { name: "SyncLoop: Refactoring Workflow", description: "4-phase refactoring checklist", applyTo: "**/*" } },
|
|
247
|
+
"api-standards": { target: ".github/instructions/api-standards.instructions.md", fm: { name: "SyncLoop: API Standards", description: "Boundary contracts and API conventions", applyTo: "{routes,routers,controllers,api}/**/*" } },
|
|
248
|
+
};
|
|
249
|
+
const CURSOR = {
|
|
250
|
+
"reasoning-kernel": { target: ".cursor/rules/01-reasoning-kernel.md", fm: { description: "7-stage agent reasoning loop with context clearage and transitions", alwaysApply: true } },
|
|
251
|
+
"feedback": { target: ".cursor/rules/02-feedback.md", fm: { description: "Failure diagnosis, patch protocol, micro-loop, branch pruning", alwaysApply: true } },
|
|
252
|
+
"validate-env": { target: ".cursor/rules/03-validate-env.md", fm: { description: "Stage 1 NFR gates: types, tests, layers, complexity, debug hygiene", alwaysApply: true } },
|
|
253
|
+
"validate-n": { target: ".cursor/rules/04-validate-n.md", fm: { description: "Stage 2 checks: shapes, boundaries, bridges", alwaysApply: true } },
|
|
254
|
+
"patterns": { target: ".cursor/rules/05-patterns.md", fm: { description: "Pattern routing index and learned patterns", alwaysApply: true } },
|
|
255
|
+
"glossary": { target: ".cursor/rules/06-glossary.md", fm: { description: "Canonical domain terminology and naming rules", alwaysApply: true } },
|
|
256
|
+
"code-patterns": { target: ".cursor/rules/07-code-patterns.md", fm: { description: "P1-P11 implementation patterns for layered code", globs: "{src,app,lib}/**/*.{ts,py,js,jsx,tsx}" } },
|
|
257
|
+
"testing-guide": { target: ".cursor/rules/08-testing-guide.md", fm: { description: "Test patterns, fixtures, mocks, strategies", globs: "{tests,test,__tests__}/**/*" } },
|
|
258
|
+
"refactoring-workflow": { target: ".cursor/rules/09-refactoring-workflow.md", fm: { description: "4-phase refactoring checklist for safe restructuring", alwaysApply: false } },
|
|
259
|
+
"api-standards": { target: ".cursor/rules/10-api-standards.md", fm: { description: "Boundary contracts, typed models, error envelopes", globs: "{routes,routers,controllers,api}/**/*" } },
|
|
260
|
+
};
|
|
261
|
+
const CLAUDE = {
|
|
262
|
+
"reasoning-kernel": { target: ".claude/rules/reasoning-kernel.md", fm: { paths: ["**/*"] } },
|
|
263
|
+
"feedback": { target: ".claude/rules/feedback.md", fm: { paths: ["**/*"] } },
|
|
264
|
+
"validate-env": { target: ".claude/rules/validate-env.md", fm: { paths: ["**/*"] } },
|
|
265
|
+
"validate-n": { target: ".claude/rules/validate-n.md", fm: { paths: ["**/*"] } },
|
|
266
|
+
"patterns": { target: ".claude/rules/patterns.md", fm: { paths: ["**/*"] } },
|
|
267
|
+
"glossary": { target: ".claude/rules/glossary.md", fm: { paths: ["**/*"] } },
|
|
268
|
+
"code-patterns": { target: ".claude/rules/code-patterns.md", fm: { paths: ["src/**", "app/**", "lib/**"] } },
|
|
269
|
+
"testing-guide": { target: ".claude/rules/testing-guide.md", fm: { paths: ["tests/**", "test/**", "__tests__/**"] } },
|
|
270
|
+
"refactoring-workflow": { target: ".claude/rules/refactoring-workflow.md", fm: { paths: ["**/*"] } },
|
|
271
|
+
"api-standards": { target: ".claude/rules/api-standards.md", fm: { paths: ["**/routes/**", "**/api/**", "**/controllers/**"] } },
|
|
272
|
+
};
|
|
273
|
+
const PLATFORM_CONFIGS = {
|
|
274
|
+
copilot: COPILOT,
|
|
275
|
+
cursor: CURSOR,
|
|
276
|
+
claude: CLAUDE,
|
|
277
|
+
};
|
|
278
|
+
// ---------------------------------------------------------------------------
|
|
279
|
+
// Environment placeholder replacement
|
|
280
|
+
// ---------------------------------------------------------------------------
|
|
281
|
+
function applyStacks(content, stacks) {
|
|
282
|
+
if (!stacks || stacks.length === 0)
|
|
283
|
+
return content;
|
|
284
|
+
const testRunners = stacks.map((stack) => stack.testRunner).filter(Boolean);
|
|
285
|
+
const typeCheckers = stacks.map((stack) => stack.typeChecker).filter(Boolean);
|
|
286
|
+
const linters = stacks.map((stack) => stack.linter).filter(Boolean);
|
|
287
|
+
const packageManagers = [...new Set(stacks.map((stack) => stack.packageManager).filter(Boolean))];
|
|
288
|
+
const stackRows = stacks
|
|
289
|
+
.map((stack) => `| ${stack.name}${stack.path ? ` (\`${stack.path}\`)` : ""} | ${stack.languages.join(", ")} | ${stack.frameworks.join(", ")} |`)
|
|
290
|
+
.join("\n");
|
|
291
|
+
const stackTable = `| Stack | Languages | Frameworks |\n|-------|-----------|------------|\n${stackRows}`;
|
|
292
|
+
const replacements = {
|
|
293
|
+
"{typecheck command}": typeCheckers.join(" && ") || "{typecheck command}",
|
|
294
|
+
"{lint command}": linters.join(" && ") || "{lint command}",
|
|
295
|
+
"{test command}": testRunners.join(" && ") || "{test command}",
|
|
296
|
+
"{targeted test command}": testRunners[0] ? `${testRunners[0]} {path}` : "{targeted test command}",
|
|
297
|
+
"{install command}": packageManagers.map((pm) => `${pm} install`).join(" && ") || "{install command}",
|
|
298
|
+
};
|
|
299
|
+
let result = content;
|
|
300
|
+
const legacyTableRegex = /\| Layer \| Stack \|\r?\n\|[-|]+\|\r?\n\| Backend \|[^\r\n]*\|\r?\n\| Frontend \|[^\r\n]*\|\r?\n\| Infra \|[^\r\n]*\|/;
|
|
301
|
+
const generatedTableRegex = /\| Stack \| Languages \| Frameworks \|\r?\n\|[-|]+\|(?:\r?\n\|[^\r\n]*\|)+/;
|
|
302
|
+
result = result.replace(legacyTableRegex, stackTable);
|
|
303
|
+
result = result.replace(generatedTableRegex, stackTable);
|
|
304
|
+
for (const [placeholder, value] of Object.entries(replacements)) {
|
|
305
|
+
result = result.replaceAll(placeholder, value);
|
|
306
|
+
}
|
|
307
|
+
return result;
|
|
308
|
+
}
|
|
309
|
+
// ---------------------------------------------------------------------------
|
|
310
|
+
// Platform file generation
|
|
311
|
+
// ---------------------------------------------------------------------------
|
|
312
|
+
function generatePlatformFiles(projectPath, platform, stacks, options) {
|
|
313
|
+
const config = PLATFORM_CONFIGS[platform];
|
|
314
|
+
const results = [];
|
|
315
|
+
const wrapperById = new Map(WRAPPER_FILES.map((item) => [item.id, item.path]));
|
|
316
|
+
for (const source of SOURCE_FILES) {
|
|
317
|
+
const entry = config[source.id];
|
|
318
|
+
if (!entry)
|
|
319
|
+
continue;
|
|
320
|
+
const wrapperPath = wrapperById.get(source.id);
|
|
321
|
+
if (!wrapperPath)
|
|
322
|
+
continue;
|
|
323
|
+
const content = applyStacks(readTemplate(wrapperPath), stacks);
|
|
324
|
+
const frontmatter = yamlFrontmatter(entry.fm);
|
|
325
|
+
const writeResult = writeOutput(projectPath, entry.target, `${frontmatter}\n\n${content}`, options);
|
|
326
|
+
results.push(` ${formatWriteResult(writeResult)}`);
|
|
327
|
+
}
|
|
328
|
+
const summary = readTemplate("protocol-summary.md");
|
|
329
|
+
if (platform === "copilot") {
|
|
330
|
+
const writeResult = writeOutput(projectPath, ".github/copilot-instructions.md", summary, options);
|
|
331
|
+
results.push(` ${formatWriteResult(writeResult)}`);
|
|
332
|
+
}
|
|
333
|
+
else if (platform === "cursor") {
|
|
334
|
+
const frontmatter = yamlFrontmatter({ description: "SyncLoop protocol summary and guardrails", alwaysApply: true });
|
|
335
|
+
const writeResult = writeOutput(projectPath, ".cursor/rules/00-protocol.md", `${frontmatter}\n\n${summary}`, options);
|
|
336
|
+
results.push(` ${formatWriteResult(writeResult)}`);
|
|
337
|
+
}
|
|
338
|
+
else if (platform === "claude") {
|
|
339
|
+
const writeResult = writeOutput(projectPath, "CLAUDE.md", summary, options);
|
|
340
|
+
results.push(` ${formatWriteResult(writeResult)}`);
|
|
341
|
+
}
|
|
342
|
+
return results;
|
|
343
|
+
}
|
|
344
|
+
// ---------------------------------------------------------------------------
|
|
345
|
+
// Public API
|
|
346
|
+
// ---------------------------------------------------------------------------
|
|
347
|
+
export function init(projectPath, target = "all", stacks = [], options = {}) {
|
|
348
|
+
const root = resolve(projectPath);
|
|
349
|
+
const effectiveStacks = stacks.length > 0 ? stacks : detectStacks(root);
|
|
350
|
+
const mergedOptions = {
|
|
351
|
+
dryRun: Boolean(options.dryRun),
|
|
352
|
+
overwrite: options.overwrite ?? true,
|
|
353
|
+
};
|
|
354
|
+
const validTargets = ["copilot", "cursor", "claude", "all"];
|
|
355
|
+
if (!validTargets.includes(target)) {
|
|
356
|
+
throw new Error(`Unknown target "${target}". Use one of: ${validTargets.join(", ")}`);
|
|
357
|
+
}
|
|
358
|
+
const results = [];
|
|
359
|
+
const src = join(TEMPLATE_DIR, ".agent-loop");
|
|
360
|
+
const dest = join(root, ".agent-loop");
|
|
361
|
+
if (!mergedOptions.dryRun) {
|
|
362
|
+
cpSync(src, dest, {
|
|
363
|
+
recursive: true,
|
|
364
|
+
force: mergedOptions.overwrite,
|
|
365
|
+
errorOnExist: false,
|
|
366
|
+
});
|
|
367
|
+
if (effectiveStacks.length > 0) {
|
|
368
|
+
for (const source of SOURCE_FILES) {
|
|
369
|
+
const destFile = join(root, source.path);
|
|
370
|
+
if (!mergedOptions.overwrite && existsSync(destFile))
|
|
371
|
+
continue;
|
|
372
|
+
try {
|
|
373
|
+
const current = readFileSync(destFile, "utf-8");
|
|
374
|
+
const updated = applyStacks(current, effectiveStacks);
|
|
375
|
+
if (updated !== current)
|
|
376
|
+
writeFileSync(destFile, updated, "utf-8");
|
|
377
|
+
}
|
|
378
|
+
catch {
|
|
379
|
+
// Ignore files that are missing after copy.
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
results.push(`.agent-loop/ (canonical source${mergedOptions.dryRun ? ", dry-run" : ""})`);
|
|
385
|
+
const agentsContent = applyStacks(readTemplate("AGENTS.md"), effectiveStacks);
|
|
386
|
+
const agentsResult = writeOutput(root, "AGENTS.md", agentsContent, mergedOptions);
|
|
387
|
+
results.push(`AGENTS.md (cross-platform entrypoint: ${formatWriteResult(agentsResult)})`);
|
|
388
|
+
const targets = target === "all"
|
|
389
|
+
? ["copilot", "cursor", "claude"]
|
|
390
|
+
: [target];
|
|
391
|
+
for (const currentTarget of targets) {
|
|
392
|
+
results.push(`\n[${currentTarget}]`);
|
|
393
|
+
results.push(...generatePlatformFiles(root, currentTarget, effectiveStacks, mergedOptions));
|
|
394
|
+
}
|
|
395
|
+
return {
|
|
396
|
+
projectPath: root,
|
|
397
|
+
target,
|
|
398
|
+
dryRun: mergedOptions.dryRun,
|
|
399
|
+
overwrite: mergedOptions.overwrite,
|
|
400
|
+
stacks: effectiveStacks,
|
|
401
|
+
results,
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { type StackDefinition } from "./init.js";
|
|
3
|
+
export declare function pathDir(value: string): string;
|
|
4
|
+
export declare function splitHash(link: string): {
|
|
5
|
+
pathPart: string;
|
|
6
|
+
hash: string;
|
|
7
|
+
};
|
|
8
|
+
export declare function isExternalLink(link: string): boolean;
|
|
9
|
+
export declare function rewriteMarkdownLinks(content: string, transform: (path: string) => string): string;
|
|
10
|
+
export declare function rewriteResourceLinks(content: string, sourcePath: string): string;
|
|
11
|
+
export declare function formatStacks(stacks: StackDefinition[]): string;
|
|
12
|
+
export declare function createServer(): McpServer;
|
|
13
|
+
export declare function startServer(): Promise<McpServer>;
|