Skip to content

Commit e64836b

Browse files
gnahCnayRampagent
andcommitted
Fix drift manifest and advisory exit
Co-authored-by: Amp <amp@ampcode.com> Amp-Thread-ID: https://ampcode.com/threads/T-019ed698-27ef-73f9-bd08-21e0117db073
1 parent 4434fea commit e64836b

3 files changed

Lines changed: 71 additions & 18 deletions

File tree

apps/docs/src/generated/cli-manifest.json

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"generatedAt": "2026-06-17T17:20:21.308Z",
2+
"generatedAt": "2026-06-17T18:35:34.326Z",
33
"tools": [
44
{
55
"tool": "ghost",
@@ -33,7 +33,7 @@
3333
{
3434
"rawName": "--memory-dir <relative-dir>",
3535
"name": "memoryDir",
36-
"description": "Relative fingerprint package directory for --all and default package lookup (flag name retained; default: .ghost)",
36+
"description": "Relative fingerprint package directory for host wrappers, --all, and default package lookup (env: GHOST_MEMORY_DIR; default: .ghost)",
3737
"default": null,
3838
"takesValue": true,
3939
"negated": false
@@ -61,7 +61,7 @@
6161
{
6262
"rawName": "--memory-dir <relative-dir>",
6363
"name": "memoryDir",
64-
"description": "Relative fingerprint package directory for init --scope or default root init (flag name retained; default: .ghost)",
64+
"description": "Relative fingerprint package directory for host wrappers, init --scope, and default root init (env: GHOST_MEMORY_DIR; default: .ghost)",
6565
"default": null,
6666
"takesValue": true,
6767
"negated": false
@@ -145,7 +145,7 @@
145145
{
146146
"rawName": "--memory-dir <relative-dir>",
147147
"name": "memoryDir",
148-
"description": "Relative fingerprint package directory for --all and default package lookup (flag name retained; default: .ghost)",
148+
"description": "Relative fingerprint package directory for host wrappers, --all, and default package lookup (env: GHOST_MEMORY_DIR; default: .ghost)",
149149
"default": null,
150150
"takesValue": true,
151151
"negated": false
@@ -181,7 +181,7 @@
181181
{
182182
"rawName": "--memory-dir <relative-dir>",
183183
"name": "memoryDir",
184-
"description": "Relative fingerprint package directory for nested discovery and default scan (flag name retained; default: .ghost)",
184+
"description": "Relative fingerprint package directory for host wrappers, nested discovery, and default scan (env: GHOST_MEMORY_DIR; default: .ghost)",
185185
"default": null,
186186
"takesValue": true,
187187
"negated": false
@@ -209,7 +209,7 @@
209209
{
210210
"rawName": "--memory-dir <relative-dir>",
211211
"name": "memoryDir",
212-
"description": "Relative fingerprint package directory for stack discovery (flag name retained; default: .ghost)",
212+
"description": "Relative fingerprint package directory for host wrappers and stack discovery (env: GHOST_MEMORY_DIR; default: .ghost)",
213213
"default": null,
214214
"takesValue": true,
215215
"negated": false
@@ -348,7 +348,7 @@
348348
{
349349
"rawName": "--memory-dir <relative-dir>",
350350
"name": "memoryDir",
351-
"description": "Relative fingerprint package directory for --path stack resolution (flag name retained; default: .ghost)",
351+
"description": "Relative fingerprint package directory for host wrappers and --path stack resolution (env: GHOST_MEMORY_DIR; default: .ghost)",
352352
"default": null,
353353
"takesValue": true,
354354
"negated": false
@@ -644,7 +644,7 @@
644644
{
645645
"rawName": "--memory-dir <relative-dir>",
646646
"name": "memoryDir",
647-
"description": "Relative fingerprint package directory for stack resolution (default: .ghost)",
647+
"description": "Relative fingerprint package directory for host wrappers and stack resolution (env: GHOST_MEMORY_DIR; default: .ghost)",
648648
"default": null,
649649
"takesValue": true,
650650
"negated": false
@@ -740,7 +740,7 @@
740740
{
741741
"rawName": "--memory-dir <relative-dir>",
742742
"name": "memoryDir",
743-
"description": "Relative fingerprint package directory for stack discovery (flag name retained; default: .ghost)",
743+
"description": "Relative fingerprint package directory for host wrappers and stack discovery (env: GHOST_MEMORY_DIR; default: .ghost)",
744744
"default": null,
745745
"takesValue": true,
746746
"negated": false
@@ -792,7 +792,7 @@
792792
{
793793
"rawName": "--memory-dir <relative-dir>",
794794
"name": "memoryDir",
795-
"description": "Relative fingerprint package directory for stack discovery (flag name retained; default: .ghost)",
795+
"description": "Relative fingerprint package directory for host wrappers and stack discovery (env: GHOST_MEMORY_DIR; default: .ghost)",
796796
"default": null,
797797
"takesValue": true,
798798
"negated": false

packages/ghost/src/drift-command.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ export function registerDriftCommand(cli: CAC): void {
205205
? `${JSON.stringify(report, null, 2)}\n`
206206
: formatDriftCheckMarkdown(report),
207207
);
208-
process.exit(gateExitCode(report.gate));
208+
process.exit(driftCheckExitCode(report));
209209
} catch (err) {
210210
console.error(
211211
`Error: ${err instanceof Error ? err.message : String(err)}`,
@@ -215,6 +215,13 @@ export function registerDriftCommand(cli: CAC): void {
215215
});
216216
}
217217

218+
function driftCheckExitCode(report: DriftCheckReport): number {
219+
if (report.designLoop.enabled && report.designLoop.mode === "advisory") {
220+
return 0;
221+
}
222+
return gateExitCode(report.gate);
223+
}
224+
218225
async function readSyncManifest(
219226
cwd: string,
220227
syncPathOption: string | undefined,
@@ -337,13 +344,7 @@ async function loadComparableFingerprintFrom(
337344
cwd: string,
338345
path: string,
339346
): Promise<Fingerprint> {
340-
const previousCwd = process.cwd();
341-
try {
342-
process.chdir(cwd);
343-
return await loadComparableFingerprint(path);
344-
} finally {
345-
process.chdir(previousCwd);
346-
}
347+
return loadComparableFingerprint(resolve(cwd, path));
347348
}
348349

349350
function parseMaxDivergenceDays(

packages/ghost/test/cli.test.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -822,6 +822,58 @@ sources: []
822822
expect(report.dimensions.spacing.verdict).toBe("uncovered");
823823
});
824824

825+
it("keeps advisory design-loop drift non-blocking", async () => {
826+
await mkdir(join(dir, ".ghost"), { recursive: true });
827+
await writeFile(
828+
join(dir, ".ghost", "config.yml"),
829+
`schema: ghost.config/v1
830+
targets: []
831+
libraries: []
832+
design_loop:
833+
enabled: true
834+
mode: advisory
835+
`,
836+
);
837+
await writeFile(
838+
join(dir, ".ghost", "fingerprint.md"),
839+
fingerprintWithId("local"),
840+
);
841+
await writeFile(
842+
join(dir, "tracked.fingerprint.md"),
843+
fingerprintWithId("tracked"),
844+
);
845+
await runCli(["track", "tracked.fingerprint.md"], dir);
846+
await writeFile(
847+
join(dir, ".ghost", "fingerprint.md"),
848+
fingerprintWithId("local").replace(
849+
"spacing: { scale: [4, 8, 16], baseUnit: 4, regularity: 1 }",
850+
"spacing: { scale: [2, 3, 5, 7, 11, 13], baseUnit: 2, regularity: 0.1 }",
851+
),
852+
);
853+
854+
const result = await runCli(
855+
[
856+
"drift",
857+
"check",
858+
"--tracked",
859+
"tracked.fingerprint.md",
860+
"--format",
861+
"json",
862+
],
863+
dir,
864+
);
865+
866+
expect(result.code).toBe(0);
867+
const report = JSON.parse(result.stdout);
868+
expect(report.designLoop).toEqual({
869+
enabled: true,
870+
mode: "advisory",
871+
source: "config",
872+
});
873+
expect(report.overall.verdict).toBe("uncovered");
874+
expect(report.dimensions.spacing.verdict).toBe("uncovered");
875+
});
876+
825877
it("initializes the default fingerprint package without cache", async () => {
826878
const init = await runCli(["init", "--format", "json"], dir);
827879
const scan = await runCli(["scan", "--format", "json"], dir);

0 commit comments

Comments
 (0)