maestro-flow 0.5.37 → 0.5.38

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 (152) hide show
  1. package/.agents/skills/maestro/SKILL.md +11 -5
  2. package/.agents/skills/maestro-ralph/SKILL.md +80 -12
  3. package/.agents/skills/maestro-ralph-execute/SKILL.md +17 -6
  4. package/.agents/skills/manage-drift-realign/SKILL.md +153 -0
  5. package/.agy/skills/maestro/SKILL.md +11 -5
  6. package/.agy/skills/maestro-ralph/SKILL.md +80 -12
  7. package/.agy/skills/maestro-ralph-execute/SKILL.md +17 -6
  8. package/.agy/skills/manage-drift-realign/SKILL.md +153 -0
  9. package/.claude/commands/maestro-ralph-execute.md +17 -6
  10. package/.claude/commands/maestro-ralph.md +80 -12
  11. package/.claude/commands/maestro.md +11 -5
  12. package/.claude/commands/manage-drift-realign.md +151 -0
  13. package/.codex/skills/maestro/SKILL.md +16 -8
  14. package/.codex/skills/maestro-ralph/SKILL.md +138 -11
  15. package/.codex/skills/maestro-ralph-execute/SKILL.md +17 -6
  16. package/.codex/skills/manage-drift-realign/SKILL.md +471 -0
  17. package/README.md +25 -8
  18. package/README.zh-CN.md +6 -6
  19. package/dashboard/dist-server/src/commands/install-backend.d.ts +10 -0
  20. package/dashboard/dist-server/src/commands/install-backend.js +69 -0
  21. package/dashboard/dist-server/src/commands/install-backend.js.map +1 -1
  22. package/dashboard/dist-server/src/core/component-defs.d.ts +11 -0
  23. package/dashboard/dist-server/src/core/component-defs.js +34 -2
  24. package/dashboard/dist-server/src/core/component-defs.js.map +1 -1
  25. package/dist/src/cli.js +3 -2
  26. package/dist/src/cli.js.map +1 -1
  27. package/dist/src/commands/install-backend.d.ts +10 -0
  28. package/dist/src/commands/install-backend.d.ts.map +1 -1
  29. package/dist/src/commands/install-backend.js +69 -0
  30. package/dist/src/commands/install-backend.js.map +1 -1
  31. package/dist/src/commands/install.js +1 -0
  32. package/dist/src/commands/install.js.map +1 -1
  33. package/dist/src/commands/ralph.d.ts.map +1 -1
  34. package/dist/src/commands/ralph.js +8 -0
  35. package/dist/src/commands/ralph.js.map +1 -1
  36. package/dist/src/commands/timeline.d.ts +14 -0
  37. package/dist/src/commands/timeline.d.ts.map +1 -0
  38. package/dist/src/commands/timeline.js +377 -0
  39. package/dist/src/commands/timeline.js.map +1 -0
  40. package/dist/src/core/component-defs.d.ts +11 -0
  41. package/dist/src/core/component-defs.d.ts.map +1 -1
  42. package/dist/src/core/component-defs.js +34 -2
  43. package/dist/src/core/component-defs.js.map +1 -1
  44. package/dist/src/core/install-executor.d.ts.map +1 -1
  45. package/dist/src/core/install-executor.js +11 -1
  46. package/dist/src/core/install-executor.js.map +1 -1
  47. package/dist/src/core/install-profile.d.ts.map +1 -1
  48. package/dist/src/core/install-profile.js +52 -17
  49. package/dist/src/core/install-profile.js.map +1 -1
  50. package/dist/src/i18n/locales/en.d.ts.map +1 -1
  51. package/dist/src/i18n/locales/en.js +4 -1
  52. package/dist/src/i18n/locales/en.js.map +1 -1
  53. package/dist/src/i18n/locales/zh.d.ts.map +1 -1
  54. package/dist/src/i18n/locales/zh.js +4 -1
  55. package/dist/src/i18n/locales/zh.js.map +1 -1
  56. package/dist/src/i18n/types.d.ts +3 -0
  57. package/dist/src/i18n/types.d.ts.map +1 -1
  58. package/dist/src/ralph/cmd-complete.d.ts +4 -0
  59. package/dist/src/ralph/cmd-complete.d.ts.map +1 -1
  60. package/dist/src/ralph/cmd-complete.js +8 -0
  61. package/dist/src/ralph/cmd-complete.js.map +1 -1
  62. package/dist/src/ralph/cmd-next.js +58 -8
  63. package/dist/src/ralph/cmd-next.js.map +1 -1
  64. package/dist/src/ralph/status-schema.d.ts +29 -2
  65. package/dist/src/ralph/status-schema.d.ts.map +1 -1
  66. package/dist/src/ralph/status-schema.js +1 -1
  67. package/dist/src/tui/install-ui/ComponentGrid.d.ts.map +1 -1
  68. package/dist/src/tui/install-ui/ComponentGrid.js +71 -38
  69. package/dist/src/tui/install-ui/ComponentGrid.js.map +1 -1
  70. package/dist/src/tui/install-ui/ComponentGrid.logic.d.ts +12 -3
  71. package/dist/src/tui/install-ui/ComponentGrid.logic.d.ts.map +1 -1
  72. package/dist/src/tui/install-ui/ComponentGrid.logic.js +21 -4
  73. package/dist/src/tui/install-ui/ComponentGrid.logic.js.map +1 -1
  74. package/dist/src/tui/install-ui/CyberItem.d.ts +3 -1
  75. package/dist/src/tui/install-ui/CyberItem.d.ts.map +1 -1
  76. package/dist/src/tui/install-ui/CyberItem.js +6 -5
  77. package/dist/src/tui/install-ui/CyberItem.js.map +1 -1
  78. package/dist/src/tui/install-ui/GroupedHub.d.ts +9 -0
  79. package/dist/src/tui/install-ui/GroupedHub.d.ts.map +1 -1
  80. package/dist/src/tui/install-ui/GroupedHub.js +54 -47
  81. package/dist/src/tui/install-ui/GroupedHub.js.map +1 -1
  82. package/dist/src/tui/install-ui/InstallConfirm.js +1 -1
  83. package/dist/src/tui/install-ui/InstallConfirm.js.map +1 -1
  84. package/dist/src/tui/install-ui/InstallFlow.d.ts.map +1 -1
  85. package/dist/src/tui/install-ui/InstallFlow.js +54 -5
  86. package/dist/src/tui/install-ui/InstallFlow.js.map +1 -1
  87. package/dist/src/tui/install-ui/types.d.ts +1 -0
  88. package/dist/src/tui/install-ui/types.d.ts.map +1 -1
  89. package/dist/src/tui/install-ui/types.js.map +1 -1
  90. package/dist/src/tui/install-ui/useInstallFlowState.d.ts +8 -2
  91. package/dist/src/tui/install-ui/useInstallFlowState.d.ts.map +1 -1
  92. package/dist/src/tui/install-ui/useInstallFlowState.js +145 -15
  93. package/dist/src/tui/install-ui/useInstallFlowState.js.map +1 -1
  94. package/dist/src/utils/update-notices.js +12 -0
  95. package/dist/src/utils/update-notices.js.map +1 -1
  96. package/package.json +1 -1
  97. package/workflows/agy-instructions.md +127 -88
  98. package/workflows/analyze.md +2 -2
  99. package/workflows/auto-test.md +7 -1
  100. package/workflows/blueprint.md +22 -19
  101. package/workflows/brainstorm.md +11 -3
  102. package/workflows/business-test.md +4 -0
  103. package/workflows/codebase-rebuild.md +8 -1
  104. package/workflows/codebase-refresh.md +7 -1
  105. package/workflows/codex-instructions.md +1 -1
  106. package/workflows/debug.md +5 -2
  107. package/workflows/domain-add.md +6 -0
  108. package/workflows/drift-realign.md +396 -0
  109. package/workflows/execute.md +5 -4
  110. package/workflows/explore-usage.md +2 -2
  111. package/workflows/finish-work.md +6 -6
  112. package/workflows/fork.md +2 -2
  113. package/workflows/grill.md +6 -5
  114. package/workflows/harvest.md +2 -2
  115. package/workflows/impeccable.md +3 -2
  116. package/workflows/init.md +7 -7
  117. package/workflows/integration-test.md +1 -0
  118. package/workflows/issue-gaps-analyze.codex.md +2 -0
  119. package/workflows/issue-gaps-analyze.md +4 -4
  120. package/workflows/issue-plan.md +1 -1
  121. package/workflows/knowhow.md +7 -1
  122. package/workflows/knowledge-audit.md +1 -1
  123. package/workflows/maestro-super.md +2 -2
  124. package/workflows/maestro.md +3 -3
  125. package/workflows/map.md +2 -2
  126. package/workflows/milestone-audit.md +1 -1
  127. package/workflows/milestone-complete.md +1 -1
  128. package/workflows/plan.md +7 -6
  129. package/workflows/quick.md +8 -6
  130. package/workflows/ralph-amend-goal.md +177 -0
  131. package/workflows/refactor.md +2 -0
  132. package/workflows/retrospective.md +7 -3
  133. package/workflows/review.md +6 -4
  134. package/workflows/roadmap-common.md +3 -3
  135. package/workflows/roadmap.md +8 -5
  136. package/workflows/spec-generate.md +23 -18
  137. package/workflows/specs-load.md +1 -1
  138. package/workflows/specs-setup.md +2 -0
  139. package/workflows/sync.md +4 -2
  140. package/workflows/test-gen.md +1 -1
  141. package/workflows/test.md +1 -1
  142. package/workflows/ui-codify-extract.md +1 -0
  143. package/workflows/ui-codify-knowhow.md +1 -1
  144. package/workflows/ui-codify-package.md +1 -1
  145. package/workflows/ui-codify.md +9 -7
  146. package/workflows/ui-design.md +9 -7
  147. package/workflows/ui-style.md +6 -4
  148. package/workflows/verify.md +4 -4
  149. package/workflows/wiki-connect.md +2 -0
  150. package/workflows/wiki-digest.md +5 -3
  151. package/workflows/wiki-manage.md +4 -0
  152. package/workflows/maestro.codex.md +0 -365
