@fgv/repo-template 5.1.0-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 (77) hide show
  1. package/.rush/temp/45a8d0dcbb9c2e59fa02645657661dffbd25461f.tar.log +57 -0
  2. package/.rush/temp/92e27a75687fa5062b71fdb897f0928a8aa4e0c9.tar.log +57 -0
  3. package/.rush/temp/chunked-rush-logs/repo-template.build.chunks.jsonl +7 -0
  4. package/.rush/temp/operation/build/all.log +7 -0
  5. package/.rush/temp/operation/build/log-chunks.jsonl +7 -0
  6. package/.rush/temp/operation/build/state.json +3 -0
  7. package/.rush/temp/shrinkwrap-deps.json +576 -0
  8. package/README.md +216 -0
  9. package/bin/repo-template.js +18 -0
  10. package/config/rig.json +4 -0
  11. package/lib/cli.d.ts +14 -0
  12. package/lib/cli.d.ts.map +1 -0
  13. package/lib/cli.js +126 -0
  14. package/lib/cli.js.map +1 -0
  15. package/lib/commands/create.d.ts +17 -0
  16. package/lib/commands/create.d.ts.map +1 -0
  17. package/lib/commands/create.js +212 -0
  18. package/lib/commands/create.js.map +1 -0
  19. package/lib/commands/init-library.d.ts +25 -0
  20. package/lib/commands/init-library.d.ts.map +1 -0
  21. package/lib/commands/init-library.js +217 -0
  22. package/lib/commands/init-library.js.map +1 -0
  23. package/lib/commands/patch.d.ts +15 -0
  24. package/lib/commands/patch.d.ts.map +1 -0
  25. package/lib/commands/patch.js +104 -0
  26. package/lib/commands/patch.js.map +1 -0
  27. package/lib/commands/sync.d.ts +11 -0
  28. package/lib/commands/sync.d.ts.map +1 -0
  29. package/lib/commands/sync.js +156 -0
  30. package/lib/commands/sync.js.map +1 -0
  31. package/lib/index.d.ts +14 -0
  32. package/lib/index.d.ts.map +1 -0
  33. package/lib/index.js +29 -0
  34. package/lib/index.js.map +1 -0
  35. package/lib/packlets/fs/index.d.ts +40 -0
  36. package/lib/packlets/fs/index.d.ts.map +1 -0
  37. package/lib/packlets/fs/index.js +142 -0
  38. package/lib/packlets/fs/index.js.map +1 -0
  39. package/lib/packlets/jsonc/index.d.ts +27 -0
  40. package/lib/packlets/jsonc/index.d.ts.map +1 -0
  41. package/lib/packlets/jsonc/index.js +124 -0
  42. package/lib/packlets/jsonc/index.js.map +1 -0
  43. package/lib/packlets/manifest/index.d.ts +15 -0
  44. package/lib/packlets/manifest/index.d.ts.map +1 -0
  45. package/lib/packlets/manifest/index.js +61 -0
  46. package/lib/packlets/manifest/index.js.map +1 -0
  47. package/lib/packlets/manifest/types.d.ts +33 -0
  48. package/lib/packlets/manifest/types.d.ts.map +1 -0
  49. package/lib/packlets/manifest/types.js +6 -0
  50. package/lib/packlets/manifest/types.js.map +1 -0
  51. package/lib/packlets/template/index.d.ts +22 -0
  52. package/lib/packlets/template/index.d.ts.map +1 -0
  53. package/lib/packlets/template/index.js +75 -0
  54. package/lib/packlets/template/index.js.map +1 -0
  55. package/package.json +32 -0
  56. package/rush-logs/repo-template.build.cache.log +4 -0
  57. package/rush-logs/repo-template.build.log +7 -0
  58. package/src/cli.ts +141 -0
  59. package/src/commands/create.ts +216 -0
  60. package/src/commands/init-library.ts +249 -0
  61. package/src/commands/patch.ts +84 -0
  62. package/src/commands/sync.ts +137 -0
  63. package/src/index.ts +14 -0
  64. package/src/packlets/fs/index.ts +114 -0
  65. package/src/packlets/jsonc/index.ts +134 -0
  66. package/src/packlets/manifest/index.ts +29 -0
  67. package/src/packlets/manifest/types.ts +36 -0
  68. package/src/packlets/template/index.ts +48 -0
  69. package/sync-manifest.json +222 -0
  70. package/temp/build/typescript/ts_l9Fw4VUO.json +1 -0
  71. package/templates/.gitignore.tmpl +85 -0
  72. package/templates/ACTIVE_DEVELOPMENT.md.tmpl +58 -0
  73. package/templates/CLAUDE.md.tmpl +124 -0
  74. package/templates/command-line.json.tmpl +50 -0
  75. package/templates/package.json.tmpl +5 -0
  76. package/templates/version-policies.json.tmpl +8 -0
  77. package/tsconfig.json +7 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Create command — stamps out a new fgv-derived Rush monorepo.\n *\n * Uses `rush init` to generate base config with full documentation,\n * then applies fgv-specific customizations via JSONC patching and shared file sync.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { loadManifest, getDefaultManifestPath } from '../packlets/manifest';\nimport { patchFile, IPatchOperation } from '../packlets/jsonc';\nimport { renderTemplateFile, getDefaultTemplatesDir, ITemplateVars } from '../packlets/template';\nimport { copyFile, copyPackage, exec, getGitCommit, getGitRemoteUrl } from '../packlets/fs';\n\nexport interface ICreateOptions {\n targetDir: string;\n repoUrl: string;\n versionPolicy: string;\n version: string;\n sourceDir: string;\n allowExisting: boolean;\n gitInit: boolean;\n}\n\nconst RUSH_VERSION = '5.172.1';\n\nconst NODE_VERSION_RANGE =\n '>=14.15.0 <15.0.0 || >=16.13.0 <17.0.0 || >=18.15.0 <19.0.0 || >=20.18.0 <21.0.0 || >=22.22.0 <23.0.0';\n\nexport async function runCreate(options: ICreateOptions): Promise<void> {\n const { targetDir, repoUrl, versionPolicy, version, sourceDir, allowExisting, gitInit } = options;\n\n // Validate\n if (!allowExisting && fs.existsSync(targetDir)) {\n throw new Error(`Target directory already exists: ${targetDir} (use --allow-existing to override)`);\n }\n if (!fs.existsSync(path.join(sourceDir, 'rush.json'))) {\n throw new Error(`Source directory is not a Rush repo: ${sourceDir}`);\n }\n\n const manifestPath = getDefaultManifestPath();\n const templatesDir = getDefaultTemplatesDir();\n const manifest = loadManifest(manifestPath);\n\n console.log(`Creating new monorepo at: ${targetDir}`);\n console.log(` Source repo: ${sourceDir}`);\n console.log(` Repo URL: ${repoUrl}`);\n console.log(` Version: ${versionPolicy}@${version}`);\n console.log('');\n\n fs.mkdirSync(targetDir, { recursive: true });\n\n // ── Step 1: rush init ──\n if (fs.existsSync(path.join(targetDir, 'rush.json'))) {\n console.log('==> Target already has rush.json, skipping rush init');\n } else {\n console.log('==> Running rush init...');\n try {\n const output = exec(`npx \"@microsoft/rush@${RUSH_VERSION}\" init`, { cwd: targetDir });\n for (const line of output.split('\\n')) {\n console.log(` ${line}`);\n }\n } catch (err: unknown) {\n // rush init writes to stderr for some messages, check if rush.json was created\n if (!fs.existsSync(path.join(targetDir, 'rush.json'))) {\n throw new Error(`rush init failed: ${(err as Error).message}`);\n }\n }\n }\n\n // ── Step 2: Patch rush.json ──\n console.log('');\n console.log('==> Patching rush.json with fgv customizations...');\n\n const rushJsonOps: IPatchOperation[] = [\n { type: 'set', path: 'nodeSupportedVersionRange', value: NODE_VERSION_RANGE },\n { type: 'set', path: 'ensureConsistentVersions', value: true },\n { type: 'uncomment', path: 'projectFolderMinDepth' },\n { type: 'set', path: 'projectFolderMinDepth', value: 2 },\n { type: 'uncomment', path: 'projectFolderMaxDepth' },\n { type: 'set', path: 'projectFolderMaxDepth', value: 2 },\n { type: 'uncomment', path: 'url' },\n { type: 'set', path: 'repository.url', value: repoUrl },\n { type: 'uncomment', path: 'defaultBranch' },\n { type: 'uncomment', path: 'defaultRemote' }\n ];\n\n patchFile(path.join(targetDir, 'rush.json'), rushJsonOps);\n for (const op of rushJsonOps) {\n const desc =\n op.type === 'uncomment' || op.type === 'remove'\n ? ` ${op.type}: ${op.path}`\n : ` ${op.type}: ${op.path}`;\n console.log(desc);\n }\n\n // ── Step 3: Patch other rush config files ──\n console.log('');\n console.log('==> Patching rush config files...');\n\n patchFile(path.join(targetDir, 'common/config/rush/build-cache.json'), [\n { type: 'set', path: 'buildCacheEnabled', value: true }\n ]);\n console.log(' build-cache.json: buildCacheEnabled = true');\n\n patchFile(path.join(targetDir, 'common/config/rush/pnpm-config.json'), [\n { type: 'uncomment', path: 'strictPeerDependencies' },\n { type: 'set', path: 'strictPeerDependencies', value: true }\n ]);\n console.log(' pnpm-config.json: strictPeerDependencies = true');\n\n // ── Step 4: Generate templated files ──\n console.log('');\n console.log('==> Generating templated config files...');\n\n const templateVars: ITemplateVars = {\n REPO_URL: repoUrl,\n VERSION_POLICY_NAME: versionPolicy,\n VERSION: version\n };\n\n for (const tmpl of manifest.templated.files) {\n const templatePath = path.join(sourceDir, tmpl.template);\n const destPath = path.join(targetDir, tmpl.destination);\n renderTemplateFile(templatePath, destPath, templateVars);\n }\n\n // ── Step 5: Copy shared files ──\n console.log('');\n console.log('==> Copying shared files...');\n\n for (const file of manifest.shared.files) {\n const srcPath = path.join(sourceDir, file.source);\n const destPath = path.join(targetDir, file.destination);\n if (!fs.existsSync(srcPath)) {\n console.warn(` WARNING: Source file not found, skipping: ${file.source}`);\n continue;\n }\n copyFile(srcPath, destPath);\n console.log(` Copied: ${file.destination}`);\n }\n\n for (const pkg of manifest.sharedPackages.packages) {\n const srcPath = path.join(sourceDir, pkg.source);\n const destPath = path.join(targetDir, pkg.destination);\n if (!fs.existsSync(srcPath)) {\n console.warn(` WARNING: Source directory not found, skipping: ${pkg.source}`);\n continue;\n }\n copyPackage(srcPath, destPath);\n console.log(` Copied package: ${pkg.destination}`);\n }\n\n // ── Step 6: Create standard directories ──\n console.log('');\n console.log('==> Creating directory structure...');\n\n const dirs = ['libraries', 'tools', 'apps', 'services', '.claude/project', '.claude/skills'];\n for (const dir of dirs) {\n fs.mkdirSync(path.join(targetDir, dir), { recursive: true });\n }\n\n const gitkeeps = ['.claude/project/.gitkeep', '.claude/skills/.gitkeep'];\n for (const gk of gitkeeps) {\n fs.writeFileSync(path.join(targetDir, gk), '');\n }\n console.log(' Created standard directory structure');\n\n // ── Step 7: Record template metadata ──\n console.log('');\n console.log('==> Recording template metadata...');\n\n const sourceCommit = getGitCommit(sourceDir);\n const sourceRepo = getGitRemoteUrl(sourceDir);\n\n const syncMetadata = {\n templateSource: repoUrl,\n sourceRepo,\n sourceCommit,\n createdAt: new Date().toISOString(),\n lastSyncedAt: new Date().toISOString(),\n manifestVersion: '1.0.0'\n };\n fs.writeFileSync(path.join(targetDir, '.template-sync'), JSON.stringify(syncMetadata, null, 2) + '\\n');\n console.log(' Created .template-sync');\n\n // ── Step 8: Git init ──\n if (gitInit) {\n console.log('');\n console.log('==> Initializing git repository...');\n try {\n exec('git init -b main', { cwd: targetDir });\n exec('git add -A', { cwd: targetDir });\n exec(\n `git commit -m \"Initial commit from fgv monorepo template\\n\\nSource: ${sourceDir}\\nTemplate commit: ${sourceCommit}\"`,\n { cwd: targetDir }\n );\n console.log(' Git repository initialized with initial commit');\n } catch (err: unknown) {\n console.warn(` WARNING: Git init failed: ${(err as Error).message}`);\n }\n }\n\n // ── Done ──\n console.log('');\n console.log(`=== Monorepo created successfully at: ${targetDir} ===`);\n console.log('');\n console.log('Next steps:');\n console.log(' 1. Add your domain packages to libraries/, apps/, tools/, services/');\n console.log(' 2. Register them in rush.json');\n console.log(' 3. Fill in the project table in CLAUDE.md');\n console.log(' 4. Fill in ACTIVE_DEVELOPMENT.md with your domain projects');\n console.log(' 5. Add domain-specific Rush commands to common/config/rush/command-line.json');\n console.log(` 6. Run: cd ${targetDir} && rush install && rush build`);\n console.log('');\n}\n"]}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * init-library command — scaffolds a new library package within an existing Rush monorepo.
3
+ */
4
+ export type RigType = 'dual' | 'node' | 'browser';
5
+ export type CategoryType = 'libraries' | 'tools' | 'apps' | 'services';
6
+ export interface IInitLibraryOptions {
7
+ /** Package name (e.g. "ts-my-lib" — will be prefixed with @fgv/) */
8
+ name: string;
9
+ /** Short description */
10
+ description: string;
11
+ /** Heft rig to use */
12
+ rig: RigType;
13
+ /** Category folder */
14
+ category: CategoryType;
15
+ /** Rush monorepo root */
16
+ repoDir: string;
17
+ /** Version policy name (from version-policies.json) */
18
+ versionPolicy: string;
19
+ /** Initial version */
20
+ version: string;
21
+ /** Dependency version for @fgv/* packages ("workspace:*" for fgv, "^5.1.0-0" for consumers) */
22
+ fgvDepVersion: string;
23
+ }
24
+ export declare function runInitLibrary(options: IInitLibraryOptions): Promise<void>;
25
+ //# sourceMappingURL=init-library.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-library.d.ts","sourceRoot":"","sources":["../../src/commands/init-library.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAClD,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;AAEvE,MAAM,WAAW,mBAAmB;IAClC,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB;IACtB,GAAG,EAAE,OAAO,CAAC;IACb,sBAAsB;IACtB,QAAQ,EAAE,YAAY,CAAC;IACvB,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,aAAa,EAAE,MAAM,CAAC;IACtB,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,+FAA+F;IAC/F,aAAa,EAAE,MAAM,CAAC;CACvB;AA6CD,wBAAsB,cAAc,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+KhF"}
@@ -0,0 +1,217 @@
1
+ "use strict";
2
+ /**
3
+ * init-library command — scaffolds a new library package within an existing Rush monorepo.
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.runInitLibrary = runInitLibrary;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const jsonc_1 = require("../packlets/jsonc");
43
+ const RIG_CONFIGS = {
44
+ dual: {
45
+ rigPackageName: '@fgv/heft-dual-rig',
46
+ rigDevDeps: {
47
+ '@fgv/heft-dual-rig': 'FGV_DEP',
48
+ '@rushstack/heft': '1.2.7',
49
+ '@rushstack/heft-node-rig': '2.11.27'
50
+ },
51
+ tsconfigExtends: './node_modules/@rushstack/heft-node-rig/profiles/default/tsconfig-base.json',
52
+ tsconfigTypes: ['heft-jest', 'node'],
53
+ tsconfigLib: ['es2018']
54
+ },
55
+ node: {
56
+ rigPackageName: '@rushstack/heft-node-rig',
57
+ rigDevDeps: {
58
+ '@rushstack/heft': '1.2.7',
59
+ '@rushstack/heft-node-rig': '2.11.27'
60
+ },
61
+ tsconfigExtends: './node_modules/@rushstack/heft-node-rig/profiles/default/tsconfig-base.json',
62
+ tsconfigTypes: ['heft-jest', 'node']
63
+ },
64
+ browser: {
65
+ rigPackageName: '@rushstack/heft-web-rig',
66
+ rigProfile: 'library',
67
+ rigDevDeps: {
68
+ '@rushstack/heft': '1.2.7',
69
+ '@rushstack/heft-web-rig': '1.4.3'
70
+ },
71
+ tsconfigExtends: './node_modules/@rushstack/heft-web-rig/profiles/library/tsconfig-base.json',
72
+ tsconfigTypes: ['heft-jest', 'node'],
73
+ tsconfigLib: ['es2018', 'DOM']
74
+ }
75
+ };
76
+ async function runInitLibrary(options) {
77
+ const { name, description, rig, category, repoDir, versionPolicy, version, fgvDepVersion } = options;
78
+ const packageName = name.startsWith('@fgv/') ? name : `@fgv/${name}`;
79
+ const shortName = packageName.replace('@fgv/', '');
80
+ const projectFolder = `${category}/${shortName}`;
81
+ const projectDir = path.join(repoDir, projectFolder);
82
+ if (fs.existsSync(projectDir)) {
83
+ throw new Error(`Project directory already exists: ${projectDir}`);
84
+ }
85
+ const rushJsonPath = path.join(repoDir, 'rush.json');
86
+ if (!fs.existsSync(rushJsonPath)) {
87
+ throw new Error(`Not a Rush repo (no rush.json): ${repoDir}`);
88
+ }
89
+ const rigConfig = RIG_CONFIGS[rig];
90
+ console.log(`Initializing library: ${packageName}`);
91
+ console.log(` Directory: ${projectFolder}`);
92
+ console.log(` Rig: ${rig} (${rigConfig.rigPackageName})`);
93
+ console.log(` Version: ${versionPolicy}@${version}`);
94
+ console.log('');
95
+ // ── Create directory structure ──
96
+ fs.mkdirSync(path.join(projectDir, 'src', 'test', 'unit'), { recursive: true });
97
+ fs.mkdirSync(path.join(projectDir, 'config'), { recursive: true });
98
+ // ── package.json ──
99
+ console.log('==> Creating package.json...');
100
+ const devDependencies = {};
101
+ // Add rig dependencies — @fgv/* packages use fgvDepVersion, others use their pinned version
102
+ for (const [dep, ver] of Object.entries(rigConfig.rigDevDeps)) {
103
+ devDependencies[dep] = dep.startsWith('@fgv/') ? fgvDepVersion : ver;
104
+ }
105
+ // Standard dev dependencies
106
+ devDependencies['@fgv/ts-utils-jest'] = fgvDepVersion;
107
+ devDependencies['@types/heft-jest'] = '1.0.6';
108
+ devDependencies['@types/jest'] = '^29.5.14';
109
+ devDependencies['@types/node'] = '^20.14.9';
110
+ devDependencies['typescript'] = '5.9.3';
111
+ devDependencies['@rushstack/eslint-config'] = '4.6.4';
112
+ devDependencies['eslint'] = '^9.39.2';
113
+ const packageJson = {
114
+ name: packageName,
115
+ version,
116
+ description,
117
+ main: 'lib/index.js',
118
+ types: 'lib/index.d.ts',
119
+ scripts: {
120
+ build: 'heft build --clean',
121
+ clean: 'heft clean',
122
+ test: 'heft test --clean',
123
+ coverage: 'jest --coverage',
124
+ lint: 'eslint src --ext .ts',
125
+ fixlint: 'eslint src --ext .ts --fix'
126
+ },
127
+ author: '',
128
+ license: 'MIT',
129
+ dependencies: {
130
+ '@fgv/ts-utils': fgvDepVersion,
131
+ '@fgv/ts-json-base': fgvDepVersion
132
+ },
133
+ devDependencies,
134
+ repository: {
135
+ type: 'git',
136
+ url: ''
137
+ }
138
+ };
139
+ // Add dual-emit exports for dual rig
140
+ if (rig === 'dual') {
141
+ packageJson['module'] = 'dist/index.js';
142
+ packageJson['exports'] = {
143
+ '.': {
144
+ types: './lib/index.d.ts',
145
+ import: './dist/index.js',
146
+ require: './lib/index.js',
147
+ default: './lib/index.js'
148
+ }
149
+ };
150
+ }
151
+ fs.writeFileSync(path.join(projectDir, 'package.json'), JSON.stringify(packageJson, null, 2) + '\n');
152
+ // ── tsconfig.json ──
153
+ console.log(' Creating tsconfig.json...');
154
+ const tsconfig = {
155
+ extends: rigConfig.tsconfigExtends,
156
+ compilerOptions: Object.assign({ types: rigConfig.tsconfigTypes }, (rigConfig.tsconfigLib ? { lib: rigConfig.tsconfigLib } : {}))
157
+ };
158
+ fs.writeFileSync(path.join(projectDir, 'tsconfig.json'), JSON.stringify(tsconfig, null, 2) + '\n');
159
+ // ── config/rig.json ──
160
+ console.log(' Creating config/rig.json...');
161
+ const rigJson = {
162
+ $schema: 'https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json',
163
+ rigPackageName: rigConfig.rigPackageName
164
+ };
165
+ if (rigConfig.rigProfile) {
166
+ rigJson['rigProfile'] = rigConfig.rigProfile;
167
+ }
168
+ fs.writeFileSync(path.join(projectDir, 'config', 'rig.json'), JSON.stringify(rigJson, null, 2) + '\n');
169
+ // ── config/jest.config.json ──
170
+ console.log(' Creating config/jest.config.json...');
171
+ const jestConfig = {
172
+ extends: '@rushstack/heft-node-rig/profiles/default/config/jest.config.json',
173
+ coverageThreshold: {
174
+ global: {
175
+ branches: 100,
176
+ functions: 100,
177
+ lines: 100,
178
+ statements: 100
179
+ }
180
+ },
181
+ collectCoverage: true,
182
+ coverageReporters: ['text', 'lcov', 'html']
183
+ };
184
+ fs.writeFileSync(path.join(projectDir, 'config', 'jest.config.json'), JSON.stringify(jestConfig, null, 2) + '\n');
185
+ // ── src/index.ts ──
186
+ console.log(' Creating src/index.ts...');
187
+ fs.writeFileSync(path.join(projectDir, 'src', 'index.ts'), `/**\n * @packageDocumentation\n * ${description}\n */\n`);
188
+ // ── Register in rush.json ──
189
+ console.log('');
190
+ console.log('==> Registering in rush.json...');
191
+ const rushJsonOps = [
192
+ {
193
+ type: 'add-to-array',
194
+ path: 'projects',
195
+ value: JSON.stringify({
196
+ packageName,
197
+ projectFolder,
198
+ shouldPublish: true,
199
+ versionPolicyName: versionPolicy,
200
+ tags: [category]
201
+ })
202
+ }
203
+ ];
204
+ (0, jsonc_1.patchFile)(rushJsonPath, rushJsonOps);
205
+ console.log(` Added ${packageName} at ${projectFolder}`);
206
+ // ── Done ──
207
+ console.log('');
208
+ console.log(`=== Library ${packageName} initialized at ${projectFolder} ===`);
209
+ console.log('');
210
+ console.log('Next steps:');
211
+ console.log(` 1. cd ${projectDir}`);
212
+ console.log(' 2. rush update');
213
+ console.log(' 3. rushx build');
214
+ console.log(' 4. Start adding code to src/');
215
+ console.log('');
216
+ }
217
+ //# sourceMappingURL=init-library.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-library.js","sourceRoot":"","sources":["../../src/commands/init-library.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * init-library command — scaffolds a new library package within an existing Rush monorepo.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { patchFile, IPatchOperation } from '../packlets/jsonc';\n\nexport type RigType = 'dual' | 'node' | 'browser';\nexport type CategoryType = 'libraries' | 'tools' | 'apps' | 'services';\n\nexport interface IInitLibraryOptions {\n /** Package name (e.g. \"ts-my-lib\" — will be prefixed with @fgv/) */\n name: string;\n /** Short description */\n description: string;\n /** Heft rig to use */\n rig: RigType;\n /** Category folder */\n category: CategoryType;\n /** Rush monorepo root */\n repoDir: string;\n /** Version policy name (from version-policies.json) */\n versionPolicy: string;\n /** Initial version */\n version: string;\n /** Dependency version for @fgv/* packages (\"workspace:*\" for fgv, \"^5.1.0-0\" for consumers) */\n fgvDepVersion: string;\n}\n\ninterface IRigConfig {\n rigPackageName: string;\n rigProfile?: string;\n rigDevDeps: Record<string, string>;\n tsconfigExtends: string;\n tsconfigTypes: string[];\n tsconfigLib?: string[];\n}\n\nconst RIG_CONFIGS: Record<RigType, IRigConfig> = {\n dual: {\n rigPackageName: '@fgv/heft-dual-rig',\n rigDevDeps: {\n '@fgv/heft-dual-rig': 'FGV_DEP',\n '@rushstack/heft': '1.2.7',\n '@rushstack/heft-node-rig': '2.11.27'\n },\n tsconfigExtends: './node_modules/@rushstack/heft-node-rig/profiles/default/tsconfig-base.json',\n tsconfigTypes: ['heft-jest', 'node'],\n tsconfigLib: ['es2018']\n },\n node: {\n rigPackageName: '@rushstack/heft-node-rig',\n rigDevDeps: {\n '@rushstack/heft': '1.2.7',\n '@rushstack/heft-node-rig': '2.11.27'\n },\n tsconfigExtends: './node_modules/@rushstack/heft-node-rig/profiles/default/tsconfig-base.json',\n tsconfigTypes: ['heft-jest', 'node']\n },\n browser: {\n rigPackageName: '@rushstack/heft-web-rig',\n rigProfile: 'library',\n rigDevDeps: {\n '@rushstack/heft': '1.2.7',\n '@rushstack/heft-web-rig': '1.4.3'\n },\n tsconfigExtends: './node_modules/@rushstack/heft-web-rig/profiles/library/tsconfig-base.json',\n tsconfigTypes: ['heft-jest', 'node'],\n tsconfigLib: ['es2018', 'DOM']\n }\n};\n\nexport async function runInitLibrary(options: IInitLibraryOptions): Promise<void> {\n const { name, description, rig, category, repoDir, versionPolicy, version, fgvDepVersion } = options;\n\n const packageName = name.startsWith('@fgv/') ? name : `@fgv/${name}`;\n const shortName = packageName.replace('@fgv/', '');\n const projectFolder = `${category}/${shortName}`;\n const projectDir = path.join(repoDir, projectFolder);\n\n if (fs.existsSync(projectDir)) {\n throw new Error(`Project directory already exists: ${projectDir}`);\n }\n\n const rushJsonPath = path.join(repoDir, 'rush.json');\n if (!fs.existsSync(rushJsonPath)) {\n throw new Error(`Not a Rush repo (no rush.json): ${repoDir}`);\n }\n\n const rigConfig = RIG_CONFIGS[rig];\n\n console.log(`Initializing library: ${packageName}`);\n console.log(` Directory: ${projectFolder}`);\n console.log(` Rig: ${rig} (${rigConfig.rigPackageName})`);\n console.log(` Version: ${versionPolicy}@${version}`);\n console.log('');\n\n // ── Create directory structure ──\n fs.mkdirSync(path.join(projectDir, 'src', 'test', 'unit'), { recursive: true });\n fs.mkdirSync(path.join(projectDir, 'config'), { recursive: true });\n\n // ── package.json ──\n console.log('==> Creating package.json...');\n\n const devDependencies: Record<string, string> = {};\n // Add rig dependencies — @fgv/* packages use fgvDepVersion, others use their pinned version\n for (const [dep, ver] of Object.entries(rigConfig.rigDevDeps)) {\n devDependencies[dep] = dep.startsWith('@fgv/') ? fgvDepVersion : ver;\n }\n // Standard dev dependencies\n devDependencies['@fgv/ts-utils-jest'] = fgvDepVersion;\n devDependencies['@types/heft-jest'] = '1.0.6';\n devDependencies['@types/jest'] = '^29.5.14';\n devDependencies['@types/node'] = '^20.14.9';\n devDependencies['typescript'] = '5.9.3';\n devDependencies['@rushstack/eslint-config'] = '4.6.4';\n devDependencies['eslint'] = '^9.39.2';\n\n const packageJson: Record<string, unknown> = {\n name: packageName,\n version,\n description,\n main: 'lib/index.js',\n types: 'lib/index.d.ts',\n scripts: {\n build: 'heft build --clean',\n clean: 'heft clean',\n test: 'heft test --clean',\n coverage: 'jest --coverage',\n lint: 'eslint src --ext .ts',\n fixlint: 'eslint src --ext .ts --fix'\n },\n author: '',\n license: 'MIT',\n dependencies: {\n '@fgv/ts-utils': fgvDepVersion,\n '@fgv/ts-json-base': fgvDepVersion\n },\n devDependencies,\n repository: {\n type: 'git',\n url: ''\n }\n };\n\n // Add dual-emit exports for dual rig\n if (rig === 'dual') {\n packageJson['module'] = 'dist/index.js';\n packageJson['exports'] = {\n '.': {\n types: './lib/index.d.ts',\n import: './dist/index.js',\n require: './lib/index.js',\n default: './lib/index.js'\n }\n };\n }\n\n fs.writeFileSync(path.join(projectDir, 'package.json'), JSON.stringify(packageJson, null, 2) + '\\n');\n\n // ── tsconfig.json ──\n console.log(' Creating tsconfig.json...');\n\n const tsconfig: Record<string, unknown> = {\n extends: rigConfig.tsconfigExtends,\n compilerOptions: {\n types: rigConfig.tsconfigTypes,\n ...(rigConfig.tsconfigLib ? { lib: rigConfig.tsconfigLib } : {})\n }\n };\n\n fs.writeFileSync(path.join(projectDir, 'tsconfig.json'), JSON.stringify(tsconfig, null, 2) + '\\n');\n\n // ── config/rig.json ──\n console.log(' Creating config/rig.json...');\n\n const rigJson: Record<string, unknown> = {\n $schema: 'https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json',\n rigPackageName: rigConfig.rigPackageName\n };\n if (rigConfig.rigProfile) {\n rigJson['rigProfile'] = rigConfig.rigProfile;\n }\n\n fs.writeFileSync(path.join(projectDir, 'config', 'rig.json'), JSON.stringify(rigJson, null, 2) + '\\n');\n\n // ── config/jest.config.json ──\n console.log(' Creating config/jest.config.json...');\n\n const jestConfig = {\n extends: '@rushstack/heft-node-rig/profiles/default/config/jest.config.json',\n coverageThreshold: {\n global: {\n branches: 100,\n functions: 100,\n lines: 100,\n statements: 100\n }\n },\n collectCoverage: true,\n coverageReporters: ['text', 'lcov', 'html']\n };\n\n fs.writeFileSync(\n path.join(projectDir, 'config', 'jest.config.json'),\n JSON.stringify(jestConfig, null, 2) + '\\n'\n );\n\n // ── src/index.ts ──\n console.log(' Creating src/index.ts...');\n\n fs.writeFileSync(\n path.join(projectDir, 'src', 'index.ts'),\n `/**\\n * @packageDocumentation\\n * ${description}\\n */\\n`\n );\n\n // ── Register in rush.json ──\n console.log('');\n console.log('==> Registering in rush.json...');\n\n const rushJsonOps: IPatchOperation[] = [\n {\n type: 'add-to-array',\n path: 'projects',\n value: JSON.stringify({\n packageName,\n projectFolder,\n shouldPublish: true,\n versionPolicyName: versionPolicy,\n tags: [category]\n })\n }\n ];\n\n patchFile(rushJsonPath, rushJsonOps);\n console.log(` Added ${packageName} at ${projectFolder}`);\n\n // ── Done ──\n console.log('');\n console.log(`=== Library ${packageName} initialized at ${projectFolder} ===`);\n console.log('');\n console.log('Next steps:');\n console.log(` 1. cd ${projectDir}`);\n console.log(' 2. rush update');\n console.log(' 3. rushx build');\n console.log(' 4. Start adding code to src/');\n console.log('');\n}\n"]}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Patch command — apply targeted edits to JSONC config files.
3
+ */
4
+ import { IPatchOperation } from '../packlets/jsonc';
5
+ export interface IPatchOptions {
6
+ file: string;
7
+ operations: IPatchOperation[];
8
+ }
9
+ /**
10
+ * Parse CLI arguments for the patch command into operations.
11
+ * Expects pairs like: --set 'path=value', --uncomment 'path', etc.
12
+ */
13
+ export declare function parsePatchArgs(args: string[]): IPatchOperation[];
14
+ export declare function runPatch(options: IPatchOptions): Promise<void>;
15
+ //# sourceMappingURL=patch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch.d.ts","sourceRoot":"","sources":["../../src/commands/patch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,eAAe,EAAmD,MAAM,mBAAmB,CAAC;AAErG,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,eAAe,EAAE,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,EAAE,CA4ChE;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBpE"}
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ /**
3
+ * Patch command — apply targeted edits to JSONC config files.
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.parsePatchArgs = parsePatchArgs;
40
+ exports.runPatch = runPatch;
41
+ const fs = __importStar(require("fs"));
42
+ const jsonc_1 = require("../packlets/jsonc");
43
+ /**
44
+ * Parse CLI arguments for the patch command into operations.
45
+ * Expects pairs like: --set 'path=value', --uncomment 'path', etc.
46
+ */
47
+ function parsePatchArgs(args) {
48
+ const operations = [];
49
+ const validOps = ['set', 'set-json', 'uncomment', 'add-to-array', 'remove'];
50
+ let i = 0;
51
+ while (i < args.length) {
52
+ const arg = args[i];
53
+ if (!arg.startsWith('--')) {
54
+ throw new Error(`Unexpected argument: ${arg}`);
55
+ }
56
+ const opType = arg.slice(2);
57
+ if (!validOps.includes(opType)) {
58
+ throw new Error(`Unknown operation: ${arg}`);
59
+ }
60
+ i++;
61
+ if (i >= args.length) {
62
+ throw new Error(`Missing value for ${arg}`);
63
+ }
64
+ const operand = args[i];
65
+ i++;
66
+ if (opType === 'uncomment' || opType === 'remove') {
67
+ operations.push({ type: opType, path: operand });
68
+ }
69
+ else {
70
+ const eqIndex = operand.indexOf('=');
71
+ if (eqIndex === -1) {
72
+ throw new Error(`Expected path=value for ${arg}, got: ${operand}`);
73
+ }
74
+ const opPath = operand.slice(0, eqIndex);
75
+ const rawValue = operand.slice(eqIndex + 1);
76
+ if (opType === 'set') {
77
+ operations.push({ type: opType, path: opPath, value: (0, jsonc_1.parseValue)(rawValue) });
78
+ }
79
+ else {
80
+ // set-json and add-to-array pass raw JSON string
81
+ operations.push({ type: opType, path: opPath, value: rawValue });
82
+ }
83
+ }
84
+ }
85
+ return operations;
86
+ }
87
+ async function runPatch(options) {
88
+ const { file, operations } = options;
89
+ if (!fs.existsSync(file)) {
90
+ throw new Error(`File not found: ${file}`);
91
+ }
92
+ console.log(`Patching: ${file}`);
93
+ let source = fs.readFileSync(file, 'utf-8');
94
+ for (const op of operations) {
95
+ const desc = op.type === 'uncomment' || op.type === 'remove'
96
+ ? ` ${op.type}: ${op.path}`
97
+ : ` ${op.type}: ${op.path} = ${op.value}`;
98
+ console.log(desc);
99
+ }
100
+ source = (0, jsonc_1.applyOperations)(source, operations);
101
+ fs.writeFileSync(file, source);
102
+ console.log(` Done: ${operations.length} operation(s) applied`);
103
+ }
104
+ //# 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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","sourcesContent":["/**\n * Patch command — apply targeted edits to JSONC config files.\n */\n\nimport * as fs from 'fs';\nimport { IPatchOperation, PatchOperationType, applyOperations, parseValue } from '../packlets/jsonc';\n\nexport interface IPatchOptions {\n file: string;\n operations: IPatchOperation[];\n}\n\n/**\n * Parse CLI arguments for the patch command into operations.\n * Expects pairs like: --set 'path=value', --uncomment 'path', etc.\n */\nexport function parsePatchArgs(args: string[]): IPatchOperation[] {\n const operations: IPatchOperation[] = [];\n const validOps: PatchOperationType[] = ['set', 'set-json', 'uncomment', 'add-to-array', 'remove'];\n\n let i = 0;\n while (i < args.length) {\n const arg = args[i];\n if (!arg.startsWith('--')) {\n throw new Error(`Unexpected argument: ${arg}`);\n }\n\n const opType = arg.slice(2) as PatchOperationType;\n if (!validOps.includes(opType)) {\n throw new Error(`Unknown operation: ${arg}`);\n }\n\n i++;\n if (i >= args.length) {\n throw new Error(`Missing value for ${arg}`);\n }\n\n const operand = args[i];\n i++;\n\n if (opType === 'uncomment' || opType === 'remove') {\n operations.push({ type: opType, path: operand });\n } else {\n const eqIndex = operand.indexOf('=');\n if (eqIndex === -1) {\n throw new Error(`Expected path=value for ${arg}, got: ${operand}`);\n }\n const opPath = operand.slice(0, eqIndex);\n const rawValue = operand.slice(eqIndex + 1);\n\n if (opType === 'set') {\n operations.push({ type: opType, path: opPath, value: parseValue(rawValue) });\n } else {\n // set-json and add-to-array pass raw JSON string\n operations.push({ type: opType, path: opPath, value: rawValue });\n }\n }\n }\n\n return operations;\n}\n\nexport async function runPatch(options: IPatchOptions): Promise<void> {\n const { file, operations } = options;\n\n if (!fs.existsSync(file)) {\n throw new Error(`File not found: ${file}`);\n }\n\n console.log(`Patching: ${file}`);\n let source = fs.readFileSync(file, 'utf-8');\n\n for (const op of operations) {\n const desc =\n op.type === 'uncomment' || op.type === 'remove'\n ? ` ${op.type}: ${op.path}`\n : ` ${op.type}: ${op.path} = ${op.value}`;\n console.log(desc);\n }\n\n source = applyOperations(source, operations);\n fs.writeFileSync(file, source);\n console.log(` Done: ${operations.length} operation(s) applied`);\n}\n"]}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Sync command — updates shared files in a consumer repo from the template source.
3
+ * Templated files are NOT touched — they are owned by the consumer after creation.
4
+ */
5
+ export interface ISyncOptions {
6
+ targetDir: string;
7
+ sourceDir: string;
8
+ dryRun: boolean;
9
+ }
10
+ export declare function runSync(options: ISyncOptions): Promise<void>;
11
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAwHlE"}
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ /**
3
+ * Sync command — updates shared files in a consumer repo from the template source.
4
+ * Templated files are NOT touched — they are owned by the consumer after creation.
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.runSync = runSync;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const manifest_1 = require("../packlets/manifest");
44
+ const fs_1 = require("../packlets/fs");
45
+ async function runSync(options) {
46
+ const { targetDir, sourceDir, dryRun } = options;
47
+ if (!fs.existsSync(targetDir)) {
48
+ throw new Error(`Target directory does not exist: ${targetDir}`);
49
+ }
50
+ if (!fs.existsSync(path.join(sourceDir, 'rush.json'))) {
51
+ throw new Error(`Source directory is not a Rush repo: ${sourceDir}`);
52
+ }
53
+ const manifestPath = (0, manifest_1.getDefaultManifestPath)();
54
+ const manifest = (0, manifest_1.loadManifest)(manifestPath);
55
+ console.log('Syncing shared files');
56
+ console.log(` Source: ${sourceDir}`);
57
+ console.log(` Target: ${targetDir}`);
58
+ if (dryRun) {
59
+ console.log(' Mode: DRY RUN (no changes will be made)');
60
+ }
61
+ console.log('');
62
+ let copied = 0;
63
+ let skipped = 0;
64
+ let warnings = 0;
65
+ // ── Sync individual shared files ──
66
+ console.log('==> Syncing shared files...');
67
+ for (const file of manifest.shared.files) {
68
+ const srcPath = path.join(sourceDir, file.source);
69
+ const dstPath = path.join(targetDir, file.destination);
70
+ if (!fs.existsSync(srcPath)) {
71
+ console.log(` WARNING: Source not found: ${file.source}`);
72
+ warnings++;
73
+ continue;
74
+ }
75
+ if (dryRun) {
76
+ if (fs.existsSync(dstPath) && (0, fs_1.filesAreEqual)(srcPath, dstPath)) {
77
+ console.log(` [unchanged] ${file.destination}`);
78
+ skipped++;
79
+ }
80
+ else if (fs.existsSync(dstPath)) {
81
+ console.log(` [would update] ${file.destination}`);
82
+ copied++;
83
+ }
84
+ else {
85
+ console.log(` [would create] ${file.destination}`);
86
+ copied++;
87
+ }
88
+ }
89
+ else {
90
+ if (fs.existsSync(dstPath) && (0, fs_1.filesAreEqual)(srcPath, dstPath)) {
91
+ skipped++;
92
+ }
93
+ else {
94
+ (0, fs_1.copyFile)(srcPath, dstPath);
95
+ console.log(` Updated: ${file.destination}`);
96
+ copied++;
97
+ }
98
+ }
99
+ }
100
+ // ── Sync shared packages ──
101
+ console.log('');
102
+ console.log('==> Syncing shared packages...');
103
+ for (const pkg of manifest.sharedPackages.packages) {
104
+ const srcPath = path.join(sourceDir, pkg.source);
105
+ const dstPath = path.join(targetDir, pkg.destination);
106
+ if (!fs.existsSync(srcPath)) {
107
+ console.log(` WARNING: Source directory not found: ${pkg.source}`);
108
+ warnings++;
109
+ continue;
110
+ }
111
+ if (dryRun) {
112
+ console.log(` [would sync] ${pkg.destination}/`);
113
+ copied++;
114
+ }
115
+ else {
116
+ (0, fs_1.copyPackage)(srcPath, dstPath);
117
+ console.log(` Synced package: ${pkg.destination}`);
118
+ copied++;
119
+ }
120
+ }
121
+ // ── Update sync metadata ──
122
+ if (!dryRun) {
123
+ const syncFilePath = path.join(targetDir, '.template-sync');
124
+ if (fs.existsSync(syncFilePath)) {
125
+ try {
126
+ const syncData = JSON.parse(fs.readFileSync(syncFilePath, 'utf-8'));
127
+ syncData.lastSyncedAt = new Date().toISOString();
128
+ syncData.sourceCommit = (0, fs_1.getGitCommit)(sourceDir);
129
+ fs.writeFileSync(syncFilePath, JSON.stringify(syncData, null, 2) + '\n');
130
+ console.log('');
131
+ console.log(' Updated .template-sync');
132
+ }
133
+ catch (_a) {
134
+ console.log(' WARNING: Could not update .template-sync');
135
+ }
136
+ }
137
+ }
138
+ // ── Summary ──
139
+ console.log('');
140
+ console.log('=== Sync complete ===');
141
+ console.log(` Updated: ${copied}`);
142
+ console.log(` Unchanged: ${skipped}`);
143
+ console.log(` Warnings: ${warnings}`);
144
+ if (dryRun) {
145
+ console.log('');
146
+ console.log('This was a dry run. No files were modified.');
147
+ console.log('Run without --dry-run to apply changes.');
148
+ }
149
+ if (!dryRun && copied > 0) {
150
+ console.log('');
151
+ console.log('Next steps:');
152
+ console.log(` 1. Review changes: cd ${targetDir} && git diff`);
153
+ console.log(" 2. Commit: git add -A && git commit -m 'Sync shared files from template'");
154
+ }
155
+ }
156
+ //# sourceMappingURL=sync.js.map