@fureworks/scope 0.1.0 → 0.3.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.
Files changed (104) hide show
  1. package/README.md +129 -48
  2. package/dist/cli/clean.d.ts +7 -0
  3. package/dist/cli/clean.d.ts.map +1 -0
  4. package/dist/cli/clean.js +49 -0
  5. package/dist/cli/clean.js.map +1 -0
  6. package/dist/cli/config.d.ts +8 -1
  7. package/dist/cli/config.d.ts.map +1 -1
  8. package/dist/cli/config.js +368 -42
  9. package/dist/cli/config.js.map +1 -1
  10. package/dist/cli/diff.d.ts +6 -0
  11. package/dist/cli/diff.d.ts.map +1 -0
  12. package/dist/cli/diff.js +63 -0
  13. package/dist/cli/diff.js.map +1 -0
  14. package/dist/cli/init.d.ts +2 -0
  15. package/dist/cli/init.d.ts.map +1 -0
  16. package/dist/cli/init.js +15 -0
  17. package/dist/cli/init.js.map +1 -0
  18. package/dist/cli/notifications.d.ts +7 -0
  19. package/dist/cli/notifications.d.ts.map +1 -0
  20. package/dist/cli/notifications.js +77 -0
  21. package/dist/cli/notifications.js.map +1 -0
  22. package/dist/cli/onboard.d.ts.map +1 -1
  23. package/dist/cli/onboard.js +2 -1
  24. package/dist/cli/onboard.js.map +1 -1
  25. package/dist/cli/plan.d.ts +7 -0
  26. package/dist/cli/plan.d.ts.map +1 -0
  27. package/dist/cli/plan.js +111 -0
  28. package/dist/cli/plan.js.map +1 -0
  29. package/dist/cli/review.d.ts +6 -0
  30. package/dist/cli/review.d.ts.map +1 -0
  31. package/dist/cli/review.js +167 -0
  32. package/dist/cli/review.js.map +1 -0
  33. package/dist/cli/snooze.d.ts +12 -0
  34. package/dist/cli/snooze.d.ts.map +1 -0
  35. package/dist/cli/snooze.js +155 -0
  36. package/dist/cli/snooze.js.map +1 -0
  37. package/dist/cli/today.d.ts.map +1 -1
  38. package/dist/cli/today.js +85 -11
  39. package/dist/cli/today.js.map +1 -1
  40. package/dist/cli/tune.d.ts +8 -0
  41. package/dist/cli/tune.d.ts.map +1 -0
  42. package/dist/cli/tune.js +62 -0
  43. package/dist/cli/tune.js.map +1 -0
  44. package/dist/engine/__tests__/prioritize.test.d.ts +2 -0
  45. package/dist/engine/__tests__/prioritize.test.d.ts.map +1 -0
  46. package/dist/engine/__tests__/prioritize.test.js +199 -0
  47. package/dist/engine/__tests__/prioritize.test.js.map +1 -0
  48. package/dist/engine/prioritize.d.ts +10 -2
  49. package/dist/engine/prioritize.d.ts.map +1 -1
  50. package/dist/engine/prioritize.js +249 -50
  51. package/dist/engine/prioritize.js.map +1 -1
  52. package/dist/index.js +61 -5
  53. package/dist/index.js.map +1 -1
  54. package/dist/notifications/index.d.ts.map +1 -1
  55. package/dist/notifications/index.js +6 -10
  56. package/dist/notifications/index.js.map +1 -1
  57. package/dist/sources/__tests__/git.test.d.ts +2 -0
  58. package/dist/sources/__tests__/git.test.d.ts.map +1 -0
  59. package/dist/sources/__tests__/git.test.js +52 -0
  60. package/dist/sources/__tests__/git.test.js.map +1 -0
  61. package/dist/sources/activity.d.ts +32 -0
  62. package/dist/sources/activity.d.ts.map +1 -0
  63. package/dist/sources/activity.js +101 -0
  64. package/dist/sources/activity.js.map +1 -0
  65. package/dist/sources/calendar.d.ts +6 -0
  66. package/dist/sources/calendar.d.ts.map +1 -1
  67. package/dist/sources/calendar.js +114 -0
  68. package/dist/sources/calendar.js.map +1 -1
  69. package/dist/sources/git.d.ts +3 -0
  70. package/dist/sources/git.d.ts.map +1 -1
  71. package/dist/sources/git.js +62 -6
  72. package/dist/sources/git.js.map +1 -1
  73. package/dist/sources/issues.d.ts +2 -0
  74. package/dist/sources/issues.d.ts.map +1 -1
  75. package/dist/sources/issues.js +33 -0
  76. package/dist/sources/issues.js.map +1 -1
  77. package/dist/store/config.d.ts +8 -0
  78. package/dist/store/config.d.ts.map +1 -1
  79. package/dist/store/config.js +22 -0
  80. package/dist/store/config.js.map +1 -1
  81. package/dist/store/muted.d.ts +17 -0
  82. package/dist/store/muted.d.ts.map +1 -0
  83. package/dist/store/muted.js +55 -0
  84. package/dist/store/muted.js.map +1 -0
  85. package/dist/store/snapshot.d.ts +12 -0
  86. package/dist/store/snapshot.d.ts.map +1 -0
  87. package/dist/store/snapshot.js +41 -0
  88. package/dist/store/snapshot.js.map +1 -0
  89. package/package.json +11 -3
  90. package/src/cli/config.ts +0 -66
  91. package/src/cli/context.ts +0 -109
  92. package/src/cli/daemon.ts +0 -217
  93. package/src/cli/onboard.ts +0 -335
  94. package/src/cli/status.ts +0 -77
  95. package/src/cli/switch.ts +0 -93
  96. package/src/cli/today.ts +0 -114
  97. package/src/engine/prioritize.ts +0 -257
  98. package/src/index.ts +0 -58
  99. package/src/notifications/index.ts +0 -42
  100. package/src/sources/calendar.ts +0 -170
  101. package/src/sources/git.ts +0 -168
  102. package/src/sources/issues.ts +0 -62
  103. package/src/store/config.ts +0 -104
  104. package/tsconfig.json +0 -19
