@fureworks/scope 0.1.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/LICENSE +21 -0
- package/README.md +92 -0
- package/dist/cli/config.d.ts +2 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +54 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/context.d.ts +6 -0
- package/dist/cli/context.d.ts.map +1 -0
- package/dist/cli/context.js +76 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/daemon.d.ts +2 -0
- package/dist/cli/daemon.d.ts.map +1 -0
- package/dist/cli/daemon.js +190 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/onboard.d.ts +2 -0
- package/dist/cli/onboard.d.ts.map +1 -0
- package/dist/cli/onboard.js +286 -0
- package/dist/cli/onboard.js.map +1 -0
- package/dist/cli/status.d.ts +6 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +57 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/switch.d.ts +2 -0
- package/dist/cli/switch.d.ts.map +1 -0
- package/dist/cli/switch.js +78 -0
- package/dist/cli/switch.js.map +1 -0
- package/dist/cli/today.d.ts +7 -0
- package/dist/cli/today.d.ts.map +1 -0
- package/dist/cli/today.js +80 -0
- package/dist/cli/today.js.map +1 -0
- package/dist/engine/prioritize.d.ts +21 -0
- package/dist/engine/prioritize.d.ts.map +1 -0
- package/dist/engine/prioritize.js +204 -0
- package/dist/engine/prioritize.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/notifications/index.d.ts +2 -0
- package/dist/notifications/index.d.ts.map +1 -0
- package/dist/notifications/index.js +41 -0
- package/dist/notifications/index.js.map +1 -0
- package/dist/sources/calendar.d.ts +17 -0
- package/dist/sources/calendar.d.ts.map +1 -0
- package/dist/sources/calendar.js +120 -0
- package/dist/sources/calendar.js.map +1 -0
- package/dist/sources/git.d.ts +20 -0
- package/dist/sources/git.d.ts.map +1 -0
- package/dist/sources/git.js +124 -0
- package/dist/sources/git.js.map +1 -0
- package/dist/sources/issues.d.ts +14 -0
- package/dist/sources/issues.d.ts.map +1 -0
- package/dist/sources/issues.js +34 -0
- package/dist/sources/issues.js.map +1 -0
- package/dist/store/config.d.ts +22 -0
- package/dist/store/config.d.ts.map +1 -0
- package/dist/store/config.js +74 -0
- package/dist/store/config.js.map +1 -0
- package/package.json +45 -0
- package/src/cli/config.ts +66 -0
- package/src/cli/context.ts +109 -0
- package/src/cli/daemon.ts +217 -0
- package/src/cli/onboard.ts +335 -0
- package/src/cli/status.ts +77 -0
- package/src/cli/switch.ts +93 -0
- package/src/cli/today.ts +114 -0
- package/src/engine/prioritize.ts +257 -0
- package/src/index.ts +58 -0
- package/src/notifications/index.ts +42 -0
- package/src/sources/calendar.ts +170 -0
- package/src/sources/git.ts +168 -0
- package/src/sources/issues.ts +62 -0
- package/src/store/config.ts +104 -0
- package/tsconfig.json +19 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Fureworks
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Scope
|
|
2
|
+
|
|
3
|
+
**Personal ops CLI — focus on what matters.**
|
|
4
|
+
|
|
5
|
+
Scope reads your existing workflow (git repos, calendar, PRs) and tells you what actually needs your attention. It doesn't add to your workflow — it gives you clarity.
|
|
6
|
+
|
|
7
|
+
## Why
|
|
8
|
+
|
|
9
|
+
AI tools made you more capable. Which means more gets piled on. The bottleneck moved from *execution* to *prioritization and context switching*.
|
|
10
|
+
|
|
11
|
+
Scope sits above your tools and helps you focus.
|
|
12
|
+
|
|
13
|
+
## Install
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install -g @fureworks/scope
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Quick Start
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
scope onboard # Guided setup (1 minute)
|
|
23
|
+
scope today # What matters right now
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Commands
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
scope onboard Guided first-time setup
|
|
30
|
+
scope today What needs your attention right now
|
|
31
|
+
scope status Overview of all watched projects
|
|
32
|
+
scope switch <project> Switch to a project context
|
|
33
|
+
scope context Show current project context
|
|
34
|
+
scope review End-of-day summary
|
|
35
|
+
scope config View/edit configuration
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## How It Works
|
|
39
|
+
|
|
40
|
+
Scope reads signals from your existing tools:
|
|
41
|
+
|
|
42
|
+
- **Git** — uncommitted changes, stale branches, open PRs
|
|
43
|
+
- **Google Calendar** — today's meetings, free blocks (via [gws](https://github.com/googleworkspace/cli))
|
|
44
|
+
- **GitHub** — PR reviews waiting on you, failing CI
|
|
45
|
+
|
|
46
|
+
It scores each item by urgency, staleness, and blocking potential, then shows you what matters:
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
$ scope today
|
|
50
|
+
|
|
51
|
+
NOW
|
|
52
|
+
───
|
|
53
|
+
🔴 Meeting: Team standup in 45 min
|
|
54
|
+
🔴 PR #8 on api-service — waiting on your review (3 days)
|
|
55
|
+
|
|
56
|
+
TODAY
|
|
57
|
+
────
|
|
58
|
+
🟡 fureworks/scope — 3 uncommitted files, last touched 2h ago
|
|
59
|
+
🟡 PR #12 on fureworks.com — open 3 days, no review
|
|
60
|
+
|
|
61
|
+
💡 2h free block after standup (14:00–16:00)
|
|
62
|
+
Good for: fureworks/scope (has pending work)
|
|
63
|
+
|
|
64
|
+
4 other items can wait → scope status
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Design Principles
|
|
68
|
+
|
|
69
|
+
- **CLI-first, local-first** — your data stays on your machine
|
|
70
|
+
- **Reads, doesn't create** — no new inputs required from you
|
|
71
|
+
- **Opinionated output** — tells you what matters, not just lists stuff
|
|
72
|
+
- **Degrades gracefully** — missing integrations skip quietly, never crash
|
|
73
|
+
- **Open source** — MIT licensed
|
|
74
|
+
|
|
75
|
+
## Prerequisites
|
|
76
|
+
|
|
77
|
+
- Node.js 18+
|
|
78
|
+
- Git
|
|
79
|
+
- [GitHub CLI](https://cli.github.com/) (`gh`) — for PR data
|
|
80
|
+
- [Google Workspace CLI](https://github.com/googleworkspace/cli) (`gws`) — for calendar (optional)
|
|
81
|
+
|
|
82
|
+
## Status
|
|
83
|
+
|
|
84
|
+
🚧 **v0.1 in development** — early but usable.
|
|
85
|
+
|
|
86
|
+
## License
|
|
87
|
+
|
|
88
|
+
MIT — see [LICENSE](./LICENSE)
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
*A [Fureworks](https://fureworks.com) project — works born from human touch.*
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAMA,wBAAsB,aAAa,CACjC,GAAG,CAAC,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAwDf"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { loadConfig, configExists } from "../store/config.js";
|
|
3
|
+
import { readFileSync } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { homedir } from "node:os";
|
|
6
|
+
export async function configCommand(key, value) {
|
|
7
|
+
if (!configExists()) {
|
|
8
|
+
console.log(chalk.yellow("\n No config found. Run `scope onboard` to get started.\n"));
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
// If no args, show config file contents
|
|
12
|
+
if (!key) {
|
|
13
|
+
const configPath = join(homedir(), ".scope", "config.toml");
|
|
14
|
+
try {
|
|
15
|
+
const content = readFileSync(configPath, "utf-8");
|
|
16
|
+
console.log("");
|
|
17
|
+
console.log(chalk.bold(" ~/.scope/config.toml"));
|
|
18
|
+
console.log(chalk.dim(" ─────────────────────\n"));
|
|
19
|
+
console.log(content
|
|
20
|
+
.split("\n")
|
|
21
|
+
.map((line) => ` ${line}`)
|
|
22
|
+
.join("\n"));
|
|
23
|
+
console.log("");
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
console.log(chalk.yellow("\n Could not read config file.\n"));
|
|
27
|
+
}
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
// Subcommands
|
|
31
|
+
switch (key) {
|
|
32
|
+
case "git":
|
|
33
|
+
console.log(chalk.dim("\n To manage repos, edit ~/.scope/config.toml"));
|
|
34
|
+
console.log(chalk.dim(" or re-run: scope onboard\n"));
|
|
35
|
+
break;
|
|
36
|
+
case "calendar":
|
|
37
|
+
console.log(chalk.dim("\n To set up calendar, install gws:"));
|
|
38
|
+
console.log(chalk.dim(" npm install -g @googleworkspace/cli"));
|
|
39
|
+
console.log(chalk.dim(" Then re-run: scope onboard\n"));
|
|
40
|
+
break;
|
|
41
|
+
case "projects":
|
|
42
|
+
const config = loadConfig();
|
|
43
|
+
console.log(chalk.bold("\n Projects:"));
|
|
44
|
+
for (const [name, project] of Object.entries(config.projects)) {
|
|
45
|
+
console.log(` ${name} → ${project.path}`);
|
|
46
|
+
}
|
|
47
|
+
console.log(chalk.dim("\n Edit: ~/.scope/config.toml\n"));
|
|
48
|
+
break;
|
|
49
|
+
default:
|
|
50
|
+
console.log(chalk.yellow(`\n Unknown config key: ${key}`));
|
|
51
|
+
console.log(chalk.dim(" Available: git, calendar, projects\n"));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.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,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAY,EACZ,KAAc;IAEd,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,4DAA4D,CAAC,CAC3E,CAAC;QACF,OAAO;IACT,CAAC;IAED,wCAAwC;IACxC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;QAC5D,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CACT,OAAO;iBACJ,KAAK,CAAC,IAAI,CAAC;iBACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;iBAC1B,IAAI,CAAC,IAAI,CAAC,CACd,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mCAAmC,CAAC,CAAC,CAAC;QACjE,CAAC;QACD,OAAO;IACT,CAAC;IAED,cAAc;IACd,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,KAAK;YACR,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;YACvD,MAAM;QACR,KAAK,UAAU;YACb,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAClD,CAAC;YACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,uCAAuC,CAAC,CACnD,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC,CAAC;YACzD,MAAM;QACR,KAAK,UAAU;YACb,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;YACzC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7C,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC,CAAC;YAC3D,MAAM;QACR;YACE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,2BAA2B,GAAG,EAAE,CAAC,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC,CAAC;IACrE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/cli/context.ts"],"names":[],"mappings":"AAKA,UAAU,cAAc;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAmG3E"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { getScopeDir } from "../store/config.js";
|
|
5
|
+
export async function contextCommand(options) {
|
|
6
|
+
const contextsDir = join(getScopeDir(), "contexts");
|
|
7
|
+
if (!existsSync(contextsDir)) {
|
|
8
|
+
console.log(chalk.yellow("\n No project contexts yet. Run `scope switch <project>` first.\n"));
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
// Find the most recently switched context
|
|
12
|
+
const files = readdirSync(contextsDir).filter((f) => f.endsWith(".json"));
|
|
13
|
+
if (files.length === 0) {
|
|
14
|
+
console.log(chalk.yellow("\n No project contexts yet. Run `scope switch <project>` first.\n"));
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
let latest = null;
|
|
18
|
+
for (const file of files) {
|
|
19
|
+
try {
|
|
20
|
+
const data = JSON.parse(readFileSync(join(contextsDir, file), "utf-8"));
|
|
21
|
+
const time = new Date(data.lastSwitchedAt || 0).getTime();
|
|
22
|
+
if (!latest || time > latest.time) {
|
|
23
|
+
latest = { name: data.name, data, time };
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// Skip corrupt files
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (!latest) {
|
|
31
|
+
console.log(chalk.yellow("\n No valid contexts found.\n"));
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const ctx = latest.data;
|
|
35
|
+
if (options.edit) {
|
|
36
|
+
const editor = process.env.EDITOR || "vi";
|
|
37
|
+
const { execSync } = await import("node:child_process");
|
|
38
|
+
const notesPath = join(contextsDir, `${ctx.name}.md`);
|
|
39
|
+
// Create notes file if it doesn't exist
|
|
40
|
+
if (!existsSync(notesPath)) {
|
|
41
|
+
const { writeFileSync } = await import("node:fs");
|
|
42
|
+
writeFileSync(notesPath, `# ${ctx.name}\n\n`, "utf-8");
|
|
43
|
+
}
|
|
44
|
+
execSync(`${editor} ${notesPath}`, { stdio: "inherit" });
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
console.log("");
|
|
48
|
+
console.log(chalk.bold(` Current: ${ctx.name}`));
|
|
49
|
+
console.log(chalk.dim(` ─────────────────────`));
|
|
50
|
+
console.log(` 📁 ${ctx.path}`);
|
|
51
|
+
console.log(` 🌿 ${ctx.branch}`);
|
|
52
|
+
if (ctx.lastSwitchedAt) {
|
|
53
|
+
const ago = Math.round((Date.now() - new Date(ctx.lastSwitchedAt).getTime()) / (1000 * 60 * 60));
|
|
54
|
+
if (ago < 1) {
|
|
55
|
+
console.log(chalk.dim(` Switched: just now`));
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
console.log(chalk.dim(` Switched: ${ago}h ago`));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (ctx.notes) {
|
|
62
|
+
console.log(`\n 📝 ${ctx.notes}`);
|
|
63
|
+
}
|
|
64
|
+
// Show other projects
|
|
65
|
+
if (files.length > 1) {
|
|
66
|
+
console.log(chalk.dim(`\n Other projects:`));
|
|
67
|
+
for (const file of files) {
|
|
68
|
+
const name = file.replace(".json", "");
|
|
69
|
+
if (name !== ctx.name) {
|
|
70
|
+
console.log(chalk.dim(` scope switch ${name}`));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
console.log("");
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/cli/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"AAoGA,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBjE"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { existsSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { spawn } from "node:child_process";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { configExists, ensureScopeDir, getScopeDir, loadConfig, saveConfig } from "../store/config.js";
|
|
6
|
+
import { scanAllRepos } from "../sources/git.js";
|
|
7
|
+
import { getCalendarToday } from "../sources/calendar.js";
|
|
8
|
+
import { scanAssignedIssues } from "../sources/issues.js";
|
|
9
|
+
import { prioritize } from "../engine/prioritize.js";
|
|
10
|
+
import { notify } from "../notifications/index.js";
|
|
11
|
+
const PID_PATH = join(getScopeDir(), "daemon.pid");
|
|
12
|
+
const NOTIFIED_PATH = join(getScopeDir(), "notified.json");
|
|
13
|
+
const DEBOUNCE_MS = 60 * 60 * 1000;
|
|
14
|
+
function isProcessRunning(pid) {
|
|
15
|
+
try {
|
|
16
|
+
process.kill(pid, 0);
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function readPid() {
|
|
24
|
+
if (!existsSync(PID_PATH))
|
|
25
|
+
return null;
|
|
26
|
+
const raw = readFileSync(PID_PATH, "utf-8").trim();
|
|
27
|
+
const pid = Number.parseInt(raw, 10);
|
|
28
|
+
return Number.isFinite(pid) ? pid : null;
|
|
29
|
+
}
|
|
30
|
+
function removePidFile() {
|
|
31
|
+
if (existsSync(PID_PATH)) {
|
|
32
|
+
unlinkSync(PID_PATH);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function loadNotifiedState() {
|
|
36
|
+
if (!existsSync(NOTIFIED_PATH))
|
|
37
|
+
return {};
|
|
38
|
+
try {
|
|
39
|
+
return JSON.parse(readFileSync(NOTIFIED_PATH, "utf-8"));
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return {};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function saveNotifiedState(state) {
|
|
46
|
+
writeFileSync(NOTIFIED_PATH, JSON.stringify(state, null, 2), "utf-8");
|
|
47
|
+
}
|
|
48
|
+
async function runSignalCheck() {
|
|
49
|
+
if (!configExists())
|
|
50
|
+
return;
|
|
51
|
+
const config = loadConfig();
|
|
52
|
+
const gitSignals = await scanAllRepos(config.repos);
|
|
53
|
+
let calendarEvents = null;
|
|
54
|
+
if (config.calendar.enabled) {
|
|
55
|
+
calendarEvents = await getCalendarToday();
|
|
56
|
+
}
|
|
57
|
+
const issueScan = await scanAssignedIssues();
|
|
58
|
+
const events = calendarEvents?.events ?? [];
|
|
59
|
+
const freeBlocks = calendarEvents?.freeBlocks ?? [];
|
|
60
|
+
const result = prioritize(gitSignals, events, freeBlocks, issueScan.issues);
|
|
61
|
+
const candidates = [...result.now, ...result.today].filter((item) => item.score >= 8);
|
|
62
|
+
if (candidates.length === 0)
|
|
63
|
+
return;
|
|
64
|
+
ensureScopeDir();
|
|
65
|
+
const state = loadNotifiedState();
|
|
66
|
+
const nowMs = Date.now();
|
|
67
|
+
let changed = false;
|
|
68
|
+
for (const item of candidates) {
|
|
69
|
+
const id = `${item.source}:${item.label}`;
|
|
70
|
+
const lastNotified = state[id] ? new Date(state[id]).getTime() : 0;
|
|
71
|
+
if (lastNotified && nowMs - lastNotified < DEBOUNCE_MS) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
notify("Scope: Action Needed", `${item.emoji} ${item.label} — ${item.detail}`);
|
|
75
|
+
state[id] = new Date(nowMs).toISOString();
|
|
76
|
+
changed = true;
|
|
77
|
+
}
|
|
78
|
+
if (changed) {
|
|
79
|
+
saveNotifiedState(state);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function markDaemonEnabled(enabled) {
|
|
83
|
+
if (!configExists())
|
|
84
|
+
return;
|
|
85
|
+
const config = loadConfig();
|
|
86
|
+
config.daemon.enabled = enabled;
|
|
87
|
+
saveConfig(config);
|
|
88
|
+
}
|
|
89
|
+
export async function daemonCommand(action) {
|
|
90
|
+
switch (action) {
|
|
91
|
+
case "start":
|
|
92
|
+
await startDaemon();
|
|
93
|
+
return;
|
|
94
|
+
case "stop":
|
|
95
|
+
stopDaemon();
|
|
96
|
+
return;
|
|
97
|
+
case "status":
|
|
98
|
+
showDaemonStatus();
|
|
99
|
+
return;
|
|
100
|
+
case "run":
|
|
101
|
+
await runDaemonLoop();
|
|
102
|
+
return;
|
|
103
|
+
default:
|
|
104
|
+
console.log(chalk.yellow(`\n Unknown daemon action: ${action}`));
|
|
105
|
+
console.log(chalk.dim(" Use: scope daemon start|stop|status\n"));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async function startDaemon() {
|
|
109
|
+
if (!configExists()) {
|
|
110
|
+
console.log(chalk.yellow("\n Scope isn't set up yet. Run `scope onboard` first.\n"));
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
ensureScopeDir();
|
|
114
|
+
const existingPid = readPid();
|
|
115
|
+
if (existingPid && isProcessRunning(existingPid)) {
|
|
116
|
+
console.log(chalk.green(`\n Daemon already running (PID ${existingPid}).\n`));
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
removePidFile();
|
|
120
|
+
const child = spawn(process.execPath, [process.argv[1], "daemon", "run"], {
|
|
121
|
+
detached: true,
|
|
122
|
+
stdio: "ignore",
|
|
123
|
+
});
|
|
124
|
+
child.unref();
|
|
125
|
+
writeFileSync(PID_PATH, String(child.pid), "utf-8");
|
|
126
|
+
markDaemonEnabled(true);
|
|
127
|
+
console.log(chalk.green(`\n Daemon started (PID ${child.pid}).\n`));
|
|
128
|
+
}
|
|
129
|
+
function stopDaemon() {
|
|
130
|
+
const pid = readPid();
|
|
131
|
+
if (!pid) {
|
|
132
|
+
console.log(chalk.dim("\n Daemon is not running.\n"));
|
|
133
|
+
markDaemonEnabled(false);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (!isProcessRunning(pid)) {
|
|
137
|
+
removePidFile();
|
|
138
|
+
console.log(chalk.dim("\n Daemon was not running (stale PID removed).\n"));
|
|
139
|
+
markDaemonEnabled(false);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
try {
|
|
143
|
+
process.kill(pid);
|
|
144
|
+
removePidFile();
|
|
145
|
+
markDaemonEnabled(false);
|
|
146
|
+
console.log(chalk.green(`\n Daemon stopped (PID ${pid}).\n`));
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
console.log(chalk.yellow(`\n Could not stop daemon PID ${pid}.\n`));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function showDaemonStatus() {
|
|
153
|
+
const config = loadConfig();
|
|
154
|
+
const pid = readPid();
|
|
155
|
+
if (pid && isProcessRunning(pid)) {
|
|
156
|
+
console.log(chalk.green(`\n Daemon running (PID ${pid}).`));
|
|
157
|
+
console.log(chalk.dim(` Interval: ${config.daemon.intervalMinutes} minutes\n`));
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (pid) {
|
|
161
|
+
removePidFile();
|
|
162
|
+
}
|
|
163
|
+
console.log(chalk.dim("\n Daemon is not running."));
|
|
164
|
+
console.log(chalk.dim(` Interval: ${config.daemon.intervalMinutes} minutes\n`));
|
|
165
|
+
}
|
|
166
|
+
async function runDaemonLoop() {
|
|
167
|
+
ensureScopeDir();
|
|
168
|
+
writeFileSync(PID_PATH, String(process.pid), "utf-8");
|
|
169
|
+
const cleanup = () => {
|
|
170
|
+
const pid = readPid();
|
|
171
|
+
if (pid === process.pid) {
|
|
172
|
+
removePidFile();
|
|
173
|
+
}
|
|
174
|
+
process.exit(0);
|
|
175
|
+
};
|
|
176
|
+
process.on("SIGTERM", cleanup);
|
|
177
|
+
process.on("SIGINT", cleanup);
|
|
178
|
+
while (true) {
|
|
179
|
+
try {
|
|
180
|
+
await runSignalCheck();
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
// Keep daemon alive even if checks fail.
|
|
184
|
+
}
|
|
185
|
+
const config = configExists() ? loadConfig() : null;
|
|
186
|
+
const intervalMinutes = Math.max(1, config?.daemon.intervalMinutes ?? 15);
|
|
187
|
+
await new Promise((resolve) => setTimeout(resolve, intervalMinutes * 60 * 1000));
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboard.d.ts","sourceRoot":"","sources":["../../src/cli/onboard.ts"],"names":[],"mappings":"AAkIA,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA4MpD"}
|