@fureworks/scope 0.1.0 → 0.2.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/README.md +129 -48
- package/dist/cli/config.d.ts +8 -1
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +368 -42
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +15 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/notifications.d.ts +7 -0
- package/dist/cli/notifications.d.ts.map +1 -0
- package/dist/cli/notifications.js +77 -0
- package/dist/cli/notifications.js.map +1 -0
- package/dist/cli/onboard.d.ts.map +1 -1
- package/dist/cli/onboard.js +2 -1
- package/dist/cli/onboard.js.map +1 -1
- package/dist/cli/plan.d.ts +7 -0
- package/dist/cli/plan.d.ts.map +1 -0
- package/dist/cli/plan.js +111 -0
- package/dist/cli/plan.js.map +1 -0
- package/dist/cli/review.d.ts +6 -0
- package/dist/cli/review.d.ts.map +1 -0
- package/dist/cli/review.js +167 -0
- package/dist/cli/review.js.map +1 -0
- package/dist/cli/snooze.d.ts +12 -0
- package/dist/cli/snooze.d.ts.map +1 -0
- package/dist/cli/snooze.js +155 -0
- package/dist/cli/snooze.js.map +1 -0
- package/dist/cli/today.d.ts.map +1 -1
- package/dist/cli/today.js +69 -9
- package/dist/cli/today.js.map +1 -1
- package/dist/cli/tune.d.ts +8 -0
- package/dist/cli/tune.d.ts.map +1 -0
- package/dist/cli/tune.js +62 -0
- package/dist/cli/tune.js.map +1 -0
- package/dist/engine/prioritize.d.ts +10 -2
- package/dist/engine/prioritize.d.ts.map +1 -1
- package/dist/engine/prioritize.js +156 -25
- package/dist/engine/prioritize.js.map +1 -1
- package/dist/index.js +48 -5
- package/dist/index.js.map +1 -1
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +6 -10
- package/dist/notifications/index.js.map +1 -1
- package/dist/sources/activity.d.ts +32 -0
- package/dist/sources/activity.d.ts.map +1 -0
- package/dist/sources/activity.js +101 -0
- package/dist/sources/activity.js.map +1 -0
- package/dist/sources/calendar.d.ts +6 -0
- package/dist/sources/calendar.d.ts.map +1 -1
- package/dist/sources/calendar.js +114 -0
- package/dist/sources/calendar.js.map +1 -1
- package/dist/store/config.d.ts +8 -0
- package/dist/store/config.d.ts.map +1 -1
- package/dist/store/config.js +22 -0
- package/dist/store/config.js.map +1 -1
- package/dist/store/muted.d.ts +17 -0
- package/dist/store/muted.d.ts.map +1 -0
- package/dist/store/muted.js +55 -0
- package/dist/store/muted.js.map +1 -0
- package/dist/store/snapshot.d.ts +12 -0
- package/dist/store/snapshot.d.ts.map +1 -0
- package/dist/store/snapshot.js +41 -0
- package/dist/store/snapshot.js.map +1 -0
- package/package.json +8 -2
- package/src/cli/config.ts +0 -66
- package/src/cli/context.ts +0 -109
- package/src/cli/daemon.ts +0 -217
- package/src/cli/onboard.ts +0 -335
- package/src/cli/status.ts +0 -77
- package/src/cli/switch.ts +0 -93
- package/src/cli/today.ts +0 -114
- package/src/engine/prioritize.ts +0 -257
- package/src/index.ts +0 -58
- package/src/notifications/index.ts +0 -42
- package/src/sources/calendar.ts +0 -170
- package/src/sources/git.ts +0 -168
- package/src/sources/issues.ts +0 -62
- package/src/store/config.ts +0 -104
- package/tsconfig.json +0 -19
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { loadMuted, saveMuted, } from "../store/muted.js";
|
|
3
|
+
const DAY_NAMES = [
|
|
4
|
+
"sunday",
|
|
5
|
+
"monday",
|
|
6
|
+
"tuesday",
|
|
7
|
+
"wednesday",
|
|
8
|
+
"thursday",
|
|
9
|
+
"friday",
|
|
10
|
+
"saturday",
|
|
11
|
+
];
|
|
12
|
+
export function parseUntilDate(input) {
|
|
13
|
+
const normalized = input.trim().toLowerCase();
|
|
14
|
+
const now = new Date();
|
|
15
|
+
if (normalized === "tomorrow") {
|
|
16
|
+
const tomorrow = new Date(now);
|
|
17
|
+
tomorrow.setHours(0, 0, 0, 0);
|
|
18
|
+
tomorrow.setDate(tomorrow.getDate() + 1);
|
|
19
|
+
return tomorrow;
|
|
20
|
+
}
|
|
21
|
+
const dayIndex = DAY_NAMES.indexOf(normalized);
|
|
22
|
+
if (dayIndex >= 0) {
|
|
23
|
+
const target = new Date(now);
|
|
24
|
+
target.setHours(0, 0, 0, 0);
|
|
25
|
+
const delta = (dayIndex - target.getDay() + 7) % 7 || 7;
|
|
26
|
+
target.setDate(target.getDate() + delta);
|
|
27
|
+
return target;
|
|
28
|
+
}
|
|
29
|
+
const relative = normalized.match(/^(\d+)([dw])$/);
|
|
30
|
+
if (relative) {
|
|
31
|
+
const amount = Number.parseInt(relative[1], 10);
|
|
32
|
+
const unit = relative[2];
|
|
33
|
+
const days = unit === "w" ? amount * 7 : amount;
|
|
34
|
+
const target = new Date(now);
|
|
35
|
+
target.setDate(target.getDate() + days);
|
|
36
|
+
return target;
|
|
37
|
+
}
|
|
38
|
+
if (/^\d{4}-\d{2}-\d{2}$/.test(normalized)) {
|
|
39
|
+
const target = new Date(`${normalized}T00:00:00`);
|
|
40
|
+
if (!Number.isNaN(target.getTime())) {
|
|
41
|
+
return target;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
throw new Error("Invalid --until value. Use: tomorrow, monday-sunday, 3d, 1w, or YYYY-MM-DD.");
|
|
45
|
+
}
|
|
46
|
+
function isValidItemId(id) {
|
|
47
|
+
return (/^(pr|issue):[^#\s]+#\d+$/.test(id) ||
|
|
48
|
+
/^git:[^\s]+$/.test(id));
|
|
49
|
+
}
|
|
50
|
+
function upsertSnooze(snoozed, entry) {
|
|
51
|
+
return [...snoozed.filter((existing) => existing.id !== entry.id), entry];
|
|
52
|
+
}
|
|
53
|
+
function upsertMute(muted, entry) {
|
|
54
|
+
return [...muted.filter((existing) => existing.id !== entry.id), entry];
|
|
55
|
+
}
|
|
56
|
+
function printList() {
|
|
57
|
+
const store = loadMuted();
|
|
58
|
+
console.log("");
|
|
59
|
+
console.log(chalk.bold(" Muted Items"));
|
|
60
|
+
if (store.muted.length === 0) {
|
|
61
|
+
console.log(chalk.dim(" (none)"));
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
for (const entry of store.muted) {
|
|
65
|
+
console.log(` - ${entry.id} ${chalk.dim(`(muted ${entry.created})`)}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
console.log("");
|
|
69
|
+
console.log(chalk.bold(" Snoozed Items"));
|
|
70
|
+
if (store.snoozed.length === 0) {
|
|
71
|
+
console.log(chalk.dim(" (none)"));
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
for (const entry of store.snoozed) {
|
|
75
|
+
console.log(` - ${entry.id} ${chalk.dim(`(until ${entry.until})`)}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
console.log("");
|
|
79
|
+
}
|
|
80
|
+
function clearItem(id) {
|
|
81
|
+
if (!isValidItemId(id)) {
|
|
82
|
+
console.log(chalk.yellow(" Invalid item id. Use pr:repo#123, issue:repo#123, or git:repo.\n"));
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const store = loadMuted();
|
|
86
|
+
const next = {
|
|
87
|
+
muted: store.muted.filter((entry) => entry.id !== id),
|
|
88
|
+
snoozed: store.snoozed.filter((entry) => entry.id !== id),
|
|
89
|
+
};
|
|
90
|
+
saveMuted(next);
|
|
91
|
+
if (next.muted.length === store.muted.length &&
|
|
92
|
+
next.snoozed.length === store.snoozed.length) {
|
|
93
|
+
console.log(chalk.dim(` No entry found for ${id}\n`));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
console.log(chalk.green(` Cleared: ${id}\n`));
|
|
97
|
+
}
|
|
98
|
+
export async function snoozeCommand(itemId, options) {
|
|
99
|
+
if (!isValidItemId(itemId)) {
|
|
100
|
+
console.log(chalk.yellow(" Invalid item id. Use pr:repo#123, issue:repo#123, or git:repo.\n"));
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
let untilDate;
|
|
104
|
+
try {
|
|
105
|
+
untilDate = parseUntilDate(options.until);
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
console.log(chalk.yellow(` ${error.message}\n`));
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (untilDate.getTime() <= Date.now()) {
|
|
112
|
+
console.log(chalk.yellow(" --until must resolve to a future time.\n"));
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const nowIso = new Date().toISOString();
|
|
116
|
+
const untilIso = untilDate.toISOString();
|
|
117
|
+
const store = loadMuted();
|
|
118
|
+
const next = {
|
|
119
|
+
muted: store.muted.filter((entry) => entry.id !== itemId),
|
|
120
|
+
snoozed: upsertSnooze(store.snoozed, {
|
|
121
|
+
id: itemId,
|
|
122
|
+
until: untilIso,
|
|
123
|
+
created: nowIso,
|
|
124
|
+
}),
|
|
125
|
+
};
|
|
126
|
+
saveMuted(next);
|
|
127
|
+
console.log(chalk.green(` Snoozed ${itemId} until ${untilIso}\n`));
|
|
128
|
+
}
|
|
129
|
+
export async function muteCommand(itemId, options) {
|
|
130
|
+
if (options.list) {
|
|
131
|
+
printList();
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (options.clear) {
|
|
135
|
+
clearItem(options.clear);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (!itemId) {
|
|
139
|
+
console.log(chalk.yellow(" Missing item id. Use: scope mute <item-id>, scope mute --list, or scope mute --clear <item-id>.\n"));
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
if (!isValidItemId(itemId)) {
|
|
143
|
+
console.log(chalk.yellow(" Invalid item id. Use pr:repo#123, issue:repo#123, or git:repo.\n"));
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const nowIso = new Date().toISOString();
|
|
147
|
+
const store = loadMuted();
|
|
148
|
+
const next = {
|
|
149
|
+
snoozed: store.snoozed.filter((entry) => entry.id !== itemId),
|
|
150
|
+
muted: upsertMute(store.muted, { id: itemId, created: nowIso }),
|
|
151
|
+
};
|
|
152
|
+
saveMuted(next);
|
|
153
|
+
console.log(chalk.green(` Muted ${itemId}\n`));
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=snooze.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snooze.js","sourceRoot":"","sources":["../../src/cli/snooze.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/today.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"today.d.ts","sourceRoot":"","sources":["../../src/cli/today.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"today.d.ts","sourceRoot":"","sources":["../../src/cli/today.ts"],"names":[],"mappings":"AAQA,UAAU,YAAY;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA0KvE"}
|
package/dist/cli/today.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
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
6
|
import { scanAssignedIssues } from "../sources/issues.js";
|
|
@@ -31,7 +32,15 @@ export async function todayCommand(options) {
|
|
|
31
32
|
console.log(chalk.dim(" ⚠ GitHub issues not available. Install/auth gh to enable issue signals.\n"));
|
|
32
33
|
}
|
|
33
34
|
// Prioritize
|
|
34
|
-
const result = prioritize(gitSignals, events, freeBlocks, issueScan.issues);
|
|
35
|
+
const result = prioritize(gitSignals, events, freeBlocks, issueScan.issues, config.weights);
|
|
36
|
+
const timeContext = getTimeContext();
|
|
37
|
+
// Save a morning snapshot for scope review/progress checks.
|
|
38
|
+
if (timeContext === "morning") {
|
|
39
|
+
saveSnapshot(result.now, result.today);
|
|
40
|
+
}
|
|
41
|
+
const snapshot = timeContext === "midday" || timeContext === "afternoon"
|
|
42
|
+
? loadSnapshot()
|
|
43
|
+
: null;
|
|
35
44
|
// Output
|
|
36
45
|
if (options.json) {
|
|
37
46
|
console.log(JSON.stringify(result, null, 2));
|
|
@@ -39,19 +48,40 @@ export async function todayCommand(options) {
|
|
|
39
48
|
}
|
|
40
49
|
console.log("");
|
|
41
50
|
if (result.now.length === 0 && result.today.length === 0) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
51
|
+
if (timeContext === "evening") {
|
|
52
|
+
console.log(" Day's winding down. Run `scope review` to wrap up.\n");
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
console.log(chalk.green(" ✓ Nothing urgent. You're clear.\n"));
|
|
56
|
+
}
|
|
57
|
+
// Show ignored items even when nothing is urgent
|
|
58
|
+
if (result.ignored.length > 0) {
|
|
59
|
+
console.log(chalk.bold(" IGNORED"));
|
|
60
|
+
console.log(chalk.dim(" ───────"));
|
|
61
|
+
const shown = result.ignored.slice(0, 10);
|
|
62
|
+
for (const item of shown) {
|
|
63
|
+
console.log(chalk.dim(` ✗ ${item.label} — ${item.reason}`));
|
|
64
|
+
}
|
|
65
|
+
if (result.ignored.length > shown.length) {
|
|
66
|
+
console.log(chalk.dim(` and ${result.ignored.length - shown.length} more`));
|
|
67
|
+
}
|
|
68
|
+
console.log("");
|
|
45
69
|
}
|
|
70
|
+
console.log(chalk.dim(" Nothing else needs you today.\n"));
|
|
46
71
|
return;
|
|
47
72
|
}
|
|
73
|
+
if (timeContext === "morning") {
|
|
74
|
+
console.log(" Good morning. Here's what matters:\n");
|
|
75
|
+
}
|
|
48
76
|
// NOW section
|
|
49
77
|
if (result.now.length > 0) {
|
|
50
78
|
console.log(chalk.bold(" NOW"));
|
|
51
79
|
console.log(chalk.dim(" ───"));
|
|
52
80
|
for (const item of result.now) {
|
|
53
|
-
|
|
81
|
+
const confTag = item.confidenceNote ? chalk.yellow(` (${item.confidenceNote})`) : "";
|
|
82
|
+
console.log(` ${item.emoji} ${chalk.bold(item.label)}${confTag}`);
|
|
54
83
|
console.log(` ${chalk.dim(item.detail)}`);
|
|
84
|
+
console.log(` ${chalk.dim(`Why: ${item.reason}`)}`);
|
|
55
85
|
}
|
|
56
86
|
console.log("");
|
|
57
87
|
}
|
|
@@ -60,11 +90,29 @@ export async function todayCommand(options) {
|
|
|
60
90
|
console.log(chalk.bold(" TODAY"));
|
|
61
91
|
console.log(chalk.dim(" ────"));
|
|
62
92
|
for (const item of result.today) {
|
|
63
|
-
|
|
93
|
+
const confTag = item.confidenceNote ? chalk.yellow(` (${item.confidenceNote})`) : "";
|
|
94
|
+
console.log(` ${item.emoji} ${chalk.bold(item.label)}${confTag}`);
|
|
64
95
|
console.log(` ${chalk.dim(item.detail)}`);
|
|
96
|
+
console.log(` ${chalk.dim(`Why: ${item.reason}`)}`);
|
|
65
97
|
}
|
|
66
98
|
console.log("");
|
|
67
99
|
}
|
|
100
|
+
// IGNORED section
|
|
101
|
+
if (result.ignored.length > 0) {
|
|
102
|
+
console.log(chalk.bold(" IGNORED"));
|
|
103
|
+
console.log(chalk.dim(" ───────"));
|
|
104
|
+
const shown = result.ignored.slice(0, 10);
|
|
105
|
+
for (const item of shown) {
|
|
106
|
+
console.log(chalk.dim(` ✗ ${item.label} — ${item.reason}`));
|
|
107
|
+
}
|
|
108
|
+
if (result.ignored.length > shown.length) {
|
|
109
|
+
console.log(chalk.dim(` and ${result.ignored.length - shown.length} more`));
|
|
110
|
+
}
|
|
111
|
+
console.log("");
|
|
112
|
+
}
|
|
113
|
+
if (result.now.length === 0) {
|
|
114
|
+
console.log(chalk.dim(" Nothing else needs you today.\n"));
|
|
115
|
+
}
|
|
68
116
|
// Suggestions
|
|
69
117
|
if (result.suggestions.length > 0) {
|
|
70
118
|
for (const suggestion of result.suggestions) {
|
|
@@ -72,9 +120,21 @@ export async function todayCommand(options) {
|
|
|
72
120
|
}
|
|
73
121
|
console.log("");
|
|
74
122
|
}
|
|
75
|
-
//
|
|
76
|
-
if (
|
|
77
|
-
|
|
123
|
+
// Temporal context: progress tracking
|
|
124
|
+
if (timeContext === "midday" && snapshot) {
|
|
125
|
+
const total = snapshot.now.length + snapshot.today.length;
|
|
126
|
+
console.log(` You had ${total} items this morning. Check back later to see progress.\n`);
|
|
127
|
+
}
|
|
128
|
+
if (timeContext === "afternoon" && snapshot) {
|
|
129
|
+
const morningItems = [...snapshot.now, ...snapshot.today];
|
|
130
|
+
const currentKeys = new Set([...result.now, ...result.today].map((item) => `${item.source}|${item.label}|${item.detail}`));
|
|
131
|
+
const left = morningItems.filter((item) => currentKeys.has(`${item.source}|${item.label}|${item.detail}`)).length;
|
|
132
|
+
const total = morningItems.length;
|
|
133
|
+
const done = total - left;
|
|
134
|
+
console.log(` ${done}/${total} from this morning done. ${left} remaining.\n`);
|
|
135
|
+
}
|
|
136
|
+
if (timeContext === "evening" && result.now.length > 0) {
|
|
137
|
+
console.log(" Late day — consider if these can wait until tomorrow.\n");
|
|
78
138
|
}
|
|
79
139
|
}
|
|
80
140
|
//# sourceMappingURL=today.js.map
|
package/dist/cli/today.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"today.js","sourceRoot":"","sources":["../../src/cli/today.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAOrD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAqB;IACtD,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,iEAAiE,CAClE,CACF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,8DAA8D,CAAC,CAC7E,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,iBAAiB;IACjB,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEpD,sBAAsB;IACtB,IAAI,cAAc,GAAiD,IAAI,CAAC;IACxE,IAAI,OAAO,CAAC,QAAQ,KAAK,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC1D,cAAc,GAAG,MAAM,gBAAgB,EAAE,CAAC;QAC1C,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,mDAAmD,CACpD,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,EAAE,MAAM,IAAI,EAAE,CAAC;IAC5C,MAAM,UAAU,GAAG,cAAc,EAAE,UAAU,IAAI,EAAE,CAAC;IACpD,MAAM,SAAS,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC7C,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,6EAA6E,CAAC,CACzF,CAAC;IACJ,CAAC;IAED,aAAa;IACb,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"today.js","sourceRoot":"","sources":["../../src/cli/today.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|
package/dist/cli/tune.js
ADDED
|
@@ -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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"}
|
|
@@ -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
|
-
|
|
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;
|
|
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;AAoPD,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,CAgHnB"}
|