@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.
Files changed (74) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +92 -0
  3. package/dist/cli/config.d.ts +2 -0
  4. package/dist/cli/config.d.ts.map +1 -0
  5. package/dist/cli/config.js +54 -0
  6. package/dist/cli/config.js.map +1 -0
  7. package/dist/cli/context.d.ts +6 -0
  8. package/dist/cli/context.d.ts.map +1 -0
  9. package/dist/cli/context.js +76 -0
  10. package/dist/cli/context.js.map +1 -0
  11. package/dist/cli/daemon.d.ts +2 -0
  12. package/dist/cli/daemon.d.ts.map +1 -0
  13. package/dist/cli/daemon.js +190 -0
  14. package/dist/cli/daemon.js.map +1 -0
  15. package/dist/cli/onboard.d.ts +2 -0
  16. package/dist/cli/onboard.d.ts.map +1 -0
  17. package/dist/cli/onboard.js +286 -0
  18. package/dist/cli/onboard.js.map +1 -0
  19. package/dist/cli/status.d.ts +6 -0
  20. package/dist/cli/status.d.ts.map +1 -0
  21. package/dist/cli/status.js +57 -0
  22. package/dist/cli/status.js.map +1 -0
  23. package/dist/cli/switch.d.ts +2 -0
  24. package/dist/cli/switch.d.ts.map +1 -0
  25. package/dist/cli/switch.js +78 -0
  26. package/dist/cli/switch.js.map +1 -0
  27. package/dist/cli/today.d.ts +7 -0
  28. package/dist/cli/today.d.ts.map +1 -0
  29. package/dist/cli/today.js +80 -0
  30. package/dist/cli/today.js.map +1 -0
  31. package/dist/engine/prioritize.d.ts +21 -0
  32. package/dist/engine/prioritize.d.ts.map +1 -0
  33. package/dist/engine/prioritize.js +204 -0
  34. package/dist/engine/prioritize.js.map +1 -0
  35. package/dist/index.d.ts +3 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +48 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/notifications/index.d.ts +2 -0
  40. package/dist/notifications/index.d.ts.map +1 -0
  41. package/dist/notifications/index.js +41 -0
  42. package/dist/notifications/index.js.map +1 -0
  43. package/dist/sources/calendar.d.ts +17 -0
  44. package/dist/sources/calendar.d.ts.map +1 -0
  45. package/dist/sources/calendar.js +120 -0
  46. package/dist/sources/calendar.js.map +1 -0
  47. package/dist/sources/git.d.ts +20 -0
  48. package/dist/sources/git.d.ts.map +1 -0
  49. package/dist/sources/git.js +124 -0
  50. package/dist/sources/git.js.map +1 -0
  51. package/dist/sources/issues.d.ts +14 -0
  52. package/dist/sources/issues.d.ts.map +1 -0
  53. package/dist/sources/issues.js +34 -0
  54. package/dist/sources/issues.js.map +1 -0
  55. package/dist/store/config.d.ts +22 -0
  56. package/dist/store/config.d.ts.map +1 -0
  57. package/dist/store/config.js +74 -0
  58. package/dist/store/config.js.map +1 -0
  59. package/package.json +45 -0
  60. package/src/cli/config.ts +66 -0
  61. package/src/cli/context.ts +109 -0
  62. package/src/cli/daemon.ts +217 -0
  63. package/src/cli/onboard.ts +335 -0
  64. package/src/cli/status.ts +77 -0
  65. package/src/cli/switch.ts +93 -0
  66. package/src/cli/today.ts +114 -0
  67. package/src/engine/prioritize.ts +257 -0
  68. package/src/index.ts +58 -0
  69. package/src/notifications/index.ts +42 -0
  70. package/src/sources/calendar.ts +170 -0
  71. package/src/sources/git.ts +168 -0
  72. package/src/sources/issues.ts +62 -0
  73. package/src/store/config.ts +104 -0
  74. 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,2 @@
1
+ export declare function configCommand(key?: string, value?: string): Promise<void>;
2
+ //# sourceMappingURL=config.d.ts.map
@@ -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":"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"}
@@ -0,0 +1,6 @@
1
+ interface ContextOptions {
2
+ edit?: boolean;
3
+ }
4
+ export declare function contextCommand(options: ContextOptions): Promise<void>;
5
+ export {};
6
+ //# sourceMappingURL=context.d.ts.map
@@ -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,2 @@
1
+ export declare function daemonCommand(action: string): Promise<void>;
2
+ //# sourceMappingURL=daemon.d.ts.map
@@ -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,2 @@
1
+ export declare function onboardCommand(): Promise<void>;
2
+ //# sourceMappingURL=onboard.d.ts.map
@@ -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"}