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.
- package/dist/cli.js +10 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/index.d.ts +9 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +9 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/patch.d.ts +8 -0
- package/dist/commands/patch.d.ts.map +1 -0
- package/dist/commands/patch.js +195 -0
- package/dist/commands/patch.js.map +1 -0
- package/dist/commands/propose.d.ts +8 -0
- package/dist/commands/propose.d.ts.map +1 -0
- package/dist/commands/propose.js +129 -0
- package/dist/commands/propose.js.map +1 -0
- package/dist/commands/sync.d.ts +8 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +110 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/core-update/generalizer.d.ts +36 -0
- package/dist/core-update/generalizer.d.ts.map +1 -0
- package/dist/core-update/generalizer.js +130 -0
- package/dist/core-update/generalizer.js.map +1 -0
- package/dist/core-update/index.d.ts +11 -0
- package/dist/core-update/index.d.ts.map +1 -0
- package/dist/core-update/index.js +11 -0
- package/dist/core-update/index.js.map +1 -0
- package/dist/core-update/manifest.d.ts +47 -0
- package/dist/core-update/manifest.d.ts.map +1 -0
- package/dist/core-update/manifest.js +118 -0
- package/dist/core-update/manifest.js.map +1 -0
- package/dist/core-update/patch-applier.d.ts +19 -0
- package/dist/core-update/patch-applier.d.ts.map +1 -0
- package/dist/core-update/patch-applier.js +115 -0
- package/dist/core-update/patch-applier.js.map +1 -0
- package/dist/core-update/patch-generator.d.ts +23 -0
- package/dist/core-update/patch-generator.d.ts.map +1 -0
- package/dist/core-update/patch-generator.js +137 -0
- package/dist/core-update/patch-generator.js.map +1 -0
- package/dist/core-update/types.d.ts +71 -0
- package/dist/core-update/types.d.ts.map +1 -0
- package/dist/core-update/types.js +7 -0
- package/dist/core-update/types.js.map +1 -0
- package/package.json +4 -2
- package/template/CORE-UPDATE.md +519 -0
- package/template/README.md +212 -1
- package/template/apps/api/src/neo4j.migrations/20250901_002.ts +24 -31
- package/template/apps/api/src/neo4j.migrations/queries/migration.queries.ts +0 -2
- package/template/apps/api/templates/email/en/activationEmail.hbs +27 -0
- package/template/apps/api/templates/email/en/registrationAdminNotification.hbs +48 -0
- package/template/apps/api/templates/email/en/waitlistAdminNotification.hbs +47 -0
- package/template/apps/api/templates/email/en/waitlistConfirmation.hbs +30 -0
- package/template/apps/api/templates/email/en/waitlistInvitation.hbs +29 -0
- package/template/apps/api/templates/email/footer.hbs +3 -0
- package/template/apps/api/templates/email/header.hbs +3 -0
- package/template/gitignore +4 -1
- 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
|
-
|
|
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":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACjE,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|