@memnexus-ai/mx-agent-cli 0.1.209 → 0.1.211
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/__tests__/claude-sync.test.js +77 -5
- package/dist/__tests__/claude-sync.test.js.map +1 -1
- package/dist/__tests__/config-generation-gate.test.js +18 -9
- package/dist/__tests__/config-generation-gate.test.js.map +1 -1
- package/dist/__tests__/generate-claude.test.js +90 -6
- package/dist/__tests__/generate-claude.test.js.map +1 -1
- package/dist/__tests__/prior-sync-failure.test.d.ts +2 -0
- package/dist/__tests__/prior-sync-failure.test.d.ts.map +1 -0
- package/dist/__tests__/prior-sync-failure.test.js +81 -0
- package/dist/__tests__/prior-sync-failure.test.js.map +1 -0
- package/dist/__tests__/security-posture.test.d.ts +8 -0
- package/dist/__tests__/security-posture.test.d.ts.map +1 -0
- package/dist/__tests__/security-posture.test.js +82 -0
- package/dist/__tests__/security-posture.test.js.map +1 -0
- package/dist/__tests__/start-report-generation-capture.test.d.ts +17 -0
- package/dist/__tests__/start-report-generation-capture.test.d.ts.map +1 -0
- package/dist/__tests__/start-report-generation-capture.test.js +127 -0
- package/dist/__tests__/start-report-generation-capture.test.js.map +1 -0
- package/dist/__tests__/start-report-integration.test.js +4 -0
- package/dist/__tests__/start-report-integration.test.js.map +1 -1
- package/dist/agent-config/hooks/OR-TRUE-AUDIT.md +67 -0
- package/dist/agent-config/hooks/observability-sync.sh +32 -0
- package/dist/agent-config/settings.json +4 -4
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +2 -1
- package/dist/commands/start.js.map +1 -1
- package/dist/lib/claude.d.ts +10 -0
- package/dist/lib/claude.d.ts.map +1 -1
- package/dist/lib/claude.js +67 -6
- package/dist/lib/claude.js.map +1 -1
- package/dist/lib/security-posture.d.ts +69 -0
- package/dist/lib/security-posture.d.ts.map +1 -0
- package/dist/lib/security-posture.js +102 -0
- package/dist/lib/security-posture.js.map +1 -0
- package/package.json +1 -1
- package/scripts/generate-claude.mjs +45 -1
- package/dist/__tests__/config-mirror-integrity.test.d.ts +0 -32
- package/dist/__tests__/config-mirror-integrity.test.d.ts.map +0 -1
- package/dist/__tests__/config-mirror-integrity.test.js +0 -248
- package/dist/__tests__/config-mirror-integrity.test.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prior-sync-failure.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/prior-sync-failure.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
+
import { mkdirSync, rmSync, writeFileSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { tmpdir } from 'os';
|
|
5
|
+
// ── Mock os.homedir so checkPriorSyncFailure reads from a temp dir ──────────
|
|
6
|
+
vi.mock('os', async (importOriginal) => {
|
|
7
|
+
const original = await importOriginal();
|
|
8
|
+
return { ...original, homedir: vi.fn() };
|
|
9
|
+
});
|
|
10
|
+
import { homedir } from 'os';
|
|
11
|
+
import { checkPriorSyncFailure } from '../lib/claude.js';
|
|
12
|
+
import { startupReport } from '../lib/startup-report.js';
|
|
13
|
+
const mockHomedir = homedir;
|
|
14
|
+
let tmpRoot;
|
|
15
|
+
let fakeHome;
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
tmpRoot = join(tmpdir(), `mx-sync-fail-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
18
|
+
fakeHome = join(tmpRoot, 'home');
|
|
19
|
+
mkdirSync(fakeHome, { recursive: true });
|
|
20
|
+
mockHomedir.mockReturnValue(fakeHome);
|
|
21
|
+
startupReport._reset();
|
|
22
|
+
});
|
|
23
|
+
afterEach(() => {
|
|
24
|
+
rmSync(tmpRoot, { recursive: true, force: true });
|
|
25
|
+
});
|
|
26
|
+
describe('checkPriorSyncFailure', () => {
|
|
27
|
+
it('emits a dim warning when the JSONL contains an observability-sync failure', () => {
|
|
28
|
+
const worktreePath = '/workspace/.worktrees/test-team';
|
|
29
|
+
const logDir = join(fakeHome, '.mx-agent', 'logs', 'startup');
|
|
30
|
+
mkdirSync(logDir, { recursive: true });
|
|
31
|
+
const failureLine = '{"ts":"2026-07-22T01:00:00Z","level":"warn","source":"observability-sync","msg":"sync failed at session end","exit_code":1,"detail":"connection refused"}';
|
|
32
|
+
writeFileSync(join(logDir, 'test-team.jsonl'), failureLine + '\n');
|
|
33
|
+
checkPriorSyncFailure(worktreePath);
|
|
34
|
+
const entries = startupReport._entries();
|
|
35
|
+
const syncWarning = entries.find(e => e.message.includes('observability sync failed'));
|
|
36
|
+
expect(syncWarning).toBeDefined();
|
|
37
|
+
expect(syncWarning.level).toBe('dim');
|
|
38
|
+
expect(syncWarning.message).toContain('mx-agent sync');
|
|
39
|
+
});
|
|
40
|
+
it('emits no warning when the JSONL has no sync failure entries', () => {
|
|
41
|
+
const worktreePath = '/workspace/.worktrees/clean-team';
|
|
42
|
+
const logDir = join(fakeHome, '.mx-agent', 'logs', 'startup');
|
|
43
|
+
mkdirSync(logDir, { recursive: true });
|
|
44
|
+
const normalLine = '{"ts":"2026-07-22T01:00:00Z","level":"info","source":"startup","msg":"session started normally"}';
|
|
45
|
+
writeFileSync(join(logDir, 'clean-team.jsonl'), normalLine + '\n');
|
|
46
|
+
checkPriorSyncFailure(worktreePath);
|
|
47
|
+
const entries = startupReport._entries();
|
|
48
|
+
const syncWarning = entries.find(e => e.message.includes('observability sync failed'));
|
|
49
|
+
expect(syncWarning).toBeUndefined();
|
|
50
|
+
});
|
|
51
|
+
it('emits no warning when the JSONL file does not exist', () => {
|
|
52
|
+
const worktreePath = '/workspace/.worktrees/no-log-team';
|
|
53
|
+
checkPriorSyncFailure(worktreePath);
|
|
54
|
+
const entries = startupReport._entries();
|
|
55
|
+
expect(entries).toHaveLength(0);
|
|
56
|
+
});
|
|
57
|
+
it('only checks the last 10 lines of the file', () => {
|
|
58
|
+
const worktreePath = '/workspace/.worktrees/old-fail-team';
|
|
59
|
+
const logDir = join(fakeHome, '.mx-agent', 'logs', 'startup');
|
|
60
|
+
mkdirSync(logDir, { recursive: true });
|
|
61
|
+
// Put the sync failure at line 1, then 15 clean lines after it
|
|
62
|
+
const failureLine = '{"ts":"2026-07-20T01:00:00Z","level":"warn","source":"observability-sync","msg":"sync failed","exit_code":1,"detail":"old"}';
|
|
63
|
+
const cleanLine = '{"ts":"2026-07-22T01:00:00Z","level":"info","source":"startup","msg":"ok"}';
|
|
64
|
+
const lines = [failureLine, ...Array(15).fill(cleanLine)];
|
|
65
|
+
writeFileSync(join(logDir, 'old-fail-team.jsonl'), lines.join('\n') + '\n');
|
|
66
|
+
checkPriorSyncFailure(worktreePath);
|
|
67
|
+
// The failure is outside the last 10 lines, so no warning
|
|
68
|
+
const entries = startupReport._entries();
|
|
69
|
+
const syncWarning = entries.find(e => e.message.includes('observability sync failed'));
|
|
70
|
+
expect(syncWarning).toBeUndefined();
|
|
71
|
+
});
|
|
72
|
+
it('does not throw on malformed JSONL content', () => {
|
|
73
|
+
const worktreePath = '/workspace/.worktrees/bad-json-team';
|
|
74
|
+
const logDir = join(fakeHome, '.mx-agent', 'logs', 'startup');
|
|
75
|
+
mkdirSync(logDir, { recursive: true });
|
|
76
|
+
writeFileSync(join(logDir, 'bad-json-team.jsonl'), 'not valid json at all\n{broken\n');
|
|
77
|
+
// Should not throw
|
|
78
|
+
expect(() => checkPriorSyncFailure(worktreePath)).not.toThrow();
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
//# sourceMappingURL=prior-sync-failure.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prior-sync-failure.test.js","sourceRoot":"","sources":["../../src/__tests__/prior-sync-failure.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for the shared self-protection posture contract (security-posture.ts,
|
|
3
|
+
* #4304 Phase 4). This is the single source of truth reused by the CI generation
|
|
4
|
+
* gate and by syncClaudeConfig's no-config hard-stop, so it is worth direct
|
|
5
|
+
* coverage independent of either consumer.
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=security-posture.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-posture.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/security-posture.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for the shared self-protection posture contract (security-posture.ts,
|
|
3
|
+
* #4304 Phase 4). This is the single source of truth reused by the CI generation
|
|
4
|
+
* gate and by syncClaudeConfig's no-config hard-stop, so it is worth direct
|
|
5
|
+
* coverage independent of either consumer.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, expect } from 'vitest';
|
|
8
|
+
import { REQUIRED_SOURCE_DENIES, SELF_PROTECTED_PATHS, unmatchedFilePathDenies, pathIsWriteProtected, assessSettingsPosture, } from '../lib/security-posture.js';
|
|
9
|
+
describe('REQUIRED_SOURCE_DENIES', () => {
|
|
10
|
+
it('is the Edit-form of every SELF_PROTECTED_PATHS entry (settings, hooks, staging, prev)', () => {
|
|
11
|
+
expect(REQUIRED_SOURCE_DENIES).toEqual([
|
|
12
|
+
'Edit(.claude/settings.json)',
|
|
13
|
+
'Edit(.claude/hooks/**)',
|
|
14
|
+
'Edit(.claude.staging-*/**)',
|
|
15
|
+
'Edit(.claude.prev-*/**)',
|
|
16
|
+
]);
|
|
17
|
+
expect(REQUIRED_SOURCE_DENIES).toHaveLength(SELF_PROTECTED_PATHS.length);
|
|
18
|
+
});
|
|
19
|
+
it('contains no unmatched file-path form (Edit-only, canary syntax fix)', () => {
|
|
20
|
+
expect(unmatchedFilePathDenies(REQUIRED_SOURCE_DENIES)).toEqual([]);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
describe('unmatchedFilePathDenies', () => {
|
|
24
|
+
it('flags Write(path)/NotebookEdit(path)/Glob(path) but not Edit/Read/Bash or bare tool names', () => {
|
|
25
|
+
const deny = [
|
|
26
|
+
'Write(.claude/settings.json)', // flagged
|
|
27
|
+
'NotebookEdit(nb/**)', // flagged
|
|
28
|
+
'Glob(src/**)', // flagged
|
|
29
|
+
'Edit(.claude/hooks/**)', // ok
|
|
30
|
+
'Read(/secrets/**)', // ok
|
|
31
|
+
'Bash(rm -rf /)', // ok (not a file-path tool form)
|
|
32
|
+
'Write', // ok — bare tool name, matches everywhere, no warning
|
|
33
|
+
];
|
|
34
|
+
expect(unmatchedFilePathDenies(deny)).toEqual([
|
|
35
|
+
'Write(.claude/settings.json)',
|
|
36
|
+
'NotebookEdit(nb/**)',
|
|
37
|
+
'Glob(src/**)',
|
|
38
|
+
]);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
describe('pathIsWriteProtected', () => {
|
|
42
|
+
it('accepts either the Edit form or the legacy Write form', () => {
|
|
43
|
+
expect(pathIsWriteProtected(['Edit(.claude/settings.json)'], '.claude/settings.json')).toBe(true);
|
|
44
|
+
expect(pathIsWriteProtected(['Write(.claude/settings.json)'], '.claude/settings.json')).toBe(true);
|
|
45
|
+
expect(pathIsWriteProtected(['Edit(other)'], '.claude/settings.json')).toBe(false);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe('assessSettingsPosture', () => {
|
|
49
|
+
const ok = JSON.stringify({
|
|
50
|
+
permissions: { deny: ['Edit(.claude/settings.json)', 'Edit(.claude/hooks/**)'] },
|
|
51
|
+
});
|
|
52
|
+
it('returns null for a valid posture', () => {
|
|
53
|
+
expect(assessSettingsPosture(ok)).toBeNull();
|
|
54
|
+
});
|
|
55
|
+
it('accepts the legacy Write(...) form (lenient on form)', () => {
|
|
56
|
+
const legacy = JSON.stringify({
|
|
57
|
+
permissions: { deny: ['Write(.claude/settings.json)', 'Write(.claude/hooks/**)'] },
|
|
58
|
+
});
|
|
59
|
+
expect(assessSettingsPosture(legacy)).toBeNull();
|
|
60
|
+
});
|
|
61
|
+
it('rejects a zero-byte / non-JSON file', () => {
|
|
62
|
+
expect(assessSettingsPosture('')).toMatch(/not valid JSON/);
|
|
63
|
+
expect(assessSettingsPosture('{ not json')).toMatch(/not valid JSON/);
|
|
64
|
+
});
|
|
65
|
+
it('rejects an empty or missing permissions.deny', () => {
|
|
66
|
+
expect(assessSettingsPosture('{"permissions":{"deny":[]}}')).toMatch(/deny is missing or empty/);
|
|
67
|
+
expect(assessSettingsPosture('{"permissions":{"allow":["Bash"]}}')).toMatch(/deny is missing or empty/);
|
|
68
|
+
expect(assessSettingsPosture('{}')).toMatch(/deny is missing or empty/);
|
|
69
|
+
});
|
|
70
|
+
it('rejects a deny list missing a required self-protection path', () => {
|
|
71
|
+
const halfProtected = JSON.stringify({
|
|
72
|
+
permissions: { deny: ['Edit(.claude/settings.json)'] }, // hooks/** missing
|
|
73
|
+
});
|
|
74
|
+
expect(assessSettingsPosture(halfProtected)).toMatch(/\.claude\/hooks/);
|
|
75
|
+
});
|
|
76
|
+
it('never throws on garbage shapes', () => {
|
|
77
|
+
expect(() => assessSettingsPosture('null')).not.toThrow();
|
|
78
|
+
expect(() => assessSettingsPosture('[]')).not.toThrow();
|
|
79
|
+
expect(() => assessSettingsPosture('42')).not.toThrow();
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
//# sourceMappingURL=security-posture.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-posture.test.js","sourceRoot":"","sources":["../../src/__tests__/security-posture.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration test (#4304 Phase 4, KI item 3d): the startup-report (v2.58, #4350)
|
|
3
|
+
* captures the config-generation lines of the REAL start path.
|
|
4
|
+
*
|
|
5
|
+
* The v2.58 startup report tees/records everything the start path prints. This
|
|
6
|
+
* test drives the actual `syncClaudeConfig` — the same function `mx-agent start`
|
|
7
|
+
* calls at §5 — against a REAL git origin so the REAL generator subprocess
|
|
8
|
+
* (`node scripts/generate-claude.mjs --from-git origin/main`) materializes
|
|
9
|
+
* `.claude/` from source, then asserts the durable JSONL records the generation
|
|
10
|
+
* lines. No production code changed for this deliverable: the confirmation is that
|
|
11
|
+
* the existing capture already records these lines end-to-end.
|
|
12
|
+
*
|
|
13
|
+
* This is the committed equivalent of the built-binary smoke: temp HOME, temp
|
|
14
|
+
* worktree clone, real generator, real durable log.
|
|
15
|
+
*/
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=start-report-generation-capture.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-report-generation-capture.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/start-report-generation-capture.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration test (#4304 Phase 4, KI item 3d): the startup-report (v2.58, #4350)
|
|
3
|
+
* captures the config-generation lines of the REAL start path.
|
|
4
|
+
*
|
|
5
|
+
* The v2.58 startup report tees/records everything the start path prints. This
|
|
6
|
+
* test drives the actual `syncClaudeConfig` — the same function `mx-agent start`
|
|
7
|
+
* calls at §5 — against a REAL git origin so the REAL generator subprocess
|
|
8
|
+
* (`node scripts/generate-claude.mjs --from-git origin/main`) materializes
|
|
9
|
+
* `.claude/` from source, then asserts the durable JSONL records the generation
|
|
10
|
+
* lines. No production code changed for this deliverable: the confirmation is that
|
|
11
|
+
* the existing capture already records these lines end-to-end.
|
|
12
|
+
*
|
|
13
|
+
* This is the committed equivalent of the built-binary smoke: temp HOME, temp
|
|
14
|
+
* worktree clone, real generator, real durable log.
|
|
15
|
+
*/
|
|
16
|
+
import { describe, it, expect, beforeAll, afterAll, beforeEach } from 'vitest';
|
|
17
|
+
import { cpSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync, existsSync } from 'fs';
|
|
18
|
+
import { execFileSync } from 'child_process';
|
|
19
|
+
import { tmpdir } from 'os';
|
|
20
|
+
import { dirname, join } from 'path';
|
|
21
|
+
import { fileURLToPath } from 'url';
|
|
22
|
+
import { syncClaudeConfig } from '../lib/claude.js';
|
|
23
|
+
import { startupReport } from '../lib/startup-report.js';
|
|
24
|
+
const CONFIG_SOURCE = 'mx-agent-system/agent-config';
|
|
25
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
26
|
+
/** Locate the repo root that holds the real agent-config source. */
|
|
27
|
+
function findRepoRoot() {
|
|
28
|
+
let dir = HERE;
|
|
29
|
+
for (let i = 0; i < 20; i++) {
|
|
30
|
+
if (existsSync(join(dir, CONFIG_SOURCE, 'settings.json')))
|
|
31
|
+
return dir;
|
|
32
|
+
const parent = dirname(dir);
|
|
33
|
+
if (parent === dir)
|
|
34
|
+
break;
|
|
35
|
+
dir = parent;
|
|
36
|
+
}
|
|
37
|
+
throw new Error('could not locate repo root from ' + HERE);
|
|
38
|
+
}
|
|
39
|
+
const REPO_ROOT = findRepoRoot();
|
|
40
|
+
let tmp;
|
|
41
|
+
let originDir;
|
|
42
|
+
let wt;
|
|
43
|
+
let home;
|
|
44
|
+
const OLD_HOME = process.env.HOME;
|
|
45
|
+
function git(cwd, ...args) {
|
|
46
|
+
execFileSync('git', args, { cwd, stdio: 'pipe' });
|
|
47
|
+
}
|
|
48
|
+
beforeAll(() => {
|
|
49
|
+
tmp = mkdtempSync(join(tmpdir(), 'mx-gencap-'));
|
|
50
|
+
originDir = join(tmp, 'origin.git');
|
|
51
|
+
wt = join(tmp, 'wt');
|
|
52
|
+
// Bare origin.
|
|
53
|
+
mkdirSync(originDir, { recursive: true });
|
|
54
|
+
git(originDir, 'init', '--bare', '-q');
|
|
55
|
+
// Working clone with the REAL agent-config source committed at CONFIG_SOURCE, so
|
|
56
|
+
// the generator has a faithful, generatable tree to archive from origin/main.
|
|
57
|
+
mkdirSync(wt, { recursive: true });
|
|
58
|
+
git(wt, 'init', '-q');
|
|
59
|
+
git(wt, 'config', 'user.email', 'test@example.com');
|
|
60
|
+
git(wt, 'config', 'user.name', 'Test');
|
|
61
|
+
git(wt, 'config', 'commit.gpgsign', 'false');
|
|
62
|
+
const dstSrc = join(wt, CONFIG_SOURCE);
|
|
63
|
+
mkdirSync(dirname(dstSrc), { recursive: true });
|
|
64
|
+
cpSync(join(REPO_ROOT, CONFIG_SOURCE), dstSrc, { recursive: true });
|
|
65
|
+
git(wt, 'add', '-A');
|
|
66
|
+
git(wt, 'commit', '-q', '-m', 'seed agent-config');
|
|
67
|
+
git(wt, 'branch', '-M', 'main');
|
|
68
|
+
git(wt, 'remote', 'add', 'origin', originDir);
|
|
69
|
+
git(wt, 'push', '-q', '-u', 'origin', 'main');
|
|
70
|
+
});
|
|
71
|
+
afterAll(() => {
|
|
72
|
+
rmSync(tmp, { recursive: true, force: true });
|
|
73
|
+
if (OLD_HOME === undefined)
|
|
74
|
+
delete process.env.HOME;
|
|
75
|
+
else
|
|
76
|
+
process.env.HOME = OLD_HOME;
|
|
77
|
+
});
|
|
78
|
+
beforeEach(() => {
|
|
79
|
+
home = mkdtempSync(join(tmpdir(), 'mx-gencap-home-'));
|
|
80
|
+
process.env.HOME = home;
|
|
81
|
+
startupReport._reset();
|
|
82
|
+
});
|
|
83
|
+
describe('startup report captures config-generation lines (real generator, real origin)', () => {
|
|
84
|
+
it('generates .claude/ from source and records the generation lines in the durable JSONL', () => {
|
|
85
|
+
startupReport.setContext({ project: 'proj', team: 'genteam', worktree: 'genwt' });
|
|
86
|
+
startupReport.installConsoleCapture();
|
|
87
|
+
// The real start-path config step: fetch origin, then run the generator
|
|
88
|
+
// subprocess against origin/main. No mocks — this spawns node on the actual
|
|
89
|
+
// scripts/generate-claude.mjs.
|
|
90
|
+
syncClaudeConfig(wt, { baseBranch: 'main', configSource: CONFIG_SOURCE });
|
|
91
|
+
startupReport.finalize('ok');
|
|
92
|
+
// The generator actually materialized .claude/ from source.
|
|
93
|
+
expect(existsSync(join(wt, '.claude', 'settings.json')), '.claude/ was not generated').toBe(true);
|
|
94
|
+
// The durable JSONL captured the generation lines.
|
|
95
|
+
const file = join(home, '.mx-agent', 'logs', 'startup', 'genwt.jsonl');
|
|
96
|
+
const lines = readFileSync(file, 'utf-8').trim().split('\n');
|
|
97
|
+
expect(lines).toHaveLength(1);
|
|
98
|
+
const report = JSON.parse(lines[0]);
|
|
99
|
+
expect(report.outcome).toBe('ok');
|
|
100
|
+
const messages = report.entries.map((e) => e.message).join('\n');
|
|
101
|
+
// syncClaudeConfig's generation lines (the start path's config step).
|
|
102
|
+
expect(messages).toContain('Syncing agent config');
|
|
103
|
+
expect(messages).toContain('Agent config generated from');
|
|
104
|
+
});
|
|
105
|
+
it('records a generator FAILURE warning (incl. generator stderr) when a valid backstop exists', () => {
|
|
106
|
+
// Prove generator WARNINGS also reach the JSONL: force generation to fail by
|
|
107
|
+
// pointing at a missing branch, with a valid existing .claude/ backstop so the
|
|
108
|
+
// path warn-and-continues (no hard stop) and the warning — which carries the
|
|
109
|
+
// generator's stderr — is recorded.
|
|
110
|
+
const claudeDir = join(wt, '.claude');
|
|
111
|
+
mkdirSync(claudeDir, { recursive: true });
|
|
112
|
+
writeFileSync(join(claudeDir, 'settings.json'), JSON.stringify({
|
|
113
|
+
permissions: { deny: ['Edit(.claude/settings.json)', 'Edit(.claude/hooks/**)'] },
|
|
114
|
+
}) + '\n');
|
|
115
|
+
startupReport.setContext({ project: 'proj', team: 'genteam', worktree: 'genwt2' });
|
|
116
|
+
startupReport.installConsoleCapture();
|
|
117
|
+
// baseBranch that does not exist in origin → git fetch fails → warn-and-continue
|
|
118
|
+
// on the valid backstop (hard stop only fires without a usable backstop).
|
|
119
|
+
syncClaudeConfig(wt, { baseBranch: 'no-such-branch', configSource: CONFIG_SOURCE });
|
|
120
|
+
startupReport.finalize('ok');
|
|
121
|
+
const file = join(home, '.mx-agent', 'logs', 'startup', 'genwt2.jsonl');
|
|
122
|
+
const report = JSON.parse(readFileSync(file, 'utf-8').trim());
|
|
123
|
+
const warnings = report.entries.filter((e) => e.level === 'warning');
|
|
124
|
+
expect(warnings.length).toBeGreaterThan(0);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
//# sourceMappingURL=start-report-generation-capture.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-report-generation-capture.test.js","sourceRoot":"","sources":["../../src/__tests__/start-report-generation-capture.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,6 +29,7 @@ vi.mock('../lib/worktree.js', () => ({
|
|
|
29
29
|
vi.mock('../lib/claude.js', () => ({
|
|
30
30
|
syncClaudeConfig: vi.fn(),
|
|
31
31
|
deployBaseHooks: vi.fn(),
|
|
32
|
+
checkPriorSyncFailure: vi.fn(),
|
|
32
33
|
deployClaudeMd: vi.fn(),
|
|
33
34
|
writeClaudeLocal: vi.fn(),
|
|
34
35
|
launchClaudeSession: vi.fn(async () => { }),
|
|
@@ -118,6 +119,9 @@ describe('runStart → durable StartupReport', () => {
|
|
|
118
119
|
const messages = report.entries.map((e) => e.message).join('\n');
|
|
119
120
|
expect(messages).toContain('Starting Agent Team');
|
|
120
121
|
expect(messages).toContain('Team:');
|
|
122
|
+
// Wiring: checkPriorSyncFailure must be called during startup (QA v2.59 finding)
|
|
123
|
+
const { checkPriorSyncFailure } = await import('../lib/claude.js');
|
|
124
|
+
expect(checkPriorSyncFailure).toHaveBeenCalled();
|
|
121
125
|
});
|
|
122
126
|
});
|
|
123
127
|
//# sourceMappingURL=start-report-integration.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-report-integration.test.js","sourceRoot":"","sources":["../../src/__tests__/start-report-integration.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"start-report-integration.test.js","sourceRoot":"","sources":["../../src/__tests__/start-report-integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# `|| true` Risk Classification — agent-config/hooks/
|
|
2
|
+
|
|
3
|
+
Audit of every `|| true` pattern in hook scripts, classifying each by failure impact.
|
|
4
|
+
|
|
5
|
+
- **Class A (external/critical-state):** calls to external services (sync, coordination brief token fetch, etc.) where failure means lost data or invisible outage. THESE get failure signals.
|
|
6
|
+
- **Class B (cosmetic/cleanup):** terminal escape codes, temp file cleanup, state file writes, jq parsing guards. Silent failure is correct behavior.
|
|
7
|
+
|
|
8
|
+
## Occurrences
|
|
9
|
+
|
|
10
|
+
| File | Line(s) | Class | Pattern | Justification |
|
|
11
|
+
|------|---------|-------|---------|---------------|
|
|
12
|
+
| `auto-capture-session-end.sh` | 88, 176 | B | `echo ... > "$STATE_FILE" 2>/dev/null \|\| true` | State file write for line-count tracking; loss means next capture re-scans (harmless). |
|
|
13
|
+
| `auto-capture-session-end.sh` | 173 | B | `>/dev/null 2>&1 \|\| true` | mx-agent create-memory call; session-end capture is best-effort. |
|
|
14
|
+
| `auto-checkpoint.sh` | 99 | B | `>/dev/null 2>&1 \|\| true` | mx-agent checkpoint call; checkpoint is best-effort convenience. |
|
|
15
|
+
| `reload-checkpoint.sh` | 20 | B | `jq ... 2>/dev/null) \|\| true` | Parsing jq input for CWD; fallback to empty string is safe. |
|
|
16
|
+
| `named-memory-write-guard.sh` | 65 | B | `jq -r ... 2>/dev/null \|\| true` | Extracting command from JSON input; empty = no command to guard. |
|
|
17
|
+
| `named-memory-write-guard.sh` | 137 | B | `python3 -c ... 2>/dev/null \|\| true` | Parsing memory write command; failure = guard skips (fail-open by design). |
|
|
18
|
+
| `named-memory-write-guard.sh` | 161 | B | `>/dev/null 2>&1 \|\| true` | Advisory memory save on guard trigger; non-blocking. |
|
|
19
|
+
| `named-memory-write-guard.sh` | 181 | B | `mx memories get ... 2>/dev/null \|\| true` | Reading existing memory for size comparison; failure = skip size check. |
|
|
20
|
+
| `named-memory-write-guard.sh` | 185 | B | `jq ... 2>/dev/null \|\| true` | Parsing memory length from JSON; failure = skip size check. |
|
|
21
|
+
| `workflow-dispatch-guard.sh` | 71 | B | `gh workflow view ... 2>/dev/null \|\| true` | Resolving workflow path; failure = skip path-based filtering. |
|
|
22
|
+
| `workflow-dispatch-guard.sh` | 118, 122 | B | `yq/awk ... 2>/dev/null \|\| true` | Extracting trigger paths from YAML; failure = conservative allow. |
|
|
23
|
+
| `workflow-dispatch-guard.sh` | 133 | B | `git diff ... 2>/dev/null \|\| true` | Listing changed files; failure = conservative allow. |
|
|
24
|
+
| `memory-checkpoint-reminder.sh` | 20 | B | `exec 3>&2 \|\| true` | Redirecting stderr to fd 3; cosmetic logging setup. |
|
|
25
|
+
| `memory-checkpoint-reminder.sh` | 38, 63, 82, 87 | B | `echo ... > "$COUNTER_FILE" 2>/dev/null \|\| true` | Writing tool-call counter; loss resets counter (harmless). |
|
|
26
|
+
| `memory-checkpoint-reminder.sh` | 73 | B | `flock ... 2>/dev/null \|\| true` | Advisory file lock; failure = racy counter update (harmless). |
|
|
27
|
+
| `git-mutation-guard.sh` | 61 | B | `jq ... 2>/dev/null \|\| true` | Extracting command from JSON input; empty = no command to guard. |
|
|
28
|
+
| `iteration-log-check.sh` | 77 | B | `>/dev/null 2>&1 \|\| true` | Advisory memory save; non-blocking. |
|
|
29
|
+
| `iteration-log-check.sh` | 88 | B | `grep ... \|\| true` | Counting merge commands in transcript; 0 on failure is safe. |
|
|
30
|
+
| `iteration-log-check.sh` | 112, 115 | B | `git rev-parse / jq ... 2>/dev/null \|\| true` | Resolving project slug; empty = use default log name. |
|
|
31
|
+
| `iteration-log-check.sh` | 167 | B | `mx memories get ... 2>/dev/null \|\| true` | Reading iteration log; failure = skip log check (advisory). |
|
|
32
|
+
| `coordination-brief.sh` | 96 | B | `node ... 2>/dev/null \|\| true` | Extracting project slug from config; empty = skip roster lookup. |
|
|
33
|
+
| `coordination-brief.sh` | 131 | B | `node ... 2>/dev/null \|\| true` | Reading team roster; empty = skip multi-team drain. |
|
|
34
|
+
| `coordination-brief.sh` | 153 | B | `head ... 2>/dev/null \|\| true` | Reading cached token; empty = fetch fresh. |
|
|
35
|
+
| `coordination-brief.sh` | 164, 172 | **A** | `az keyvault ... 2>/dev/null \|\| true` | **Token fetch from Azure Key Vault.** Failure means no coordination token; brief will fail silently. Mitigated: the brief itself reports "no token" and the coordination-brief.sh logs to stderr. |
|
|
36
|
+
| `coordination-brief.sh` | 179 | B | `printf ... > "$CACHE" 2>/dev/null \|\| true` | Caching fetched token; loss = re-fetch next time. |
|
|
37
|
+
| `coordination-brief.sh` | 202 | B | `mktemp ... 2>/dev/null \|\| true` | Creating temp file for stderr capture; failure = no stderr capture. |
|
|
38
|
+
| `coordination-brief.sh` | 235 | B | `rm -f ... 2>/dev/null \|\| true` | Cleaning up temp file; standard cleanup. |
|
|
39
|
+
| `deploy-verification-reminder.sh` | 21 | B | `touch ... 2>/dev/null \|\| true` | Touching lock file; failure = cosmetic. |
|
|
40
|
+
| `deploy-verification-reminder.sh` | 64 | B | `>/dev/null 2>&1 \|\| true` | Advisory memory save; non-blocking. |
|
|
41
|
+
| `deploy-verification-reminder.sh` | 74 | B | `touch ... 2>/dev/null \|\| true` | Marking verify-sent; loss = duplicate reminder (harmless). |
|
|
42
|
+
| `deploy-verification-reminder.sh` | 77, 105, 127 | B | `rm -f ... 2>/dev/null \|\| true` | Cleanup of state files; standard cleanup. |
|
|
43
|
+
| `deploy-verification-reminder.sh` | 110 | B | `touch "$MERGE_SENT" 2>/dev/null \|\| true` | Marking merge-sent; loss = duplicate merge reminder (harmless). |
|
|
44
|
+
| `deploy-verification-reminder.sh` | 100 | B | `flock ... 2>/dev/null \|\| true` | Advisory file lock; failure = racy state update (harmless). |
|
|
45
|
+
| `deploy-verification-reminder.sh` | 103 | B | `printf ... > "$STATE_FILE" 2>/dev/null \|\| true` | Writing PR state; loss = missed reminder (acceptable). |
|
|
46
|
+
| `deploy-verification-reminder.sh` | 134 | B | `grep ... \|\| true` | Extracting stored PR number; empty on failure is safe. |
|
|
47
|
+
| `deploy-verification-reminder.sh` | 145 | B | `git rev-parse ... 2>/dev/null \|\| true` | Resolving worktree root; empty = skip CLI package check. |
|
|
48
|
+
| `deploy-verification-reminder.sh` | 148 | B | `jq ... 2>/dev/null \|\| true` | Reading CLI package name from config; empty = skip. |
|
|
49
|
+
| `deploy-verification-reminder.sh` | 177 | B | `touch ... 2>/dev/null \|\| true` | Marking remind-sent; loss = duplicate reminder (harmless). |
|
|
50
|
+
| `ci-validate-hook.sh` | 61 | B | `chmod 700 ... 2>/dev/null \|\| true` | Setting dir permissions; failure = slightly open perms (non-critical). |
|
|
51
|
+
| `ci-validate-hook.sh` | 101 | B | `\|\| true` at end of npm test pipeline | Allowing validation to continue after individual test failure. |
|
|
52
|
+
| `ci-validate-hook.sh` | 117 | B | `>> "$FLAKE_LOG" 2>/dev/null \|\| true` | Logging flaky test; loss = missed flake record. |
|
|
53
|
+
| `ci-validate-hook.sh` | 155 | B | `fuser ... \|\| true` | Checking lock holder; failure = skip holder info. |
|
|
54
|
+
| `ci-validate-hook.sh` | 293 | B | `comm ... \|\| true` | Computing flake set; failure = conservative reporting. |
|
|
55
|
+
| `ci-validate-hook.sh` | 329, 330 | B | `cat/jq ... 2>/dev/null \|\| true` | Self-test mode input parsing; failure = skip self-test. |
|
|
56
|
+
| `ci-validate-hook.sh` | 420 | B | `\|\| true` at end of validation pipeline | Ensuring hook always exits 0 (fail-open). |
|
|
57
|
+
| `set-terminal-appearance.sh` | 24 | B | `cat > /dev/null 2>&1 \|\| true` | Draining stdin; cosmetic. |
|
|
58
|
+
| `set-terminal-appearance.sh` | 27, 31 | B | `printf ... > /dev/tty 2>/dev/null \|\| true` | Setting terminal title/color; cosmetic. |
|
|
59
|
+
| `worktree-guard.sh` | 118 | B | `tr ... \|\| true` | Stripping quotes from parsed path; empty on failure is safe. |
|
|
60
|
+
| `auto-capture-precompact.sh` | 174 | B | `>/dev/null 2>&1 \|\| true` | mx-agent create-memory call; pre-compact capture is best-effort. |
|
|
61
|
+
|
|
62
|
+
## Summary
|
|
63
|
+
|
|
64
|
+
- **Class A occurrences: 2** (coordination-brief.sh lines 164, 172 — Azure Key Vault token fetch). These already have downstream visibility: the brief command itself reports "no token" to stderr when the fetch fails.
|
|
65
|
+
- **Class B occurrences: all others.** Silent failure is the correct behavior for cosmetic, cleanup, advisory, and parsing-guard patterns.
|
|
66
|
+
|
|
67
|
+
The observability-sync `|| true` that previously lived inline in `settings.json` (line 99) was **Class A** and has been replaced by `observability-sync.sh`, which logs failures to the startup JSONL before exiting 0 (v2.59, #4377).
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# observability-sync.sh — Stop hook wrapper for mx-agent sync
|
|
3
|
+
# Logs sync failures to the local startup JSONL so they are visible at next session start.
|
|
4
|
+
# FAIL-OPEN: always exits 0 regardless of sync outcome.
|
|
5
|
+
|
|
6
|
+
set -euo pipefail
|
|
7
|
+
|
|
8
|
+
WORKTREE_PATH="${CLAUDE_PROJECT_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || echo '')}"
|
|
9
|
+
[ -z "$WORKTREE_PATH" ] && exit 0
|
|
10
|
+
|
|
11
|
+
API_URL="https://api.dev.memnexus.ai/internal/observability"
|
|
12
|
+
LOG_DIR="$HOME/.mx-agent/logs/startup"
|
|
13
|
+
WORKTREE_NAME="$(basename "$WORKTREE_PATH")"
|
|
14
|
+
LOG_FILE="$LOG_DIR/${WORKTREE_NAME}.jsonl"
|
|
15
|
+
|
|
16
|
+
# Run the sync, capture exit code
|
|
17
|
+
SYNC_OUTPUT=""
|
|
18
|
+
SYNC_EXIT=0
|
|
19
|
+
SYNC_OUTPUT=$(mx-agent sync --api-url "$API_URL" --quiet 2>&1) || SYNC_EXIT=$?
|
|
20
|
+
|
|
21
|
+
if [ "$SYNC_EXIT" -ne 0 ]; then
|
|
22
|
+
# Log failure to the local startup JSONL (v2.58 infrastructure)
|
|
23
|
+
mkdir -p "$LOG_DIR" 2>/dev/null || true
|
|
24
|
+
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ" 2>/dev/null || echo "unknown")
|
|
25
|
+
# Sanitize output: strip control characters, escape JSON metacharacters, truncate
|
|
26
|
+
SAFE_OUTPUT=$(printf '%s' "$SYNC_OUTPUT" | tr -cd '[:print:]\n' | sed 's/\\/\\\\/g; s/"/\\"/g; s/\t/\\t/g' | head -c 500)
|
|
27
|
+
printf '{"ts":"%s","level":"warn","source":"observability-sync","msg":"sync failed at session end","exit_code":%d,"detail":"%s"}\n' \
|
|
28
|
+
"$TIMESTAMP" "$SYNC_EXIT" "$SAFE_OUTPUT" >> "$LOG_FILE" 2>/dev/null || true
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
# Always exit 0 — fail-open contract
|
|
32
|
+
exit 0
|
|
@@ -96,7 +96,7 @@
|
|
|
96
96
|
"hooks": [
|
|
97
97
|
{
|
|
98
98
|
"type": "command",
|
|
99
|
-
"command": "
|
|
99
|
+
"command": "bash -c 'H=\"${CLAUDE_PROJECT_DIR:-$(git rev-parse --show-toplevel 2>/dev/null)}/.claude/hooks/observability-sync.sh\"; [ -f \"$H\" ] && exec bash \"$H\" || exit 0'"
|
|
100
100
|
},
|
|
101
101
|
{
|
|
102
102
|
"type": "command",
|
|
@@ -177,10 +177,10 @@
|
|
|
177
177
|
"Bash(git push --force origin main *)",
|
|
178
178
|
"Bash(git push -f origin main)",
|
|
179
179
|
"Bash(git push -f origin main *)",
|
|
180
|
-
"Write(.claude/settings.json)",
|
|
181
180
|
"Edit(.claude/settings.json)",
|
|
182
|
-
"
|
|
183
|
-
"Edit(.claude
|
|
181
|
+
"Edit(.claude/hooks/**)",
|
|
182
|
+
"Edit(.claude.staging-*/**)",
|
|
183
|
+
"Edit(.claude.prev-*/**)"
|
|
184
184
|
],
|
|
185
185
|
"ask": [
|
|
186
186
|
"Bash(sudo *)",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA2BH;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,8BAA8B,UAG1C,CAAC;AACF,eAAO,MAAM,2BAA2B,aAEtC,CAAC;AAEH;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAK3D;AA4BD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAgFjG;AA4FD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAsC5E;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,6FAA6F;IAC7F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kGAAkG;IAClG,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAID,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA2BH;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,8BAA8B,UAG1C,CAAC;AACF,eAAO,MAAM,2BAA2B,aAEtC,CAAC;AAEH;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAK3D;AA4BD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAgFjG;AA4FD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAsC5E;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,6FAA6F;IAC7F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kGAAkG;IAClG,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAID,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA2nBnE"}
|
package/dist/commands/start.js
CHANGED
|
@@ -10,7 +10,7 @@ import { createRequire } from 'module';
|
|
|
10
10
|
import { dirname, join } from 'path';
|
|
11
11
|
import { fileURLToPath } from 'url';
|
|
12
12
|
import { findProjectRoot, findWorktreePath, getSlot, getCurrentBranch, } from '../lib/worktree.js';
|
|
13
|
-
import { syncClaudeConfig, deployBaseHooks, deployClaudeMd, writeClaudeLocal, launchClaudeSession, logSuccess, logDim, logWarning } from '../lib/claude.js';
|
|
13
|
+
import { syncClaudeConfig, deployBaseHooks, deployClaudeMd, writeClaudeLocal, launchClaudeSession, checkPriorSyncFailure, logSuccess, logDim, logWarning } from '../lib/claude.js';
|
|
14
14
|
import { launchAgentSession } from '../lib/agent-session.js';
|
|
15
15
|
import { getTeam } from '../lib/catalog.js';
|
|
16
16
|
import { loadProjectConfig, resolveProjectConfig } from '../lib/project-config.js';
|
|
@@ -754,6 +754,7 @@ export async function runStart(options) {
|
|
|
754
754
|
// ── 5. Sync Claude config from origin/<baseBranch> ────────────────
|
|
755
755
|
syncClaudeConfig(worktreePath, cfg);
|
|
756
756
|
deployBaseHooks(worktreePath);
|
|
757
|
+
checkPriorSyncFailure(worktreePath);
|
|
757
758
|
// ── 5a. Auto-configure coordination marker + token cache ──────────
|
|
758
759
|
// When the project is configured for queue-mode coordination, write the
|
|
759
760
|
// .mx-coordination-team marker and attempt to cache the token so that
|