@orbitpanel/cli 1.6.1 → 1.8.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/note/add.js +10 -9
- package/dist/commands/note/add.js.map +1 -1
- package/dist/commands/report/send.js +6 -7
- package/dist/commands/report/send.js.map +1 -1
- package/dist/commands/session/end.js +21 -24
- package/dist/commands/session/end.js.map +1 -1
- package/dist/commands/session/start.js +22 -25
- package/dist/commands/session/start.js.map +1 -1
- package/dist/commands/status.js +6 -2
- package/dist/commands/status.js.map +1 -1
- package/dist/lib/command-router.d.ts +11 -2
- package/dist/lib/command-router.js +61 -3
- package/dist/lib/command-router.js.map +1 -1
- package/dist/lib/context-guard.d.ts +11 -2
- package/dist/lib/context-guard.js +11 -2
- package/dist/lib/context-guard.js.map +1 -1
- package/dist/lib/git.d.ts +1 -0
- package/dist/lib/git.js +1 -1
- package/dist/lib/git.js.map +1 -1
- package/dist/lib/info-engine.d.ts +23 -6
- package/dist/lib/info-engine.js +53 -8
- package/dist/lib/info-engine.js.map +1 -1
- package/dist/lib/report-builder.d.ts +23 -1
- package/dist/lib/report-builder.js +134 -7
- package/dist/lib/report-builder.js.map +1 -1
- package/dist/lib/session-engine.d.ts +65 -0
- package/dist/lib/session-engine.js +143 -0
- package/dist/lib/session-engine.js.map +1 -0
- package/dist/lib/session-summary-format.d.ts +35 -0
- package/dist/lib/session-summary-format.js +95 -0
- package/dist/lib/session-summary-format.js.map +1 -0
- package/dist/lib/session.d.ts +1 -0
- package/dist/lib/session.js +1 -1
- package/dist/lib/session.js.map +1 -1
- package/dist/lib/shell-commands.d.ts +3 -0
- package/dist/lib/shell-commands.js +160 -41
- package/dist/lib/shell-commands.js.map +1 -1
- package/dist/lib/shell-render.js +3 -0
- package/dist/lib/shell-render.js.map +1 -1
- package/dist/mcp/server.d.ts +13 -1
- package/dist/mcp/server.js +44 -27
- package/dist/mcp/server.js.map +1 -1
- package/dist/types.d.ts +24 -1
- package/oclif.manifest.json +1 -1
- package/package.json +7 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-guard.js","sourceRoot":"","sources":["../../src/lib/context-guard.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"context-guard.js","sourceRoot":"","sources":["../../src/lib/context-guard.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/git.d.ts
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
export interface GitRunner {
|
|
7
7
|
exec(args: string[]): Promise<string>;
|
|
8
8
|
}
|
|
9
|
+
export declare const defaultRunner: GitRunner;
|
|
9
10
|
/** Get current git branch name. Returns null if not in a git repo. */
|
|
10
11
|
export declare function getGitBranch(runner?: GitRunner): Promise<string | null>;
|
|
11
12
|
/** Get current HEAD commit hash (short). Returns null on error. */
|
package/dist/lib/git.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { execFile } from 'node:child_process';
|
|
6
6
|
import { promisify } from 'node:util';
|
|
7
7
|
const execFileAsync = promisify(execFile);
|
|
8
|
-
const defaultRunner = {
|
|
8
|
+
export const defaultRunner = {
|
|
9
9
|
exec: async (args) => {
|
|
10
10
|
const { stdout } = await execFileAsync('git', args, { timeout: 5000 });
|
|
11
11
|
return stdout;
|
package/dist/lib/git.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/lib/git.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAO1C,MAAM,aAAa,GAAc;
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/lib/git.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAO1C,MAAM,CAAC,MAAM,aAAa,GAAc;IACtC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACnB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC;AAEF,sEAAsE;AACtE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,SAAoB,aAAa;IAClE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;QACxE,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,mEAAmE;AACnE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,SAAoB,aAAa;IACtE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;QACnE,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAQD,gEAAgE;AAChE,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,UAAkB,EAClB,QAAgB,EAChB,SAAoB,aAAa;IAEjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC;QACnF,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAE1B,yCAAyC;QACzC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACpD,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzD,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;IACvC,CAAC;AACH,CAAC"}
|
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* SOURCE OF TRUTH — User guidance layer
|
|
3
3
|
*
|
|
4
4
|
* Computes the "what should I do now?" logic:
|
|
5
|
-
* -
|
|
6
|
-
* -
|
|
7
|
-
* -
|
|
8
|
-
* -
|
|
5
|
+
* - setup level (unconfigured → configured)
|
|
6
|
+
* - onboarding steps for first-time users
|
|
7
|
+
* - next step recommendation
|
|
8
|
+
* - workflow checklist with visual status
|
|
9
|
+
* - contextual suggestions (max 2, with reasons)
|
|
10
|
+
* - welcome message
|
|
9
11
|
*
|
|
10
|
-
* PRINCIPLE: Every output answers "cosa fare adesso e
|
|
12
|
+
* PRINCIPLE: Every output answers "cosa fare adesso e perché"
|
|
13
|
+
*
|
|
14
|
+
* NON mettere qui:
|
|
15
|
+
* - logica di esecuzione comandi → command-router.ts
|
|
16
|
+
* - policy di sicurezza / guard → context-guard.ts
|
|
17
|
+
* - hint per comandi sconosciuti → shell-hints.ts
|
|
11
18
|
*/
|
|
12
19
|
import type { ContextHealthLevel } from '../types.js';
|
|
13
20
|
export interface InfoState {
|
|
@@ -18,6 +25,16 @@ export interface InfoState {
|
|
|
18
25
|
projectName: string | null;
|
|
19
26
|
environment: string | null;
|
|
20
27
|
healthLevel: ContextHealthLevel;
|
|
28
|
+
/** Number of open tasks in the active session (0 if no session or no tasks) */
|
|
29
|
+
tasksOpen?: number;
|
|
30
|
+
/** True when the active session has been running for a long time (>2h) */
|
|
31
|
+
sessionLong?: boolean;
|
|
32
|
+
/** Number of completed tasks in the active session */
|
|
33
|
+
tasksDone?: number;
|
|
34
|
+
/** Total number of entries (notes + tasks + decisions + warnings) in the session */
|
|
35
|
+
notesTotal?: number;
|
|
36
|
+
/** Number of agent-originated notes (MCP + AI) in the session */
|
|
37
|
+
notesAgent?: number;
|
|
21
38
|
}
|
|
22
39
|
export interface NextStep {
|
|
23
40
|
cmd: string;
|
package/dist/lib/info-engine.js
CHANGED
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* SOURCE OF TRUTH — User guidance layer
|
|
3
3
|
*
|
|
4
4
|
* Computes the "what should I do now?" logic:
|
|
5
|
-
* -
|
|
6
|
-
* -
|
|
7
|
-
* -
|
|
8
|
-
* -
|
|
5
|
+
* - setup level (unconfigured → configured)
|
|
6
|
+
* - onboarding steps for first-time users
|
|
7
|
+
* - next step recommendation
|
|
8
|
+
* - workflow checklist with visual status
|
|
9
|
+
* - contextual suggestions (max 2, with reasons)
|
|
10
|
+
* - welcome message
|
|
9
11
|
*
|
|
10
|
-
* PRINCIPLE: Every output answers "cosa fare adesso e
|
|
12
|
+
* PRINCIPLE: Every output answers "cosa fare adesso e perché"
|
|
13
|
+
*
|
|
14
|
+
* NON mettere qui:
|
|
15
|
+
* - logica di esecuzione comandi → command-router.ts
|
|
16
|
+
* - policy di sicurezza / guard → context-guard.ts
|
|
17
|
+
* - hint per comandi sconosciuti → shell-hints.ts
|
|
11
18
|
*/
|
|
12
19
|
// ─── Setup Level ──────────────────────────────────────────────────
|
|
13
20
|
/**
|
|
@@ -92,10 +99,48 @@ export function getNextStep(state) {
|
|
|
92
99
|
reason: 'Avvia una sessione per tracciare il lavoro su questo progetto',
|
|
93
100
|
};
|
|
94
101
|
}
|
|
95
|
-
// Session active —
|
|
102
|
+
// Session active — task-aware suggestions
|
|
103
|
+
const openTasks = state.tasksOpen ?? 0;
|
|
104
|
+
if (openTasks > 0 && state.sessionLong) {
|
|
105
|
+
return {
|
|
106
|
+
cmd: '/session info',
|
|
107
|
+
reason: 'Sessione lunga con task pendenti — verifica lo stato con /session info',
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
if (openTasks > 0) {
|
|
111
|
+
return {
|
|
112
|
+
cmd: '/session info',
|
|
113
|
+
reason: `Hai ${openTasks} task aperti — rivedili con /session info`,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
// All tasks completed — suggest wrapping up
|
|
117
|
+
const doneTasks = state.tasksDone ?? 0;
|
|
118
|
+
if (doneTasks > 0 && openTasks === 0) {
|
|
119
|
+
return {
|
|
120
|
+
cmd: '/report',
|
|
121
|
+
reason: 'Hai chiuso i task aperti — valuta di concludere con /report',
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
// Few notes — suggest annotating before continuing
|
|
125
|
+
const totalNotes = state.notesTotal ?? 0;
|
|
126
|
+
if (totalNotes < 2) {
|
|
127
|
+
return {
|
|
128
|
+
cmd: '/note <cosa stai facendo>',
|
|
129
|
+
reason: 'Aggiungi un aggiornamento prima di continuare',
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
// MCP/AI activity present — suggest human review
|
|
133
|
+
const agentNotes = state.notesAgent ?? 0;
|
|
134
|
+
if (agentNotes > 0) {
|
|
135
|
+
return {
|
|
136
|
+
cmd: '/session info',
|
|
137
|
+
reason: 'Attività automatiche presenti — verifica con /session info',
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
// Session active, enough notes, no special conditions
|
|
96
141
|
return {
|
|
97
142
|
cmd: '/note <cosa stai facendo>',
|
|
98
|
-
reason: 'Annota il lavoro in corso, oppure
|
|
143
|
+
reason: 'Annota il lavoro in corso, oppure chiudi con /session end quando hai finito',
|
|
99
144
|
};
|
|
100
145
|
}
|
|
101
146
|
// ─── Workflow Checklist ───────────────────────────────────────────
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"info-engine.js","sourceRoot":"","sources":["../../src/lib/info-engine.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"info-engine.js","sourceRoot":"","sources":["../../src/lib/info-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Report builder for @orbitpanel/cli.
|
|
3
3
|
* Assembles intervention payload from session data + git info.
|
|
4
|
+
*
|
|
5
|
+
* v2: reads source/kind from SessionNote for structured reports.
|
|
4
6
|
*/
|
|
5
|
-
import type { SessionState } from '../types.js';
|
|
7
|
+
import type { SessionState, SessionNote } from '../types.js';
|
|
6
8
|
export interface ReportOptions {
|
|
7
9
|
session: SessionState;
|
|
8
10
|
title?: string;
|
|
@@ -13,5 +15,25 @@ export interface ReportOptions {
|
|
|
13
15
|
files_changed?: number;
|
|
14
16
|
environment?: string;
|
|
15
17
|
}
|
|
18
|
+
/** Grouped notes by source and kind */
|
|
19
|
+
export interface GroupedNotes {
|
|
20
|
+
/** Notes from source='user' or legacy (no source) */
|
|
21
|
+
userNotes: SessionNote[];
|
|
22
|
+
/** Notes from source='mcp' or 'ai' */
|
|
23
|
+
agentNotes: SessionNote[];
|
|
24
|
+
/** Notes from source='system' */
|
|
25
|
+
systemNotes: SessionNote[];
|
|
26
|
+
/** Tasks grouped by status */
|
|
27
|
+
tasks: {
|
|
28
|
+
open: SessionNote[];
|
|
29
|
+
done: SessionNote[];
|
|
30
|
+
};
|
|
31
|
+
/** Decision entries */
|
|
32
|
+
decisions: SessionNote[];
|
|
33
|
+
/** Warning entries */
|
|
34
|
+
warnings: SessionNote[];
|
|
35
|
+
}
|
|
36
|
+
/** Group notes by source and kind. Exported for testability. */
|
|
37
|
+
export declare function groupNotes(notes: SessionNote[]): GroupedNotes;
|
|
16
38
|
/** Build a complete intervention payload ready for POST /api/v1/maintenance/ */
|
|
17
39
|
export declare function buildReportPayload(opts: ReportOptions): Record<string, unknown>;
|
|
@@ -1,21 +1,78 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Report builder for @orbitpanel/cli.
|
|
3
3
|
* Assembles intervention payload from session data + git info.
|
|
4
|
+
*
|
|
5
|
+
* v2: reads source/kind from SessionNote for structured reports.
|
|
4
6
|
*/
|
|
7
|
+
/** Group notes by source and kind. Exported for testability. */
|
|
8
|
+
export function groupNotes(notes) {
|
|
9
|
+
const result = {
|
|
10
|
+
userNotes: [],
|
|
11
|
+
agentNotes: [],
|
|
12
|
+
systemNotes: [],
|
|
13
|
+
tasks: { open: [], done: [] },
|
|
14
|
+
decisions: [],
|
|
15
|
+
warnings: [],
|
|
16
|
+
};
|
|
17
|
+
for (const note of notes) {
|
|
18
|
+
const source = note.source ?? 'user';
|
|
19
|
+
const kind = note.kind ?? 'note';
|
|
20
|
+
// Group by kind (cross-source)
|
|
21
|
+
if (kind === 'task') {
|
|
22
|
+
if (note.taskStatus === 'done') {
|
|
23
|
+
result.tasks.done.push(note);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
result.tasks.open.push(note);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
else if (kind === 'decision') {
|
|
30
|
+
result.decisions.push(note);
|
|
31
|
+
}
|
|
32
|
+
else if (kind === 'warning') {
|
|
33
|
+
result.warnings.push(note);
|
|
34
|
+
}
|
|
35
|
+
// Group by source (only generic notes — tasks/decisions/warnings already categorised)
|
|
36
|
+
if (kind === 'note') {
|
|
37
|
+
if (source === 'mcp' || source === 'ai') {
|
|
38
|
+
result.agentNotes.push(note);
|
|
39
|
+
}
|
|
40
|
+
else if (source === 'system') {
|
|
41
|
+
result.systemNotes.push(note);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
result.userNotes.push(note);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
/** Map note source to actions_taken tool_used value */
|
|
51
|
+
function mapToolUsed(source) {
|
|
52
|
+
switch (source) {
|
|
53
|
+
case 'mcp': return 'mcp-agent';
|
|
54
|
+
case 'ai': return 'ai-agent';
|
|
55
|
+
case 'system': return 'system-auto';
|
|
56
|
+
default: return 'manual';
|
|
57
|
+
}
|
|
58
|
+
}
|
|
5
59
|
/** Build a complete intervention payload ready for POST /api/v1/maintenance/ */
|
|
6
60
|
export function buildReportPayload(opts) {
|
|
7
61
|
const { session } = opts;
|
|
8
62
|
// Auto-generate title from session if not provided
|
|
9
63
|
const title = opts.title ?? generateTitle(session);
|
|
10
|
-
|
|
64
|
+
const grouped = groupNotes(session.notes);
|
|
65
|
+
// Convert notes to actions_taken format (v2: source → tool_used)
|
|
11
66
|
const actions_taken = session.notes.map(note => ({
|
|
12
67
|
action: note.text,
|
|
13
|
-
tool_used:
|
|
68
|
+
tool_used: mapToolUsed(note.source),
|
|
14
69
|
result: 'success',
|
|
15
70
|
timestamp: note.timestamp,
|
|
16
71
|
}));
|
|
17
72
|
// Auto-generate description from notes if not provided
|
|
18
|
-
const description = opts.description ?? generateDescription(session);
|
|
73
|
+
const description = opts.description ?? generateDescription(session, grouped);
|
|
74
|
+
// Build notes_summary (additive, optional field)
|
|
75
|
+
const notes_summary = buildNotesSummary(session.notes, grouped);
|
|
19
76
|
// Build report_data matching backend schema v1.0
|
|
20
77
|
const report_data = {
|
|
21
78
|
findings: [],
|
|
@@ -30,6 +87,7 @@ export function buildReportPayload(opts) {
|
|
|
30
87
|
git_commit_end: opts.git_commit_end,
|
|
31
88
|
files_changed: opts.files_changed ?? 0,
|
|
32
89
|
environment: opts.environment ?? 'local-dev',
|
|
90
|
+
notes_summary,
|
|
33
91
|
},
|
|
34
92
|
};
|
|
35
93
|
return {
|
|
@@ -50,7 +108,8 @@ function generateTitle(session) {
|
|
|
50
108
|
}
|
|
51
109
|
return parts.join(' ');
|
|
52
110
|
}
|
|
53
|
-
|
|
111
|
+
/** v2: structured description with sections based on source/kind */
|
|
112
|
+
function generateDescription(session, grouped) {
|
|
54
113
|
const lines = [];
|
|
55
114
|
lines.push('## Sessione locale');
|
|
56
115
|
lines.push('');
|
|
@@ -60,14 +119,82 @@ function generateDescription(session) {
|
|
|
60
119
|
if (session.git_commit_start) {
|
|
61
120
|
lines.push(`- Commit inizio: ${session.git_commit_start}`);
|
|
62
121
|
}
|
|
63
|
-
|
|
122
|
+
// Section: Attività svolte (user notes, kind='note')
|
|
123
|
+
if (grouped.userNotes.length > 0) {
|
|
64
124
|
lines.push('');
|
|
65
|
-
lines.push('##
|
|
125
|
+
lines.push('## Attività svolte');
|
|
66
126
|
lines.push('');
|
|
67
|
-
for (const note of
|
|
127
|
+
for (const note of grouped.userNotes) {
|
|
68
128
|
lines.push(`- ${note.text}`);
|
|
69
129
|
}
|
|
70
130
|
}
|
|
131
|
+
// Section: Task (open + done)
|
|
132
|
+
const hasTasks = grouped.tasks.done.length > 0 || grouped.tasks.open.length > 0;
|
|
133
|
+
if (hasTasks) {
|
|
134
|
+
lines.push('');
|
|
135
|
+
lines.push('## Task');
|
|
136
|
+
lines.push('');
|
|
137
|
+
for (const t of grouped.tasks.done) {
|
|
138
|
+
lines.push(`- [x] ${t.text}`);
|
|
139
|
+
}
|
|
140
|
+
for (const t of grouped.tasks.open) {
|
|
141
|
+
lines.push(`- [ ] ${t.text}`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Section: Decisioni
|
|
145
|
+
if (grouped.decisions.length > 0) {
|
|
146
|
+
lines.push('');
|
|
147
|
+
lines.push('## Decisioni');
|
|
148
|
+
lines.push('');
|
|
149
|
+
for (const d of grouped.decisions) {
|
|
150
|
+
lines.push(`- ${d.text}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Section: Note automatiche (agent = mcp + ai)
|
|
154
|
+
if (grouped.agentNotes.length > 0) {
|
|
155
|
+
lines.push('');
|
|
156
|
+
lines.push('## Note automatiche');
|
|
157
|
+
lines.push('');
|
|
158
|
+
for (const n of grouped.agentNotes) {
|
|
159
|
+
lines.push(`- ${n.text}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// Section: Avvisi (warnings + system notes)
|
|
163
|
+
const warningsAndSystem = [...grouped.warnings, ...grouped.systemNotes];
|
|
164
|
+
if (warningsAndSystem.length > 0) {
|
|
165
|
+
lines.push('');
|
|
166
|
+
lines.push('## Avvisi');
|
|
167
|
+
lines.push('');
|
|
168
|
+
for (const w of warningsAndSystem) {
|
|
169
|
+
lines.push(`- ${w.text}`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
71
172
|
return lines.join('\n');
|
|
72
173
|
}
|
|
174
|
+
/** Build additive notes_summary for report_data.session */
|
|
175
|
+
function buildNotesSummary(notes, grouped) {
|
|
176
|
+
let userCount = 0;
|
|
177
|
+
let agentCount = 0;
|
|
178
|
+
let systemCount = 0;
|
|
179
|
+
for (const note of notes) {
|
|
180
|
+
const source = note.source ?? 'user';
|
|
181
|
+
if (source === 'mcp' || source === 'ai') {
|
|
182
|
+
agentCount++;
|
|
183
|
+
}
|
|
184
|
+
else if (source === 'system') {
|
|
185
|
+
systemCount++;
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
userCount++;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return {
|
|
192
|
+
total: notes.length,
|
|
193
|
+
by_source: { user: userCount, agent: agentCount, system: systemCount },
|
|
194
|
+
tasks_open: grouped.tasks.open.length,
|
|
195
|
+
tasks_done: grouped.tasks.done.length,
|
|
196
|
+
decisions: grouped.decisions.length,
|
|
197
|
+
warnings: grouped.warnings.length,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
73
200
|
//# sourceMappingURL=report-builder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report-builder.js","sourceRoot":"","sources":["../../src/lib/report-builder.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"report-builder.js","sourceRoot":"","sources":["../../src/lib/report-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SOURCE OF TRUTH — Session lifecycle orchestration
|
|
3
|
+
*
|
|
4
|
+
* Cuore operativo locale della CLI. Gestisce:
|
|
5
|
+
* - avvio e chiusura sessioni (con cattura git automatica)
|
|
6
|
+
* - aggiunta entry (note, task, decisioni, warning) con source/kind
|
|
7
|
+
* - summary e metriche sessione
|
|
8
|
+
* - storico sessioni completate
|
|
9
|
+
*
|
|
10
|
+
* Usato da:
|
|
11
|
+
* - comandi CLI (shell-commands.ts)
|
|
12
|
+
* - MCP tools (mcp/server.ts)
|
|
13
|
+
*
|
|
14
|
+
* NON dipende da:
|
|
15
|
+
* - UI (chalk, ink, react, shell-render)
|
|
16
|
+
* - backend API (client.ts)
|
|
17
|
+
* - comandi specifici (shell-commands.ts)
|
|
18
|
+
*/
|
|
19
|
+
import type { SessionState, SessionNote, SessionSummary, NoteSource, NoteKind } from '../types.js';
|
|
20
|
+
import { type SessionIO } from './session.js';
|
|
21
|
+
import { type GitRunner } from './git.js';
|
|
22
|
+
/** Dependencies — injectable for testing */
|
|
23
|
+
export interface SessionEngineDeps {
|
|
24
|
+
io: SessionIO;
|
|
25
|
+
git: GitRunner;
|
|
26
|
+
}
|
|
27
|
+
/** Input for adding an entry to the active session */
|
|
28
|
+
export interface AddEntryInput {
|
|
29
|
+
text: string;
|
|
30
|
+
source: NoteSource;
|
|
31
|
+
kind: NoteKind;
|
|
32
|
+
priority?: SessionNote['priority'];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Session Engine v2 — orchestrates session lifecycle for a single site.
|
|
36
|
+
*
|
|
37
|
+
* Stateless: every method reads from disk. No in-memory cache.
|
|
38
|
+
* This means multiple consumers (CLI + MCP) can operate concurrently.
|
|
39
|
+
*/
|
|
40
|
+
export declare class SessionEngine {
|
|
41
|
+
private readonly siteId;
|
|
42
|
+
private readonly io;
|
|
43
|
+
private readonly git;
|
|
44
|
+
constructor(siteId: string, deps?: SessionEngineDeps);
|
|
45
|
+
/** Start a new session. Captures git branch and commit automatically. */
|
|
46
|
+
startSession(initialNote?: string): Promise<SessionState>;
|
|
47
|
+
/** End the active session. Captures final git commit automatically. */
|
|
48
|
+
endSession(summary?: string): Promise<SessionState>;
|
|
49
|
+
/**
|
|
50
|
+
* Add an entry (note, task, decision, warning) to the active session.
|
|
51
|
+
* Always populates id, source, kind, and timestamp.
|
|
52
|
+
*/
|
|
53
|
+
addEntry(input: AddEntryInput): Promise<SessionState>;
|
|
54
|
+
/**
|
|
55
|
+
* Mark a task entry as done.
|
|
56
|
+
* No-op if already done. Throws if entry not found or not a task.
|
|
57
|
+
*/
|
|
58
|
+
completeTask(entryId: string): Promise<SessionState>;
|
|
59
|
+
/** Get the active session, or null if none. */
|
|
60
|
+
getActive(): Promise<SessionState | null>;
|
|
61
|
+
/** Compute summary metrics for the active session. Returns null if no active session. */
|
|
62
|
+
getSummary(): Promise<SessionSummary | null>;
|
|
63
|
+
/** List completed sessions, newest first. */
|
|
64
|
+
listHistory(limit?: number): Promise<SessionState[]>;
|
|
65
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SOURCE OF TRUTH — Session lifecycle orchestration
|
|
3
|
+
*
|
|
4
|
+
* Cuore operativo locale della CLI. Gestisce:
|
|
5
|
+
* - avvio e chiusura sessioni (con cattura git automatica)
|
|
6
|
+
* - aggiunta entry (note, task, decisioni, warning) con source/kind
|
|
7
|
+
* - summary e metriche sessione
|
|
8
|
+
* - storico sessioni completate
|
|
9
|
+
*
|
|
10
|
+
* Usato da:
|
|
11
|
+
* - comandi CLI (shell-commands.ts)
|
|
12
|
+
* - MCP tools (mcp/server.ts)
|
|
13
|
+
*
|
|
14
|
+
* NON dipende da:
|
|
15
|
+
* - UI (chalk, ink, react, shell-render)
|
|
16
|
+
* - backend API (client.ts)
|
|
17
|
+
* - comandi specifici (shell-commands.ts)
|
|
18
|
+
*/
|
|
19
|
+
import { randomUUID } from 'node:crypto';
|
|
20
|
+
import { join } from 'node:path';
|
|
21
|
+
import { createSession, loadActiveSession, endSession, listCompletedSessions, SESSIONS_DIR, defaultIO, } from './session.js';
|
|
22
|
+
import { getGitBranch, getGitCommitHead, defaultRunner } from './git.js';
|
|
23
|
+
/**
|
|
24
|
+
* Session Engine v2 — orchestrates session lifecycle for a single site.
|
|
25
|
+
*
|
|
26
|
+
* Stateless: every method reads from disk. No in-memory cache.
|
|
27
|
+
* This means multiple consumers (CLI + MCP) can operate concurrently.
|
|
28
|
+
*/
|
|
29
|
+
export class SessionEngine {
|
|
30
|
+
siteId;
|
|
31
|
+
io;
|
|
32
|
+
git;
|
|
33
|
+
constructor(siteId, deps) {
|
|
34
|
+
this.siteId = siteId;
|
|
35
|
+
this.io = deps?.io ?? defaultIO;
|
|
36
|
+
this.git = deps?.git ?? defaultRunner;
|
|
37
|
+
}
|
|
38
|
+
/** Start a new session. Captures git branch and commit automatically. */
|
|
39
|
+
async startSession(initialNote) {
|
|
40
|
+
const existing = await loadActiveSession(this.siteId, this.io);
|
|
41
|
+
if (existing) {
|
|
42
|
+
throw new Error(`Sessione gia' attiva: ${existing.id}. Chiudila prima con /session end.`);
|
|
43
|
+
}
|
|
44
|
+
const branch = await getGitBranch(this.git);
|
|
45
|
+
const commit = await getGitCommitHead(this.git);
|
|
46
|
+
return createSession(this.siteId, {
|
|
47
|
+
git_branch: branch ?? undefined,
|
|
48
|
+
git_commit: commit ?? undefined,
|
|
49
|
+
note: initialNote,
|
|
50
|
+
}, this.io);
|
|
51
|
+
}
|
|
52
|
+
/** End the active session. Captures final git commit automatically. */
|
|
53
|
+
async endSession(summary) {
|
|
54
|
+
const active = await loadActiveSession(this.siteId, this.io);
|
|
55
|
+
if (!active) {
|
|
56
|
+
throw new Error('Nessuna sessione attiva da chiudere.');
|
|
57
|
+
}
|
|
58
|
+
const commit = await getGitCommitHead(this.git);
|
|
59
|
+
return endSession(active.id, {
|
|
60
|
+
git_commit_end: commit ?? undefined,
|
|
61
|
+
summary,
|
|
62
|
+
}, this.io);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Add an entry (note, task, decision, warning) to the active session.
|
|
66
|
+
* Always populates id, source, kind, and timestamp.
|
|
67
|
+
*/
|
|
68
|
+
async addEntry(input) {
|
|
69
|
+
const active = await loadActiveSession(this.siteId, this.io);
|
|
70
|
+
if (!active) {
|
|
71
|
+
throw new Error('Nessuna sessione attiva. Avviala con /session start.');
|
|
72
|
+
}
|
|
73
|
+
const entry = {
|
|
74
|
+
id: randomUUID().replace(/-/g, '').slice(0, 12),
|
|
75
|
+
text: input.text,
|
|
76
|
+
timestamp: new Date().toISOString(),
|
|
77
|
+
priority: input.priority ?? 'medium',
|
|
78
|
+
source: input.source,
|
|
79
|
+
kind: input.kind,
|
|
80
|
+
taskStatus: input.kind === 'task' ? 'open' : undefined,
|
|
81
|
+
};
|
|
82
|
+
active.notes.push(entry);
|
|
83
|
+
await this.io.write(join(SESSIONS_DIR, `${active.id}.json`), JSON.stringify(active, null, 2));
|
|
84
|
+
return active;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Mark a task entry as done.
|
|
88
|
+
* No-op if already done. Throws if entry not found or not a task.
|
|
89
|
+
*/
|
|
90
|
+
async completeTask(entryId) {
|
|
91
|
+
const active = await loadActiveSession(this.siteId, this.io);
|
|
92
|
+
if (!active) {
|
|
93
|
+
throw new Error('Nessuna sessione attiva.');
|
|
94
|
+
}
|
|
95
|
+
const entry = active.notes.find(n => n.id === entryId);
|
|
96
|
+
if (!entry) {
|
|
97
|
+
throw new Error(`Entry non trovato: ${entryId}`);
|
|
98
|
+
}
|
|
99
|
+
if (entry.kind !== 'task') {
|
|
100
|
+
throw new Error(`Entry "${entryId}" non e' un task (kind: ${entry.kind}).`);
|
|
101
|
+
}
|
|
102
|
+
// No-op if already done
|
|
103
|
+
if (entry.taskStatus === 'done') {
|
|
104
|
+
return active;
|
|
105
|
+
}
|
|
106
|
+
entry.taskStatus = 'done';
|
|
107
|
+
await this.io.write(join(SESSIONS_DIR, `${active.id}.json`), JSON.stringify(active, null, 2));
|
|
108
|
+
return active;
|
|
109
|
+
}
|
|
110
|
+
/** Get the active session, or null if none. */
|
|
111
|
+
async getActive() {
|
|
112
|
+
return loadActiveSession(this.siteId, this.io);
|
|
113
|
+
}
|
|
114
|
+
/** Compute summary metrics for the active session. Returns null if no active session. */
|
|
115
|
+
async getSummary() {
|
|
116
|
+
const active = await loadActiveSession(this.siteId, this.io);
|
|
117
|
+
if (!active)
|
|
118
|
+
return null;
|
|
119
|
+
const tasks = active.notes.filter(n => n.kind === 'task');
|
|
120
|
+
const lastNote = active.notes.length > 0
|
|
121
|
+
? active.notes[active.notes.length - 1]
|
|
122
|
+
: null;
|
|
123
|
+
const startMs = new Date(active.started_at).getTime();
|
|
124
|
+
const endMs = active.ended_at
|
|
125
|
+
? new Date(active.ended_at).getTime()
|
|
126
|
+
: Date.now();
|
|
127
|
+
return {
|
|
128
|
+
sessionId: active.id,
|
|
129
|
+
status: active.status,
|
|
130
|
+
notesCount: active.notes.length,
|
|
131
|
+
tasksTotal: tasks.length,
|
|
132
|
+
tasksOpen: tasks.filter(t => t.taskStatus === 'open').length,
|
|
133
|
+
tasksDone: tasks.filter(t => t.taskStatus === 'done').length,
|
|
134
|
+
latestActivityAt: lastNote?.timestamp ?? null,
|
|
135
|
+
durationMs: endMs - startMs,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/** List completed sessions, newest first. */
|
|
139
|
+
async listHistory(limit = 10) {
|
|
140
|
+
return listCompletedSessions(this.siteId, limit, this.io);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=session-engine.js.map
|