@@ -0,0 +1,377 @@
1
+ /**
2
+ * Timeline Command — Unified project activity timeline (git + sessions).
3
+ *
4
+ * maestro timeline — last 30 days, all sources
5
+ * maestro timeline --since 7d — last 7 days
6
+ * maestro timeline --since HEAD~20 — since 20 commits ago
7
+ * maestro timeline --scope git — git events only
8
+ * maestro timeline --scope session — session events only
9
+ * maestro timeline --json — JSON output
10
+ * maestro timeline --output report.json — write to file
11
+ */
12
+ import { resolve, join, relative, dirname } from 'node:path';
13
+ import { writeFileSync, existsSync, statSync, readdirSync } from 'node:fs';
14
+ import { execSync } from 'node:child_process';
15
+ import { truncate } from '../utils/cli-format.js';
16
+ import { loadWorkspaceConfig, resolveWorkspaceLinks } from '../config/index.js';
17
+ // ── Lazy WikiIndexer singleton ─────────────────────────────────────────
18
+ let _indexer = null;
19
+ async function getIndexer() {
20
+ if (!_indexer) {
21
+ const { WikiIndexer: Cls } = await import('#maestro-dashboard/wiki/wiki-indexer.js');
22
+ const workflowRoot = resolve('.workflow');
23
+ const projectPath = process.cwd();
24
+ const wsConfig = loadWorkspaceConfig(projectPath);
25
+ const resolved = resolveWorkspaceLinks(projectPath, wsConfig);
26
+ const linkedWorkspaces = resolved
27
+ .filter(lw => lw.valid)
28
+ .map(lw => ({ name: lw.name, workflowRoot: lw.workflowRoot, shareTypes: lw.share }));
29
+ _indexer = new Cls({ workflowRoot, linkedWorkspaces });
30
+ }
31
+ return _indexer;
32
+ }
33
+ // ── Date parsing ───────────────────────────────────────────────────────
34
+ /**
35
+ * Parse --since value into an ISO date string.
36
+ * Supports: ISO dates, relative (7d, 2w, 3m), HEAD~N, commit hashes.
37
+ */
38
+ function parseSince(value, cwd) {
39
+ // Relative duration: 7d, 2w, 3m
40
+ const relMatch = value.match(/^(\d+)([dwm])$/i);
41
+ if (relMatch) {
42
+ const amount = parseInt(relMatch[1], 10);
43
+ const unit = relMatch[2].toLowerCase();
44
+ const now = new Date();
45
+ if (unit === 'd')
46
+ now.setDate(now.getDate() - amount);
47
+ else if (unit === 'w')
48
+ now.setDate(now.getDate() - amount * 7);
49
+ else if (unit === 'm')
50
+ now.setMonth(now.getMonth() - amount);
51
+ return now.toISOString();
52
+ }
53
+ // HEAD~N: resolve to commit date
54
+ if (value.startsWith('HEAD~') || value.startsWith('head~')) {
55
+ try {
56
+ const date = execSync(`git log -1 --format="%aI" ${value}`, {
57
+ encoding: 'utf-8',
58
+ cwd,
59
+ }).trim();
60
+ if (date)
61
+ return new Date(date).toISOString();
62
+ }
63
+ catch {
64
+ console.error(`E003: Failed to resolve "${value}" via git log`);
65
+ process.exit(1);
66
+ }
67
+ }
68
+ // Commit hash (7-40 hex chars)
69
+ if (/^[0-9a-f]{7,40}$/i.test(value)) {
70
+ try {
71
+ const date = execSync(`git log -1 --format="%aI" ${value}`, {
72
+ encoding: 'utf-8',
73
+ cwd,
74
+ }).trim();
75
+ if (date)
76
+ return new Date(date).toISOString();
77
+ }
78
+ catch {
79
+ console.error(`E003: Failed to resolve commit "${value}" via git log`);
80
+ process.exit(1);
81
+ }
82
+ }
83
+ // ISO date or date string
84
+ const parsed = new Date(value);
85
+ if (!isNaN(parsed.getTime())) {
86
+ return parsed.toISOString();
87
+ }
88
+ console.error(`E003: Unable to parse --since value: "${value}"`);
89
+ process.exit(1);
90
+ }
91
+ // ── Git event collection ───────────────────────────────────────────────
92
+ function collectGitEvents(sinceDate, cwd) {
93
+ try {
94
+ const isoDate = new Date(sinceDate).toISOString();
95
+ const raw = execSync(`git log --since="${isoDate}" --max-count=1000 --format="COMMIT:%H|%aI|%s" --name-only`, { encoding: 'utf-8', cwd });
96
+ const events = [];
97
+ let current = null;
98
+ for (const line of raw.split('\n')) {
99
+ if (line.startsWith('COMMIT:')) {
100
+ if (current)
101
+ events.push({ type: 'commit', ...current });
102
+ const payload = line.slice(7);
103
+ const parts = payload.split('|');
104
+ if (parts.length < 3)
105
+ continue;
106
+ current = { hash: parts[0], at: parts[1], message: parts.slice(2).join('|'), files: [] };
107
+ }
108
+ else if (current && line.trim().length > 0) {
109
+ current.files.push(line.trim());
110
+ }
111
+ }
112
+ if (current)
113
+ events.push({ type: 'commit', ...current });
114
+ return events;
115
+ }
116
+ catch (err) {
117
+ const msg = err instanceof Error ? err.message : String(err);
118
+ if (msg.includes('not a git repository') || msg.includes('fatal: bad default revision')) {
119
+ console.error('E003: not a git repository');
120
+ process.exit(1);
121
+ }
122
+ // Empty repo or no commits in range — return empty list
123
+ console.error('W004: git log returned no results — proceeding with empty git history');
124
+ return [];
125
+ }
126
+ }
127
+ // ── Git summary (insertions/deletions) ─────────────────────────────────
128
+ function computeGitSummary(sinceDate, cwd, commitCount, allFiles) {
129
+ let insertions = 0;
130
+ let deletions = 0;
131
+ try {
132
+ const isoDate = new Date(sinceDate).toISOString();
133
+ const raw = execSync(`git log --since="${isoDate}" --numstat --format=""`, { encoding: 'utf-8', cwd }).trim();
134
+ for (const line of raw.split('\n')) {
135
+ const match = line.match(/^(\d+)\t(\d+)\t/);
136
+ if (match) {
137
+ insertions += parseInt(match[1], 10);
138
+ deletions += parseInt(match[2], 10);
139
+ }
140
+ }
141
+ }
142
+ catch {
143
+ // git log may fail on shallow clones — use commit-level data
144
+ }
145
+ return {
146
+ commits: commitCount,
147
+ files_changed: allFiles.size,
148
+ insertions,
149
+ deletions,
150
+ };
151
+ }
152
+ // ── Session event collection ───────────────────────────────────────────
153
+ async function collectSessionEvents(sinceDate) {
154
+ try {
155
+ const indexer = await getIndexer();
156
+ const index = await indexer.get();
157
+ const sinceMs = new Date(sinceDate).getTime();
158
+ const sessionEntries = index.entries.filter((e) => (e.category === 'session' || e.category === 'scratch') &&
159
+ new Date(e.created).getTime() >= sinceMs);
160
+ return sessionEntries.map((e) => ({
161
+ type: 'session',
162
+ at: e.created,
163
+ id: e.id,
164
+ title: e.title,
165
+ summary: e.summary ?? '',
166
+ edited_files: Array.isArray(e.ext?.editedFiles) ? e.ext.editedFiles : [],
167
+ code_paths: Array.isArray(e.ext?.codePaths) ? e.ext.codePaths : [],
168
+ platform: typeof e.ext?.platform === 'string' ? e.ext.platform : undefined,
169
+ }));
170
+ }
171
+ catch {
172
+ console.error('W001: Wiki/session index unavailable — proceeding with git-only data');
173
+ return [];
174
+ }
175
+ }
176
+ // ── Hot paths computation ──────────────────────────────────────────────
177
+ function computeHotPaths(events, topN) {
178
+ const dirCounts = new Map();
179
+ for (const ev of events) {
180
+ const files = ev.type === 'commit' ? ev.files : [...ev.edited_files, ...ev.code_paths];
181
+ for (const f of files) {
182
+ const dir = dirname(f);
183
+ if (dir === '.')
184
+ continue;
185
+ // Use top-level or second-level directory
186
+ const parts = dir.split(/[/\\]/);
187
+ const key = parts.length >= 2 ? `${parts[0]}/${parts[1]}/` : `${parts[0]}/`;
188
+ dirCounts.set(key, (dirCounts.get(key) ?? 0) + 1);
189
+ }
190
+ }
191
+ return Array.from(dirCounts.entries())
192
+ .sort((a, b) => b[1] - a[1])
193
+ .slice(0, topN)
194
+ .map(([dir, count]) => `${dir} (${count} changes)`);
195
+ }
196
+ // ── Cold workflow files ────────────────────────────────────────────────
197
+ function findColdWorkflowFiles(sinceDate, cwd) {
198
+ const workflowDir = resolve(cwd, '.workflow');
199
+ if (!existsSync(workflowDir))
200
+ return [];
201
+ const sinceMs = new Date(sinceDate).getTime();
202
+ const cold = [];
203
+ function walk(dir) {
204
+ let entries;
205
+ try {
206
+ entries = readdirSync(dir);
207
+ }
208
+ catch {
209
+ return;
210
+ }
211
+ for (const name of entries) {
212
+ if (name === '.git' || name === 'node_modules')
213
+ continue;
214
+ const fullPath = join(dir, name);
215
+ try {
216
+ const st = statSync(fullPath);
217
+ if (st.isDirectory()) {
218
+ walk(fullPath);
219
+ }
220
+ else if (st.isFile() && st.mtimeMs < sinceMs) {
221
+ cold.push({
222
+ path: relative(cwd, fullPath).replace(/\\/g, '/'),
223
+ mtime: st.mtime,
224
+ });
225
+ }
226
+ }
227
+ catch {
228
+ // Permission errors etc — skip
229
+ }
230
+ }
231
+ }
232
+ walk(workflowDir);
233
+ // Sort by oldest first, return top entries
234
+ cold.sort((a, b) => a.mtime.getTime() - b.mtime.getTime());
235
+ return cold.slice(0, 20).map(c => ({ path: c.path, last_modified: c.mtime.toISOString().slice(0, 10) }));
236
+ }
237
+ // ── Human-readable output ──────────────────────────────────────────────
238
+ function formatHumanOutput(output) {
239
+ const lines = [];
240
+ const { window: w, git_summary: gs, session_summary: ss, events, hot_paths, cold_workflow_files } = output;
241
+ lines.push(`--- Timeline: ${w.from.slice(0, 10)} → ${w.to.slice(0, 10)} (${w.days} days) ---`);
242
+ lines.push('');
243
+ lines.push(`Git: ${gs.commits} commits, ${gs.files_changed} files, +${gs.insertions}/-${gs.deletions}`);
244
+ const platformParts = Object.entries(ss.by_platform)
245
+ .sort((a, b) => b[1] - a[1])
246
+ .map(([p, n]) => `${p}: ${n}`);
247
+ const platformSuffix = platformParts.length > 0 ? ` (${platformParts.join(', ')})` : '';
248
+ lines.push(`Sessions: ${ss.total} total, ${ss.with_edits} with edits${platformSuffix}`);
249
+ if (hot_paths.length > 0) {
250
+ lines.push('');
251
+ lines.push('Hot paths:');
252
+ for (const p of hot_paths) {
253
+ lines.push(` ${p}`);
254
+ }
255
+ }
256
+ if (cold_workflow_files.length > 0) {
257
+ lines.push('');
258
+ lines.push('Cold .workflow/ files (not modified in window):');
259
+ for (const f of cold_workflow_files) {
260
+ lines.push(` ${f.path} (last: ${f.last_modified})`);
261
+ }
262
+ }
263
+ if (events.length > 0) {
264
+ lines.push('');
265
+ lines.push('Recent events:');
266
+ for (const ev of events) {
267
+ const date = ev.at.slice(0, 10);
268
+ if (ev.type === 'commit') {
269
+ const shortHash = ev.hash.slice(0, 7);
270
+ const msg = truncate(ev.message, 60);
271
+ lines.push(` ${date} [commit] ${shortHash} ${msg}`);
272
+ }
273
+ else {
274
+ const plat = ev.platform ? `[${ev.platform}]` : '[session]';
275
+ const shortId = truncate(ev.id, 12);
276
+ const title = truncate(ev.title, 50);
277
+ lines.push(` ${date} ${plat.padEnd(10)} ${shortId} ${title}`);
278
+ }
279
+ }
280
+ }
281
+ return lines.join('\n');
282
+ }
283
+ // ── Command registration ───────────────────────────────────────────────
284
+ export function registerTimelineCommand(program) {
285
+ program
286
+ .command('timeline')
287
+ .description('Unified project activity timeline — git commits + sessions')
288
+ .option('--since <date>', 'Analysis starting point: ISO date, relative (7d/2w/3m), HEAD~N, or commit hash', '30d')
289
+ .option('--scope <scope>', 'Event source filter: git, session, all', 'all')
290
+ .option('--json', 'Output as JSON')
291
+ .option('--output <path>', 'Write output to file')
292
+ .option('--limit <n>', 'Max events', '500')
293
+ .option('--platform <name>', 'Filter sessions by platform: claude, codex, all', 'all')
294
+ .action(async (opts) => {
295
+ const cwd = process.cwd();
296
+ const scope = opts.scope;
297
+ const limit = parseInt(opts.limit, 10) || 500;
298
+ const platformFilter = opts.platform ?? 'all';
299
+ const now = new Date();
300
+ if (!['git', 'session', 'all'].includes(scope)) {
301
+ console.error(`Error: --scope must be one of git, session, all (got "${scope}")`);
302
+ process.exit(1);
303
+ }
304
+ // Parse --since
305
+ const sinceDate = parseSince(opts.since, cwd);
306
+ const sinceMs = new Date(sinceDate).getTime();
307
+ const days = Math.max(1, Math.round((now.getTime() - sinceMs) / (1000 * 60 * 60 * 24)));
308
+ // Collect events from each source
309
+ const gitEvents = (scope === 'session')
310
+ ? []
311
+ : collectGitEvents(sinceDate, cwd);
312
+ let sessionEvents = (scope === 'git')
313
+ ? []
314
+ : await collectSessionEvents(sinceDate);
315
+ if (platformFilter !== 'all' && sessionEvents.length > 0) {
316
+ sessionEvents = sessionEvents.filter(s => s.platform === platformFilter);
317
+ }
318
+ // Merge and sort
319
+ const allEvents = [...gitEvents, ...sessionEvents]
320
+ .sort((a, b) => new Date(b.at).getTime() - new Date(a.at).getTime())
321
+ .slice(0, limit);
322
+ // Compute summaries
323
+ const allGitFiles = new Set();
324
+ for (const ev of gitEvents) {
325
+ for (const f of ev.files)
326
+ allGitFiles.add(f);
327
+ }
328
+ const gitSummary = (scope === 'session')
329
+ ? { commits: 0, files_changed: 0, insertions: 0, deletions: 0 }
330
+ : computeGitSummary(sinceDate, cwd, gitEvents.length, allGitFiles);
331
+ const sessionsWithEdits = sessionEvents.filter(s => s.edited_files.length > 0);
332
+ const lastSessionDate = sessionEvents.length > 0
333
+ ? sessionEvents.sort((a, b) => new Date(b.at).getTime() - new Date(a.at).getTime())[0].at
334
+ : null;
335
+ const byPlatform = {};
336
+ for (const s of sessionEvents) {
337
+ const p = s.platform ?? 'unknown';
338
+ byPlatform[p] = (byPlatform[p] ?? 0) + 1;
339
+ }
340
+ const sessionSummary = {
341
+ total: sessionEvents.length,
342
+ with_edits: sessionsWithEdits.length,
343
+ last_session: lastSessionDate,
344
+ by_platform: byPlatform,
345
+ };
346
+ const hotPaths = computeHotPaths(allEvents, 10);
347
+ const coldWorkflowFiles = findColdWorkflowFiles(sinceDate, cwd);
348
+ const output = {
349
+ window: {
350
+ from: sinceDate,
351
+ to: now.toISOString(),
352
+ days,
353
+ },
354
+ git_summary: gitSummary,
355
+ session_summary: sessionSummary,
356
+ events: allEvents,
357
+ hot_paths: hotPaths,
358
+ cold_workflow_files: coldWorkflowFiles,
359
+ };
360
+ // Output
361
+ if (opts.json || opts.output) {
362
+ const jsonStr = JSON.stringify(output, null, 2);
363
+ if (opts.output) {
364
+ const outPath = resolve(opts.output);
365
+ writeFileSync(outPath, jsonStr, 'utf-8');
366
+ console.log(`Timeline written to ${outPath}`);
367
+ }
368
+ if (opts.json) {
369
+ console.log(jsonStr);
370
+ }
371
+ }
372
+ else {
373
+ console.log(formatHumanOutput(output));
374
+ }
375
+ });
376
+ }
377
+ //# sourceMappingURL=timeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline.js","sourceRoot":"","sources":["../../../src/commands/timeline.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,11 @@ export interface ComponentDef {
17
17
  * `false` = opt-in only; user must explicitly tick to install.
