create-carlonicora-app 1.7.0 → 1.9.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.
Files changed (56) hide show
  1. package/dist/cli.js +10 -2
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/index.d.ts +9 -0
  4. package/dist/commands/index.d.ts.map +1 -0
  5. package/dist/commands/index.js +9 -0
  6. package/dist/commands/index.js.map +1 -0
  7. package/dist/commands/patch.d.ts +8 -0
  8. package/dist/commands/patch.d.ts.map +1 -0
  9. package/dist/commands/patch.js +195 -0
  10. package/dist/commands/patch.js.map +1 -0
  11. package/dist/commands/propose.d.ts +8 -0
  12. package/dist/commands/propose.d.ts.map +1 -0
  13. package/dist/commands/propose.js +129 -0
  14. package/dist/commands/propose.js.map +1 -0
  15. package/dist/commands/sync.d.ts +8 -0
  16. package/dist/commands/sync.d.ts.map +1 -0
  17. package/dist/commands/sync.js +110 -0
  18. package/dist/commands/sync.js.map +1 -0
  19. package/dist/core-update/generalizer.d.ts +36 -0
  20. package/dist/core-update/generalizer.d.ts.map +1 -0
  21. package/dist/core-update/generalizer.js +130 -0
  22. package/dist/core-update/generalizer.js.map +1 -0
  23. package/dist/core-update/index.d.ts +11 -0
  24. package/dist/core-update/index.d.ts.map +1 -0
  25. package/dist/core-update/index.js +11 -0
  26. package/dist/core-update/index.js.map +1 -0
  27. package/dist/core-update/manifest.d.ts +47 -0
  28. package/dist/core-update/manifest.d.ts.map +1 -0
  29. package/dist/core-update/manifest.js +118 -0
  30. package/dist/core-update/manifest.js.map +1 -0
  31. package/dist/core-update/patch-applier.d.ts +19 -0
  32. package/dist/core-update/patch-applier.d.ts.map +1 -0
  33. package/dist/core-update/patch-applier.js +115 -0
  34. package/dist/core-update/patch-applier.js.map +1 -0
  35. package/dist/core-update/patch-generator.d.ts +23 -0
  36. package/dist/core-update/patch-generator.d.ts.map +1 -0
  37. package/dist/core-update/patch-generator.js +137 -0
  38. package/dist/core-update/patch-generator.js.map +1 -0
  39. package/dist/core-update/types.d.ts +71 -0
  40. package/dist/core-update/types.d.ts.map +1 -0
  41. package/dist/core-update/types.js +7 -0
  42. package/dist/core-update/types.js.map +1 -0
  43. package/package.json +4 -2
  44. package/template/CORE-UPDATE.md +519 -0
  45. package/template/README.md +212 -1
  46. package/template/apps/api/src/neo4j.migrations/20250901_002.ts +24 -31
  47. package/template/apps/api/src/neo4j.migrations/queries/migration.queries.ts +0 -2
  48. package/template/apps/api/templates/email/en/activationEmail.hbs +27 -0
  49. package/template/apps/api/templates/email/en/registrationAdminNotification.hbs +48 -0
  50. package/template/apps/api/templates/email/en/waitlistAdminNotification.hbs +47 -0
  51. package/template/apps/api/templates/email/en/waitlistConfirmation.hbs +30 -0
  52. package/template/apps/api/templates/email/en/waitlistInvitation.hbs +29 -0
  53. package/template/apps/api/templates/email/footer.hbs +3 -0
  54. package/template/apps/api/templates/email/header.hbs +3 -0
  55. package/template/gitignore +4 -1
  56. package/template/package.json +3 -3
package/dist/cli.js CHANGED
@@ -6,12 +6,16 @@ import { directoryExists, directoryIsEmpty } from './utils/files.js';
6
6
  import { checkGitInstalled, checkPnpmInstalled } from './git.js';
7
7
  import { promptProjectName, promptOverwrite, promptContinueWithoutGit, promptContinueWithoutPnpm, } from './prompts.js';
