@principles/pd-cli 1.103.0 → 1.104.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/commands/runtime-internalization-integrity-repair.d.ts.map +1 -1
- package/dist/commands/runtime-internalization-integrity-repair.js +40 -14
- package/dist/commands/runtime-internalization-integrity-repair.js.map +1 -1
- package/package.json +1 -1
- package/src/commands/runtime-internalization-integrity-repair.ts +37 -15
- package/tests/commands/runtime-internalization-integrity-repair.test.ts +31 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-internalization-integrity-repair.d.ts","sourceRoot":"","sources":["../../src/commands/runtime-internalization-integrity-repair.ts"],"names":[],"mappings":"AAKA,UAAU,qCAAqC;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAiCD,wBAAsB,2CAA2C,CAAC,IAAI,EAAE,qCAAqC,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"runtime-internalization-integrity-repair.d.ts","sourceRoot":"","sources":["../../src/commands/runtime-internalization-integrity-repair.ts"],"names":[],"mappings":"AAKA,UAAU,qCAAqC;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAiCD,wBAAsB,2CAA2C,CAAC,IAAI,EAAE,qCAAqC,GAAG,OAAO,CAAC,IAAI,CAAC,CA+C5H"}
|
|
@@ -30,25 +30,51 @@ function formatTextOutput(result) {
|
|
|
30
30
|
return lines.join('\n');
|
|
31
31
|
}
|
|
32
32
|
export async function handleRuntimeInternalizationIntegrityRepair(opts) {
|
|
33
|
-
const workspaceDir = opts.workspace
|
|
34
|
-
? path.resolve(opts.workspace)
|
|
35
|
-
: resolveWorkspaceDir();
|
|
36
33
|
if (opts.dryRun && opts.confirm) {
|
|
37
|
-
|
|
34
|
+
if (opts.json) {
|
|
35
|
+
console.log(JSON.stringify({
|
|
36
|
+
ok: false,
|
|
37
|
+
reason: 'Error: --dry-run and --confirm are mutually exclusive',
|
|
38
|
+
nextAction: 'Specify only one of --dry-run or --confirm',
|
|
39
|
+
}, null, 2));
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
console.error('Error: --dry-run and --confirm are mutually exclusive. Specify one or the other.');
|
|
43
|
+
}
|
|
38
44
|
process.exit(1);
|
|
45
|
+
return;
|
|
39
46
|
}
|
|
40
47
|
const isDryRun = !opts.confirm;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
+
try {
|
|
49
|
+
const workspaceDir = opts.workspace
|
|
50
|
+
? path.resolve(opts.workspace)
|
|
51
|
+
: resolveWorkspaceDir();
|
|
52
|
+
const remediation = new InternalizationIntegrityRemediation({ workspaceDir });
|
|
53
|
+
const result = remediation.repair({ dryRun: isDryRun });
|
|
54
|
+
if (opts.json) {
|
|
55
|
+
console.log(JSON.stringify(result, null, 2));
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
console.log(formatTextOutput(result));
|
|
59
|
+
if (!isDryRun && result.repairedCount === 0 && result.actions.length > 0) {
|
|
60
|
+
console.error('');
|
|
61
|
+
console.error('NOTE: No repairs were made. All issues were already resolved or skipped.');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
48
64
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
65
|
+
catch (err) {
|
|
66
|
+
if (opts.json) {
|
|
67
|
+
console.log(JSON.stringify({
|
|
68
|
+
ok: false,
|
|
69
|
+
reason: err instanceof Error ? err.message : String(err),
|
|
70
|
+
nextAction: 'Check workspace path and DB connectivity',
|
|
71
|
+
}, null, 2));
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);
|
|
75
|
+
}
|
|
76
|
+
process.exit(1);
|
|
77
|
+
return;
|
|
52
78
|
}
|
|
53
79
|
}
|
|
54
80
|
//# sourceMappingURL=runtime-internalization-integrity-repair.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-internalization-integrity-repair.js","sourceRoot":"","sources":["../../src/commands/runtime-internalization-integrity-repair.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,mCAAmC,EAAE,MAAM,6BAA6B,CAAC;AAClF,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAU9D,SAAS,gBAAgB,CAAC,MAAyB;IACjD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IACtD,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IACjD,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IACzE,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACvC,KAAK,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;IACrD,KAAK,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;IACrD,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IAC1D,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;QAClD,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACrD,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC9F,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,cAAc,IAAI,WAAW,MAAM,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI,WAAW,EAAE,CAAC,CAAC;YAC3I,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YAC3C,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;gBAC3B,KAAK,CAAC,IAAI,CAAC,wBAAwB,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2CAA2C,CAAC,IAA2C;IAC3G,
|
|
1
|
+
{"version":3,"file":"runtime-internalization-integrity-repair.js","sourceRoot":"","sources":["../../src/commands/runtime-internalization-integrity-repair.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -42,28 +42,50 @@ function formatTextOutput(result: RemediationResult): string {
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
export async function handleRuntimeInternalizationIntegrityRepair(opts: InternalizationIntegrityRepairOptions): Promise<void> {
|
|
45
|
-
const workspaceDir = opts.workspace
|
|
46
|
-
? path.resolve(opts.workspace)
|
|
47
|
-
: resolveWorkspaceDir();
|
|
48
|
-
|
|
49
45
|
if (opts.dryRun && opts.confirm) {
|
|
50
|
-
|
|
46
|
+
if (opts.json) {
|
|
47
|
+
console.log(JSON.stringify({
|
|
48
|
+
ok: false,
|
|
49
|
+
reason: 'Error: --dry-run and --confirm are mutually exclusive',
|
|
50
|
+
nextAction: 'Specify only one of --dry-run or --confirm',
|
|
51
|
+
}, null, 2));
|
|
52
|
+
} else {
|
|
53
|
+
console.error('Error: --dry-run and --confirm are mutually exclusive. Specify one or the other.');
|
|
54
|
+
}
|
|
51
55
|
process.exit(1);
|
|
56
|
+
return;
|
|
52
57
|
}
|
|
53
58
|
|
|
54
59
|
const isDryRun = !opts.confirm;
|
|
55
60
|
|
|
56
|
-
|
|
57
|
-
|
|
61
|
+
try {
|
|
62
|
+
const workspaceDir = opts.workspace
|
|
63
|
+
? path.resolve(opts.workspace)
|
|
64
|
+
: resolveWorkspaceDir();
|
|
58
65
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
} else {
|
|
62
|
-
console.log(formatTextOutput(result));
|
|
63
|
-
}
|
|
66
|
+
const remediation = new InternalizationIntegrityRemediation({ workspaceDir });
|
|
67
|
+
const result = remediation.repair({ dryRun: isDryRun });
|
|
64
68
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
69
|
+
if (opts.json) {
|
|
70
|
+
console.log(JSON.stringify(result, null, 2));
|
|
71
|
+
} else {
|
|
72
|
+
console.log(formatTextOutput(result));
|
|
73
|
+
if (!isDryRun && result.repairedCount === 0 && result.actions.length > 0) {
|
|
74
|
+
console.error('');
|
|
75
|
+
console.error('NOTE: No repairs were made. All issues were already resolved or skipped.');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
} catch (err: unknown) {
|
|
79
|
+
if (opts.json) {
|
|
80
|
+
console.log(JSON.stringify({
|
|
81
|
+
ok: false,
|
|
82
|
+
reason: err instanceof Error ? err.message : String(err),
|
|
83
|
+
nextAction: 'Check workspace path and DB connectivity',
|
|
84
|
+
}, null, 2));
|
|
85
|
+
} else {
|
|
86
|
+
console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);
|
|
87
|
+
}
|
|
88
|
+
process.exit(1);
|
|
89
|
+
return;
|
|
68
90
|
}
|
|
69
91
|
}
|
|
@@ -203,6 +203,37 @@ describe('Commander wiring for integrity-repair', () => {
|
|
|
203
203
|
program.parseAsync(['node', 'pd', 'internalization', 'integrity-repair', '--workspace', WS, '--dry-run', '--confirm', '--json']),
|
|
204
204
|
).rejects.toThrow('process.exit:1');
|
|
205
205
|
|
|
206
|
+
// Verify it printed a single JSON error object on stdout
|
|
207
|
+
expect(consoleLogSpy).toHaveBeenCalledTimes(1);
|
|
208
|
+
const jsonOutput = JSON.parse(consoleLogSpy.mock.calls[0][0]);
|
|
209
|
+
expect(jsonOutput).toMatchObject({
|
|
210
|
+
ok: false,
|
|
211
|
+
reason: expect.stringContaining('mutually exclusive'),
|
|
212
|
+
nextAction: expect.any(String),
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
exitSpy.mockRestore();
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
it('outputs structured JSON failure on exception in JSON mode', async () => {
|
|
219
|
+
mockRepair.mockImplementation(() => {
|
|
220
|
+
throw new Error('Database connection failed');
|
|
221
|
+
});
|
|
222
|
+
const exitSpy = vi.spyOn(process, 'exit').mockImplementation((code) => { throw new Error(`process.exit:${code}`); });
|
|
223
|
+
|
|
224
|
+
const program = createTestProgram();
|
|
225
|
+
await expect(
|
|
226
|
+
program.parseAsync(['node', 'pd', 'internalization', 'integrity-repair', '--workspace', WS, '--confirm', '--json']),
|
|
227
|
+
).rejects.toThrow('process.exit:1');
|
|
228
|
+
|
|
229
|
+
expect(consoleLogSpy).toHaveBeenCalledTimes(1);
|
|
230
|
+
const jsonOutput = JSON.parse(consoleLogSpy.mock.calls[0][0]);
|
|
231
|
+
expect(jsonOutput).toMatchObject({
|
|
232
|
+
ok: false,
|
|
233
|
+
reason: 'Database connection failed',
|
|
234
|
+
nextAction: 'Check workspace path and DB connectivity',
|
|
235
|
+
});
|
|
236
|
+
|
|
206
237
|
exitSpy.mockRestore();
|
|
207
238
|
});
|
|
208
239
|
});
|