create-einja-app 0.3.0 → 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.
Files changed (80) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.js +32 -16
  3. package/dist/cli.js.map +1 -1
  4. package/package.json +1 -1
  5. package/templates/default/.claude/hooks/einja/plan-mode-skill-loader.sh +23 -0
  6. package/templates/default/.claude/settings.json +15 -1
  7. package/templates/default/.env.personal.example +6 -2
  8. package/templates/default/.envrc +5 -0
  9. package/templates/default/.github/workflows/deploy-pr-preview.yml +23 -24
  10. package/templates/default/.github/workflows/deploy-stable-branches.yml +55 -49
  11. package/templates/default/.mcp.json +2 -12
  12. package/templates/default/.serena/project.yml +7 -0
  13. package/templates/default/CLAUDE.md +28 -4
  14. package/templates/default/README.md +2 -2
  15. package/templates/default/apps/admin/package.json +1 -1
  16. package/templates/default/apps/admin/tsconfig.json +2 -1
  17. package/templates/default/apps/web/package.json +1 -1
  18. package/templates/default/apps/web/tsconfig.json +2 -1
  19. package/templates/default/docs/plans/.gitkeep +0 -0
  20. package/templates/default/docs/plans/ancient-greeting-flamingo-agent-a87e67c.md +221 -0
  21. package/templates/default/docs/plans/ancient-greeting-flamingo-agent-ab73a1c.md +107 -0
  22. package/templates/default/docs/plans/ancient-greeting-flamingo.md +120 -0
  23. package/templates/default/docs/plans/bright-stargazing-dawn.md +87 -0
  24. package/templates/default/docs/plans/calm-stirring-bonbon.md +196 -0
  25. package/templates/default/docs/plans/calm-watching-widget.md +111 -0
  26. package/templates/default/docs/plans/cheerful-wiggling-ullman.md +164 -0
  27. package/templates/default/docs/plans/compiled-humming-cherny.md +94 -0
  28. package/templates/default/docs/plans/dapper-launching-lynx.md +81 -0
  29. package/templates/default/docs/plans/effervescent-munching-kite-agent-ac08baf.md +672 -0
  30. package/templates/default/docs/plans/effervescent-munching-kite-agent-aecc373.md +442 -0
  31. package/templates/default/docs/plans/effervescent-munching-kite.md +263 -0
  32. package/templates/default/docs/plans/fix-orphan-cleaner-review.md +25 -0
  33. package/templates/default/docs/plans/fix-sync-template-variables.md +162 -0
  34. package/templates/default/docs/plans/glimmering-giggling-sedgewick.md +126 -0
  35. package/templates/default/docs/plans/glittery-swimming-bachman.md +78 -0
  36. package/templates/default/docs/plans/happy-watching-toast.md +56 -0
  37. package/templates/default/docs/plans/harmonic-strolling-nebula.md +210 -0
  38. package/templates/default/docs/plans/import-alias-refactor.md +75 -0
  39. package/templates/default/docs/plans/lazy-percolating-sloth-agent-abda679.md +346 -0
  40. package/templates/default/docs/plans/lazy-percolating-sloth.md +151 -0
  41. package/templates/default/docs/plans/linked-greeting-llama-agent-a7a6e5b.md +345 -0
  42. package/templates/default/docs/plans/linked-greeting-llama.md +467 -0
  43. package/templates/default/docs/plans/lovely-bubbling-rose.md +80 -0
  44. package/templates/default/docs/plans/optimized-watching-sprout.md +149 -0
  45. package/templates/default/docs/plans/peaceful-beaming-toast-agent-a292da6.md +288 -0
  46. package/templates/default/docs/plans/peaceful-beaming-toast-agent-a819699.md +366 -0
  47. package/templates/default/docs/plans/peaceful-beaming-toast-agent-ac11de2.md +474 -0
  48. package/templates/default/docs/plans/peaceful-beaming-toast.md +345 -0
  49. package/templates/default/docs/plans/purrfect-spinning-hickey-agent-ae6194c.md +300 -0
  50. package/templates/default/docs/plans/purrfect-spinning-hickey-agent-ae6900e.md +444 -0
  51. package/templates/default/docs/plans/purrfect-spinning-hickey.md +361 -0
  52. package/templates/default/docs/plans/recursive-kindling-lemon-agent-a42199e.md +186 -0
  53. package/templates/default/docs/plans/recursive-kindling-lemon.md +36 -0
  54. package/templates/default/docs/plans/seed-migration-tests.md +47 -0
  55. package/templates/default/docs/plans/sprightly-leaping-manatee.md +224 -0
  56. package/templates/default/docs/plans/stateful-wishing-lerdorf.md +161 -0
  57. package/templates/default/docs/plans/streamed-purring-wreath.md +40 -0
  58. package/templates/default/docs/plans/synthetic-percolating-pearl.md +101 -0
  59. package/templates/default/docs/plans/todo-fix-sync-template-variables.md +21 -0
  60. package/templates/default/docs/plans/todo-phase4-marker-update.md +39 -0
  61. package/templates/default/docs/plans/todo-skill-creator-sync.md +23 -0
  62. package/templates/default/docs/plans/typed-snuggling-parnas-agent-a6f6391.md +476 -0
  63. package/templates/default/docs/plans/typed-snuggling-parnas-agent-adb678b.md +144 -0
  64. package/templates/default/docs/plans/typed-snuggling-parnas.md +84 -0
  65. package/templates/default/docs/plans/warm-hopping-lighthouse-agent-a30aa4f.md +534 -0
  66. package/templates/default/docs/plans/warm-hopping-lighthouse-agent-a57a278.md +508 -0
  67. package/templates/default/docs/plans/warm-hopping-lighthouse-agent-a90b809.md +421 -0
  68. package/templates/default/docs/plans/warm-hopping-lighthouse.md +199 -0
  69. package/templates/default/docs/verification-test.md +2 -0
  70. package/templates/default/gitignore +4 -0
  71. package/templates/default/package.json +2 -2
  72. package/templates/default/packages/admin-ui/package.json +1 -1
  73. package/templates/default/packages/server-core/tsconfig.json +6 -1
  74. package/templates/default/pnpm-lock.yaml +276 -57
  75. package/templates/default/scripts/ensure-serena.sh +75 -0
  76. package/templates/default/scripts/lib/worktree-config.ts +64 -0
  77. package/templates/default/scripts/stop-serena.sh +25 -0
  78. package/templates/default/scripts/worktree/dev.ts +2 -2
  79. /package/templates/default/scripts/{cli-template-update.ts → _cli-template-update.ts} +0 -0
  80. /package/templates/default/scripts/{template-update.ts → _template-update.ts} +0 -0
