@sentropic/track 0.85.16 → 0.85.17

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.
Files changed (45) hide show
  1. package/dist/cli/index.d.ts +2 -0
  2. package/dist/cli/index.d.ts.map +1 -1
  3. package/dist/cli/index.js +119 -29
  4. package/dist/cli/index.js.map +1 -1
  5. package/dist/cli/install-skills.d.ts.map +1 -1
  6. package/dist/cli/install-skills.js +8 -6
  7. package/dist/cli/install-skills.js.map +1 -1
  8. package/dist/mcp/server.d.ts +25 -2
  9. package/dist/mcp/server.d.ts.map +1 -1
  10. package/dist/mcp/server.js +30 -2
  11. package/dist/mcp/server.js.map +1 -1
  12. package/dist/read/contract.d.ts +3 -0
  13. package/dist/read/contract.d.ts.map +1 -1
  14. package/dist/read/contract.js +5 -0
  15. package/dist/read/contract.js.map +1 -1
  16. package/dist/read/index.d.ts +1 -0
  17. package/dist/read/index.d.ts.map +1 -1
  18. package/dist/read/index.js +1 -0
  19. package/dist/read/index.js.map +1 -1
  20. package/dist/report/ai-report.d.ts +122 -0
  21. package/dist/report/ai-report.d.ts.map +1 -0
  22. package/dist/report/ai-report.js +720 -0
  23. package/dist/report/ai-report.js.map +1 -0
  24. package/dist/report/build.d.ts +1 -1
  25. package/dist/report/build.d.ts.map +1 -1
  26. package/dist/report/build.js +6 -6
  27. package/dist/report/build.js.map +1 -1
  28. package/dist/report/directive.d.ts +1 -1
  29. package/dist/report/directive.d.ts.map +1 -1
  30. package/dist/report/directive.js +9 -9
  31. package/dist/report/directive.js.map +1 -1
  32. package/dist/report/index.d.ts +2 -0
  33. package/dist/report/index.d.ts.map +1 -1
  34. package/dist/report/index.js +2 -0
  35. package/dist/report/index.js.map +1 -1
  36. package/dist/report/rollup.d.ts +1 -1
  37. package/dist/report/rollup.d.ts.map +1 -1
  38. package/dist/report/rollup.js +3 -3
  39. package/dist/report/rollup.js.map +1 -1
  40. package/dist/report/snapshot.d.ts +67 -0
  41. package/dist/report/snapshot.d.ts.map +1 -0
  42. package/dist/report/snapshot.js +203 -0
  43. package/dist/report/snapshot.js.map +1 -0
  44. package/package.json +1 -1
  45. package/skills/track-operation/SKILL.md +23 -18
