workweave 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.
Files changed (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +254 -0
  3. package/dist/ai/local.d.ts +9 -0
  4. package/dist/ai/local.d.ts.map +1 -0
  5. package/dist/ai/local.js +148 -0
  6. package/dist/ai/local.js.map +1 -0
  7. package/dist/ai/provider.d.ts +43 -0
  8. package/dist/ai/provider.d.ts.map +1 -0
  9. package/dist/ai/provider.js +191 -0
  10. package/dist/ai/provider.js.map +1 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +193 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/connectors/github.d.ts +13 -0
  16. package/dist/connectors/github.d.ts.map +1 -0
  17. package/dist/connectors/github.js +212 -0
  18. package/dist/connectors/github.js.map +1 -0
  19. package/dist/connectors/linear.d.ts +12 -0
  20. package/dist/connectors/linear.d.ts.map +1 -0
  21. package/dist/connectors/linear.js +160 -0
  22. package/dist/connectors/linear.js.map +1 -0
  23. package/dist/connectors/registry.d.ts +10 -0
  24. package/dist/connectors/registry.d.ts.map +1 -0
  25. package/dist/connectors/registry.js +36 -0
  26. package/dist/connectors/registry.js.map +1 -0
  27. package/dist/connectors/slack.d.ts +11 -0
  28. package/dist/connectors/slack.d.ts.map +1 -0
  29. package/dist/connectors/slack.js +212 -0
  30. package/dist/connectors/slack.js.map +1 -0
  31. package/dist/connectors/types.d.ts +2 -0
  32. package/dist/connectors/types.d.ts.map +1 -0
  33. package/dist/connectors/types.js +3 -0
  34. package/dist/connectors/types.js.map +1 -0
  35. package/dist/display.d.ts +9 -0
  36. package/dist/display.d.ts.map +1 -0
  37. package/dist/display.js +216 -0
  38. package/dist/display.js.map +1 -0
  39. package/dist/env.d.ts +4 -0
  40. package/dist/env.d.ts.map +1 -0
  41. package/dist/env.js +64 -0
  42. package/dist/env.js.map +1 -0
  43. package/dist/pipeline/ai-synthesize.d.ts +11 -0
  44. package/dist/pipeline/ai-synthesize.d.ts.map +1 -0
  45. package/dist/pipeline/ai-synthesize.js +264 -0
  46. package/dist/pipeline/ai-synthesize.js.map +1 -0
  47. package/dist/pipeline/cluster-id.d.ts +5 -0
  48. package/dist/pipeline/cluster-id.d.ts.map +1 -0
  49. package/dist/pipeline/cluster-id.js +13 -0
  50. package/dist/pipeline/cluster-id.js.map +1 -0
  51. package/dist/pipeline/correlate.d.ts +7 -0
  52. package/dist/pipeline/correlate.d.ts.map +1 -0
  53. package/dist/pipeline/correlate.js +105 -0
  54. package/dist/pipeline/correlate.js.map +1 -0
  55. package/dist/pipeline/ingest.d.ts +17 -0
  56. package/dist/pipeline/ingest.d.ts.map +1 -0
  57. package/dist/pipeline/ingest.js +56 -0
  58. package/dist/pipeline/ingest.js.map +1 -0
  59. package/dist/pipeline/merge-plan.d.ts +14 -0
  60. package/dist/pipeline/merge-plan.d.ts.map +1 -0
  61. package/dist/pipeline/merge-plan.js +70 -0
  62. package/dist/pipeline/merge-plan.js.map +1 -0
  63. package/dist/pipeline/normalize.d.ts +3 -0
  64. package/dist/pipeline/normalize.d.ts.map +1 -0
  65. package/dist/pipeline/normalize.js +169 -0
  66. package/dist/pipeline/normalize.js.map +1 -0
  67. package/dist/pipeline/prioritize.d.ts +6 -0
  68. package/dist/pipeline/prioritize.d.ts.map +1 -0
  69. package/dist/pipeline/prioritize.js +453 -0
  70. package/dist/pipeline/prioritize.js.map +1 -0
  71. package/dist/pipeline/schedule.d.ts +11 -0
  72. package/dist/pipeline/schedule.d.ts.map +1 -0
  73. package/dist/pipeline/schedule.js +98 -0
  74. package/dist/pipeline/schedule.js.map +1 -0
  75. package/dist/setup.d.ts +2 -0
  76. package/dist/setup.d.ts.map +1 -0
  77. package/dist/setup.js +276 -0
  78. package/dist/setup.js.map +1 -0
  79. package/dist/types/index.d.ts +90 -0
  80. package/dist/types/index.d.ts.map +1 -0
  81. package/dist/types/index.js +3 -0
  82. package/dist/types/index.js.map +1 -0
  83. package/package.json +51 -0
@@ -0,0 +1,11 @@
1
+ import type { TaskCluster, WorkweavePlan } from "../types";
2
+ /**
3
+ * Priority-first scheduler with context-affinity nudging.
4
+ *
5
+ * 1. Takes clusters already sorted by priority score (highest first)
6
+ * 2. Nudges related adjacent items together when the priority gap is small
7
+ * 3. Fills time slots sequentially until workdayMinutes is reached
8
+ * 4. Overflow stays in the plan without a scheduledSlot (backlog)
9
+ */
10
+ export declare function schedule(clusters: TaskCluster[], workdayMinutes: number): WorkweavePlan;
11
+ //# sourceMappingURL=schedule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../src/pipeline/schedule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAK3D;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,WAAW,EAAE,EACvB,cAAc,EAAE,MAAM,GACrB,aAAa,CA8Bf"}
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.schedule = schedule;
4
+ const crypto_1 = require("crypto");
5
+ const AFFINITY_THRESHOLD = 10;
6
+ /**
7
+ * Priority-first scheduler with context-affinity nudging.
8
+ *
9
+ * 1. Takes clusters already sorted by priority score (highest first)
10
+ * 2. Nudges related adjacent items together when the priority gap is small
11
+ * 3. Fills time slots sequentially until workdayMinutes is reached
12
+ * 4. Overflow stays in the plan without a scheduledSlot (backlog)
13
+ */
14
+ function schedule(clusters, workdayMinutes) {
15
+ const ordered = nudgeRelatedItems([...clusters]);
16
+ let minutesUsed = 0;
17
+ const scheduled = ordered.map((cluster) => {
18
+ if (minutesUsed >= workdayMinutes) {
19
+ return cluster;
20
+ }
21
+ const start = minutesUsed;
22
+ const end = Math.min(start + cluster.estimatedMinutes, workdayMinutes);
23
+ minutesUsed += cluster.estimatedMinutes;
24
+ return {
25
+ ...cluster,
26
+ scheduledSlot: { start, end },
27
+ };
28
+ });
29
+ const today = new Date().toISOString().split("T")[0];
30
+ return {
31
+ id: (0, crypto_1.randomUUID)(),
32
+ date: today,
33
+ clusters: scheduled,
34
+ totalMinutes: workdayMinutes,
35
+ usedMinutes: Math.min(minutesUsed, workdayMinutes),
36
+ generatedAt: new Date().toISOString(),
37
+ };
38
+ }
39
+ /**
40
+ * If a lower-priority cluster shares context (same repo, project, or linked
41
+ * artifacts) with the cluster right above it, and the score gap is within
42
+ * AFFINITY_THRESHOLD, pull it up so the developer stays in the same context.
43
+ */
44
+ function nudgeRelatedItems(clusters) {
45
+ for (let i = 1; i < clusters.length; i++) {
46
+ const prev = clusters[i - 1];
47
+ const curr = clusters[i];
48
+ if (sharesContext(prev, curr))
49
+ continue; // already adjacent
50
+ // Look ahead for a related cluster that's close enough in priority
51
+ for (let j = i + 1; j < clusters.length; j++) {
52
+ const candidate = clusters[j];
53
+ const gap = prev.priorityScore - candidate.priorityScore;
54
+ if (gap > AFFINITY_THRESHOLD)
55
+ break; // too far in priority
56
+ if (sharesContext(prev, candidate)) {
57
+ // Pull candidate up to position i
58
+ clusters.splice(j, 1);
59
+ clusters.splice(i, 0, candidate);
60
+ break;
61
+ }
62
+ }
63
+ }
64
+ return clusters;
65
+ }
66
+ function sharesContext(a, b) {
67
+ const reposA = extractContextKeys(a);
68
+ const reposB = extractContextKeys(b);
69
+ for (const key of reposA) {
70
+ if (reposB.has(key))
71
+ return true;
72
+ }
73
+ // Check if any artifacts are directly linked
74
+ const idsA = new Set(a.artifacts.map((art) => art.id));
75
+ for (const art of b.artifacts) {
76
+ for (const relId of art.relatedArtifactIds) {
77
+ if (idsA.has(relId))
78
+ return true;
79
+ }
80
+ }
81
+ return false;
82
+ }
83
+ function extractContextKeys(cluster) {
84
+ const keys = new Set();
85
+ for (const art of cluster.artifacts) {
86
+ const repo = art.metadata.repository;
87
+ if (repo)
88
+ keys.add(`repo:${repo}`);
89
+ const project = art.metadata.project;
90
+ if (project)
91
+ keys.add(`project:${project}`);
92
+ const channel = art.metadata.channel;
93
+ if (channel)
94
+ keys.add(`channel:${channel}`);
95
+ }
96
+ return keys;
97
+ }
98
+ //# sourceMappingURL=schedule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule.js","sourceRoot":"","sources":["../../src/pipeline/schedule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runSetup(): Promise<void>;
2
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAyQA,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CA8B9C"}
package/dist/setup.js ADDED
@@ -0,0 +1,276 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runSetup = runSetup;
4
+ const promises_1 = require("readline/promises");
5
+ const env_1 = require("./env");
6
+ const local_1 = require("./ai/local");
7
+ // ── display helpers ────────────────────────────────────────────────────────
8
+ function hr() {
9
+ console.log("─".repeat(60));
10
+ }
11
+ function section(title) {
12
+ console.log("");
13
+ hr();
14
+ console.log(` ${title}`);
15
+ hr();
16
+ }
17
+ function ok(msg) { console.log(` [ok] ${msg}`); }
18
+ function warn(msg) { console.log(` [!] ${msg}`); }
19
+ function info(msg) { console.log(` ${msg}`); }
20
+ function progressBar(pct, width = 30) {
21
+ const filled = Math.round((pct / 100) * width);
22
+ return "[" + "█".repeat(filled) + "░".repeat(width - filled) + "]";
23
+ }
24
+ async function yesNo(rl, question, defaultYes) {
25
+ const hint = defaultYes ? "[Y/n]" : "[y/N]";
26
+ const answer = (await rl.question(`\n ${question} ${hint} `)).trim().toLowerCase();
27
+ if (!answer)
28
+ return defaultYes;
29
+ return answer === "y" || answer === "yes";
30
+ }
31
+ async function ask(rl, question) {
32
+ return (await rl.question(`\n ${question} `)).trim();
33
+ }
34
+ // ── sections ───────────────────────────────────────────────────────────────
35
+ async function setupGitHub(rl) {
36
+ section("GitHub");
37
+ if (process.env.GITHUB_TOKEN) {
38
+ ok("GITHUB_TOKEN is already configured.");
39
+ const replace = await yesNo(rl, "Replace it?", false);
40
+ if (!replace)
41
+ return;
42
+ }
43
+ else {
44
+ const configure = await yesNo(rl, "Configure GitHub now?", true);
45
+ if (!configure) {
46
+ info(" Skipped.");
47
+ return;
48
+ }
49
+ }
50
+ info("");
51
+ info(" 1. Go to github.com/settings/tokens → Generate new token (classic)");
52
+ info(" 2. Name it 'Workweave' and set an expiration");
53
+ info(" 3. Select scope: repo");
54
+ info(" 4. Click Generate token and copy it");
55
+ const token = await ask(rl, "Paste GITHUB_TOKEN (input is visible):");
56
+ if (!token) {
57
+ warn("No token entered — skipping.");
58
+ return;
59
+ }
60
+ const file = (0, env_1.upsertLocalEnv)("GITHUB_TOKEN", token);
61
+ ok(`GITHUB_TOKEN saved to ${file}`);
62
+ }
63
+ async function setupLocalModel(rl) {
64
+ section("AI synthesis — local model (recommended)");
65
+ if ((0, local_1.modelExists)()) {
66
+ ok(`${local_1.MODEL_NAME} is already downloaded.`);
67
+ info(` Path: ${(0, local_1.modelPath)()}`);
68
+ const replace = await yesNo(rl, "Re-download it?", false);
69
+ if (!replace)
70
+ return true;
71
+ }
72
+ else {
73
+ info(` Model : ${local_1.MODEL_NAME} Q4_K_M`);
74
+ info(` Size : ~${local_1.MODEL_SIZE_MB} MB (downloaded once, stored in ~/.workweave/models/)`);
75
+ info(` Speed : ~5–15 s per synthesis on CPU`);
76
+ info(` Key : none required`);
77
+ const go = await yesNo(rl, "Download and use the local model?", true);
78
+ if (!go)
79
+ return false;
80
+ }
81
+ info("");
82
+ info(` Downloading ${local_1.MODEL_FILE} …`);
83
+ info("");
84
+ let lastLine = "";
85
+ await (0, local_1.downloadModel)((downloadedMB, totalMB, pct) => {
86
+ const bar = progressBar(pct);
87
+ const line = ` ${bar} ${pct}% ${downloadedMB} MB / ${totalMB} MB`;
88
+ process.stdout.write("\r" + line + " ".repeat(Math.max(0, lastLine.length - line.length)));
89
+ lastLine = line;
90
+ });
91
+ process.stdout.write("\n");
92
+ info("");
93
+ ok(`Downloaded to ${(0, local_1.modelPath)()}`);
94
+ return true;
95
+ }
96
+ async function setupAPIProvider(rl) {
97
+ section("AI synthesis — API key (alternative)");
98
+ info(" Use an API key instead of (or alongside) the local model.");
99
+ info(" The local model is preferred at runtime; an API key is a fallback.");
100
+ info("");
101
+ const hasAnthropic = !!process.env.ANTHROPIC_API_KEY;
102
+ const hasOpenAI = !!process.env.OPENAI_API_KEY;
103
+ if (hasAnthropic) {
104
+ ok("ANTHROPIC_API_KEY is already configured.");
105
+ const replace = await yesNo(rl, "Replace it?", false);
106
+ if (replace)
107
+ await enterKey(rl, "anthropic");
108
+ }
109
+ else if (hasOpenAI) {
110
+ ok("OPENAI_API_KEY is already configured.");
111
+ const replace = await yesNo(rl, "Replace it or add an Anthropic key?", false);
112
+ if (replace)
113
+ await pickAndEnterKey(rl);
114
+ }
115
+ else {
116
+ const configure = await yesNo(rl, "Add an API key now?", false);
117
+ if (configure)
118
+ await pickAndEnterKey(rl);
119
+ else
120
+ info(" Skipped. Run `workweave setup` again to add one later.");
121
+ }
122
+ }
123
+ async function pickAndEnterKey(rl) {
124
+ info("");
125
+ info(" 1) Anthropic (claude-haiku-4-5)");
126
+ info(" 2) OpenAI (gpt-4o-mini)");
127
+ const choice = (await rl.question("\n Enter 1 or 2 [1]: ")).trim();
128
+ await enterKey(rl, choice === "2" ? "openai" : "anthropic");
129
+ }
130
+ async function enterKey(rl, provider) {
131
+ if (provider === "anthropic") {
132
+ info("");
133
+ info(" Get a key at https://console.anthropic.com/settings/keys");
134
+ const key = await ask(rl, "Paste ANTHROPIC_API_KEY (input is visible):");
135
+ if (!key) {
136
+ warn("No key entered — skipping.");
137
+ return;
138
+ }
139
+ const file = (0, env_1.upsertLocalEnv)("ANTHROPIC_API_KEY", key);
140
+ ok(`ANTHROPIC_API_KEY saved to ${file}`);
141
+ }
142
+ else {
143
+ info("");
144
+ info(" Get a key at https://platform.openai.com/api-keys");
145
+ const key = await ask(rl, "Paste OPENAI_API_KEY (input is visible):");
146
+ if (!key) {
147
+ warn("No key entered — skipping.");
148
+ return;
149
+ }
150
+ const file = (0, env_1.upsertLocalEnv)("OPENAI_API_KEY", key);
151
+ ok(`OPENAI_API_KEY saved to ${file}`);
152
+ }
153
+ }
154
+ async function setupLinear(rl) {
155
+ section("Linear (optional)");
156
+ if (process.env.LINEAR_API_KEY) {
157
+ ok("LINEAR_API_KEY is already configured.");
158
+ const replace = await yesNo(rl, "Replace it?", false);
159
+ if (!replace)
160
+ return;
161
+ }
162
+ else {
163
+ const configure = await yesNo(rl, "Configure Linear now?", false);
164
+ if (!configure) {
165
+ info(" Skipped.");
166
+ return;
167
+ }
168
+ }
169
+ info("");
170
+ info(" Generate a personal API key at:");
171
+ info(" https://linear.app/settings/api");
172
+ const key = await ask(rl, "Paste LINEAR_API_KEY (input is visible):");
173
+ if (!key) {
174
+ warn("No key entered — skipping.");
175
+ return;
176
+ }
177
+ const file = (0, env_1.upsertLocalEnv)("LINEAR_API_KEY", key);
178
+ ok(`LINEAR_API_KEY saved to ${file}`);
179
+ }
180
+ async function setupWorkdayHours(rl) {
181
+ section("Workday hours");
182
+ const current = process.env.WORKDAY_MINUTES
183
+ ? `${Math.round(Number(process.env.WORKDAY_MINUTES) / 60)} hours`
184
+ : null;
185
+ if (current) {
186
+ ok(`Workday is currently set to ${current}.`);
187
+ const replace = await yesNo(rl, "Change it?", false);
188
+ if (!replace)
189
+ return;
190
+ }
191
+ info(" How many hours do you work per day?");
192
+ const input = await ask(rl, "Hours per day [8]:");
193
+ const hours = parseFloat(input || "8");
194
+ if (isNaN(hours) || hours <= 0 || hours > 24) {
195
+ warn("Invalid value — keeping default of 8 hours.");
196
+ return;
197
+ }
198
+ const minutes = Math.round(hours * 60);
199
+ const file = (0, env_1.upsertLocalEnv)("WORKDAY_MINUTES", String(minutes));
200
+ ok(`Workday set to ${hours}h (${minutes} min), saved to ${file}`);
201
+ }
202
+ async function setupSlack(rl) {
203
+ section("Slack (optional)");
204
+ if (process.env.SLACK_USER_TOKEN) {
205
+ ok("SLACK_USER_TOKEN is already configured.");
206
+ const replace = await yesNo(rl, "Replace it?", false);
207
+ if (!replace)
208
+ return;
209
+ }
210
+ else {
211
+ const configure = await yesNo(rl, "Configure Slack now?", false);
212
+ if (!configure) {
213
+ info(" Skipped.");
214
+ return;
215
+ }
216
+ }
217
+ info("");
218
+ info(" 1. Go to api.slack.com/apps → Create New App → From scratch");
219
+ info(" 2. Name it (e.g. 'Workweave') and pick your workspace");
220
+ info(" 3. Sidebar: OAuth & Permissions → User Token Scopes → add:");
221
+ info(" search:read users:read channels:read groups:read im:read");
222
+ info(" 4. Scroll up → Install to Workspace → Authorize");
223
+ info(" 5. Copy the User OAuth Token (starts with xoxp-)");
224
+ const token = await ask(rl, "Paste SLACK_USER_TOKEN (input is visible):");
225
+ if (!token) {
226
+ warn("No token entered — skipping.");
227
+ return;
228
+ }
229
+ const file = (0, env_1.upsertLocalEnv)("SLACK_USER_TOKEN", token);
230
+ ok(`SLACK_USER_TOKEN saved to ${file}`);
231
+ }
232
+ function printNextSteps() {
233
+ section("Done");
234
+ info("Local config: " + (0, env_1.envFilePath)());
235
+ info("");
236
+ info(" Try it out:");
237
+ info(" workweave detect --connectors github,linear,slack");
238
+ info(" workweave synth --connectors github --ai");
239
+ info("");
240
+ info(" Run setup again any time to add or update credentials:");
241
+ info(" workweave setup");
242
+ info("");
243
+ }
244
+ // ── entrypoint ─────────────────────────────────────────────────────────────
245
+ async function runSetup() {
246
+ const rl = (0, promises_1.createInterface)({ input: process.stdin, output: process.stdout });
247
+ try {
248
+ console.log("");
249
+ hr();
250
+ console.log(" Workweave — setup");
251
+ hr();
252
+ info("");
253
+ info(" Configures connectors and AI synthesis.");
254
+ info(" Credentials are stored in a local .env file (never committed).");
255
+ await setupGitHub(rl);
256
+ const hasLocal = await setupLocalModel(rl);
257
+ if (!hasLocal) {
258
+ // Only prompt for an API key if they declined the local model
259
+ await setupAPIProvider(rl);
260
+ }
261
+ else {
262
+ // Still offer an API key as an optional fallback
263
+ const addKey = await yesNo(rl, "\n Also add an API key as fallback?", false);
264
+ if (addKey)
265
+ await pickAndEnterKey(rl);
266
+ }
267
+ await setupWorkdayHours(rl);
268
+ await setupLinear(rl);
269
+ await setupSlack(rl);
270
+ printNextSteps();
271
+ }
272
+ finally {
273
+ rl.close();
274
+ }
275
+ }
276
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ export type ArtifactType = "pr" | "issue" | "slack_message" | "slack_thread" | "meeting" | "notion_page" | "commit";
2
+ export type TaskStatus = "todo" | "in_progress" | "done" | "snoozed";
3
+ export type ActionType = "plan" | "review" | "investigate" | "open_url" | "context_link" | "mark_done" | "snooze" | "start_work";
4
+ export interface RawEvent {
5
+ id: string;
6
+ connectorId: string;
7
+ sourceType: string;
8
+ rawPayload: unknown;
9
+ fetchedAt: string;
10
+ }
11
+ export interface Artifact {
12
+ id: string;
13
+ type: ArtifactType;
14
+ title: string;
15
+ description?: string;
16
+ sourceUrl: string;
17
+ connectorId: string;
18
+ externalId: string;
19
+ priority?: number;
20
+ createdAt: string;
21
+ updatedAt: string;
22
+ metadata: Record<string, unknown>;
23
+ relatedArtifactIds: string[];
24
+ }
25
+ export interface ExecutionAction {
26
+ id: string;
27
+ type: ActionType;
28
+ label: string;
29
+ icon?: string;
30
+ params: Record<string, unknown>;
31
+ }
32
+ export interface TaskCluster {
33
+ id: string;
34
+ title: string;
35
+ summary: string;
36
+ category: TaskCategory;
37
+ artifacts: Artifact[];
38
+ priorityScore: number;
39
+ priorityReasons: string[];
40
+ estimatedMinutes: number;
41
+ status: TaskStatus;
42
+ actions: ExecutionAction[];
43
+ snoozedUntil?: string;
44
+ scheduledSlot?: {
45
+ start: number;
46
+ end: number;
47
+ };
48
+ }
49
+ export type TaskCategory = "review" | "implementation" | "respond" | "investigate" | "meeting_prep" | "follow_up" | "other";
50
+ export type AIProviderType = "openai" | "anthropic" | "ollama" | "local";
51
+ export interface WorkweavePlan {
52
+ id: string;
53
+ date: string;
54
+ clusters: TaskCluster[];
55
+ totalMinutes: number;
56
+ usedMinutes: number;
57
+ generatedAt: string;
58
+ synthesisMode?: "ai" | "rules";
59
+ synthesisProvider?: AIProviderType;
60
+ }
61
+ export type ConnectorAuthMethod = "cli" | "token";
62
+ export type ConnectorStatus = {
63
+ available: true;
64
+ authMethod: ConnectorAuthMethod;
65
+ } | {
66
+ available: false;
67
+ reason: string;
68
+ setupInstructions: string;
69
+ };
70
+ export interface ConnectorCapability {
71
+ type: ArtifactType;
72
+ description: string;
73
+ }
74
+ export interface Connector {
75
+ id: string;
76
+ name: string;
77
+ icon: string;
78
+ detect(): Promise<ConnectorStatus>;
79
+ authenticate(): Promise<boolean>;
80
+ fetch(): Promise<RawEvent[]>;
81
+ getCapabilities(): ConnectorCapability[];
82
+ }
83
+ export interface ConnectorInfo {
84
+ id: string;
85
+ name: string;
86
+ icon: string;
87
+ status: ConnectorStatus;
88
+ capabilities: ConnectorCapability[];
89
+ }
90
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "workweave",
3
+ "description": "CLI tool that weaves scattered developer signals into a focused, prioritized workday plan",
4
+ "version": "0.2.0",
5
+ "license": "MIT",
6
+ "homepage": "https://emin93.github.io/workweave/",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/emin93/workweave.git"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/emin93/workweave/issues"
13
+ },
14
+ "keywords": [
15
+ "developer-tools",
16
+ "productivity",
17
+ "cli",
18
+ "workday",
19
+ "planning",
20
+ "github",
21
+ "linear",
22
+ "slack",
23
+ "ai",
24
+ "llm"
25
+ ],
26
+ "engines": {
27
+ "node": ">=18"
28
+ },
29
+ "files": [
30
+ "dist",
31
+ "README.md",
32
+ "LICENSE"
33
+ ],
34
+ "bin": {
35
+ "workweave": "dist/cli.js"
36
+ },
37
+ "scripts": {
38
+ "build": "tsc -p tsconfig.json",
39
+ "dev": "npm run build && node dist/cli.js",
40
+ "lint": "eslint src/ --ext .ts",
41
+ "prepublishOnly": "npm run build"
42
+ },
43
+ "devDependencies": {
44
+ "@types/node": "^20.11.0",
45
+ "eslint": "^9.0.0",
46
+ "typescript": "^5.7.0"
47
+ },
48
+ "dependencies": {
49
+ "node-llama-cpp": "^3.18.1"
50
+ }
51
+ }