create-einja-app 0.3.1 → 0.3.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 +1 -1
- package/dist/cli.js +32 -16
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
- package/templates/default/.claude/hooks/einja/plan-mode-skill-loader.sh +23 -0
- package/templates/default/.claude/settings.json +15 -1
- package/templates/default/.env.personal.example +6 -2
- package/templates/default/.envrc +5 -0
- package/templates/default/.github/workflows/deploy-pr-preview.yml +23 -24
- package/templates/default/.github/workflows/deploy-stable-branches.yml +55 -49
- package/templates/default/.mcp.json +2 -12
- package/templates/default/.serena/project.yml +7 -0
- package/templates/default/CLAUDE.md +28 -4
- package/templates/default/README.md +2 -2
- package/templates/default/apps/admin/package.json +1 -1
- package/templates/default/apps/admin/tsconfig.json +2 -1
- package/templates/default/apps/web/package.json +1 -1
- package/templates/default/apps/web/tsconfig.json +2 -1
- package/templates/default/docs/plans/.gitkeep +0 -0
- package/templates/default/docs/plans/ancient-greeting-flamingo-agent-a87e67c.md +221 -0
- package/templates/default/docs/plans/ancient-greeting-flamingo-agent-ab73a1c.md +107 -0
- package/templates/default/docs/plans/ancient-greeting-flamingo.md +120 -0
- package/templates/default/docs/plans/bright-stargazing-dawn.md +87 -0
- package/templates/default/docs/plans/calm-stirring-bonbon.md +196 -0
- package/templates/default/docs/plans/calm-watching-widget.md +111 -0
- package/templates/default/docs/plans/cheerful-wiggling-ullman.md +164 -0
- package/templates/default/docs/plans/compiled-humming-cherny.md +94 -0
- package/templates/default/docs/plans/dapper-launching-lynx.md +81 -0
- package/templates/default/docs/plans/effervescent-munching-kite-agent-ac08baf.md +672 -0
- package/templates/default/docs/plans/effervescent-munching-kite-agent-aecc373.md +442 -0
- package/templates/default/docs/plans/effervescent-munching-kite.md +263 -0
- package/templates/default/docs/plans/fix-orphan-cleaner-review.md +25 -0
- package/templates/default/docs/plans/fix-sync-template-variables.md +162 -0
- package/templates/default/docs/plans/glimmering-giggling-sedgewick.md +126 -0
- package/templates/default/docs/plans/glittery-swimming-bachman.md +78 -0
- package/templates/default/docs/plans/happy-watching-toast.md +56 -0
- package/templates/default/docs/plans/harmonic-strolling-nebula.md +210 -0
- package/templates/default/docs/plans/import-alias-refactor.md +75 -0
- package/templates/default/docs/plans/lazy-percolating-sloth-agent-abda679.md +346 -0
- package/templates/default/docs/plans/lazy-percolating-sloth.md +151 -0
- package/templates/default/docs/plans/linked-greeting-llama-agent-a7a6e5b.md +345 -0
- package/templates/default/docs/plans/linked-greeting-llama.md +467 -0
- package/templates/default/docs/plans/lovely-bubbling-rose.md +80 -0
- package/templates/default/docs/plans/optimized-watching-sprout.md +149 -0
- package/templates/default/docs/plans/peaceful-beaming-toast-agent-a292da6.md +288 -0
- package/templates/default/docs/plans/peaceful-beaming-toast-agent-a819699.md +366 -0
- package/templates/default/docs/plans/peaceful-beaming-toast-agent-ac11de2.md +474 -0
- package/templates/default/docs/plans/peaceful-beaming-toast.md +345 -0
- package/templates/default/docs/plans/purrfect-spinning-hickey-agent-ae6194c.md +300 -0
- package/templates/default/docs/plans/purrfect-spinning-hickey-agent-ae6900e.md +444 -0
- package/templates/default/docs/plans/purrfect-spinning-hickey.md +361 -0
- package/templates/default/docs/plans/recursive-kindling-lemon-agent-a42199e.md +186 -0
- package/templates/default/docs/plans/recursive-kindling-lemon.md +36 -0
- package/templates/default/docs/plans/seed-migration-tests.md +47 -0
- package/templates/default/docs/plans/sprightly-leaping-manatee.md +224 -0
- package/templates/default/docs/plans/stateful-wishing-lerdorf.md +161 -0
- package/templates/default/docs/plans/streamed-purring-wreath.md +40 -0
- package/templates/default/docs/plans/synthetic-percolating-pearl.md +101 -0
- package/templates/default/docs/plans/todo-fix-sync-template-variables.md +21 -0
- package/templates/default/docs/plans/todo-phase4-marker-update.md +39 -0
- package/templates/default/docs/plans/todo-skill-creator-sync.md +23 -0
- package/templates/default/docs/plans/typed-snuggling-parnas-agent-a6f6391.md +476 -0
- package/templates/default/docs/plans/typed-snuggling-parnas-agent-adb678b.md +144 -0
- package/templates/default/docs/plans/typed-snuggling-parnas.md +84 -0
- package/templates/default/docs/plans/warm-hopping-lighthouse-agent-a30aa4f.md +534 -0
- package/templates/default/docs/plans/warm-hopping-lighthouse-agent-a57a278.md +508 -0
- package/templates/default/docs/plans/warm-hopping-lighthouse-agent-a90b809.md +421 -0
- package/templates/default/docs/plans/warm-hopping-lighthouse.md +199 -0
- package/templates/default/docs/verification-test.md +2 -0
- package/templates/default/gitignore +4 -0
- package/templates/default/package.json +2 -2
- package/templates/default/packages/admin-ui/package.json +1 -1
- package/templates/default/packages/server-core/tsconfig.json +6 -1
- package/templates/default/pnpm-lock.yaml +276 -57
- package/templates/default/scripts/ensure-serena.sh +75 -0
- package/templates/default/scripts/lib/worktree-config.ts +64 -0
- package/templates/default/scripts/stop-serena.sh +25 -0
- package/templates/default/scripts/worktree/dev.ts +2 -2
- /package/templates/default/scripts/{cli-template-update.ts → _cli-template-update.ts} +0 -0
- /package/templates/default/scripts/{template-update.ts → _template-update.ts} +0 -0
package/README.md
CHANGED
package/dist/cli.js
CHANGED
|
@@ -1190,13 +1190,13 @@ function mergeTextWithMarkers(templateContent, existingContent) {
|
|
|
1190
1190
|
const templateSections = parseMarkers(templateContent);
|
|
1191
1191
|
const localSections = parseMarkers(existingContent);
|
|
1192
1192
|
const hasMarkers = templateSections.some(
|
|
1193
|
-
(s) => s.type === "managed" || s.type === "
|
|
1193
|
+
(s) => s.type === "managed" || s.type === "project-private"
|
|
1194
1194
|
);
|
|
1195
1195
|
if (!hasMarkers) {
|
|
1196
1196
|
return existingContent;
|
|
1197
1197
|
}
|
|
1198
1198
|
const templateManagedById = /* @__PURE__ */ new Map();
|
|
1199
|
-
const
|
|
1199
|
+
const templateProjectPrivateById = /* @__PURE__ */ new Map();
|
|
1200
1200
|
const templateManagedWithoutId = [];
|
|
1201
1201
|
const processedTemplateIds = /* @__PURE__ */ new Set();
|
|
1202
1202
|
for (const section of templateSections) {
|
|
@@ -1204,8 +1204,8 @@ function mergeTextWithMarkers(templateContent, existingContent) {
|
|
|
1204
1204
|
templateManagedById.set(section.id, section);
|
|
1205
1205
|
} else if (section.type === "managed") {
|
|
1206
1206
|
templateManagedWithoutId.push(section);
|
|
1207
|
-
} else if (section.type === "
|
|
1208
|
-
|
|
1207
|
+
} else if (section.type === "project-private" && section.id) {
|
|
1208
|
+
templateProjectPrivateById.set(section.id, section);
|
|
1209
1209
|
}
|
|
1210
1210
|
}
|
|
1211
1211
|
const result = [];
|
|
@@ -1225,7 +1225,7 @@ function mergeTextWithMarkers(templateContent, existingContent) {
|
|
|
1225
1225
|
result.push(localSection.content);
|
|
1226
1226
|
}
|
|
1227
1227
|
}
|
|
1228
|
-
} else if (localSection.type === "
|
|
1228
|
+
} else if (localSection.type === "project-private") {
|
|
1229
1229
|
if (localSection.id) {
|
|
1230
1230
|
processedTemplateIds.add(localSection.id);
|
|
1231
1231
|
}
|
|
@@ -1242,7 +1242,7 @@ function mergeTextWithMarkers(templateContent, existingContent) {
|
|
|
1242
1242
|
for (const section of templateManagedWithoutId.slice(managedWithoutIdIndex)) {
|
|
1243
1243
|
result.push(section.content);
|
|
1244
1244
|
}
|
|
1245
|
-
for (const [id, section] of
|
|
1245
|
+
for (const [id, section] of templateProjectPrivateById) {
|
|
1246
1246
|
if (!processedTemplateIds.has(id)) {
|
|
1247
1247
|
result.push(section.content);
|
|
1248
1248
|
}
|
|
@@ -1272,7 +1272,7 @@ function deepMergeWithPaths(template, existing, jsonPaths, filePath, currentPath
|
|
|
1272
1272
|
const existingValue = existing[key];
|
|
1273
1273
|
if (isPathManaged(filePath, keyPath, jsonPaths)) {
|
|
1274
1274
|
result[key] = deepClone(templateValue);
|
|
1275
|
-
} else if (
|
|
1275
|
+
} else if (isPathProjectPrivate(filePath, keyPath, jsonPaths)) {
|
|
1276
1276
|
if (typeof templateValue === "object" && templateValue !== null && !Array.isArray(templateValue) && typeof existingValue === "object" && existingValue !== null && !Array.isArray(existingValue)) {
|
|
1277
1277
|
result[key] = deepMergeWithPaths(
|
|
1278
1278
|
templateValue,
|
|
@@ -1373,7 +1373,7 @@ async function mergeAndWriteFile(templatePath, targetPath, syncMetadata, package
|
|
|
1373
1373
|
try {
|
|
1374
1374
|
const templateJson = JSON.parse(templateContent);
|
|
1375
1375
|
const existingJson = existingContent ? JSON.parse(existingContent) : null;
|
|
1376
|
-
const jsonPaths = syncMetadata.jsonPaths || { managed: {},
|
|
1376
|
+
const jsonPaths = syncMetadata.jsonPaths || { managed: {}, "project-private": {} };
|
|
1377
1377
|
const fileName = targetPath.split("/").pop() || "package.json";
|
|
1378
1378
|
const mergedJson = mergeJson(templateJson, existingJson, jsonPaths, fileName);
|
|
1379
1379
|
mergedContent = JSON.stringify(mergedJson, null, 2);
|
|
@@ -1462,20 +1462,30 @@ function parseStartMarker(line) {
|
|
|
1462
1462
|
if (match) {
|
|
1463
1463
|
return { type: "managed", id: match[1] || void 0 };
|
|
1464
1464
|
}
|
|
1465
|
+
const markdownProjectPrivatePattern = /^<!--\s*@einja:project-private:start(?:\s+id="([^"]+)")?\s*-->$/;
|
|
1466
|
+
match = line.match(markdownProjectPrivatePattern);
|
|
1467
|
+
if (match) {
|
|
1468
|
+
return { type: "project-private", id: match[1] || void 0 };
|
|
1469
|
+
}
|
|
1465
1470
|
const markdownSeedPattern = /^<!--\s*@einja:seed:start(?:\s+id="([^"]+)")?\s*-->$/;
|
|
1466
1471
|
match = line.match(markdownSeedPattern);
|
|
1467
1472
|
if (match) {
|
|
1468
|
-
return { type: "
|
|
1473
|
+
return { type: "project-private", id: match[1] || void 0 };
|
|
1469
1474
|
}
|
|
1470
1475
|
const yamlManagedPattern = /^\s*#\s*@einja:managed:start(?:\s+id="([^"]+)")?\s*$/;
|
|
1471
1476
|
match = line.match(yamlManagedPattern);
|
|
1472
1477
|
if (match) {
|
|
1473
1478
|
return { type: "managed", id: match[1] || void 0 };
|
|
1474
1479
|
}
|
|
1480
|
+
const yamlProjectPrivatePattern = /^\s*#\s*@einja:project-private:start(?:\s+id="([^"]+)")?\s*$/;
|
|
1481
|
+
match = line.match(yamlProjectPrivatePattern);
|
|
1482
|
+
if (match) {
|
|
1483
|
+
return { type: "project-private", id: match[1] || void 0 };
|
|
1484
|
+
}
|
|
1475
1485
|
const yamlSeedPattern = /^\s*#\s*@einja:seed:start(?:\s+id="([^"]+)")?\s*$/;
|
|
1476
1486
|
match = line.match(yamlSeedPattern);
|
|
1477
1487
|
if (match) {
|
|
1478
|
-
return { type: "
|
|
1488
|
+
return { type: "project-private", id: match[1] || void 0 };
|
|
1479
1489
|
}
|
|
1480
1490
|
return null;
|
|
1481
1491
|
}
|
|
@@ -1483,14 +1493,20 @@ function parseEndMarker(line) {
|
|
|
1483
1493
|
if (/^<!--\s*@einja:managed:end\s*-->$/.test(line)) {
|
|
1484
1494
|
return "managed";
|
|
1485
1495
|
}
|
|
1496
|
+
if (/^<!--\s*@einja:project-private:end\s*-->$/.test(line)) {
|
|
1497
|
+
return "project-private";
|
|
1498
|
+
}
|
|
1486
1499
|
if (/^<!--\s*@einja:seed:end\s*-->$/.test(line)) {
|
|
1487
|
-
return "
|
|
1500
|
+
return "project-private";
|
|
1488
1501
|
}
|
|
1489
1502
|
if (/^\s*#\s*@einja:managed:end\s*$/.test(line)) {
|
|
1490
1503
|
return "managed";
|
|
1491
1504
|
}
|
|
1505
|
+
if (/^\s*#\s*@einja:project-private:end\s*$/.test(line)) {
|
|
1506
|
+
return "project-private";
|
|
1507
|
+
}
|
|
1492
1508
|
if (/^\s*#\s*@einja:seed:end\s*$/.test(line)) {
|
|
1493
|
-
return "
|
|
1509
|
+
return "project-private";
|
|
1494
1510
|
}
|
|
1495
1511
|
return null;
|
|
1496
1512
|
}
|
|
@@ -1500,9 +1516,9 @@ function isPathManaged(filePath, keyPath, jsonPaths) {
|
|
|
1500
1516
|
(p) => keyPath === p || keyPath.startsWith(`${p}.`)
|
|
1501
1517
|
);
|
|
1502
1518
|
}
|
|
1503
|
-
function
|
|
1504
|
-
const
|
|
1505
|
-
return
|
|
1519
|
+
function isPathProjectPrivate(filePath, keyPath, jsonPaths) {
|
|
1520
|
+
const projectPrivatePaths = jsonPaths["project-private"][filePath] || [];
|
|
1521
|
+
return projectPrivatePaths.some((p) => keyPath === p || keyPath.startsWith(`${p}.`));
|
|
1506
1522
|
}
|
|
1507
1523
|
|
|
1508
1524
|
// src/utils/placeholder-validator.ts
|
|
@@ -1839,7 +1855,7 @@ async function syncCommand(options) {
|
|
|
1839
1855
|
files: {},
|
|
1840
1856
|
jsonPaths: {
|
|
1841
1857
|
managed: {},
|
|
1842
|
-
|
|
1858
|
+
"project-private": {}
|
|
1843
1859
|
}
|
|
1844
1860
|
};
|
|
1845
1861
|
const result = {
|