18
18
  */
19
19
  defaultSelected?: boolean;
20
+ /**
21
+ * If true, this component is always installed and cannot be deselected.
22
+ * Core infrastructure components (workflows, templates, chains, etc.) should be mandatory.
23
+ */
24
+ mandatory?: boolean;
20
25
  /**
21
26
  * Build callback — when present, the install pipeline calls this instead of
22
27
  * copyRecursive. Receives the `.claude` directory (source of truth) and the
@@ -41,6 +46,12 @@ export interface ComponentDef {
41
46
  * Components sharing the same category display under a shared header.
42
47
  */
43
48
  category?: string;
49
+ /**
50
+ * Target platform for this component. Used by TUI to group and filter components.
51
+ * 'shared' = always visible regardless of platform selection.
52
+ * undefined = treated as 'shared' for backward compat.
53
+ */
54
+ platform?: 'claude' | 'codex' | 'agy' | 'agents-standard' | 'shared';
44
55
  }
45
56
  export declare const COMPONENT_DEFS: ComponentDef[];
46
57
  export declare function migrateComponentIds(ids: string[]): string[];
@@ -1 +1 @@
1
- {"version":3,"file":"component-defs.d.ts","sourceRoot":"","sources":["../../../src/core/component-defs.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,MAAM,EAAE,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC;IACpE,4DAA4D;IAC5D,YAAY,EAAE,OAAO,CAAC;IACtB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACpE;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAyED,eAAO,MAAM,cAAc,EAAE,YAAY,EA8UxC,CAAC;AAaF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAW3D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAShE"}
1
+ {"version":3,"file":"component-defs.d.ts","sourceRoot":"","sources":["../../../src/core/component-defs.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,MAAM,EAAE,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC;IACpE,4DAA4D;IAC5D,YAAY,EAAE,OAAO,CAAC;IACtB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACpE;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,iBAAiB,GAAG,QAAQ,CAAC;CACtE;AAyED,eAAO,MAAM,cAAc,EAAE,YAAY,EA8WxC,CAAC;AAaF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAW3D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAShE"}
@@ -73,6 +73,8 @@ export const COMPONENT_DEFS = [
73
73
  sourcePath: 'workflows',
74
74
  target: () => join(paths.home, 'workflows'),
75
75
  alwaysGlobal: true,
76
+ mandatory: true,
77
+ platform: 'shared',
76
78
  },
77
79
  {
78
80
  id: 'templates',
@@ -81,6 +83,8 @@ export const COMPONENT_DEFS = [
81
83
  sourcePath: 'templates',
82
84
  target: () => join(paths.home, 'templates'),
83
85
  alwaysGlobal: true,
86
+ mandatory: true,
87
+ platform: 'shared',
84
88
  },
85
89
  {
86
90
  id: 'chains',
@@ -89,6 +93,8 @@ export const COMPONENT_DEFS = [
89
93
  sourcePath: 'chains',
90
94
  target: () => join(paths.home, 'chains'),
91
95
  alwaysGlobal: true,
96
+ mandatory: true,
97
+ platform: 'shared',
92
98
  },
93
99
  {
94
100
  id: 'overlays',
@@ -97,6 +103,8 @@ export const COMPONENT_DEFS = [
97
103
  sourcePath: join('overlays', '_shipped'),
98
104
  target: () => join(paths.home, 'overlays', '_shipped'),
99
105
  alwaysGlobal: true,
106
+ mandatory: true,
107
+ platform: 'shared',
100
108
  },
101
109
  {
102
110
  id: 'commands',
@@ -107,7 +115,9 @@ export const COMPONENT_DEFS = [
107
115
  ? join(homedir(), '.claude', 'commands')
108
116
  : join(projectPath, '.claude', 'commands'),
109
117
  alwaysGlobal: false,
118
+ mandatory: true,
110
119
  category: 'commands',
120
+ platform: 'claude',
111
121
  fileFilter: (name) => !name.startsWith('odyssey-') && !name.startsWith('learn-'),
112
122
  },
113
123
  {
@@ -120,7 +130,7 @@ export const COMPONENT_DEFS = [
120
130
  : join(projectPath, '.claude', 'commands'),
121
131
  alwaysGlobal: false,
122
132
  category: 'commands',
123
- defaultSelected: false,
133
+ platform: 'claude',
124
134
  fileFilter: (name) => name.startsWith('odyssey-'),
125
135
  },
126
136
  {
@@ -133,7 +143,7 @@ export const COMPONENT_DEFS = [
133
143
  : join(projectPath, '.claude', 'commands'),
134
144
  alwaysGlobal: false,
135
145
  category: 'commands',
136
- defaultSelected: false,
146
+ platform: 'claude',
137
147
  fileFilter: (name) => name.startsWith('learn-'),
138
148
  },
139
149
  {
@@ -145,6 +155,8 @@ export const COMPONENT_DEFS = [
145
155
  ? join(homedir(), '.claude', 'agents')
146
156
  : join(projectPath, '.claude', 'agents'),
147
157
  alwaysGlobal: false,
158
+ mandatory: true,
159
+ platform: 'claude',
148
160
  },
149
161
  {
150
162
  id: 'skills',
@@ -155,7 +167,9 @@ export const COMPONENT_DEFS = [
155
167
  ? join(homedir(), '.claude', 'skills')
156
168
  : join(projectPath, '.claude', 'skills'),
157
169
  alwaysGlobal: false,
170
+ mandatory: true,
158
171
  category: 'skills',
172
+ platform: 'claude',
159
173
  fileFilter: (name) => !NON_CORE_SKILL_NAMES.has(name),
160
174
  },
161
175
  {
@@ -167,7 +181,9 @@ export const COMPONENT_DEFS = [
167
181
  ? join(homedir(), '.claude', 'skills')
168
182
  : join(projectPath, '.claude', 'skills'),
169
183
  alwaysGlobal: false,
184
+ mandatory: true,
170
185
  category: 'skills',
186
+ platform: 'claude',
171
187
  fileFilter: (name) => BUILTIN_TEAM_SKILLS.has(name),
172
188
  },
173
189
  {
@@ -179,7 +195,9 @@ export const COMPONENT_DEFS = [
179
195
  ? join(homedir(), '.claude', 'CLAUDE.md')
180
196
  : join(projectPath, '.claude', 'CLAUDE.md'),
181
197
  alwaysGlobal: false,
198
+ mandatory: true,
182
199
  inject: true,
200
+ platform: 'claude',
183
201
  },
184
202
  {
185
203
  id: 'codex-agents-md',
@@ -191,6 +209,7 @@ export const COMPONENT_DEFS = [
191
209
  : join(projectPath, '.codex', 'AGENTS.md'),
192
210
  alwaysGlobal: false,
193
211
  inject: true,
212
+ platform: 'codex',
194
213
  },
195
214
  {
196
215
  id: 'claude-md-chinese',
@@ -203,6 +222,7 @@ export const COMPONENT_DEFS = [
203
222
  alwaysGlobal: false,
204
223
  inject: true,
205
224
  section: 'chinese',
225
+ platform: 'claude',
206
226
  },
207
227
  {
208
228
  id: 'codex-md-chinese',
@@ -215,6 +235,7 @@ export const COMPONENT_DEFS = [
215
235
  alwaysGlobal: false,
216
236
  inject: true,
217
237
  section: 'chinese',
238
+ platform: 'codex',
218
239
  },
219
240
  {
220
241
  id: 'codex-agents',
@@ -225,6 +246,7 @@ export const COMPONENT_DEFS = [
225
246
  ? join(homedir(), '.codex', 'agents')
226
247
  : join(projectPath, '.codex', 'agents'),
227
248
  alwaysGlobal: false,
249
+ platform: 'codex',
228
250
  },
229
251
  {
230
252
  id: 'codex-skills',
@@ -235,6 +257,7 @@ export const COMPONENT_DEFS = [
235
257
  ? join(homedir(), '.codex', 'skills')
236
258
  : join(projectPath, '.codex', 'skills'),
237
259
  alwaysGlobal: false,
260
+ platform: 'codex',
238
261
  },
239
262
  // ---------------------------------------------------------------------------
240
263
  // Antigravity (agy) CLI assets
@@ -255,6 +278,7 @@ export const COMPONENT_DEFS = [
255
278
  : join(projectPath, 'AGENTS.md'),
256
279
  alwaysGlobal: false,
257
280
  inject: true,
281
+ platform: 'agy',
258
282
  },
259
283
  {
260
284
  id: 'agy-md-chinese',
@@ -267,6 +291,7 @@ export const COMPONENT_DEFS = [
267
291
  alwaysGlobal: false,
268
292
  inject: true,
269
293
  section: 'chinese',
294
+ platform: 'agy',
270
295
  },
271
296
  {
272
297
  id: 'agy-skills',
@@ -278,6 +303,7 @@ export const COMPONENT_DEFS = [
278
303
  ? join(homedir(), '.gemini', 'antigravity-cli', 'skills')
279
304
  : join(projectPath, '.agents', 'skills'),
280
305
  alwaysGlobal: false,
306
+ platform: 'agy',
281
307
  build: (claudeDir, targetDir) => {
282
308
  const { buildAgySkills } = require('./skill-converter.js');
283
309
  return buildAgySkills(claudeDir, targetDir);
@@ -293,6 +319,7 @@ export const COMPONENT_DEFS = [
293
319
  ? join(homedir(), '.gemini', 'antigravity-cli', 'agents')
294
320
  : join(projectPath, '.agents', 'agents'),
295
321
  alwaysGlobal: false,
322
+ platform: 'agy',
296
323
  build: (claudeDir, targetDir) => {
297
324
  const { buildAgyAgents } = require('./skill-converter.js');
298
325
  return buildAgyAgents(claudeDir, targetDir);
@@ -316,6 +343,7 @@ export const COMPONENT_DEFS = [
316
343
  ? join(homedir(), '.agents', 'skills')
317
344
  : join(projectPath, '.agents', 'skills'),
318
345
  alwaysGlobal: false,
346
+ platform: 'agents-standard',
319
347
  build: (claudeDir, targetDir) => {
320
348
  const { buildAgentsStandardSkills } = require('./skill-converter.js');
321
349
  return buildAgentsStandardSkills(claudeDir, targetDir);
@@ -331,6 +359,7 @@ export const COMPONENT_DEFS = [
331
359
  ? join(homedir(), '.agents', 'agents')
332
360
  : join(projectPath, '.agents', 'agents'),
333
361
  alwaysGlobal: false,
362
+ platform: 'agents-standard',
334
363
  build: (claudeDir, targetDir) => {
335
364
  const { buildAgentsStandardAgents } = require('./skill-converter.js');
336
365
  return buildAgentsStandardAgents(claudeDir, targetDir);
@@ -349,6 +378,7 @@ export const COMPONENT_DEFS = [
349
378
  : join(projectPath, '.claude', 'skills'),
350
379
  alwaysGlobal: false,
351
380
  category: 'skills',
381
+ platform: 'claude',
352
382
  defaultSelected: false,
353
383
  fileFilter: (name) => EXTRA_TEAM_SKILL_NAMES.has(name),
354
384
  },
@@ -362,6 +392,7 @@ export const COMPONENT_DEFS = [
362
392
  : join(projectPath, '.claude', 'skills'),
363
393
  alwaysGlobal: false,
364
394
  category: 'skills',
395
+ platform: 'claude',
365
396
  defaultSelected: false,
366
397
  fileFilter: (name) => SCHOLAR_SKILL_NAMES.has(name),
367
398
  },
@@ -375,6 +406,7 @@ export const COMPONENT_DEFS = [
375
406
  : join(projectPath, '.claude', 'skills'),
376
407
  alwaysGlobal: false,
377
408
  category: 'skills',
409
+ platform: 'claude',
378
410
  defaultSelected: false,
379
411
  fileFilter: (name) => META_SKILL_NAMES.has(name),
380
412
  },