8
8
  import { scaffold } from './scaffold.js';
9
+ import { createProposeCommand, createSyncCommand, createPatchCommand } from './commands/index.js';
9
10
  const program = new Command();
10
11
  program
11
12
  .name('create-carlonicora-app')
12
13
  .description('Create a new NestJS + Next.js monorepo project with Neo4j and JSON:API')
13
- .version('1.0.0')
14
- .argument('[project-name]', 'Name of the project')
14
+ .version('1.0.0');
15
+ // Default create command
16
+ program
17
+ .command('create [project-name]', { isDefault: true })
18
+ .description('Create a new project')
15
19
  .option('--skip-git', 'Skip git initialization and submodules')
16
20
  .option('--skip-install', 'Skip dependency installation')
17
21
  .action(async (projectName, options) => {
@@ -88,5 +92,9 @@ program
88
92
  process.exit(1);
89
93
  }
90
94
  });
95
+ // Add core update commands
96
+ program.addCommand(createProposeCommand());
97
+ program.addCommand(createSyncCommand());
98
+ program.addCommand(createPatchCommand());
91
99
  program.parse();
92
100
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Command Exports
3
+ *
4
+ * Central export for all CLI commands.
5
+ */
6
+ export { createProposeCommand } from './propose.js';
7
+ export { createSyncCommand } from './sync.js';
8
+ export { createPatchCommand } from './patch.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Command Exports
3
+ *
4
+ * Central export for all CLI commands.
5
+ */
6
+ export { createProposeCommand } from './propose.js';
7
+ export { createSyncCommand } from './sync.js';
8
+ export { createPatchCommand } from './patch.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Patch Command
3
+ *
4
+ * Generate and apply patches.
5
+ */
6
+ import { Command } from 'commander';
7
+ export declare function createPatchCommand(): Command;
8
+ //# sourceMappingURL=patch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch.d.ts","sourceRoot":"","sources":["../../src/commands/patch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6BpC,wBAAgB,kBAAkB,IAAI,OAAO,CA+L5C"}
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Patch Command
3
+ *
4
+ * Generate and apply patches.
5
+ */
6
+ import { Command } from 'commander';
7
+ import chalk from 'chalk';
8
+ import fs from 'fs-extra';
9
+ import path from 'path';
10
+ import { fileURLToPath } from 'url';
11
+ import { getProposedUpdates } from '../core-update/manifest.js';
12
+ import { generatePatch, savePatch, listPatches, loadPatch } from '../core-update/patch-generator.js';
13
+ import { applyPatch, previewPatch } from '../core-update/patch-applier.js';
14
+ const __filename = fileURLToPath(import.meta.url);
15
+ const __dirname = path.dirname(__filename);
16
+ function getPatchesPath() {
17
+ return path.resolve(__dirname, '..', '..', 'patches');
18
+ }
19
+ function getTemplatePath() {
20
+ return path.resolve(__dirname, '..', '..', 'template');
21
+ }
22
+ async function detectAppName(appPath) {
23
+ const packageJsonPath = path.join(appPath, 'package.json');
24
+ if (await fs.pathExists(packageJsonPath)) {
25
+ const pkg = await fs.readJson(packageJsonPath);
26
+ return pkg.name || path.basename(appPath);
27
+ }
28
+ return path.basename(appPath);
29
+ }
30
+ export function createPatchCommand() {
31
+ const patch = new Command('patch')
32
+ .description('Generate and apply patches');
33
+ // Generate subcommand
34
+ patch
35
+ .command('generate')
36
+ .description('Generate a patch from proposed files')
37
+ .requiredOption('-m, --message <message>', 'Patch description')
38
+ .option('--from <path>', 'Source app path (default: current directory)')
39
+ .action(async (options) => {
40
+ try {
41
+ const appPath = options.from ? path.resolve(options.from) : process.cwd();
42
+ const templatePath = getTemplatePath();
43
+ const patchesPath = getPatchesPath();
44
+ const appName = await detectAppName(appPath);
45
+ const updates = await getProposedUpdates(appPath, appName);
46
+ if (updates.length === 0) {
47
+ console.log(chalk.yellow('No files proposed for patch.'));
48
+ console.log(chalk.gray('Use "propose add <file>" to add files first.'));
49
+ return;
50
+ }
51
+ console.log(chalk.bold('Generating patch...'));
52
+ console.log(` Source: ${chalk.cyan(appPath)}`);
53
+ console.log(` Files: ${updates.length}`);
54
+ console.log();
55
+ const patchData = await generatePatch(appPath, templatePath, appName, updates, options.message);
56
+ const patchPath = await savePatch(patchesPath, patchData);
57
+ console.log(chalk.green('Patch generated successfully!'));
58
+ console.log(` ID: ${chalk.cyan(patchData.metadata.id)}`);
59
+ console.log(` Path: ${patchPath}`);
60
+ console.log(` Files: ${patchData.files.length}`);
61
+ console.log(` Categories: ${patchData.metadata.categories.join(', ')}`);
62
+ }
63
+ catch (error) {
64
+ console.error(chalk.red(`Error: ${error instanceof Error ? error.message : error}`));
65
+ process.exit(1);
66
+ }
67
+ });
68
+ // List subcommand
69
+ patch
70
+ .command('list')
71
+ .description('List available patches')
72
+ .action(async () => {
73
+ try {
74
+ const patchesPath = getPatchesPath();
75
+ const patches = await listPatches(patchesPath);
76
+ if (patches.length === 0) {
77
+ console.log(chalk.gray('No patches available.'));
78
+ return;
79
+ }
80
+ console.log(chalk.bold('Available patches:'));
81
+ console.log();
82
+ for (const p of patches) {
83
+ console.log(` ${chalk.cyan(p.metadata.id)}`);
84
+ console.log(` ${chalk.gray(p.metadata.description)}`);
85
+ console.log(` Files: ${p.files.length} | From: ${p.metadata.sourceApp} | Date: ${p.metadata.createdAt.split('T')[0]}`);
86
+ console.log();
87
+ }
88
+ }
89
+ catch (error) {
90
+ console.error(chalk.red(`Error: ${error instanceof Error ? error.message : error}`));
91
+ process.exit(1);
92
+ }
93
+ });
94
+ // Show subcommand
95
+ patch
96
+ .command('show <patch-id>')
97
+ .description('Show patch details')
98
+ .action(async (patchId) => {
99
+ try {
100
+ const patchesPath = getPatchesPath();
101
+ const patchPath = path.join(patchesPath, `${patchId}.patch.json`);
102
+ const patchData = await loadPatch(patchPath);
103
+ console.log(chalk.bold(`Patch: ${patchData.metadata.id}`));
104
+ console.log();
105
+ console.log(` Description: ${patchData.metadata.description}`);
106
+ console.log(` Source App: ${patchData.metadata.sourceApp}`);
107
+ console.log(` Created: ${patchData.metadata.createdAt}`);
108
+ console.log(` Categories: ${patchData.metadata.categories.join(', ')}`);
109
+ console.log();
110
+ console.log(chalk.bold('Files:'));
111
+ for (const file of patchData.files) {
112
+ console.log(` ${chalk.cyan(file.path)} [${file.operation}]`);
113
+ console.log(` ${chalk.gray(file.description)}`);
114
+ }
115
+ }
116
+ catch (error) {
117
+ console.error(chalk.red(`Error: ${error instanceof Error ? error.message : error}`));
118
+ process.exit(1);
119
+ }
120
+ });
121
+ // Apply subcommand
122
+ patch
123
+ .command('apply <patch-id>')
124
+ .description('Apply a patch to current directory or target')
125
+ .option('--target <path>', 'Target app path (default: current directory)')
126
+ .option('--dry-run', 'Show what would be applied without making changes')
127
+ .option('--force', 'Overwrite conflicting files')
128
+ .action(async (patchId, options) => {
129
+ try {
130
+ const patchesPath = getPatchesPath();
131
+ const patchPath = path.join(patchesPath, `${patchId}.patch.json`);
132
+ const targetPath = options.target ? path.resolve(options.target) : process.cwd();
133
+ const patchData = await loadPatch(patchPath);
134
+ console.log(chalk.bold(`Applying patch: ${patchData.metadata.id}`));
135
+ console.log(` Target: ${chalk.cyan(targetPath)}`);
136
+ console.log();
137
+ if (options.dryRun) {
138
+ const preview = await previewPatch(patchData, targetPath);
139
+ console.log(` Project name: ${chalk.cyan(preview.projectName)}`);
140
+ console.log();
141
+ if (preview.wouldApply.length > 0) {
142
+ console.log(chalk.green('Would apply:'));
143
+ for (const file of preview.wouldApply) {
144
+ console.log(` ${file}`);
145
+ }
146
+ }
147
+ if (preview.wouldConflict.length > 0) {
148
+ console.log();
149
+ console.log(chalk.yellow('Would conflict:'));
150
+ for (const conflict of preview.wouldConflict) {
151
+ console.log(` ${conflict.path}`);
152
+ console.log(` ${chalk.gray(conflict.reason)}`);
153
+ }
154
+ }
155
+ console.log();
156
+ console.log(chalk.gray('Dry run complete. No changes made.'));
157
+ return;
158
+ }
159
+ const result = await applyPatch(patchData, {
160
+ targetPath,
161
+ dryRun: false,
162
+ force: options.force,
163
+ });
164
+ if (result.applied.length > 0) {
165
+ console.log(chalk.green('Applied:'));
166
+ for (const file of result.applied) {
167
+ console.log(` ${file}`);
168
+ }
169
+ }
170
+ if (result.conflicts.length > 0) {
171
+ console.log();
172
+ console.log(chalk.yellow('Conflicts (skipped):'));
173
+ for (const conflict of result.conflicts) {
174
+ console.log(` ${conflict.path}`);
175
+ console.log(` ${chalk.gray(conflict.reason)}`);
176
+ }
177
+ console.log();
178
+ console.log(chalk.gray('Use --force to overwrite conflicting files.'));
179
+ }
180
+ console.log();
181
+ if (result.success) {
182
+ console.log(chalk.green(`Patch applied successfully! (${result.applied.length} file(s))`));
183
+ }
184
+ else {
185
+ console.log(chalk.yellow(`Patch partially applied. ${result.conflicts.length} conflict(s).`));
186
+ }
187
+ }
188
+ catch (error) {
189
+ console.error(chalk.red(`Error: ${error instanceof Error ? error.message : error}`));
190
+ process.exit(1);
191
+ }
192
+ });
193
+ return patch;
194
+ }
195
+ //# sourceMappingURL=patch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch.js","sourceRoot":"","sources":["../../src/commands/patch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Propose Command
3
+ *
4
+ * Stage files for core update.
5
+ */
6
+ import { Command } from 'commander';
7
+ export declare function createProposeCommand(): Command;
8
+ //# sourceMappingURL=propose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"propose.d.ts","sourceRoot":"","sources":["../../src/commands/propose.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBpC,wBAAgB,oBAAoB,IAAI,OAAO,CA8H9C"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Propose Command
3
+ *
4
+ * Stage files for core update.
5
+ */
6
+ import { Command } from 'commander';
7
+ import chalk from 'chalk';
8
+ import fs from 'fs-extra';
9
+ import path from 'path';
10
+ import { addProposedUpdate, removeProposedUpdate, clearProposedUpdates, getProposedUpdates, } from '../core-update/manifest.js';
11
+ const VALID_CATEGORIES = ['config', 'ci', 'dx', 'scripts', 'docker', 'docs', 'other'];
12
+ async function detectAppName(appPath) {
13
+ const packageJsonPath = path.join(appPath, 'package.json');
14
+ if (await fs.pathExists(packageJsonPath)) {
15
+ const pkg = await fs.readJson(packageJsonPath);
16
+ return pkg.name || path.basename(appPath);
17
+ }
18
+ return path.basename(appPath);
19
+ }
20
+ export function createProposeCommand() {
21
+ const propose = new Command('propose')
22
+ .description('Stage files for core update');
23
+ // Add subcommand
24
+ propose
25
+ .command('add <file>')
26
+ .description('Add a file to the proposal')
27
+ .requiredOption('-d, --description <description>', 'Description of the change')
28
+ .requiredOption('-c, --category <category>', `Category: ${VALID_CATEGORIES.join(', ')}`)
29
+ .action(async (file, options) => {
30
+ try {
31
+ const appPath = process.cwd();
32
+ const appName = await detectAppName(appPath);
33
+ // Validate category
34
+ if (!VALID_CATEGORIES.includes(options.category)) {
35
+ console.error(chalk.red(`Invalid category: ${options.category}`));
36
+ console.error(chalk.gray(`Valid categories: ${VALID_CATEGORIES.join(', ')}`));
37
+ process.exit(1);
38
+ }
39
+ // Validate file exists
40
+ const absolutePath = path.join(appPath, file);
41
+ if (!(await fs.pathExists(absolutePath))) {
42
+ console.error(chalk.red(`File not found: ${file}`));
43
+ process.exit(1);
44
+ }
45
+ const update = await addProposedUpdate(appPath, appName, file, options.description, options.category);
46
+ console.log(chalk.green('Added to proposals:'));
47
+ console.log(` File: ${chalk.cyan(file)}`);
48
+ console.log(` Description: ${options.description}`);
49
+ console.log(` Category: ${options.category}`);
50
+ console.log(` ID: ${chalk.gray(update.id)}`);
51
+ }
52
+ catch (error) {
53
+ console.error(chalk.red(`Error: ${error instanceof Error ? error.message : error}`));
54
+ process.exit(1);
55
+ }
56
+ });
57
+ // Remove subcommand
58
+ propose
59
+ .command('remove <file>')
60
+ .description('Remove a file from the proposal')
61
+ .action(async (file) => {
62
+ try {
63
+ const appPath = process.cwd();
64
+ const appName = await detectAppName(appPath);
65
+ const removed = await removeProposedUpdate(appPath, appName, file);
66
+ if (removed) {
67
+ console.log(chalk.green(`Removed from proposals: ${file}`));
68
+ }
69
+ else {
70
+ console.log(chalk.yellow(`File not in proposals: ${file}`));
71
+ }
72
+ }
73
+ catch (error) {
74
+ console.error(chalk.red(`Error: ${error instanceof Error ? error.message : error}`));
75
+ process.exit(1);
76
+ }
77
+ });
78
+ // List subcommand
79
+ propose
80
+ .command('list')
81
+ .description('List all proposed files')
82
+ .action(async () => {
83
+ try {
84
+ const appPath = process.cwd();
85
+ const appName = await detectAppName(appPath);
86
+ const updates = await getProposedUpdates(appPath, appName);
87
+ if (updates.length === 0) {
88
+ console.log(chalk.gray('No files proposed for update.'));
89
+ return;
90
+ }
91
+ console.log(chalk.bold(`Proposed updates for ${appName}:`));
92
+ console.log();
93
+ for (const update of updates) {
94
+ console.log(` ${chalk.cyan(update.filePath)}`);
95
+ console.log(` ${chalk.gray(update.description)}`);
96
+ console.log(` Category: ${update.category} | Added: ${update.addedAt.split('T')[0]}`);
97
+ console.log();
98
+ }
99
+ console.log(chalk.gray(`Total: ${updates.length} file(s)`));
100
+ }
101
+ catch (error) {
102
+ console.error(chalk.red(`Error: ${error instanceof Error ? error.message : error}`));
103
+ process.exit(1);
104
+ }
105
+ });
106
+ // Clear subcommand
107
+ propose
108
+ .command('clear')
109
+ .description('Clear all proposed files')
110
+ .action(async () => {
111
+ try {
112
+ const appPath = process.cwd();
113
+ const appName = await detectAppName(appPath);
114
+ const count = await clearProposedUpdates(appPath, appName);
115
+ if (count > 0) {
116
+ console.log(chalk.green(`Cleared ${count} proposed update(s).`));
117
+ }
118
+ else {
119
+ console.log(chalk.gray('No proposals to clear.'));
120
+ }
121
+ }
122
+ catch (error) {
123
+ console.error(chalk.red(`Error: ${error instanceof Error ? error.message : error}`));
124
+ process.exit(1);
125
+ }
126
+ });
127
+ return propose;
128
+ }
129
+ //# sourceMappingURL=propose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"propose.js","sourceRoot":"","sources":["../../src/commands/propose.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Sync Command
3
+ *
4
+ * Sync proposed files from app to bootstrapper template.
5
+ */
6
+ import { Command } from 'commander';
7
+ export declare function createSyncCommand(): Command;
8
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyBpC,wBAAgB,iBAAiB,IAAI,OAAO,CA4F3C"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Sync Command
3
+ *
4
+ * Sync proposed files from app to bootstrapper template.
5
+ */
6
+ import { Command } from 'commander';
7
+ import chalk from 'chalk';
8
+ import fs from 'fs-extra';
9
+ import path from 'path';
10
+ import { fileURLToPath } from 'url';
11
+ import { getProposedUpdates } from '../core-update/manifest.js';
12
+ import { generalize, previewReplacements } from '../core-update/generalizer.js';
13
+ const __filename = fileURLToPath(import.meta.url);
14
+ const __dirname = path.dirname(__filename);
15
+ function getTemplatePath() {
16
+ // Navigate from src/commands to project root, then to template
17
+ return path.resolve(__dirname, '..', '..', 'template');
18
+ }
19
+ async function detectAppName(appPath) {
20
+ const packageJsonPath = path.join(appPath, 'package.json');
21
+ if (await fs.pathExists(packageJsonPath)) {
22
+ const pkg = await fs.readJson(packageJsonPath);
23
+ return pkg.name || path.basename(appPath);
24
+ }
25
+ return path.basename(appPath);
26
+ }
27
+ export function createSyncCommand() {
28
+ const sync = new Command('sync')
29
+ .description('Sync files to bootstrapper template')
30
+ .option('--from <path>', 'Source app path (default: current directory)')
31
+ .option('--proposed-only', 'Only sync proposed files')
32
+ .option('--dry-run', 'Show what would be synced without making changes')
33
+ .action(async (options) => {
34
+ try {
35
+ const appPath = options.from ? path.resolve(options.from) : process.cwd();
36
+ const templatePath = getTemplatePath();
37
+ // Validate paths
38
+ if (!(await fs.pathExists(appPath))) {
39
+ console.error(chalk.red(`Source path not found: ${appPath}`));
40
+ process.exit(1);
41
+ }
42
+ if (!(await fs.pathExists(templatePath))) {
43
+ console.error(chalk.red(`Template path not found: ${templatePath}`));
44
+ process.exit(1);
45
+ }
46
+ const appName = await detectAppName(appPath);
47
+ console.log(chalk.bold('Sync to Template'));
48
+ console.log(` Source: ${chalk.cyan(appPath)}`);
49
+ console.log(` Template: ${chalk.cyan(templatePath)}`);
50
+ console.log(` App name: ${chalk.cyan(appName)}`);
51
+ console.log();
52
+ let filesToSync = [];
53
+ if (options.proposedOnly) {
54
+ const updates = await getProposedUpdates(appPath, appName);
55
+ if (updates.length === 0) {
56
+ console.log(chalk.yellow('No files proposed for update.'));
57
+ console.log(chalk.gray('Use "propose add <file>" to add files.'));
58
+ return;
59
+ }
60
+ filesToSync = updates.map((u) => u.filePath);
61
+ console.log(chalk.gray(`Syncing ${filesToSync.length} proposed file(s)...`));
62
+ }
63
+ else {
64
+ console.error(chalk.red('--proposed-only is required. Full sync not yet implemented.'));
65
+ console.log(chalk.gray('Use "propose add <file>" to stage files, then run with --proposed-only'));
66
+ process.exit(1);
67
+ }
68
+ let syncedCount = 0;
69
+ for (const filePath of filesToSync) {
70
+ const absoluteSource = path.join(appPath, filePath);
71
+ const absoluteDest = path.join(templatePath, filePath);
72
+ if (!(await fs.pathExists(absoluteSource))) {
73
+ console.log(chalk.yellow(` Skip (not found): ${filePath}`));
74
+ continue;
75
+ }
76
+ const content = await fs.readFile(absoluteSource, 'utf-8');
77
+ const generalizedContent = generalize(content, appName);
78
+ if (options.dryRun) {
79
+ console.log(chalk.cyan(` Would sync: ${filePath}`));
80
+ const replacements = previewReplacements(content, appName);
81
+ if (replacements.length > 0) {
82
+ console.log(chalk.gray(' Replacements:'));
83
+ for (const r of replacements) {
84
+ console.log(chalk.gray(` "${r.original}" -> "${r.replacement}" (${r.count}x)`));
85
+ }
86
+ }
87
+ }
88
+ else {
89
+ await fs.ensureDir(path.dirname(absoluteDest));
90
+ await fs.writeFile(absoluteDest, generalizedContent, 'utf-8');
91
+ console.log(chalk.green(` Synced: ${filePath}`));
92
+ }
93
+ syncedCount++;
94
+ }
95
+ console.log();
96
+ if (options.dryRun) {
97
+ console.log(chalk.gray(`Dry run complete. Would sync ${syncedCount} file(s).`));
98
+ }
99
+ else {
100
+ console.log(chalk.green(`Synced ${syncedCount} file(s) to template.`));
101
+ }
102
+ }
103
+ catch (error) {
104
+ console.error(chalk.red(`Error: ${error instanceof Error ? error.message : error}`));
105
+ process.exit(1);
106
+ }
107
+ });
108
+ return sync;
109
+ }
110
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Generalizer
3
+ *
4
+ * Converts app-specific content to template placeholders and vice versa.
5
+ */
6
+ import type { ReplacementPattern } from './types.js';
7
+ /**
8
+ * Default replacement patterns (priority order: highest first)
9
+ * These patterns convert app-specific references to {{name}} placeholders.
10
+ */
11
+ export declare function getDefaultPatterns(appName: string): ReplacementPattern[];
12
+ /**
13
+ * Create a regex pattern for word-boundary matching (lowest priority fallback)
14
+ */
15
+ export declare function createWordBoundaryPattern(appName: string): ReplacementPattern;
16
+ /**
17
+ * Generalize content: replace app-specific values with placeholders
18
+ */
19
+ export declare function generalize(content: string, appName: string, additionalPatterns?: ReplacementPattern[]): string;
20
+ /**
21
+ * Specialize content: replace placeholders with project-specific values
22
+ */
23
+ export declare function specialize(content: string, projectName: string): string;
24
+ /**
25
+ * Check if content contains app-specific references
26
+ */
27
+ export declare function hasAppReferences(content: string, appName: string): boolean;
28
+ /**
29
+ * Get list of replacements that would be made (for dry-run/preview)
30
+ */
31
+ export declare function previewReplacements(content: string, appName: string): Array<{
32
+ original: string;
33
+ replacement: string;
34
+ count: number;
35
+ }>;
36
+ //# sourceMappingURL=generalizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generalizer.d.ts","sourceRoot":"","sources":["../../src/core-update/generalizer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAoCxE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,CAM7E;AAgBD;;GAEG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,kBAAkB,GAAE,kBAAkB,EAAO,GAC5C,MAAM,CAmBR;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAG1E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAgCjE"}