package/README.md CHANGED
@@ -129,7 +129,7 @@ $ npx create-einja-app add
129
129
 
130
130
  ファイルの競合は以下のマーカーベースで処理されます:
131
131
  - `@einja:managed` - テンプレートで上書き
132
- - `@einja:seed` - ローカル優先(初回のみコピー)
132
+ - `@einja:project-private` - ローカル優先(初回のみコピー)
133
133
  - マーカーなし - 既存ファイル優先
134
134
 
135
135
  **JSONマージ設定 (.einja-sync.json):**
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 === "seed"
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 templateSeedById = /* @__PURE__ */ new Map();
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 === "seed" && section.id) {
1208
- templateSeedById.set(section.id, section);
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 === "seed") {
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 templateSeedById) {
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 (isPathSeed(filePath, keyPath, jsonPaths)) {
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: {}, seed: {} };
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: "seed", id: match[1] || void 0 };
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: "seed", id: match[1] || void 0 };
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 "seed";
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 "seed";
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 isPathSeed(filePath, keyPath, jsonPaths) {
1504
- const seedPaths = jsonPaths.seed[filePath] || [];
1505
- return seedPaths.some((p) => keyPath === p || keyPath.startsWith(`${p}.`));
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
- seed: {}
1858
+ "project-private": {}
1843
1859
  }
1844
1860
  };
1845
1861
  const result = {