@mmnto/cli 1.6.3 → 1.7.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.
- package/dist/commands/describe.d.ts +4 -0
- package/dist/commands/describe.d.ts.map +1 -0
- package/dist/commands/describe.js +37 -0
- package/dist/commands/describe.js.map +1 -0
- package/dist/commands/describe.test.d.ts +2 -0
- package/dist/commands/describe.test.d.ts.map +1 -0
- package/dist/commands/describe.test.js +146 -0
- package/dist/commands/describe.test.js.map +1 -0
- package/dist/commands/handoff.d.ts +37 -0
- package/dist/commands/handoff.d.ts.map +1 -1
- package/dist/commands/handoff.js +177 -0
- package/dist/commands/handoff.js.map +1 -1
- package/dist/commands/handoff.test.js +262 -2
- package/dist/commands/handoff.test.js.map +1 -1
- package/dist/commands/install-hooks.d.ts +9 -8
- package/dist/commands/install-hooks.d.ts.map +1 -1
- package/dist/commands/install-hooks.js +21 -7
- package/dist/commands/install-hooks.js.map +1 -1
- package/dist/commands/install-hooks.test.js +31 -0
- package/dist/commands/install-hooks.test.js.map +1 -1
- package/dist/commands/rule.d.ts.map +1 -1
- package/dist/commands/rule.js +28 -0
- package/dist/commands/rule.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +17 -0
- package/dist/commands/status.js.map +1 -1
- package/dist/help.d.ts +13 -0
- package/dist/help.d.ts.map +1 -0
- package/dist/help.js +93 -0
- package/dist/help.js.map +1 -0
- package/dist/help.test.d.ts +2 -0
- package/dist/help.test.d.ts.map +1 -0
- package/dist/help.test.js +95 -0
- package/dist/help.test.js.map +1 -0
- package/dist/hooks/__tests__/auto-context.test.d.ts +2 -0
- package/dist/hooks/__tests__/auto-context.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/auto-context.test.js +155 -0
- package/dist/hooks/__tests__/auto-context.test.js.map +1 -0
- package/dist/hooks/auto-context.d.ts +26 -0
- package/dist/hooks/auto-context.d.ts.map +1 -0
- package/dist/hooks/auto-context.js +164 -0
- package/dist/hooks/auto-context.js.map +1 -0
- package/dist/index.js +44 -9
- package/dist/index.js.map +1 -1
- package/dist/json-output.d.ts +21 -0
- package/dist/json-output.d.ts.map +1 -0
- package/dist/json-output.js +9 -0
- package/dist/json-output.js.map +1 -0
- package/dist/json-output.test.d.ts +2 -0
- package/dist/json-output.test.d.ts.map +1 -0
- package/dist/json-output.test.js +46 -0
- package/dist/json-output.test.js.map +1 -0
- package/dist/parse-nits.d.ts.map +1 -1
- package/dist/parse-nits.js +14 -2
- package/dist/parse-nits.js.map +1 -1
- package/dist/parse-nits.test.js +25 -0
- package/dist/parse-nits.test.js.map +1 -1
- package/dist/schemas/handoff-checkpoint.d.ts +34 -0
- package/dist/schemas/handoff-checkpoint.d.ts.map +1 -0
- package/dist/schemas/handoff-checkpoint.js +13 -0
- package/dist/schemas/handoff-checkpoint.js.map +1 -0
- package/dist/schemas/handoff-checkpoint.test.d.ts +2 -0
- package/dist/schemas/handoff-checkpoint.test.d.ts.map +1 -0
- package/dist/schemas/handoff-checkpoint.test.js +65 -0
- package/dist/schemas/handoff-checkpoint.test.js.map +1 -0
- package/dist/utils.d.ts +2 -5
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +3 -6
- package/dist/utils.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe.d.ts","sourceRoot":"","sources":["../../src/commands/describe.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,sDAUtD;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CA4BrD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export async function getProjectDescription(cwd) {
|
|
2
|
+
const path = await import('node:path');
|
|
3
|
+
const { describeProject } = await import('@mmnto/totem');
|
|
4
|
+
const { loadConfig, resolveConfigPath } = await import('../utils.js');
|
|
5
|
+
const configPath = resolveConfigPath(cwd);
|
|
6
|
+
const configRoot = path.dirname(configPath);
|
|
7
|
+
const config = await loadConfig(configPath);
|
|
8
|
+
return describeProject(config, configRoot);
|
|
9
|
+
}
|
|
10
|
+
export async function describeCommand() {
|
|
11
|
+
const { log } = await import('../ui.js');
|
|
12
|
+
const { isJsonMode, printJson } = await import('../json-output.js');
|
|
13
|
+
const cwd = process.cwd();
|
|
14
|
+
const result = await getProjectDescription(cwd);
|
|
15
|
+
if (isJsonMode()) {
|
|
16
|
+
printJson({ status: 'success', command: 'describe', data: result });
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
log.info('[Describe]', `Project: ${result.project}`);
|
|
20
|
+
if (result.description)
|
|
21
|
+
log.info('[Describe]', `Description: ${result.description}`);
|
|
22
|
+
log.info('[Describe]', `Tier: ${result.tier}`);
|
|
23
|
+
log.info('[Describe]', `Rules: ${result.rules} compiled`);
|
|
24
|
+
log.info('[Describe]', `Lessons: ${result.lessons}`);
|
|
25
|
+
log.info('[Describe]', `Targets: ${result.targets.length}`);
|
|
26
|
+
for (const t of result.targets) {
|
|
27
|
+
log.info('[Describe]', ` ${t}`);
|
|
28
|
+
}
|
|
29
|
+
const partitionNames = Object.keys(result.partitions);
|
|
30
|
+
if (partitionNames.length > 0) {
|
|
31
|
+
log.info('[Describe]', `Partitions: ${partitionNames.join(', ')}`);
|
|
32
|
+
}
|
|
33
|
+
if (result.hooks.length > 0) {
|
|
34
|
+
log.info('[Describe]', `Hooks: ${result.hooks.join(', ')}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=describe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe.js","sourceRoot":"","sources":["../../src/commands/describe.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAW;IACrD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IACvC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;IACzD,MAAM,EAAE,UAAU,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IAEtE,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;IAE5C,OAAO,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAEpE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAEhD,IAAI,UAAU,EAAE,EAAE,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACpE,OAAO;IACT,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACrD,IAAI,MAAM,CAAC,WAAW;QAAE,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,gBAAgB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IACrF,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/C,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,MAAM,CAAC,KAAK,WAAW,CAAC,CAAC;IAC1D,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACrD,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5D,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAC/B,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;IACD,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACtD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,eAAe,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe.test.d.ts","sourceRoot":"","sources":["../../src/commands/describe.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as os from 'node:os';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import { describe, expect, it } from 'vitest';
|
|
5
|
+
import { getProjectDescription } from './describe.js';
|
|
6
|
+
function makeTmpDir() {
|
|
7
|
+
return fs.mkdtempSync(path.join(os.tmpdir(), 'totem-describe-'));
|
|
8
|
+
}
|
|
9
|
+
function cleanTmpDir(dir) {
|
|
10
|
+
fs.rmSync(dir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 });
|
|
11
|
+
}
|
|
12
|
+
/** Scaffold a minimal totem project in a temp dir. */
|
|
13
|
+
function scaffoldProject(dir, opts = {}) {
|
|
14
|
+
// totem.config.ts
|
|
15
|
+
const partitions = opts.partitions ? JSON.stringify(opts.partitions) : undefined;
|
|
16
|
+
const configLines = [
|
|
17
|
+
'export default {',
|
|
18
|
+
' targets: [{ glob: "**/*.ts", type: "code", strategy: "typescript-ast" }],',
|
|
19
|
+
' embedding: { provider: "gemini" },',
|
|
20
|
+
partitions ? ` partitions: ${partitions},` : '',
|
|
21
|
+
'};',
|
|
22
|
+
];
|
|
23
|
+
fs.writeFileSync(path.join(dir, 'totem.config.ts'), configLines.join('\n'));
|
|
24
|
+
// package.json
|
|
25
|
+
fs.writeFileSync(path.join(dir, 'package.json'), JSON.stringify({ name: 'test-project', description: 'A test project' }));
|
|
26
|
+
// .totem/lessons
|
|
27
|
+
const lessonsDir = path.join(dir, '.totem', 'lessons');
|
|
28
|
+
fs.mkdirSync(lessonsDir, { recursive: true });
|
|
29
|
+
for (let i = 0; i < (opts.lessons ?? 0); i++) {
|
|
30
|
+
fs.writeFileSync(path.join(lessonsDir, `lesson-${i}.md`), `# Lesson ${i}`);
|
|
31
|
+
}
|
|
32
|
+
// .totem/compiled-rules.json
|
|
33
|
+
const rulesCount = opts.rules ?? 0;
|
|
34
|
+
if (rulesCount > 0) {
|
|
35
|
+
const rules = Array.from({ length: rulesCount }, (_, i) => ({ id: `rule-${i}` }));
|
|
36
|
+
fs.writeFileSync(path.join(dir, '.totem', 'compiled-rules.json'), JSON.stringify(rules));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
describe('getProjectDescription', () => {
|
|
40
|
+
it('returns project name and description from package.json', async () => {
|
|
41
|
+
const dir = makeTmpDir();
|
|
42
|
+
try {
|
|
43
|
+
scaffoldProject(dir);
|
|
44
|
+
const result = await getProjectDescription(dir);
|
|
45
|
+
expect(result.project).toBe('test-project');
|
|
46
|
+
expect(result.description).toBe('A test project');
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
cleanTmpDir(dir);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
it('returns correct tier based on config', async () => {
|
|
53
|
+
const dir = makeTmpDir();
|
|
54
|
+
try {
|
|
55
|
+
scaffoldProject(dir);
|
|
56
|
+
const result = await getProjectDescription(dir);
|
|
57
|
+
expect(result.tier).toBe('standard'); // has embedding, no orchestrator
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
cleanTmpDir(dir);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
it('counts lessons from .totem/lessons directory', async () => {
|
|
64
|
+
const dir = makeTmpDir();
|
|
65
|
+
try {
|
|
66
|
+
scaffoldProject(dir, { lessons: 5 });
|
|
67
|
+
const result = await getProjectDescription(dir);
|
|
68
|
+
expect(result.lessons).toBe(5);
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
cleanTmpDir(dir);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
it('counts rules from compiled-rules.json', async () => {
|
|
75
|
+
const dir = makeTmpDir();
|
|
76
|
+
try {
|
|
77
|
+
scaffoldProject(dir, { rules: 10 });
|
|
78
|
+
const result = await getProjectDescription(dir);
|
|
79
|
+
expect(result.rules).toBe(10);
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
cleanTmpDir(dir);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
it('returns zero counts when .totem directories are missing', async () => {
|
|
86
|
+
const dir = makeTmpDir();
|
|
87
|
+
try {
|
|
88
|
+
// Minimal config, no .totem dir at all
|
|
89
|
+
fs.writeFileSync(path.join(dir, 'totem.config.ts'), 'export default { targets: [{ glob: "**/*.md", type: "spec", strategy: "markdown-heading" }] };');
|
|
90
|
+
const result = await getProjectDescription(dir);
|
|
91
|
+
expect(result.rules).toBe(0);
|
|
92
|
+
expect(result.lessons).toBe(0);
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
cleanTmpDir(dir);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
it('includes partitions from config', async () => {
|
|
99
|
+
const dir = makeTmpDir();
|
|
100
|
+
try {
|
|
101
|
+
scaffoldProject(dir, { partitions: { core: ['packages/core/'], cli: ['packages/cli/'] } });
|
|
102
|
+
const result = await getProjectDescription(dir);
|
|
103
|
+
expect(result.partitions).toEqual({ core: ['packages/core/'], cli: ['packages/cli/'] });
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
cleanTmpDir(dir);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
it('returns empty partitions when none configured', async () => {
|
|
110
|
+
const dir = makeTmpDir();
|
|
111
|
+
try {
|
|
112
|
+
scaffoldProject(dir);
|
|
113
|
+
const result = await getProjectDescription(dir);
|
|
114
|
+
expect(result.partitions).toEqual({});
|
|
115
|
+
}
|
|
116
|
+
finally {
|
|
117
|
+
cleanTmpDir(dir);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
it('includes targets from config', async () => {
|
|
121
|
+
const dir = makeTmpDir();
|
|
122
|
+
try {
|
|
123
|
+
scaffoldProject(dir);
|
|
124
|
+
const result = await getProjectDescription(dir);
|
|
125
|
+
expect(result.targets).toHaveLength(1);
|
|
126
|
+
expect(result.targets[0]).toContain('**/*.ts');
|
|
127
|
+
expect(result.targets[0]).toContain('code');
|
|
128
|
+
}
|
|
129
|
+
finally {
|
|
130
|
+
cleanTmpDir(dir);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
it('falls back to directory name when no package.json', async () => {
|
|
134
|
+
const dir = makeTmpDir();
|
|
135
|
+
try {
|
|
136
|
+
fs.writeFileSync(path.join(dir, 'totem.config.ts'), 'export default { targets: [{ glob: "**/*.md", type: "spec", strategy: "markdown-heading" }] };');
|
|
137
|
+
const result = await getProjectDescription(dir);
|
|
138
|
+
expect(result.project).toBe(path.basename(dir));
|
|
139
|
+
expect(result.description).toBeUndefined();
|
|
140
|
+
}
|
|
141
|
+
finally {
|
|
142
|
+
cleanTmpDir(dir);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
//# sourceMappingURL=describe.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe.test.js","sourceRoot":"","sources":["../../src/commands/describe.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { HandoffCheckpoint } from '../schemas/handoff-checkpoint.js';
|
|
1
2
|
export declare function readRecentLessons(cwd: string, totemDir: string): string;
|
|
2
3
|
export interface HandoffOptions {
|
|
3
4
|
raw?: boolean;
|
|
@@ -6,6 +7,42 @@ export interface HandoffOptions {
|
|
|
6
7
|
fresh?: boolean;
|
|
7
8
|
lite?: boolean;
|
|
8
9
|
}
|
|
10
|
+
export interface DeterministicCheckpoint {
|
|
11
|
+
checkpoint_version: 1;
|
|
12
|
+
timestamp: string;
|
|
13
|
+
branch: string;
|
|
14
|
+
active_files: string[];
|
|
15
|
+
open_prs: number[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Gathers deterministic (zero-LLM) state for the handoff checkpoint.
|
|
19
|
+
* ADR-039: Git Metadata Primacy — these fields come from git, never the LLM.
|
|
20
|
+
*/
|
|
21
|
+
export declare function gatherDeterministicState(cwd: string): Promise<DeterministicCheckpoint>;
|
|
22
|
+
export interface SemanticFields {
|
|
23
|
+
completed: string[];
|
|
24
|
+
remaining: string[];
|
|
25
|
+
pending_decisions: string[];
|
|
26
|
+
context_hints: string[];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Extract semantic fields from Markdown output by parsing section headings
|
|
30
|
+
* and collecting bullet points / non-empty lines under each.
|
|
31
|
+
*
|
|
32
|
+
* Returns empty arrays for any sections not found or when input is malformed.
|
|
33
|
+
*/
|
|
34
|
+
export declare function parseSemanticFields(markdown: string): SemanticFields;
|
|
35
|
+
/**
|
|
36
|
+
* Write a JSON checkpoint file atomically: write to a .tmp file then rename.
|
|
37
|
+
* Creates parent directories if needed.
|
|
38
|
+
*/
|
|
39
|
+
export declare function writeCheckpoint(jsonPath: string, checkpoint: HandoffCheckpoint): void;
|
|
40
|
+
/**
|
|
41
|
+
* Determine the JSON checkpoint path given the --out option.
|
|
42
|
+
* - If --out is specified: companion file with .json extension
|
|
43
|
+
* - If --out is not specified: <cwd>/<totemDir>/handoff.json
|
|
44
|
+
*/
|
|
45
|
+
export declare function resolveCheckpointPath(cwd: string, totemDir: string, outPath?: string): string;
|
|
9
46
|
export declare function buildLiteHandoff(branch: string, status: string, diffStat: string, recentCommits: string, lessons: string): string;
|
|
10
47
|
export declare function handoffCommand(options: HandoffOptions): Promise<void>;
|
|
11
48
|
//# sourceMappingURL=handoff.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handoff.d.ts","sourceRoot":"","sources":["../../src/commands/handoff.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"handoff.d.ts","sourceRoot":"","sources":["../../src/commands/handoff.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAiD1E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAYvE;AAiDD,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAID,MAAM,WAAW,uBAAuB;IACtC,kBAAkB,EAAE,CAAC,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AA4BD;;;GAGG;AACH,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAwB5F;AAgBD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CA6CpE;AAID;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,GAAG,IAAI,CASrF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAa7F;AAMD,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,GACd,MAAM,CAgDR;AAID,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAyF3E"}
|
package/dist/commands/handoff.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
1
2
|
import * as path from 'node:path';
|
|
2
3
|
import { readAllLessons } from '@mmnto/totem'; // totem-ignore
|
|
4
|
+
import { HandoffCheckpointSchema } from '../schemas/handoff-checkpoint.js';
|
|
3
5
|
import { sanitize, wrapXml } from '../utils.js';
|
|
4
6
|
// ─── Constants ──────────────────────────────────────────
|
|
5
7
|
const TAG = 'Handoff';
|
|
@@ -82,6 +84,152 @@ function assemblePrompt(branch, status, diff, diffStat, lessons, systemPrompt) {
|
|
|
82
84
|
sections.push(lessons || '(no lessons recorded)');
|
|
83
85
|
return sections.join('\n');
|
|
84
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* Parse file paths from `git status --porcelain` output.
|
|
89
|
+
* Handles standard two-char status codes: " M", "M ", "MM", "A ", "??", "D ", etc.
|
|
90
|
+
* Also handles renames ("R old -> new") by extracting the new path.
|
|
91
|
+
*/
|
|
92
|
+
function parseStatusFiles(statusOutput) {
|
|
93
|
+
if (!statusOutput.trim())
|
|
94
|
+
return [];
|
|
95
|
+
const files = [];
|
|
96
|
+
for (const line of statusOutput.split(/\r?\n/)) {
|
|
97
|
+
if (!line.trim())
|
|
98
|
+
continue;
|
|
99
|
+
// Porcelain format: XY <path> or XY <old> -> <new> for renames (R/C status)
|
|
100
|
+
const statusCode = line.slice(0, 2);
|
|
101
|
+
let filePart = line.slice(3); // skip 2-char status + space
|
|
102
|
+
if ((statusCode.includes('R') || statusCode.includes('C')) && filePart.includes(' -> ')) {
|
|
103
|
+
filePart = filePart.slice(filePart.indexOf(' -> ') + 4);
|
|
104
|
+
}
|
|
105
|
+
// Strip C-style quotes that git adds for paths with spaces/special chars
|
|
106
|
+
if (filePart.startsWith('"') && filePart.endsWith('"')) {
|
|
107
|
+
filePart = filePart.slice(1, -1);
|
|
108
|
+
}
|
|
109
|
+
files.push(filePart);
|
|
110
|
+
}
|
|
111
|
+
return files;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Gathers deterministic (zero-LLM) state for the handoff checkpoint.
|
|
115
|
+
* ADR-039: Git Metadata Primacy — these fields come from git, never the LLM.
|
|
116
|
+
*/
|
|
117
|
+
export async function gatherDeterministicState(cwd) {
|
|
118
|
+
const { getGitBranch, getGitStatus } = await import('../git.js');
|
|
119
|
+
// 1. Get branch — handle detached HEAD gracefully
|
|
120
|
+
let branch;
|
|
121
|
+
try {
|
|
122
|
+
const raw = getGitBranch(cwd);
|
|
123
|
+
branch = raw && raw !== '(unknown)' ? raw : 'HEAD';
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
branch = 'HEAD';
|
|
127
|
+
}
|
|
128
|
+
// 2. Get active files from git status --porcelain (covers staged, unstaged, and untracked)
|
|
129
|
+
const statusOutput = getGitStatus(cwd);
|
|
130
|
+
const active_files = parseStatusFiles(statusOutput).sort();
|
|
131
|
+
// 3. Return checkpoint with timestamp and empty open_prs (PR detection is future work)
|
|
132
|
+
return {
|
|
133
|
+
checkpoint_version: 1,
|
|
134
|
+
timestamp: new Date().toISOString(),
|
|
135
|
+
branch,
|
|
136
|
+
active_files,
|
|
137
|
+
open_prs: [],
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
// ─── Semantic field extraction (Task 3) ─────────────────
|
|
141
|
+
/**
|
|
142
|
+
* Known Markdown section headings and the semantic field they map to.
|
|
143
|
+
* Headings are matched case-insensitively.
|
|
144
|
+
*/
|
|
145
|
+
const SECTION_MAP = {
|
|
146
|
+
'what was done': 'completed',
|
|
147
|
+
'next steps': 'remaining',
|
|
148
|
+
'lessons & traps': 'context_hints',
|
|
149
|
+
lessons: 'context_hints',
|
|
150
|
+
'uncommitted changes': 'pending_decisions',
|
|
151
|
+
};
|
|
152
|
+
/**
|
|
153
|
+
* Extract semantic fields from Markdown output by parsing section headings
|
|
154
|
+
* and collecting bullet points / non-empty lines under each.
|
|
155
|
+
*
|
|
156
|
+
* Returns empty arrays for any sections not found or when input is malformed.
|
|
157
|
+
*/
|
|
158
|
+
export function parseSemanticFields(markdown) {
|
|
159
|
+
const result = {
|
|
160
|
+
completed: [],
|
|
161
|
+
remaining: [],
|
|
162
|
+
pending_decisions: [],
|
|
163
|
+
context_hints: [],
|
|
164
|
+
};
|
|
165
|
+
if (!markdown || !markdown.trim())
|
|
166
|
+
return result;
|
|
167
|
+
const lines = markdown.split(/\r?\n/);
|
|
168
|
+
let currentField = null;
|
|
169
|
+
let inCodeBlock = false;
|
|
170
|
+
for (const line of lines) {
|
|
171
|
+
const trimmed = line.trim();
|
|
172
|
+
// Track fenced code blocks (``` or ~~~)
|
|
173
|
+
if (trimmed.startsWith('```') || trimmed.startsWith('~~~')) {
|
|
174
|
+
inCodeBlock = !inCodeBlock;
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
if (inCodeBlock)
|
|
178
|
+
continue;
|
|
179
|
+
// Detect heading (### or ##)
|
|
180
|
+
const headingMatch = line.match(/^#{2,3}\s+(.+)$/);
|
|
181
|
+
if (headingMatch) {
|
|
182
|
+
const heading = headingMatch[1].trim().toLowerCase();
|
|
183
|
+
currentField = SECTION_MAP[heading] ?? null;
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
// Collect content lines under recognized sections
|
|
187
|
+
if (currentField) {
|
|
188
|
+
if (!trimmed)
|
|
189
|
+
continue;
|
|
190
|
+
const bulletMatch = trimmed.match(/^[-*]\s+(.+)$/) ?? trimmed.match(/^\d+\.\s+(.+)$/);
|
|
191
|
+
if (bulletMatch) {
|
|
192
|
+
result[currentField].push(bulletMatch[1].trim());
|
|
193
|
+
}
|
|
194
|
+
else if (!/^#{1,6}\s/.test(trimmed)) {
|
|
195
|
+
result[currentField].push(trimmed);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return result;
|
|
200
|
+
}
|
|
201
|
+
// ─── Atomic checkpoint writer (Task 4) ──────────────────
|
|
202
|
+
/**
|
|
203
|
+
* Write a JSON checkpoint file atomically: write to a .tmp file then rename.
|
|
204
|
+
* Creates parent directories if needed.
|
|
205
|
+
*/
|
|
206
|
+
export function writeCheckpoint(jsonPath, checkpoint) {
|
|
207
|
+
const dir = path.dirname(jsonPath);
|
|
208
|
+
if (!fs.existsSync(dir)) {
|
|
209
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
210
|
+
}
|
|
211
|
+
const tmpPath = jsonPath + '.tmp';
|
|
212
|
+
fs.writeFileSync(tmpPath, JSON.stringify(checkpoint, null, 2) + '\n', 'utf-8');
|
|
213
|
+
fs.renameSync(tmpPath, jsonPath);
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Determine the JSON checkpoint path given the --out option.
|
|
217
|
+
* - If --out is specified: companion file with .json extension
|
|
218
|
+
* - If --out is not specified: <cwd>/<totemDir>/handoff.json
|
|
219
|
+
*/
|
|
220
|
+
export function resolveCheckpointPath(cwd, totemDir, outPath) {
|
|
221
|
+
if (outPath) {
|
|
222
|
+
const ext = path.extname(outPath);
|
|
223
|
+
if (ext === '.json') {
|
|
224
|
+
return outPath.slice(0, -ext.length) + '.checkpoint.json';
|
|
225
|
+
}
|
|
226
|
+
if (ext) {
|
|
227
|
+
return outPath.slice(0, -ext.length) + '.json';
|
|
228
|
+
}
|
|
229
|
+
return outPath + '.json';
|
|
230
|
+
}
|
|
231
|
+
return path.join(cwd, totemDir, 'handoff.json');
|
|
232
|
+
}
|
|
85
233
|
// ─── Lite handoff (zero LLM) ────────────────────────────
|
|
86
234
|
const RECENT_COMMITS_COUNT = 10;
|
|
87
235
|
export function buildLiteHandoff(branch, status, diffStat, recentCommits, lessons) {
|
|
@@ -160,11 +308,24 @@ export async function handoffCommand(options) {
|
|
|
160
308
|
log.info(TAG, `Lessons: ${lessons ? `${lessons.split('\n').length} lines` : 'none found'}`);
|
|
161
309
|
// Lite mode — deterministic, zero LLM
|
|
162
310
|
if (options.lite) {
|
|
311
|
+
// Snapshot git state BEFORE writing any files to avoid self-contamination
|
|
312
|
+
const deterministicState = await gatherDeterministicState(cwd);
|
|
163
313
|
const recentCommits = getGitLogSince(cwd, undefined, RECENT_COMMITS_COUNT);
|
|
164
314
|
const output = buildLiteHandoff(branch, status, diffStat, recentCommits, lessons);
|
|
165
315
|
writeOutput(output, options.out);
|
|
166
316
|
if (options.out)
|
|
167
317
|
log.success(TAG, `Written to ${options.out}`);
|
|
318
|
+
// Write checkpoint JSON with empty semantic fields (lite = no LLM)
|
|
319
|
+
try {
|
|
320
|
+
const checkpoint = HandoffCheckpointSchema.parse(deterministicState);
|
|
321
|
+
const jsonPath = resolveCheckpointPath(cwd, config.totemDir, options.out);
|
|
322
|
+
writeCheckpoint(jsonPath, checkpoint);
|
|
323
|
+
log.dim(TAG, `Checkpoint: ${jsonPath}`);
|
|
324
|
+
}
|
|
325
|
+
catch (err) {
|
|
326
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
327
|
+
log.warn(TAG, `Checkpoint write failed (skipped): ${msg}`);
|
|
328
|
+
}
|
|
168
329
|
log.dim(TAG, 'Lite handoff complete (zero LLM).');
|
|
169
330
|
return;
|
|
170
331
|
}
|
|
@@ -173,11 +334,27 @@ export async function handoffCommand(options) {
|
|
|
173
334
|
// Assemble prompt
|
|
174
335
|
const prompt = assemblePrompt(branch, status, diff, diffStat, lessons, systemPrompt);
|
|
175
336
|
log.dim(TAG, `Prompt: ${(prompt.length / 1024).toFixed(0)}KB`);
|
|
337
|
+
// Snapshot git state BEFORE writing any files to avoid self-contamination
|
|
338
|
+
const deterministicState = await gatherDeterministicState(cwd);
|
|
176
339
|
const content = await runOrchestrator({ prompt, tag: TAG, options, config, cwd });
|
|
177
340
|
if (content != null) {
|
|
178
341
|
writeOutput(content, options.out);
|
|
179
342
|
if (options.out)
|
|
180
343
|
log.success(TAG, `Written to ${options.out}`);
|
|
344
|
+
// Build structured checkpoint: deterministic state + semantic fields from LLM output
|
|
345
|
+
const semanticFields = parseSemanticFields(content);
|
|
346
|
+
const merged = { ...deterministicState, ...semanticFields };
|
|
347
|
+
try {
|
|
348
|
+
const checkpoint = HandoffCheckpointSchema.parse(merged);
|
|
349
|
+
const jsonPath = resolveCheckpointPath(cwd, config.totemDir, options.out);
|
|
350
|
+
writeCheckpoint(jsonPath, checkpoint);
|
|
351
|
+
log.dim(TAG, `Checkpoint: ${jsonPath}`);
|
|
352
|
+
}
|
|
353
|
+
catch (err) {
|
|
354
|
+
// Checkpoint is best-effort — never block the handoff on validation failure
|
|
355
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
356
|
+
log.warn(TAG, `Checkpoint validation failed (skipped): ${msg}`);
|
|
357
|
+
}
|
|
181
358
|
}
|
|
182
359
|
}
|
|
183
360
|
//# sourceMappingURL=handoff.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/commands/handoff.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/commands/handoff.ts"],"names":[],"mappings":"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"}
|