package/dist/cli/today.js CHANGED
@@ -1,8 +1,9 @@
1
1
  import chalk from "chalk";
2
2
  import { loadConfig, configExists } from "../store/config.js";
3
+ import { getTimeContext, loadSnapshot, saveSnapshot } from "../store/snapshot.js";
3
4
  import { scanAllRepos } from "../sources/git.js";
4
5
  import { getCalendarToday } from "../sources/calendar.js";
5
- import { scanAssignedIssues } from "../sources/issues.js";
6
+ import { scanAssignedIssues, scanAllRepoIssues } from "../sources/issues.js";
6
7
  import { prioritize } from "../engine/prioritize.js";
7
8
  export async function todayCommand(options) {
8
9
  if (!configExists()) {
@@ -26,12 +27,34 @@ export async function todayCommand(options) {
26
27
  }
27
28
  const events = calendarEvents?.events ?? [];
28
29
  const freeBlocks = calendarEvents?.freeBlocks ?? [];
29
- const issueScan = await scanAssignedIssues();
30
+ // Scan issues from watched repos + assigned issues
31
+ const [repoIssues, issueScan] = await Promise.all([
32
+ scanAllRepoIssues(config.repos),
33
+ scanAssignedIssues(),
34
+ ]);
30
35
  if (!issueScan.available) {
31
36
  console.log(chalk.dim(" ⚠ GitHub issues not available. Install/auth gh to enable issue signals.\n"));
32
37
  }
38
+ // Merge repo issues with @me issues, dedup by number+repo
39
+ const issueKey = (i) => `${i.repo}#${i.number}`;
40
+ const seen = new Set();
41
+ const allIssues = [...repoIssues, ...issueScan.issues].filter((issue) => {
42
+ const key = issueKey(issue);
43
+ if (seen.has(key))
44
+ return false;
45
+ seen.add(key);
46
+ return true;
47
+ });
33
48
  // Prioritize
34
- const result = prioritize(gitSignals, events, freeBlocks, issueScan.issues);
49
+ const result = prioritize(gitSignals, events, freeBlocks, allIssues, config.weights);
50
+ const timeContext = getTimeContext();
51
+ // Save a morning snapshot for scope review/progress checks.
52
+ if (timeContext === "morning") {
53
+ saveSnapshot(result.now, result.today);
54
+ }
55
+ const snapshot = timeContext === "midday" || timeContext === "afternoon"
56
+ ? loadSnapshot()
57
+ : null;
35
58
  // Output
36
59
  if (options.json) {
37
60
  console.log(JSON.stringify(result, null, 2));
@@ -39,19 +62,40 @@ export async function todayCommand(options) {
39
62
  }
40
63
  console.log("");
41
64
  if (result.now.length === 0 && result.today.length === 0) {
42
- console.log(chalk.green(" ✓ Nothing urgent. You're clear.\n"));
43
- if (result.laterCount > 0) {
44
- console.log(chalk.dim(` ${result.laterCount} low-priority items → scope status\n`));
65
+ if (timeContext === "evening") {
66
+ console.log(" Day's winding down. Run `scope review` to wrap up.\n");
67
+ }
68
+ else {
69
+ console.log(chalk.green(" ✓ Nothing urgent. You're clear.\n"));
70
+ }
71
+ // Show ignored items even when nothing is urgent
72
+ if (result.ignored.length > 0) {
73
+ console.log(chalk.bold(" IGNORED"));
74
+ console.log(chalk.dim(" ───────"));
75
+ const shown = result.ignored.slice(0, 10);
76
+ for (const item of shown) {
77
+ console.log(chalk.dim(` ✗ ${item.label} — ${item.reason}`));
78
+ }
79
+ if (result.ignored.length > shown.length) {
80
+ console.log(chalk.dim(` and ${result.ignored.length - shown.length} more`));
81
+ }
82
+ console.log("");
45
83
  }
84
+ console.log(chalk.dim(" Nothing else needs you today.\n"));
46
85
  return;
47
86
  }
87
+ if (timeContext === "morning") {
88
+ console.log(" Good morning. Here's what matters:\n");
89
+ }
48
90
  // NOW section
49
91
  if (result.now.length > 0) {
50
92
  console.log(chalk.bold(" NOW"));
51
93
  console.log(chalk.dim(" ───"));
52
94
  for (const item of result.now) {
53
- console.log(` ${item.emoji} ${chalk.bold(item.label)}`);
95
+ const confTag = item.confidenceNote ? chalk.yellow(` (${item.confidenceNote})`) : "";
96
+ console.log(` ${item.emoji} ${chalk.bold(item.label)}${confTag}`);
54
97
  console.log(` ${chalk.dim(item.detail)}`);
98
+ console.log(` ${chalk.dim(`Why: ${item.reason}`)}`);
55
99
  }
56
100
  console.log("");
57
101
  }
@@ -60,11 +104,29 @@ export async function todayCommand(options) {
60
104
  console.log(chalk.bold(" TODAY"));
61
105
  console.log(chalk.dim(" ────"));
62
106
  for (const item of result.today) {
63
- console.log(` ${item.emoji} ${chalk.bold(item.label)}`);
107
+ const confTag = item.confidenceNote ? chalk.yellow(` (${item.confidenceNote})`) : "";
108
+ console.log(` ${item.emoji} ${chalk.bold(item.label)}${confTag}`);
64
109
  console.log(` ${chalk.dim(item.detail)}`);
110
+ console.log(` ${chalk.dim(`Why: ${item.reason}`)}`);
65
111
  }
66
112
  console.log("");
67
113
  }
114
+ // IGNORED section
115
+ if (result.ignored.length > 0) {
116
+ console.log(chalk.bold(" IGNORED"));
117
+ console.log(chalk.dim(" ───────"));
118
+ const shown = result.ignored.slice(0, 10);
119
+ for (const item of shown) {
120
+ console.log(chalk.dim(` ✗ ${item.label} — ${item.reason}`));
121
+ }
122
+ if (result.ignored.length > shown.length) {
123
+ console.log(chalk.dim(` and ${result.ignored.length - shown.length} more`));
124
+ }
125
+ console.log("");
126
+ }
127
+ if (result.now.length === 0) {
128
+ console.log(chalk.dim(" Nothing else needs you today.\n"));
129
+ }
68
130
  // Suggestions
69
131
  if (result.suggestions.length > 0) {
70
132
  for (const suggestion of result.suggestions) {
@@ -72,9 +134,21 @@ export async function todayCommand(options) {
72
134
  }
73
135
  console.log("");
74
136
  }
75
- // Later count
76
- if (result.laterCount > 0) {
77
- console.log(chalk.dim(` ${result.laterCount} other items can wait → scope status\n`));
137
+ // Temporal context: progress tracking
138
+ if (timeContext === "midday" && snapshot) {
139
+ const total = snapshot.now.length + snapshot.today.length;
140
+ console.log(` You had ${total} items this morning. Check back later to see progress.\n`);
141
+ }
142
+ if (timeContext === "afternoon" && snapshot) {
143
+ const morningItems = [...snapshot.now, ...snapshot.today];
144
+ const currentKeys = new Set([...result.now, ...result.today].map((item) => `${item.source}|${item.label}|${item.detail}`));
145
+ const left = morningItems.filter((item) => currentKeys.has(`${item.source}|${item.label}|${item.detail}`)).length;
146
+ const total = morningItems.length;
147
+ const done = total - left;
148
+ console.log(` ${done}/${total} from this morning done. ${left} remaining.\n`);
149
+ }
150
+ if (timeContext === "evening" && result.now.length > 0) {
151
+ console.log(" Late day — consider if these can wait until tomorrow.\n");
78
152
  }
79
153
  }
80
154
  //# sourceMappingURL=today.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"today.js","sourceRoot":"","sources":["../../src/cli/today.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"today.js","sourceRoot":"","sources":["../../src/cli/today.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ interface TuneOptions {
2
+ show?: boolean;
3
+ reset?: boolean;
4
+ config?: boolean;
5
+ }
6
+ export declare function tuneCommand(key: string | undefined, value: string | undefined, options: TuneOptions): Promise<void>;
7
+ export {};
8
+ //# sourceMappingURL=tune.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tune.d.ts","sourceRoot":"","sources":["../../src/cli/tune.ts"],"names":[],"mappings":"AAGA,UAAU,WAAW;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAID,wBAAsB,WAAW,CAC/B,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CA+Df"}
@@ -0,0 +1,62 @@
1
+ import chalk from "chalk";
2
+ import { loadConfig, saveConfig, DEFAULT_WEIGHTS } from "../store/config.js";
3
+ const VALID_KEYS = ["staleness", "blocking", "timePressure", "effort"];
4
+ export async function tuneCommand(key, value, options) {
5
+ const config = loadConfig();
6
+ if (options.show || (!key && !options.reset && !options.config)) {
7
+ console.log("");
8
+ console.log(chalk.bold(" Scoring Weights"));
9
+ console.log(chalk.dim(" ───────────────"));
10
+ for (const [k, v] of Object.entries(config.weights)) {
11
+ const isDefault = v === DEFAULT_WEIGHTS[k];
12
+ const label = isDefault ? chalk.dim("(default)") : chalk.yellow("(custom)");
13
+ console.log(` ${k}: ${v} ${label}`);
14
+ }
15
+ console.log("");
16
+ console.log(chalk.dim(" Multipliers on raw scores. 1.0 = default. Higher = more priority."));
17
+ console.log(chalk.dim(" Example: scope tune staleness 1.5 → stale items rank higher\n"));
18
+ return;
19
+ }
20
+ if (options.reset) {
21
+ config.weights = { ...DEFAULT_WEIGHTS };
22
+ saveConfig(config);
23
+ console.log(" ✓ Weights reset to defaults.\n");
24
+ return;
25
+ }
26
+ if (options.config) {
27
+ const editor = process.env.EDITOR || process.env.VISUAL || "vi";
28
+ const { execSync } = await import("node:child_process");
29
+ const { join } = await import("node:path");
30
+ const { homedir } = await import("node:os");
31
+ const configPath = join(homedir(), ".scope", "config.toml");
32
+ try {
33
+ execSync(`${editor} ${configPath}`, { stdio: "inherit" });
34
+ console.log(" ✓ Config saved.\n");
35
+ }
36
+ catch {
37
+ console.log(chalk.red(" Failed to open editor.\n"));
38
+ }
39
+ return;
40
+ }
41
+ if (key && value) {
42
+ if (!VALID_KEYS.includes(key)) {
43
+ console.log(chalk.red(` Unknown weight: ${key}`));
44
+ console.log(chalk.dim(` Valid keys: ${VALID_KEYS.join(", ")}\n`));
45
+ process.exit(1);
46
+ }
47
+ const num = parseFloat(value);
48
+ if (isNaN(num) || num < 0 || num > 10) {
49
+ console.log(chalk.red(` Invalid value: ${value}. Must be 0-10.\n`));
50
+ process.exit(1);
51
+ }
52
+ config.weights[key] = num;
53
+ saveConfig(config);
54
+ console.log(` ✓ ${key} set to ${num}\n`);
55
+ return;
56
+ }
57
+ if (key && !value) {
58
+ console.log(chalk.red(` Missing value. Usage: scope tune ${key} <number>\n`));
59
+ process.exit(1);
60
+ }
61
+ }
62
+ //# sourceMappingURL=tune.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tune.js","sourceRoot":"","sources":["../../src/cli/tune.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=prioritize.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prioritize.test.d.ts","sourceRoot":"","sources":["../../../src/engine/__tests__/prioritize.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,199 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ // Mock the muted store
3
+ vi.mock('../../store/muted.js', () => ({
4
+ isItemMuted: () => false,
5
+ }));
6
+ import { prioritize } from '../prioritize.js';
7
+ import { DEFAULT_WEIGHTS } from '../../store/config.js';
8
+ function makePR(overrides = {}) {
9
+ return {
10
+ number: 1,
11
+ title: 'Test PR',
12
+ url: 'https://github.com/test/repo/pull/1',
13
+ ageDays: 5,
14
+ reviewRequested: false,
15
+ reviewDecision: '',
16
+ ciStatus: 'unknown',
17
+ hasConflicts: false,
18
+ labels: [],
19
+ ...overrides,
20
+ };
21
+ }
22
+ function makeGitSignal(repo, prs) {
23
+ return {
24
+ repo,
25
+ branch: 'main',
26
+ uncommittedFiles: 0,
27
+ lastCommitAge: 1,
28
+ staleBranches: [],
29
+ openPRs: prs, myPRs: [],
30
+ };
31
+ }
32
+ function makeIssue(overrides = {}) {
33
+ return {
34
+ number: 1,
35
+ title: 'Test Issue',
36
+ url: 'https://github.com/test/repo/issues/1',
37
+ repo: 'test/repo',
38
+ ageDays: 5,
39
+ labels: [],
40
+ ...overrides,
41
+ };
42
+ }
43
+ describe('prioritize', () => {
44
+ describe('graduated staleness scoring', () => {
45
+ it('should score a 51-day PR higher than a 15-day PR', () => {
46
+ const old = makePR({ number: 1, ageDays: 51 });
47
+ const newer = makePR({ number: 2, ageDays: 15 });
48
+ const result = prioritize([makeGitSignal('repo', [old, newer])], [], [], [], DEFAULT_WEIGHTS);
49
+ // Items may be in now, today, or ignored — collect all scored items
50
+ const allItems = [...result.now, ...result.today];
51
+ const oldItem = allItems.find(i => i.label.includes('#1'));
52
+ const newerItem = allItems.find(i => i.label.includes('#2'));
53
+ // At least the older one should surface
54
+ expect(oldItem).toBeDefined();
55
+ // 51 * 0.6 = 30.6 → 31 (capped at 30), 15 * 0.6 = 9
56
+ expect(oldItem.score).toBeGreaterThan(9);
57
+ // Newer may be in ignored, but its raw score should be lower
58
+ // Score: 51-day = 30, 15-day = 9 → differentiated
59
+ expect(oldItem.score).toBeGreaterThanOrEqual(25); // "now" tier
60
+ });
61
+ it('should score a 30-day PR higher than a 16-day PR', () => {
62
+ const thirtyDay = makePR({ number: 1, ageDays: 30 });
63
+ const sixteenDay = makePR({ number: 2, ageDays: 16 });
64
+ const result = prioritize([makeGitSignal('repo', [thirtyDay, sixteenDay])], [], [], [], DEFAULT_WEIGHTS);
65
+ // 30 * 0.6 = 18 (today), 16 * 0.6 = 9.6 → 10 (later)
66
+ const allItems = [...result.now, ...result.today];
67
+ const item30 = allItems.find(i => i.label.includes('#1'));
68
+ expect(item30).toBeDefined();
69
+ expect(item30.score).toBe(18); // 30 * 0.6 = 18
70
+ });
71
+ });
72
+ describe('label-based scoring', () => {
73
+ it('should score a P0-labeled PR higher than an unlabeled PR', () => {
74
+ const p0 = makePR({ number: 1, ageDays: 10, labels: ['P0-critical'] });
75
+ const plain = makePR({ number: 2, ageDays: 10, labels: [] });
76
+ const result = prioritize([makeGitSignal('repo', [p0, plain])], [], [], [], DEFAULT_WEIGHTS);
77
+ // P0 score: 10*0.6=6 + 15(P0 boost) = 21 (today)
78
+ // Plain score: 10*0.6=6 (later)
79
+ const allItems = [...result.now, ...result.today];
80
+ const p0Item = allItems.find(i => i.label.includes('#1'));
81
+ expect(p0Item).toBeDefined();
82
+ expect(p0Item.score).toBe(21); // 6 + 15
83
+ });
84
+ it('should boost compliance-labeled items', () => {
85
+ const compliance = makePR({ number: 1, ageDays: 10, labels: ['compliance'] });
86
+ const plain = makePR({ number: 2, ageDays: 10, labels: [] });
87
+ const result = prioritize([makeGitSignal('repo', [compliance, plain])], [], [], [], DEFAULT_WEIGHTS);
88
+ // Compliance score: 6 + 12 = 18 (today)
89
+ // Plain score: 6 (later)
90
+ const allItems = [...result.now, ...result.today];
91
+ const compItem = allItems.find(i => i.label.includes('#1'));
92
+ expect(compItem).toBeDefined();
93
+ expect(compItem.score).toBe(18); // 6 + 12
94
+ });
95
+ });
96
+ describe('confidence notes', () => {
97
+ it('should NOT say "no reviewer assigned" when reviewDecision exists', () => {
98
+ const pr = makePR({
99
+ number: 1,
100
+ ageDays: 30, // high enough to surface in today
101
+ reviewRequested: false,
102
+ reviewDecision: 'CHANGES_REQUESTED',
103
+ });
104
+ const result = prioritize([makeGitSignal('repo', [pr])], [], [], [], DEFAULT_WEIGHTS);
105
+ const allItems = [...result.now, ...result.today];
106
+ const item = allItems.find(i => i.label.includes('#1'));
107
+ expect(item).toBeDefined();
108
+ // With reviewDecision set, should not flag "no reviewer assigned"
109
+ if (item?.confidenceNote) {
110
+ expect(item.confidenceNote).not.toContain('no reviewer assigned');
111
+ }
112
+ });
113
+ });
114
+ describe('issue scoring', () => {
115
+ it('should include issues in output', () => {
116
+ const issue = makeIssue({ number: 42, ageDays: 20 });
117
+ const result = prioritize([], [], [], [issue], DEFAULT_WEIGHTS);
118
+ const allItems = [...result.now, ...result.today];
119
+ expect(allItems.some(i => i.source === 'issue')).toBe(true);
120
+ });
121
+ });
122
+ describe('calendar scoring', () => {
123
+ it('should classify meeting in 10 minutes as NOW', () => {
124
+ const event = {
125
+ title: 'Standup',
126
+ startTime: new Date(Date.now() + 10 * 60 * 1000),
127
+ endTime: new Date(Date.now() + 40 * 60 * 1000),
128
+ minutesUntilStart: 10,
129
+ durationMinutes: 30,
130
+ };
131
+ const result = prioritize([], [event], [], [], DEFAULT_WEIGHTS);
132
+ const item = result.now.find(i => i.source === 'calendar');
133
+ expect(item).toBeDefined();
134
+ expect(item.score).toBeGreaterThanOrEqual(25);
135
+ });
136
+ it('should classify meeting in 45 minutes as TODAY', () => {
137
+ const event = {
138
+ title: 'Review',
139
+ startTime: new Date(Date.now() + 45 * 60 * 1000),
140
+ endTime: new Date(Date.now() + 75 * 60 * 1000),
141
+ minutesUntilStart: 45,
142
+ durationMinutes: 30,
143
+ };
144
+ const result = prioritize([], [event], [], [], DEFAULT_WEIGHTS);
145
+ const item = result.today.find(i => i.source === 'calendar');
146
+ expect(item).toBeDefined();
147
+ expect(item.score).toBeGreaterThanOrEqual(12);
148
+ });
149
+ });
150
+ describe('uncommitted work scoring', () => {
151
+ it('should classify 3+ days uncommitted as NOW', () => {
152
+ const signal = {
153
+ repo: 'myrepo',
154
+ branch: 'main',
155
+ uncommittedFiles: 5,
156
+ lastCommitAge: 80, // hours (>72 = 3+ days)
157
+ staleBranches: [],
158
+ openPRs: [], myPRs: [],
159
+ };
160
+ const result = prioritize([signal], [], [], [], DEFAULT_WEIGHTS);
161
+ const item = result.now.find(i => i.source === 'git');
162
+ expect(item).toBeDefined();
163
+ expect(item.score).toBeGreaterThanOrEqual(25);
164
+ });
165
+ it('should classify 1-3 days uncommitted as TODAY', () => {
166
+ const signal = {
167
+ repo: 'myrepo',
168
+ branch: 'main',
169
+ uncommittedFiles: 3,
170
+ lastCommitAge: 36, // hours (>24, <72)
171
+ staleBranches: [],
172
+ openPRs: [], myPRs: [],
173
+ };
174
+ const result = prioritize([signal], [], [], [], DEFAULT_WEIGHTS);
175
+ const item = result.today.find(i => i.source === 'git');
176
+ expect(item).toBeDefined();
177
+ expect(item.score).toBeGreaterThanOrEqual(12);
178
+ });
179
+ });
180
+ describe('label pattern matching', () => {
181
+ it('should not match p1 in p10 label', () => {
182
+ const p10 = makePR({ number: 1, ageDays: 10, labels: ['p10-backlog'] });
183
+ const p1 = makePR({ number: 2, ageDays: 10, labels: ['P1-important'] });
184
+ const result = prioritize([makeGitSignal('repo', [p10, p1])], [], [], [], DEFAULT_WEIGHTS);
185
+ const allItems = [...result.now, ...result.today];
186
+ const p10Item = allItems.find(i => i.label.includes('#1'));
187
+ const p1Item = allItems.find(i => i.label.includes('#2'));
188
+ // p10 should not get the P1 boost
189
+ // p1 should get P1 boost (+10)
190
+ expect(p1Item).toBeDefined();
191
+ expect(p1Item.score).toBe(16); // 6 + 10
192
+ // p10 with no matching pattern = just age score
193
+ if (p10Item) {
194
+ expect(p10Item.score).toBe(6); // just age, no boost
195
+ }
196
+ });
197
+ });
198
+ });
199
+ //# sourceMappingURL=prioritize.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prioritize.test.js","sourceRoot":"","sources":["../../../src/engine/__tests__/prioritize.test.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { GitSignal } from "../sources/git.js";
2
2
  import { CalendarEvent, FreeBlock } from "../sources/calendar.js";
3
3
  import { IssueSignal } from "../sources/issues.js";
4
+ import { ScoringWeights } from "../store/config.js";
4
5
  export type Priority = "now" | "today" | "later";
5
6
  export interface ScoredItem {
6
7
  priority: Priority;
@@ -8,14 +9,21 @@ export interface ScoredItem {
8
9
  emoji: string;
9
10
  label: string;
10
11
  detail: string;
12
+ reason: string;
13
+ confidence: "high" | "medium" | "low";
14
+ confidenceNote?: string;
11
15
  source: "git" | "calendar" | "pr" | "issue";
12
16
  }
13
17
  export interface PrioritizedOutput {
14
18
  now: ScoredItem[];
15
19
  today: ScoredItem[];
16
- laterCount: number;
20
+ ignored: Array<{
21
+ label: string;
22
+ reason: string;
23
+ }>;
24
+ readonly laterCount: number;
17
25
  freeBlocks: FreeBlock[];
18
26
  suggestions: string[];
19
27
  }
20
- export declare function prioritize(gitSignals: GitSignal[], calendarEvents: CalendarEvent[], freeBlocks: FreeBlock[], issues: IssueSignal[]): PrioritizedOutput;
28
+ export declare function prioritize(gitSignals: GitSignal[], calendarEvents: CalendarEvent[], freeBlocks: FreeBlock[], issues: IssueSignal[], weights?: ScoringWeights): PrioritizedOutput;
21
29
  //# sourceMappingURL=prioritize.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prioritize.d.ts","sourceRoot":"","sources":["../../src/engine/prioritize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAU,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,OAAO,CAAC;AAEjD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,KAAK,GAAG,UAAU,GAAG,IAAI,GAAG,OAAO,CAAC;CAC7C;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,UAAU,EAAE,CAAC;IAClB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AA4JD,wBAAgB,UAAU,CACxB,UAAU,EAAE,SAAS,EAAE,EACvB,cAAc,EAAE,aAAa,EAAE,EAC/B,UAAU,EAAE,SAAS,EAAE,EACvB,MAAM,EAAE,WAAW,EAAE,GACpB,iBAAiB,CA0EnB"}
1
+ {"version":3,"file":"prioritize.d.ts","sourceRoot":"","sources":["../../src/engine/prioritize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAU,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAmB,MAAM,oBAAoB,CAAC;AAErE,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,OAAO,CAAC;AAEjD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,KAAK,GAAG,UAAU,GAAG,IAAI,GAAG,OAAO,CAAC;CAC7C;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,UAAU,EAAE,CAAC;IAClB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAuTD,wBAAgB,UAAU,CACxB,UAAU,EAAE,SAAS,EAAE,EACvB,cAAc,EAAE,aAAa,EAAE,EAC/B,UAAU,EAAE,SAAS,EAAE,EACvB,MAAM,EAAE,WAAW,EAAE,EACrB,OAAO,GAAE,cAAgC,GACxC,iBAAiB,CA0HnB"}