@sculptor/cli 0.2.4 → 0.3.1

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.
@@ -0,0 +1,275 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import ts from "typescript";
4
+ import { loadConfig } from "@sculptor/config";
5
+ import { validatePackageRegistryState } from "./package-commands.js";
6
+ import { detectPackageManager } from "./package-manager.js";
7
+ const cliPackageVersion = JSON.parse(fs.readFileSync(new URL("../package.json", import.meta.url), "utf8"));
8
+ const toPackageManager = detectPackageManager;
9
+ const findAppRoot = (cwd) => {
10
+ let current = path.resolve(cwd);
11
+ for (;;) {
12
+ if (fs.existsSync(path.join(current, "sculptor.json"))) {
13
+ return current;
14
+ }
15
+ const parent = path.dirname(current);
16
+ if (parent === current) {
17
+ return undefined;
18
+ }
19
+ current = parent;
20
+ }
21
+ };
22
+ const readJson = (filePath) => {
23
+ if (!fs.existsSync(filePath)) {
24
+ return undefined;
25
+ }
26
+ const raw = fs.readFileSync(filePath, "utf8");
27
+ if (!raw.trim()) {
28
+ return undefined;
29
+ }
30
+ return JSON.parse(raw);
31
+ };
32
+ const comparePinnedVersions = (left, right) => {
33
+ const parse = (value) => {
34
+ const match = value.trim().match(/^(\d+)\.(\d+)\.(\d+)$/);
35
+ if (!match) {
36
+ return undefined;
37
+ }
38
+ return [Number(match[1]), Number(match[2]), Number(match[3])];
39
+ };
40
+ const leftParts = parse(left);
41
+ const rightParts = parse(right);
42
+ if (!leftParts || !rightParts) {
43
+ return undefined;
44
+ }
45
+ for (let index = 0; index < leftParts.length; index += 1) {
46
+ const difference = leftParts[index] - rightParts[index];
47
+ if (difference !== 0) {
48
+ return difference;
49
+ }
50
+ }
51
+ return 0;
52
+ };
53
+ const isRangeSpecifier = (specifier) => /^(\^|~|>=|<=|>|<|\*)/.test(specifier.trim()) || specifier.includes(" || ");
54
+ const collectSculptorDependencies = (rootDir) => {
55
+ const packageJson = readJson(path.join(rootDir, "package.json"));
56
+ if (!packageJson) {
57
+ return [];
58
+ }
59
+ const sources = [
60
+ ["dependencies", packageJson.dependencies],
61
+ ["devDependencies", packageJson.devDependencies],
62
+ ["peerDependencies", packageJson.peerDependencies],
63
+ ["optionalDependencies", packageJson.optionalDependencies]
64
+ ];
65
+ const result = [];
66
+ for (const [source, dependencies] of sources) {
67
+ for (const [packageName, specifier] of Object.entries(dependencies ?? {})) {
68
+ if (!packageName.startsWith("@sculptor/")) {
69
+ continue;
70
+ }
71
+ result.push({ packageName, specifier, source });
72
+ }
73
+ }
74
+ return result;
75
+ };
76
+ const inspectRegistryShape = (rootDir) => {
77
+ const diagnostics = [];
78
+ let srcRoot = "src";
79
+ try {
80
+ srcRoot = String(loadConfig(rootDir).framework.project?.srcRoot ?? "src");
81
+ }
82
+ catch (error) {
83
+ diagnostics.push({
84
+ severity: "error",
85
+ code: "CONFIG_LOAD_FAILED",
86
+ message: error instanceof Error ? error.message : String(error)
87
+ });
88
+ return diagnostics;
89
+ }
90
+ const registryPath = path.join(rootDir, srcRoot, "registry.ts");
91
+ if (!fs.existsSync(registryPath)) {
92
+ diagnostics.push({
93
+ severity: "warn",
94
+ code: "REGISTRY_MISSING",
95
+ message: `No registry file found at ${path.posix.join(srcRoot, "registry.ts")}.`
96
+ });
97
+ return diagnostics;
98
+ }
99
+ const sourceText = fs.readFileSync(registryPath, "utf8");
100
+ const sourceFile = ts.createSourceFile(registryPath, sourceText, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
101
+ const registryDeclaration = sourceFile.statements.find((statement) => ts.isVariableStatement(statement) &&
102
+ statement.declarationList.declarations.some((declaration) => ts.isIdentifier(declaration.name) && declaration.name.text === "registry"));
103
+ if (!registryDeclaration) {
104
+ diagnostics.push({
105
+ severity: "warn",
106
+ code: "REGISTRY_UNINSPECTABLE",
107
+ message: "Unable to inspect registry.ts statically."
108
+ });
109
+ return diagnostics;
110
+ }
111
+ const registryInitializer = registryDeclaration.declarationList.declarations.find((declaration) => ts.isIdentifier(declaration.name) && declaration.name.text === "registry" &&
112
+ declaration.initializer !== undefined)?.initializer;
113
+ if (!registryInitializer || !ts.isObjectLiteralExpression(registryInitializer)) {
114
+ diagnostics.push({
115
+ severity: "error",
116
+ code: "REGISTRY_MALFORMED",
117
+ message: "registry.ts must export a plain object registry."
118
+ });
119
+ return diagnostics;
120
+ }
121
+ const propertyNames = new Set();
122
+ for (const property of registryInitializer.properties) {
123
+ if (ts.isPropertyAssignment(property) && ts.isIdentifier(property.name)) {
124
+ propertyNames.add(property.name.text);
125
+ }
126
+ }
127
+ if (!propertyNames.has("packages")) {
128
+ if (["controllers", "services", "routes", "repositories", "middlewares"].some((key) => propertyNames.has(key))) {
129
+ diagnostics.push({
130
+ severity: "warn",
131
+ code: "REGISTRY_LEGACY",
132
+ message: "Legacy flat registry shape detected. Package-aware registry support is available.",
133
+ });
134
+ }
135
+ return diagnostics;
136
+ }
137
+ const packagesProperty = registryInitializer.properties.find((property) => ts.isPropertyAssignment(property) && ts.isIdentifier(property.name) && property.name.text === "packages");
138
+ if (packagesProperty && !ts.isArrayLiteralExpression(packagesProperty.initializer)) {
139
+ diagnostics.push({
140
+ severity: "error",
141
+ code: "REGISTRY_PACKAGES_INVALID",
142
+ message: "registry.packages must be an array."
143
+ });
144
+ return diagnostics;
145
+ }
146
+ diagnostics.push({
147
+ severity: "info",
148
+ code: "REGISTRY_PACKAGE_AWARE",
149
+ message: "Package-aware registry shape detected."
150
+ });
151
+ return diagnostics;
152
+ };
153
+ export const createDoctorReport = (cwd) => {
154
+ const diagnostics = [];
155
+ const cliVersion = cliPackageVersion.version ?? "0.0.0";
156
+ const packageManager = toPackageManager();
157
+ const appRoot = findAppRoot(cwd);
158
+ if (!appRoot) {
159
+ diagnostics.push({
160
+ severity: "info",
161
+ code: "NO_APP_ROOT",
162
+ message: "No Sculptor app root detected. Project diagnostics are skipped."
163
+ });
164
+ return {
165
+ cliVersion,
166
+ packageManager,
167
+ diagnostics
168
+ };
169
+ }
170
+ diagnostics.push({
171
+ severity: "info",
172
+ code: "APP_ROOT_DETECTED",
173
+ message: `App root: ${appRoot}`
174
+ });
175
+ const sculptorDependencies = collectSculptorDependencies(appRoot);
176
+ if (sculptorDependencies.length === 0) {
177
+ diagnostics.push({
178
+ severity: "warn",
179
+ code: "NO_SCULPTOR_DEPENDENCIES",
180
+ message: "No Sculptor dependencies were declared in package.json."
181
+ });
182
+ }
183
+ for (const dependency of sculptorDependencies) {
184
+ const specifier = dependency.specifier.trim();
185
+ if (!specifier || specifier === "latest" || specifier === "*" || specifier.startsWith("file:") || specifier.startsWith("link:") || specifier.startsWith("workspace:")) {
186
+ diagnostics.push({
187
+ severity: "warn",
188
+ code: "DEPENDENCY_UNPINNED",
189
+ message: `${dependency.packageName} (${dependency.source}) uses an unpinned or workspace specifier: ${dependency.specifier}`
190
+ });
191
+ continue;
192
+ }
193
+ if (isRangeSpecifier(specifier)) {
194
+ diagnostics.push({
195
+ severity: "info",
196
+ code: "DEPENDENCY_RANGE",
197
+ message: `${dependency.packageName} (${dependency.source}) is declared with range ${dependency.specifier}.`
198
+ });
199
+ continue;
200
+ }
201
+ const comparison = comparePinnedVersions(cliVersion, specifier);
202
+ if (comparison === undefined) {
203
+ diagnostics.push({
204
+ severity: "info",
205
+ code: "DEPENDENCY_UNKNOWN",
206
+ message: `${dependency.packageName} (${dependency.source}) is declared as ${dependency.specifier}.`
207
+ });
208
+ continue;
209
+ }
210
+ if (comparison > 0) {
211
+ diagnostics.push({
212
+ severity: "warn",
213
+ code: "DEPENDENCY_OLDER_THAN_CLI",
214
+ message: `${dependency.packageName} (${dependency.source}) is behind the CLI version ${cliVersion} (declared ${dependency.specifier}).`
215
+ });
216
+ continue;
217
+ }
218
+ if (comparison < 0) {
219
+ diagnostics.push({
220
+ severity: "warn",
221
+ code: "DEPENDENCY_AHEAD_OF_CLI",
222
+ message: `${dependency.packageName} (${dependency.source}) is ahead of the CLI version ${cliVersion} (declared ${dependency.specifier}).`
223
+ });
224
+ continue;
225
+ }
226
+ diagnostics.push({
227
+ severity: "info",
228
+ code: "DEPENDENCY_MATCH",
229
+ message: `${dependency.packageName} (${dependency.source}) matches CLI version ${cliVersion}.`
230
+ });
231
+ }
232
+ try {
233
+ const report = validatePackageRegistryState(appRoot);
234
+ diagnostics.push({
235
+ severity: "info",
236
+ code: "PACKAGE_REGISTRY_COUNTS",
237
+ message: `Packages detected: ${report.packageCountDetected}; registered: ${report.packageCountRegistered}.`
238
+ });
239
+ for (const message of report.messages) {
240
+ diagnostics.push({
241
+ severity: message.startsWith("Missing registered file") || message.startsWith("Package not registered") ? "warn" : "warn",
242
+ code: "PACKAGE_REGISTRY_WARNING",
243
+ message
244
+ });
245
+ }
246
+ }
247
+ catch (error) {
248
+ diagnostics.push({
249
+ severity: "error",
250
+ code: "PACKAGE_REGISTRY_SCAN_FAILED",
251
+ message: error instanceof Error ? error.message : String(error)
252
+ });
253
+ }
254
+ diagnostics.push(...inspectRegistryShape(appRoot));
255
+ return {
256
+ cliVersion,
257
+ packageManager,
258
+ appRoot,
259
+ diagnostics
260
+ };
261
+ };
262
+ export const printDoctorReport = (report, log) => {
263
+ log(`Sculptor doctor`);
264
+ log(`CLI version: ${report.cliVersion}`);
265
+ log(`Package manager: ${report.packageManager}`);
266
+ if (report.appRoot) {
267
+ log(`App root: ${report.appRoot}`);
268
+ }
269
+ for (const diagnostic of report.diagnostics) {
270
+ const prefix = diagnostic.severity === "error" ? "✖" : diagnostic.severity === "warn" ? "⚠" : "•";
271
+ log(`${prefix} ${diagnostic.message}`);
272
+ }
273
+ };
274
+ export const hasDoctorErrors = (report) => report.diagnostics.some((diagnostic) => diagnostic.severity === "error");
275
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { type PackageRecord } from "./package-registry.js";
2
+ export type PromptFn = (question: string, defaultValue?: string) => Promise<string>;
3
+ export interface PackageCommandContext {
4
+ cwd: string;
5
+ prompt: PromptFn;
6
+ log: (...args: unknown[]) => void;
7
+ error: (...args: unknown[]) => void;
8
+ }
9
+ export interface PackageValidationReport {
10
+ packageCountDetected: number;
11
+ packageCountRegistered: number;
12
+ messages: string[];
13
+ }
14
+ export declare const getPackageFlagValue: (args: string[]) => string | undefined;
15
+ export declare const stripPackageFlag: (args: string[]) => string[];
16
+ export declare const validatePackageRegistryState: (rootDir: string, packageName?: string) => PackageValidationReport;
17
+ export declare const syncPackageRegistryState: (rootDir: string) => PackageValidationReport;
18
+ export declare const printPackageValidation: (report: PackageValidationReport, log: (...args: unknown[]) => void) => void;
19
+ export declare const handleSyncCommand: (args: string[], context: PackageCommandContext) => void;
20
+ export declare const handleLsCommand: (args: string[], context: PackageCommandContext) => void;
21
+ export declare const handlePackageCommand: (args: string[], context: PackageCommandContext) => Promise<void>;
22
+ export declare const handleRegisterCommand: (command: "reg" | "ureg" | "rm", args: string[], context: PackageCommandContext) => Promise<void>;
23
+ export declare const createPackageFromName: (rootDir: string, name: string, explicitPath?: string) => PackageRecord;
24
+ export declare const ensureRootRegistryForPackages: (rootDir: string) => void;
@@ -0,0 +1,299 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { loadConfig } from "@sculptor/config";
4
+ import { buildPackageRecord, getOwningPackage, loadPackageRegistry, removeFileFromRegistry, savePackageRegistry, scanPackageRegistry, syncPackageRegistry, updatePackageIndexForRecord, upsertFileIntoRegistry } from "./package-registry.js";
5
+ const packageFlagNames = ["-p", "--p", "-pkg", "--pkg", "-package", "--package"];
6
+ const ensureAppRoot = (cwd, command) => {
7
+ if (!fs.existsSync(path.join(cwd, "sculptor.json"))) {
8
+ throw new Error(`${command} can only be run from a Sculptor app root.`);
9
+ }
10
+ return cwd;
11
+ };
12
+ const normalizePath = (value) => value.replace(/\\/g, "/").replace(/^\/+/, "").replace(/\/+$/, "");
13
+ const isPackageFlag = (value) => packageFlagNames.some((flag) => value === flag || value.startsWith(`${flag}=`));
14
+ export const getPackageFlagValue = (args) => {
15
+ for (let index = 0; index < args.length; index += 1) {
16
+ const arg = args[index];
17
+ for (const flag of packageFlagNames) {
18
+ const prefixed = `${flag}=`;
19
+ if (arg.startsWith(prefixed)) {
20
+ return arg.slice(prefixed.length);
21
+ }
22
+ if (arg !== flag) {
23
+ continue;
24
+ }
25
+ const next = args[index + 1];
26
+ if (!next || next.startsWith("-")) {
27
+ return undefined;
28
+ }
29
+ return next;
30
+ }
31
+ }
32
+ return undefined;
33
+ };
34
+ export const stripPackageFlag = (args) => {
35
+ const result = [];
36
+ for (let index = 0; index < args.length; index += 1) {
37
+ const arg = args[index];
38
+ if (!isPackageFlag(arg)) {
39
+ result.push(arg);
40
+ continue;
41
+ }
42
+ if (packageFlagNames.some((flag) => arg.startsWith(`${flag}=`))) {
43
+ continue;
44
+ }
45
+ const next = args[index + 1];
46
+ if (next && !next.startsWith("-")) {
47
+ index += 1;
48
+ }
49
+ }
50
+ return result;
51
+ };
52
+ const toPascalCase = (value) => value
53
+ .split(/[^a-zA-Z0-9]+/)
54
+ .filter(Boolean)
55
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
56
+ .join("");
57
+ const getPackageByName = (registry, packageName) => Object.values(registry.packages).find((record) => record.name === packageName);
58
+ const getPackageRegistryKey = (registry, packageName) => Object.keys(registry.packages).find((key) => registry.packages[key]?.name === packageName);
59
+ const comparePackageFiles = (detected, registered, messages, packageName) => {
60
+ const detectedFiles = new Set((detected?.files ?? []).map((entry) => entry.path));
61
+ const registeredFiles = new Set((registered?.files ?? []).map((entry) => entry.path));
62
+ for (const file of registeredFiles) {
63
+ if (!detectedFiles.has(file)) {
64
+ messages.push(`Missing registered file: ${file}`);
65
+ }
66
+ }
67
+ for (const file of detectedFiles) {
68
+ if (!registeredFiles.has(file)) {
69
+ messages.push(`Detected unregistered file: ${file}`);
70
+ }
71
+ }
72
+ if (detected && !registered) {
73
+ messages.push(`Package not registered: ${packageName}`);
74
+ }
75
+ };
76
+ export const validatePackageRegistryState = (rootDir, packageName) => {
77
+ const scan = scanPackageRegistry(rootDir);
78
+ const registry = loadPackageRegistry(rootDir);
79
+ const messages = [];
80
+ const detectedPackages = packageName
81
+ ? scan.packages.filter((record) => record.name === packageName)
82
+ : scan.packages;
83
+ const registeredPackages = packageName
84
+ ? Object.values(registry.packages).filter((record) => record.name === packageName)
85
+ : Object.values(registry.packages);
86
+ for (const detected of detectedPackages) {
87
+ const registered = getPackageByName(registry, detected.name);
88
+ comparePackageFiles(detected, registered, messages, detected.name);
89
+ }
90
+ for (const registered of registeredPackages) {
91
+ const detected = detectedPackages.find((record) => record.name === registered.name);
92
+ comparePackageFiles(detected, registered, messages, registered.name);
93
+ }
94
+ const detectedFileSet = new Set(scan.files.map((file) => file.path));
95
+ const registeredFileSet = new Set(registry.files.map((file) => file.path));
96
+ for (const file of registeredFileSet) {
97
+ if (!detectedFileSet.has(file)) {
98
+ messages.push(`Missing registered file: ${file}`);
99
+ }
100
+ }
101
+ for (const file of detectedFileSet) {
102
+ if (!registeredFileSet.has(file)) {
103
+ messages.push(`Detected unregistered file: ${file}`);
104
+ }
105
+ }
106
+ return {
107
+ packageCountDetected: detectedPackages.length,
108
+ packageCountRegistered: registeredPackages.length,
109
+ messages: [...new Set(messages)]
110
+ };
111
+ };
112
+ export const syncPackageRegistryState = (rootDir) => {
113
+ const report = validatePackageRegistryState(rootDir);
114
+ syncPackageRegistry(rootDir);
115
+ return report;
116
+ };
117
+ export const printPackageValidation = (report, log) => {
118
+ log(`Packages detected: ${report.packageCountDetected}`);
119
+ log(`Packages registered: ${report.packageCountRegistered}`);
120
+ for (const message of report.messages) {
121
+ log(message);
122
+ }
123
+ };
124
+ export const handleSyncCommand = (args, context) => {
125
+ const rootDir = ensureAppRoot(context.cwd, "sc sync");
126
+ const packageName = getPackageFlagValue(args);
127
+ const report = validatePackageRegistryState(rootDir, packageName);
128
+ printPackageValidation(report, context.log);
129
+ syncPackageRegistry(rootDir);
130
+ };
131
+ const packageTreeLines = (record, registered) => {
132
+ if (!record && !registered) {
133
+ return [];
134
+ }
135
+ const lines = [];
136
+ const source = record ?? registered;
137
+ if (!source) {
138
+ return lines;
139
+ }
140
+ lines.push(`${source.name} (${source.path})`);
141
+ const detectedFiles = new Set((record?.files ?? []).map((entry) => entry.path));
142
+ const registeredFiles = new Set((registered?.files ?? []).map((entry) => entry.path));
143
+ const allFiles = [...new Set([...detectedFiles, ...registeredFiles])].sort();
144
+ for (const file of allFiles) {
145
+ const marker = detectedFiles.has(file) && registeredFiles.has(file)
146
+ ? "✔"
147
+ : detectedFiles.has(file)
148
+ ? "⚠"
149
+ : "✖";
150
+ lines.push(` ${marker} ${path.posix.basename(file)}`);
151
+ }
152
+ return lines;
153
+ };
154
+ export const handleLsCommand = (args, context) => {
155
+ const rootDir = ensureAppRoot(context.cwd, "sc ls");
156
+ const treeMode = args.some((arg) => ["-t", "--tree", "-tree", "--t"].includes(arg));
157
+ const packageName = getPackageFlagValue(args);
158
+ const scan = scanPackageRegistry(rootDir);
159
+ const registry = loadPackageRegistry(rootDir);
160
+ if (treeMode) {
161
+ const packages = packageName
162
+ ? scan.packages.filter((record) => record.name === packageName)
163
+ : scan.packages;
164
+ for (const pkg of packages) {
165
+ const registered = registry.packages[pkg.name];
166
+ for (const line of packageTreeLines(pkg, registered)) {
167
+ context.log(line);
168
+ }
169
+ }
170
+ if (!packageName) {
171
+ const unpackaged = scan.files.filter((file) => !Object.values(registry.packages).some((record) => record.files.some((entry) => entry.path === file.path)));
172
+ if (unpackaged.length > 0) {
173
+ context.log("Unpackaged files");
174
+ for (const file of unpackaged) {
175
+ context.log(` ⚠ ${file.path}`);
176
+ }
177
+ }
178
+ }
179
+ return;
180
+ }
181
+ context.log(`Packages detected: ${scan.packages.length}`);
182
+ for (const pkg of scan.packages) {
183
+ context.log(`${pkg.name} -> ${pkg.path}`);
184
+ }
185
+ };
186
+ export const handlePackageCommand = async (args, context) => {
187
+ const rootDir = ensureAppRoot(context.cwd, "sc pkg");
188
+ const [subcommand, ...rest] = args;
189
+ if (!subcommand || subcommand === "help") {
190
+ context.log(`Usage: sc pkg|package <name|ls|rm>`);
191
+ return;
192
+ }
193
+ if (subcommand === "ls") {
194
+ const scan = scanPackageRegistry(rootDir);
195
+ for (const pkg of scan.packages) {
196
+ context.log(`${pkg.name} (${pkg.path})`);
197
+ }
198
+ return;
199
+ }
200
+ if (subcommand === "rm") {
201
+ const packageName = rest[0];
202
+ if (!packageName) {
203
+ context.error("Usage: sc pkg|package rm <name>");
204
+ process.exit(1);
205
+ }
206
+ const registry = loadPackageRegistry(rootDir);
207
+ const record = getPackageByName(registry, packageName);
208
+ if (!record) {
209
+ context.error(`Package "${packageName}" is not registered.`);
210
+ process.exit(1);
211
+ }
212
+ const answer = await context.prompt(`Remove package "${packageName}" and delete ${record.path}? (y/n)`, "n");
213
+ if (!answer.trim().toLowerCase().startsWith("y")) {
214
+ context.log("Package removal cancelled.");
215
+ return;
216
+ }
217
+ fs.rmSync(path.join(rootDir, record.path), { recursive: true, force: true });
218
+ const registryKey = getPackageRegistryKey(registry, packageName);
219
+ if (registryKey) {
220
+ delete registry.packages[registryKey];
221
+ }
222
+ savePackageRegistry(rootDir, registry);
223
+ context.log(`Removed package "${packageName}".`);
224
+ return;
225
+ }
226
+ const registry = loadPackageRegistry(rootDir);
227
+ const packageRecord = getPackageByName(registry, subcommand);
228
+ if (!packageRecord) {
229
+ context.error(`Package "${subcommand}" is not registered.`);
230
+ process.exit(1);
231
+ }
232
+ context.log(`Package: ${packageRecord.name}`);
233
+ context.log(`Path: ${packageRecord.path}`);
234
+ context.log(`Index: ${packageRecord.index}`);
235
+ context.log(`Files: ${packageRecord.files.length}`);
236
+ for (const line of packageTreeLines(packageRecord, packageRecord)) {
237
+ context.log(line);
238
+ }
239
+ };
240
+ const resolveFilePath = (rootDir, filePath) => path.isAbsolute(filePath) ? filePath : path.join(rootDir, filePath);
241
+ export const handleRegisterCommand = async (command, args, context) => {
242
+ const rootDir = ensureAppRoot(context.cwd, `sc ${command}`);
243
+ const [fileInput] = args;
244
+ if (!fileInput) {
245
+ context.error(`Usage: sc ${command} <file>`);
246
+ process.exit(1);
247
+ }
248
+ const filePath = normalizePath(path.relative(rootDir, resolveFilePath(rootDir, fileInput)));
249
+ const fileAbs = resolveFilePath(rootDir, fileInput);
250
+ const registry = syncPackageRegistry(rootDir);
251
+ const owningPackage = getOwningPackage(registry, filePath);
252
+ if (command === "rm") {
253
+ if (owningPackage && filePath === owningPackage.index) {
254
+ context.error(`sc rm cannot delete the package index file for "${owningPackage.name}". Use sc pkg rm ${owningPackage.name} instead.`);
255
+ process.exit(1);
256
+ }
257
+ const answer = await context.prompt(`Delete ${filePath}? (y/n)`, "n");
258
+ if (!answer.trim().toLowerCase().startsWith("y")) {
259
+ context.log("Removal cancelled.");
260
+ return;
261
+ }
262
+ }
263
+ if (command === "reg") {
264
+ upsertFileIntoRegistry(registry, filePath);
265
+ }
266
+ else {
267
+ removeFileFromRegistry(registry, filePath);
268
+ }
269
+ savePackageRegistry(rootDir, registry);
270
+ if (command === "rm" && fs.existsSync(fileAbs)) {
271
+ fs.rmSync(fileAbs, { force: true });
272
+ }
273
+ if (owningPackage) {
274
+ updatePackageIndexForRecord(path.join(rootDir, owningPackage.index), owningPackage);
275
+ }
276
+ context.log(`${command === "reg" ? "Registered" : command === "rm" ? "Removed" : "Unregistered"} ${filePath}`);
277
+ };
278
+ export const createPackageFromName = (rootDir, name, explicitPath) => buildPackageRecord(rootDir, name, explicitPath);
279
+ export const ensureRootRegistryForPackages = (rootDir) => {
280
+ const srcRoot = String(loadConfig(rootDir).framework.project?.srcRoot ?? "src");
281
+ const registryPath = path.join(rootDir, srcRoot, "registry.ts");
282
+ if (fs.existsSync(registryPath)) {
283
+ return;
284
+ }
285
+ const registry = loadPackageRegistry(rootDir);
286
+ const packageRecords = Object.values(registry.packages);
287
+ const packageEntries = packageRecords.map((record) => `${toPascalCase(record.name)}Package`);
288
+ const imports = packageRecords
289
+ .map((record) => {
290
+ const relativePath = record.path.startsWith(`${srcRoot}/`)
291
+ ? record.path.slice(`${srcRoot}/`.length)
292
+ : record.path;
293
+ return `import { ${toPascalCase(record.name)}Package } from "./${relativePath}/index.js";`;
294
+ })
295
+ .join("\n");
296
+ fs.mkdirSync(path.dirname(registryPath), { recursive: true });
297
+ fs.writeFileSync(registryPath, `${imports}${imports ? "\n\n" : ""}export const registry = {\n packages: [${packageEntries.join(", ")}],\n controllers: [],\n services: [],\n repositories: [],\n middlewares: [],\n routes: []\n};\n`, "utf8");
298
+ };
299
+ //# sourceMappingURL=package-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-commands.js","sourceRoot":"","sources":["../src/package-commands.ts"],"names":[],"mappings":"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"}