@@ -0,0 +1,203 @@
1
+ import { canonicalize } from '../events/canonical.js';
2
+ import { fold } from '../state/fold.js';
3
+ import { buildReport, } from './build.js';
4
+ import { buildDirectives } from './directive.js';
5
+ import { directivePhrase, wpTotals } from './format.js';
6
+ export const SNAPSHOT_SCHEMA = 'track.snapshot/v1';
7
+ export const SNAPSHOT_EVENT_LIMIT = 200;
8
+ /** Locale/ICU-independent JS UTF-16 code-unit ordering for canonical snapshot arrays. */
9
+ export function ordinalCompare(a, b) {
10
+ return a < b ? -1 : a > b ? 1 : 0;
11
+ }
12
+ function stableWpTree(tree) {
13
+ return tree
14
+ .map((node) => ({
15
+ ...node,
16
+ leaves: [...node.leaves].sort((a, b) => ordinalCompare(a.id, b.id)),
17
+ children: stableWpTree(node.children),
18
+ }))
19
+ .sort((a, b) => ordinalCompare(a.id, b.id));
20
+ }
21
+ function stableReport(report) {
22
+ const tree = stableWpTree(report.wpTree ?? []);
23
+ return {
24
+ buckets: {
25
+ AWAITED: [...report.buckets.AWAITED].sort((a, b) => ordinalCompare(a.id, b.id)),
26
+ DROPPED: [...report.buckets.DROPPED].sort((a, b) => ordinalCompare(a.id, b.id)),
27
+ DONE: [...report.buckets.DONE].sort((a, b) => ordinalCompare(a.id, b.id)),
28
+ 'TO-DO': [...report.buckets['TO-DO']].sort((a, b) => ordinalCompare(a.id, b.id)),
29
+ },
30
+ decisions: [...(report.decisions ?? [])].sort((a, b) => ordinalCompare(a.id, b.id)),
31
+ wpTree: tree,
32
+ };
33
+ }
34
+ function projectRow(row) {
35
+ return {
36
+ id: row.id,
37
+ title: row.title,
38
+ kind: row.kind,
39
+ workspace: row.workspace,
40
+ bucket: row.bucket,
41
+ realization: row.realization,
42
+ acceptance: row.acceptance,
43
+ ...(row.priority !== undefined ? { priority: row.priority } : {}),
44
+ ...(row.accountable !== undefined ? { accountable: row.accountable } : {}),
45
+ ...(row.engagementRef !== undefined ? { engagementRef: row.engagementRef } : {}),
46
+ ...(row.role !== undefined ? { role: row.role } : {}),
47
+ ...(row.wpId !== undefined ? { wpId: row.wpId } : {}),
48
+ ...(row.wpLabel !== undefined ? { wpLabel: row.wpLabel } : {}),
49
+ detail: { acceptanceLabel: row.detail.acceptanceLabel },
50
+ };
51
+ }
52
+ function projectDecision(decision) {
53
+ return {
54
+ id: decision.id,
55
+ title: decision.title,
56
+ workspace: decision.workspace,
57
+ decisionKind: decision.decisionKind,
58
+ realization: decision.realization,
59
+ outcome: decision.outcome,
60
+ ...(decision.accountable !== undefined ? { accountable: decision.accountable } : {}),
61
+ ...(decision.optionCount !== undefined ? { optionCount: decision.optionCount } : {}),
62
+ ...(decision.openQuestionCount !== undefined ? { openQuestionCount: decision.openQuestionCount } : {}),
63
+ ...(decision.hasRecommendation !== undefined ? { hasRecommendation: decision.hasRecommendation } : {}),
64
+ };
65
+ }
66
+ function projectBlocker(blocker) {
67
+ return {
68
+ blockerId: blocker.blockerId,
69
+ kind: blocker.kind,
70
+ reason: blocker.reason,
71
+ ...(blocker.ref !== undefined ? { ref: blocker.ref } : {}),
72
+ ...(blocker.scope !== undefined ? { scope: blocker.scope } : {}),
73
+ ...(blocker.resolutionRule !== undefined ? { resolutionRule: blocker.resolutionRule } : {}),
74
+ ...(blocker.engagementRef !== undefined ? { engagementRef: blocker.engagementRef } : {}),
75
+ };
76
+ }
77
+ function projectLeaf(leaf) {
78
+ return {
79
+ id: leaf.id,
80
+ title: leaf.title,
81
+ bucket: leaf.bucket,
82
+ kind: leaf.kind,
83
+ workspace: leaf.workspace,
84
+ realization: leaf.realization,
85
+ acceptance: leaf.acceptance,
86
+ specStatus: leaf.specStatus,
87
+ openBlockers: leaf.openBlockers.map(projectBlocker),
88
+ ...(leaf.priority !== undefined ? { priority: leaf.priority } : {}),
89
+ ...(leaf.accountable !== undefined ? { accountable: leaf.accountable } : {}),
90
+ ...(leaf.engagementRef !== undefined ? { engagementRef: leaf.engagementRef } : {}),
91
+ ...(leaf.awaitedOnDecision !== undefined ? { awaitedOnDecision: leaf.awaitedOnDecision } : {}),
92
+ };
93
+ }
94
+ function projectNode(node) {
95
+ return {
96
+ id: node.id,
97
+ title: node.title,
98
+ label: node.label,
99
+ done: node.done,
100
+ active: node.active,
101
+ dropped: node.dropped,
102
+ pct: node.pct,
103
+ leaves: node.leaves.map(projectLeaf),
104
+ children: node.children.map(projectNode),
105
+ ...(node.code !== undefined ? { code: node.code } : {}),
106
+ ...(node.role !== undefined ? { role: node.role } : {}),
107
+ ...(node.terminal !== undefined ? { terminal: node.terminal } : {}),
108
+ ...(node.partial !== undefined ? { partial: node.partial } : {}),
109
+ };
110
+ }
111
+ function projectReport(report) {
112
+ return {
113
+ buckets: {
114
+ AWAITED: report.buckets.AWAITED.map(projectRow),
115
+ DROPPED: report.buckets.DROPPED.map(projectRow),
116
+ DONE: report.buckets.DONE.map(projectRow),
117
+ 'TO-DO': report.buckets['TO-DO'].map(projectRow),
118
+ },
119
+ decisions: (report.decisions ?? []).map(projectDecision),
120
+ wpTree: (report.wpTree ?? []).map(projectNode),
121
+ };
122
+ }
123
+ /**
124
+ * A deliberately narrow event summary. Never copy arbitrary prose-bearing payload fields: the event kind,
125
+ * aggregate id, and append position already carry the useful change signal for the AI context.
126
+ */
127
+ function recentEvents(events) {
128
+ const start = Math.max(0, events.length - SNAPSHOT_EVENT_LIMIT);
129
+ return events.slice(start).map((event, offset) => ({
130
+ position: start + offset + 1,
131
+ eventId: event.id,
132
+ kind: event.type,
133
+ aggregateId: event.aggregateId,
134
+ }));
135
+ }
136
+ export function buildSnapshot(events, options) {
137
+ const report = stableReport(buildReport(fold(events), {
138
+ baselineCommit: options.resolvedCommit,
139
+ requireAccepted: options.requireAccepted ?? false,
140
+ decisions: true,
141
+ wpTree: true,
142
+ activeRoster: false,
143
+ }, ordinalCompare));
144
+ const directives = buildDirectives(report.wpTree ?? [], report.decisions ?? [], ordinalCompare)
145
+ .map((directive) => ({
146
+ id: directive.id,
147
+ source: 'rule-derived',
148
+ kind: directive.step.code,
149
+ aggregateId: directive.target.id,
150
+ text: directivePhrase(directive),
151
+ }))
152
+ .sort((a, b) => ordinalCompare(a.id, b.id));
153
+ return {
154
+ schema: SNAPSHOT_SCHEMA,
155
+ baseline: { input: options.baselineInput, resolvedCommit: options.resolvedCommit },
156
+ report: projectReport(report),
157
+ wpTotals: wpTotals(report.wpTree ?? []),
158
+ directives,
159
+ recentEvents: recentEvents(events),
160
+ };
161
+ }
162
+ export function snapshotJson(snapshot) {
163
+ return `${canonicalize(snapshot)}\n`;
164
+ }
165
+ function clean(value) {
166
+ return value
167
+ .replace(/[\u0000-\u001f\u007f-\u009f\u2028\u2029\u202a-\u202e\u2066-\u2069]/gu, ' ')
168
+ .replace(/\s+/gu, ' ')
169
+ .trim();
170
+ }
171
+ function markdown(value) {
172
+ return clean(value).replace(/([\\`*_{}\[\]()#+\-.!|<>~])/gu, '\\$1');
173
+ }
174
+ export function snapshotDiagnostic(snapshot, format) {
175
+ const h = (value) => (format === 'md' ? `## ${value}` : value);
176
+ const esc = format === 'md' ? markdown : clean;
177
+ const lines = [
178
+ format === 'md' ? '# Track factual snapshot' : 'TRACK FACTUAL SNAPSHOT',
179
+ `schema: ${snapshot.schema}`,
180
+ `baseline: ${esc(snapshot.baseline.resolvedCommit)}`,
181
+ '',
182
+ h('BUCKETS'),
183
+ `AWAITED ${snapshot.report.buckets.AWAITED.length} · DROPPED ${snapshot.report.buckets.DROPPED.length} · DONE ${snapshot.report.buckets.DONE.length} · TO-DO ${snapshot.report.buckets['TO-DO'].length}`,
184
+ '',
185
+ h('RULE-DERIVED FACTS (NOT AI ADVICE)'),
186
+ ];
187
+ for (const directive of snapshot.directives) {
188
+ lines.push(`- [${esc(directive.kind)}] ${esc(directive.text)} (${esc(directive.id)})`);
189
+ }
190
+ if (snapshot.directives.length === 0)
191
+ lines.push('- none');
192
+ lines.push('', h('RECENT EVENTS'));
193
+ for (const event of snapshot.recentEvents) {
194
+ lines.push(`- #${event.position} ${esc(event.kind)} · ${esc(event.aggregateId ?? '-')}`);
195
+ }
196
+ if (snapshot.recentEvents.length === 0)
197
+ lines.push('- none');
198
+ return `${lines.join('\n').trimEnd()}\n`;
199
+ }
200
+ export function renderSnapshot(snapshot, format) {
201
+ return format === 'json' ? snapshotJson(snapshot) : snapshotDiagnostic(snapshot, format);
202
+ }
203
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/report/snapshot.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentropic/track",
3
- "version": "0.85.16",
3
+ "version": "0.85.17",
4
4
  "description": "Typed product-backlog and spec/plan/UAT system of record for the sentropic ecosystem (record-only MVP).",
5
5
  "license": "MIT",
6
6
  "author": "Fabien Antoine",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: track-operation
3
- description: "Use when the user asks for a track report, a status, an advancement/progress report, or says 'fais-moi un track report' / 'un track report' — run the CLI `track report` (default table) from the repo root and paste its FAIT/À-FAIRE/DÉCISIONS-ACTIONS table verbatim; NEVER use the `track_report` MCP tool to render a human report (it returns machine JSON). Also use when an agent needs to read, update, import, or verify track state in a repo; when a BRANCH.md or plan/NN-BRANCH_*.md file changed; when a session reports that track write/import is not exposed; or when deciding whether to use track MCP versus the track CLI. The skill enforces the contract: MCP is read-only, writes/imports use the track CLI from the target repo root, and .track is append-only/single-writer."
3
+ description: "Use when the user asks for a track report, status, or advancement/progress report — run the CLI `track report` from the repo root and return its AI-prepared, cited output verbatim; never substitute the deterministic `track_report` MCP projection for a human AI report. Also use when an agent needs to read, update, import, or verify track state; when a BRANCH.md or plan/NN-BRANCH_*.md changed; or when deciding between Track MCP and CLI. MCP remains read-only, writes/imports use the CLI, and .track is append-only/single-writer."
4
4
  ---
5
5
 
6
6
  # Track Operation
@@ -9,17 +9,21 @@ Use this for ordinary track hygiene: reading status, importing BRANCH files, rec
9
9
  updates, and verifying that the sidecar is current. This is the general operational skill; use
10
10
  `present-decision` for human decision dossiers and `propose-workpackages` for backlog restructuring.
11
11
 
12
- ## Human report/status — DO THIS FIRST
12
+ ## Human AI report/status — DO THIS FIRST
13
13
 
14
14
  For ANY human-facing track report or status (including "fais-moi un track report", "un track report",
15
- "a status", "an advancement/progress report"): run the CLI `track report` (default table, or
16
- `track report --format md`) from the repo root and PASTE THE OUTPUT VERBATIM in a fenced code block.
17
-
18
- - NEVER call the `track_report` MCP tool to render a human report it returns machine JSON, and hand
19
- reformatting that JSON is exactly what produces the verbose bullet lists this rule exists to prevent.
20
- - NEVER reformat the report into bullets or numbered lists, and never drop the table layout.
21
- - `track report --flat` is DEPRECATED for human reporting (flat buckets only); the default table is the
22
- FAIT / À-FAIRE (%·WP) / DÉCISIONS-ACTIONS conductor view.
15
+ "a status", "an advancement/progress report"): run the CLI `track report` (or
16
+ `track report --format md`) from the repo root and paste its AI-prepared, cited output verbatim.
17
+
18
+ - NEVER call the `track_report` MCP tool to render a human AI report. It is the frozen legacy,
19
+ deterministic projection; `track_snapshot` is the canonical factual context projection.
20
+ - NEVER invent a report by interpreting MCP JSON or snapshot facts yourself.
21
+ - If `track report` fails because no adapter is configured, times out, or returns invalid output, say that
22
+ the AI report is unavailable and preserve the command's honest error. You MAY run
23
+ `track snapshot --format text`, but label it exactly as a **factual snapshot (not an AI report)**. Do not
24
+ turn rule-derived snapshot directives into AI advice.
25
+ - `--wp`, `--flat`, `--decisions`, and `--active-roster` are emphasis/context controls for the AI adapter;
26
+ they no longer select a deterministic human renderer.
23
27
 
24
28
  ## Contract
25
29
 
@@ -54,7 +58,7 @@ When progress is represented by a `BRANCH.md` or `plan/NN-BRANCH_*.md` file:
54
58
  3. Verify immediately:
55
59
 
56
60
  ```bash
57
- track report --format text
61
+ track snapshot --format text
58
62
  track validate
59
63
  ```
60
64
 
@@ -75,13 +79,14 @@ Use direct CLI writes only for the event they actually represent:
75
79
 
76
80
  Report track results from the verified state, not from memory:
77
81
 
78
- - Use `track report --format text` for human status. Since track 0.19.1 this prefers the WP/table
79
- conductor view (FAIT / À-FAIRE %·WP / ATTENDUS) when workpackages exist, and falls back to flat buckets
80
- in unstructured repos. **When the user asks for a report/status, paste the raw command output verbatim in
81
- a fenced code block; do not summarize it, do not convert it to bullets, and do not drop the table layout.**
82
- - Use `track report --wp` only to force the conductor table explicitly. Use legacy `track report --flat`
83
- only when the user asks for flat buckets or a downstream script still needs them; treat `--flat` as
84
- deprecated for human reporting.
82
+ - Use `track report --format text` for a human AI status and paste its raw, cited output verbatim.
83
+ - Use `track report --format md` when Markdown is explicitly useful, and `--wp` or `--flat` only to request
84
+ a workpackage or flat emphasis from the adapter.
85
+ - Use `track snapshot` or the exact alias `track report --raw` for canonical deterministic facts. Its text
86
+ and Markdown renderers are diagnostics; always label them **factual snapshot (not an AI report)** when
87
+ returning them to a human.
88
+ - `track report --format json` and the MCP `track_report` tool remain frozen legacy compatibility surfaces;
89
+ do not present either as the new human AI report.
85
90
  - Mention if `.track/` was intentionally not written because the current checkout is not the designated
86
91
  writer.
87
92