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.
- package/LICENSE +21 -0
- package/README.md +254 -0
- package/dist/ai/local.d.ts +9 -0
- package/dist/ai/local.d.ts.map +1 -0
- package/dist/ai/local.js +148 -0
- package/dist/ai/local.js.map +1 -0
- package/dist/ai/provider.d.ts +43 -0
- package/dist/ai/provider.d.ts.map +1 -0
- package/dist/ai/provider.js +191 -0
- package/dist/ai/provider.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +193 -0
- package/dist/cli.js.map +1 -0
- package/dist/connectors/github.d.ts +13 -0
- package/dist/connectors/github.d.ts.map +1 -0
- package/dist/connectors/github.js +212 -0
- package/dist/connectors/github.js.map +1 -0
- package/dist/connectors/linear.d.ts +12 -0
- package/dist/connectors/linear.d.ts.map +1 -0
- package/dist/connectors/linear.js +160 -0
- package/dist/connectors/linear.js.map +1 -0
- package/dist/connectors/registry.d.ts +10 -0
- package/dist/connectors/registry.d.ts.map +1 -0
- package/dist/connectors/registry.js +36 -0
- package/dist/connectors/registry.js.map +1 -0
- package/dist/connectors/slack.d.ts +11 -0
- package/dist/connectors/slack.d.ts.map +1 -0
- package/dist/connectors/slack.js +212 -0
- package/dist/connectors/slack.js.map +1 -0
- package/dist/connectors/types.d.ts +2 -0
- package/dist/connectors/types.d.ts.map +1 -0
- package/dist/connectors/types.js +3 -0
- package/dist/connectors/types.js.map +1 -0
- package/dist/display.d.ts +9 -0
- package/dist/display.d.ts.map +1 -0
- package/dist/display.js +216 -0
- package/dist/display.js.map +1 -0
- package/dist/env.d.ts +4 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +64 -0
- package/dist/env.js.map +1 -0
- package/dist/pipeline/ai-synthesize.d.ts +11 -0
- package/dist/pipeline/ai-synthesize.d.ts.map +1 -0
- package/dist/pipeline/ai-synthesize.js +264 -0
- package/dist/pipeline/ai-synthesize.js.map +1 -0
- package/dist/pipeline/cluster-id.d.ts +5 -0
- package/dist/pipeline/cluster-id.d.ts.map +1 -0
- package/dist/pipeline/cluster-id.js +13 -0
- package/dist/pipeline/cluster-id.js.map +1 -0
- package/dist/pipeline/correlate.d.ts +7 -0
- package/dist/pipeline/correlate.d.ts.map +1 -0
- package/dist/pipeline/correlate.js +105 -0
- package/dist/pipeline/correlate.js.map +1 -0
- package/dist/pipeline/ingest.d.ts +17 -0
- package/dist/pipeline/ingest.d.ts.map +1 -0
- package/dist/pipeline/ingest.js +56 -0
- package/dist/pipeline/ingest.js.map +1 -0
- package/dist/pipeline/merge-plan.d.ts +14 -0
- package/dist/pipeline/merge-plan.d.ts.map +1 -0
- package/dist/pipeline/merge-plan.js +70 -0
- package/dist/pipeline/merge-plan.js.map +1 -0
- package/dist/pipeline/normalize.d.ts +3 -0
- package/dist/pipeline/normalize.d.ts.map +1 -0
- package/dist/pipeline/normalize.js +169 -0
- package/dist/pipeline/normalize.js.map +1 -0
- package/dist/pipeline/prioritize.d.ts +6 -0
- package/dist/pipeline/prioritize.d.ts.map +1 -0
- package/dist/pipeline/prioritize.js +453 -0
- package/dist/pipeline/prioritize.js.map +1 -0
- package/dist/pipeline/schedule.d.ts +11 -0
- package/dist/pipeline/schedule.d.ts.map +1 -0
- package/dist/pipeline/schedule.js +98 -0
- package/dist/pipeline/schedule.js.map +1 -0
- package/dist/setup.d.ts +2 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +276 -0
- package/dist/setup.js.map +1 -0
- package/dist/types/index.d.ts +90 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/ai/provider.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const registry_1 = require("./connectors/registry");
|
|
5
|
+
const github_1 = require("./connectors/github");
|
|
6
|
+
const linear_1 = require("./connectors/linear");
|
|
7
|
+
const slack_1 = require("./connectors/slack");
|
|
8
|
+
const ingest_1 = require("./pipeline/ingest");
|
|
9
|
+
const normalize_1 = require("./pipeline/normalize");
|
|
10
|
+
const correlate_1 = require("./pipeline/correlate");
|
|
11
|
+
const prioritize_1 = require("./pipeline/prioritize");
|
|
12
|
+
const schedule_1 = require("./pipeline/schedule");
|
|
13
|
+
const ai_synthesize_1 = require("./pipeline/ai-synthesize");
|
|
14
|
+
const provider_1 = require("./ai/provider");
|
|
15
|
+
const local_1 = require("./ai/local");
|
|
16
|
+
const env_1 = require("./env");
|
|
17
|
+
const setup_1 = require("./setup");
|
|
18
|
+
const display_1 = require("./display");
|
|
19
|
+
function parseArgs(argv) {
|
|
20
|
+
const args = [...argv];
|
|
21
|
+
const first = args[0];
|
|
22
|
+
const command = first === "detect" || first === "setup" || first === "synth"
|
|
23
|
+
? args.shift()
|
|
24
|
+
: "synth";
|
|
25
|
+
const opts = {
|
|
26
|
+
command,
|
|
27
|
+
connectors: ["github"],
|
|
28
|
+
workdayMinutes: Number(process.env.WORKDAY_MINUTES ?? "480"),
|
|
29
|
+
ai: false,
|
|
30
|
+
json: false,
|
|
31
|
+
};
|
|
32
|
+
for (let i = 0; i < args.length; i++) {
|
|
33
|
+
const a = args[i];
|
|
34
|
+
if (a === "--connectors")
|
|
35
|
+
opts.connectors = (args[++i] ?? "github").split(",").map((x) => x.trim()).filter(Boolean);
|
|
36
|
+
else if (a === "--workday-minutes")
|
|
37
|
+
opts.workdayMinutes = Number(args[++i] ?? "480");
|
|
38
|
+
else if (a === "--ai")
|
|
39
|
+
opts.ai = true;
|
|
40
|
+
else if (a === "--json")
|
|
41
|
+
opts.json = true;
|
|
42
|
+
else if (a === "--provider") {
|
|
43
|
+
const val = args[++i] ?? "";
|
|
44
|
+
if (val === "openai" || val === "anthropic" || val === "local")
|
|
45
|
+
opts.provider = val;
|
|
46
|
+
}
|
|
47
|
+
else if (a === "-h" || a === "--help") {
|
|
48
|
+
printHelp();
|
|
49
|
+
process.exit(0);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return opts;
|
|
53
|
+
}
|
|
54
|
+
function printHelp() {
|
|
55
|
+
console.log(`Workweave
|
|
56
|
+
|
|
57
|
+
Usage:
|
|
58
|
+
workweave setup
|
|
59
|
+
workweave detect [--connectors github,linear,slack] [--json]
|
|
60
|
+
workweave synth [--connectors github,linear,slack] [--workday-minutes 480]
|
|
61
|
+
[--ai] [--provider local|anthropic|openai] [--json]
|
|
62
|
+
|
|
63
|
+
Flags:
|
|
64
|
+
--json Machine-readable JSON output (default: formatted terminal)
|
|
65
|
+
--ai Enable AI synthesis
|
|
66
|
+
--provider <name> Force a specific AI provider (local | anthropic | openai)
|
|
67
|
+
--workday-minutes Available minutes in your workday (default: 480)
|
|
68
|
+
--connectors Comma-separated list of connectors to use
|
|
69
|
+
|
|
70
|
+
Environment variables:
|
|
71
|
+
GITHUB_TOKEN GitHub personal access token (repo scope)
|
|
72
|
+
ANTHROPIC_API_KEY Anthropic API key (fallback when local model unavailable)
|
|
73
|
+
ANTHROPIC_MODEL Model override (default: claude-haiku-4-5)
|
|
74
|
+
OPENAI_API_KEY OpenAI API key (fallback when Anthropic unavailable)
|
|
75
|
+
OPENAI_MODEL Model override (default: gpt-4o-mini)
|
|
76
|
+
LINEAR_API_KEY Linear personal API key
|
|
77
|
+
SLACK_USER_TOKEN Slack user token (xoxp-...)
|
|
78
|
+
`);
|
|
79
|
+
}
|
|
80
|
+
function buildRegistry() {
|
|
81
|
+
const registry = new registry_1.ConnectorRegistry();
|
|
82
|
+
registry.register(new github_1.GitHubConnector());
|
|
83
|
+
registry.register(new linear_1.LinearConnector());
|
|
84
|
+
registry.register(new slack_1.SlackConnector());
|
|
85
|
+
return registry;
|
|
86
|
+
}
|
|
87
|
+
async function resolveProvider(useAi, preferredProvider) {
|
|
88
|
+
if (!useAi)
|
|
89
|
+
return null;
|
|
90
|
+
const anthropicKey = process.env.ANTHROPIC_API_KEY;
|
|
91
|
+
const openaiKey = process.env.OPENAI_API_KEY;
|
|
92
|
+
if (preferredProvider === "local") {
|
|
93
|
+
if (!(0, local_1.modelExists)()) {
|
|
94
|
+
throw new Error("Local model not found. Run `workweave setup` to download it.");
|
|
95
|
+
}
|
|
96
|
+
return new provider_1.LlamaCppProvider((0, local_1.modelPath)());
|
|
97
|
+
}
|
|
98
|
+
if (preferredProvider === "anthropic") {
|
|
99
|
+
if (!anthropicKey)
|
|
100
|
+
throw new Error("ANTHROPIC_API_KEY is required when --provider anthropic is set.");
|
|
101
|
+
return new provider_1.AnthropicProvider({ apiKey: anthropicKey, model: process.env.ANTHROPIC_MODEL });
|
|
102
|
+
}
|
|
103
|
+
if (preferredProvider === "openai") {
|
|
104
|
+
if (!openaiKey)
|
|
105
|
+
throw new Error("OPENAI_API_KEY is required when --provider openai is set.");
|
|
106
|
+
return new provider_1.OpenAIProvider({ apiKey: openaiKey, model: process.env.OPENAI_MODEL });
|
|
107
|
+
}
|
|
108
|
+
// Auto-detect: local → Anthropic → OpenAI
|
|
109
|
+
if ((0, local_1.modelExists)())
|
|
110
|
+
return new provider_1.LlamaCppProvider((0, local_1.modelPath)());
|
|
111
|
+
if (anthropicKey)
|
|
112
|
+
return new provider_1.AnthropicProvider({ apiKey: anthropicKey, model: process.env.ANTHROPIC_MODEL });
|
|
113
|
+
if (openaiKey)
|
|
114
|
+
return new provider_1.OpenAIProvider({ apiKey: openaiKey, model: process.env.OPENAI_MODEL });
|
|
115
|
+
throw new Error("No AI provider found. Run `workweave setup` to download a local model or add an API key.");
|
|
116
|
+
}
|
|
117
|
+
(0, env_1.loadLocalEnv)();
|
|
118
|
+
async function run() {
|
|
119
|
+
const opts = parseArgs(process.argv.slice(2));
|
|
120
|
+
// In JSON mode suppress the [info]/[warn] progress logs so stdout stays clean
|
|
121
|
+
if (opts.json) {
|
|
122
|
+
ingest_1.log.info = () => { };
|
|
123
|
+
ingest_1.log.warn = () => { };
|
|
124
|
+
ingest_1.log.error = () => { };
|
|
125
|
+
}
|
|
126
|
+
if (!["detect", "setup", "synth"].includes(opts.command)) {
|
|
127
|
+
printHelp();
|
|
128
|
+
process.exit(1);
|
|
129
|
+
}
|
|
130
|
+
const registry = buildRegistry();
|
|
131
|
+
if (opts.command === "setup") {
|
|
132
|
+
await (0, setup_1.runSetup)();
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
if (opts.command === "detect") {
|
|
136
|
+
if (!opts.json)
|
|
137
|
+
(0, display_1.startSpinner)("Checking connectors…");
|
|
138
|
+
const infos = await registry.detectAll();
|
|
139
|
+
(0, display_1.stopSpinner)();
|
|
140
|
+
if (opts.json) {
|
|
141
|
+
console.log(JSON.stringify({ connectors: infos }, null, 2));
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
(0, display_1.printDetect)(infos);
|
|
145
|
+
}
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
// synth
|
|
149
|
+
if (!opts.json)
|
|
150
|
+
(0, display_1.startSpinner)("Fetching from connectors…");
|
|
151
|
+
const ingestion = new ingest_1.IngestionOrchestrator(registry);
|
|
152
|
+
const { events, errors } = await ingestion.fetchAll(opts.connectors);
|
|
153
|
+
const artifacts = (0, normalize_1.normalize)(events);
|
|
154
|
+
const provider = await resolveProvider(opts.ai, opts.provider);
|
|
155
|
+
let clusters;
|
|
156
|
+
let synthesisMode = "rules";
|
|
157
|
+
if (provider) {
|
|
158
|
+
if (!opts.json)
|
|
159
|
+
(0, display_1.startSpinner)(`Synthesizing with ${provider.name}…`);
|
|
160
|
+
const out = await (0, ai_synthesize_1.aiSynthesize)(artifacts, provider, {
|
|
161
|
+
info: (msg) => process.stderr.write(`[info] ${msg}\n`),
|
|
162
|
+
warn: (msg) => process.stderr.write(`[warn] ${msg}\n`),
|
|
163
|
+
});
|
|
164
|
+
clusters = out.clusters;
|
|
165
|
+
synthesisMode = out.mode;
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
clusters = (0, prioritize_1.prioritize)((0, correlate_1.correlate)(artifacts));
|
|
169
|
+
}
|
|
170
|
+
(0, display_1.stopSpinner)();
|
|
171
|
+
const plan = (0, schedule_1.schedule)(clusters, opts.workdayMinutes);
|
|
172
|
+
plan.synthesisMode = synthesisMode;
|
|
173
|
+
plan.synthesisProvider = provider?.id;
|
|
174
|
+
const meta = {
|
|
175
|
+
connectors: opts.connectors,
|
|
176
|
+
rawEvents: events.length,
|
|
177
|
+
artifacts: artifacts.length,
|
|
178
|
+
connectorErrors: errors,
|
|
179
|
+
};
|
|
180
|
+
if (opts.json) {
|
|
181
|
+
console.log(JSON.stringify({ plan, meta }, null, 2));
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
(0, display_1.printPlan)(plan, meta);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
run().catch((err) => {
|
|
188
|
+
(0, display_1.stopSpinner)();
|
|
189
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
190
|
+
console.error(msg);
|
|
191
|
+
process.exit(1);
|
|
192
|
+
});
|
|
193
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Connector, ConnectorStatus, ConnectorCapability, RawEvent } from "../types";
|
|
2
|
+
export declare class GitHubConnector implements Connector {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
icon: string;
|
|
6
|
+
private _token;
|
|
7
|
+
private _username;
|
|
8
|
+
detect(): Promise<ConnectorStatus>;
|
|
9
|
+
authenticate(): Promise<boolean>;
|
|
10
|
+
getCapabilities(): ConnectorCapability[];
|
|
11
|
+
fetch(): Promise<RawEvent[]>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=github.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/connectors/github.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EACf,mBAAmB,EACnB,QAAQ,EACT,MAAM,UAAU,CAAC;AAgDlB,qBAAa,eAAgB,YAAW,SAAS;IAC/C,EAAE,SAAY;IACd,IAAI,SAAY;IAChB,IAAI,SAAY;IAEhB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAuB;IAElC,MAAM,IAAI,OAAO,CAAC,eAAe,CAAC;IA6BlC,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAatC,eAAe,IAAI,mBAAmB,EAAE;IAOlC,KAAK,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;CA6DnC"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.GitHubConnector = void 0;
|
|
37
|
+
const https = __importStar(require("https"));
|
|
38
|
+
async function githubApi(token, path) {
|
|
39
|
+
return new Promise((resolve, reject) => {
|
|
40
|
+
const req = https.request({
|
|
41
|
+
hostname: "api.github.com",
|
|
42
|
+
path,
|
|
43
|
+
method: "GET",
|
|
44
|
+
headers: {
|
|
45
|
+
Authorization: `Bearer ${token}`,
|
|
46
|
+
Accept: "application/vnd.github+json",
|
|
47
|
+
"User-Agent": "workweave",
|
|
48
|
+
"X-GitHub-Api-Version": "2022-11-28",
|
|
49
|
+
},
|
|
50
|
+
}, (res) => {
|
|
51
|
+
let data = "";
|
|
52
|
+
res.on("data", (chunk) => (data += chunk));
|
|
53
|
+
res.on("end", () => {
|
|
54
|
+
if (res.statusCode === 401) {
|
|
55
|
+
reject(new Error("GitHub token is invalid or expired"));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (res.statusCode && res.statusCode >= 400) {
|
|
59
|
+
reject(new Error(`GitHub API error: HTTP ${res.statusCode}`));
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
resolve(JSON.parse(data));
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
reject(new Error("Failed to parse GitHub API response"));
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
req.on("error", reject);
|
|
71
|
+
req.setTimeout(15_000, () => {
|
|
72
|
+
req.destroy();
|
|
73
|
+
reject(new Error("GitHub API timeout"));
|
|
74
|
+
});
|
|
75
|
+
req.end();
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
class GitHubConnector {
|
|
79
|
+
id = "github";
|
|
80
|
+
name = "GitHub";
|
|
81
|
+
icon = "github";
|
|
82
|
+
_token = null;
|
|
83
|
+
_username = null;
|
|
84
|
+
async detect() {
|
|
85
|
+
const token = process.env.GITHUB_TOKEN;
|
|
86
|
+
if (!token) {
|
|
87
|
+
return {
|
|
88
|
+
available: false,
|
|
89
|
+
reason: "GITHUB_TOKEN is not set",
|
|
90
|
+
setupInstructions: [
|
|
91
|
+
"1. Go to github.com/settings/tokens → Generate new token (classic)",
|
|
92
|
+
"2. Name it 'Workweave', set expiration",
|
|
93
|
+
"3. Select scope: repo",
|
|
94
|
+
"4. Generate and copy the token",
|
|
95
|
+
"5. Run `workweave setup` and paste it when prompted",
|
|
96
|
+
].join("\n"),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
const user = await githubApi(token, "/user");
|
|
101
|
+
if (!user.login)
|
|
102
|
+
throw new Error("No login in response");
|
|
103
|
+
return { available: true, authMethod: "token" };
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
return {
|
|
107
|
+
available: false,
|
|
108
|
+
reason: err instanceof Error ? err.message : "GitHub token validation failed",
|
|
109
|
+
setupInstructions: "Run `workweave setup` to update your GITHUB_TOKEN.",
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async authenticate() {
|
|
114
|
+
const token = process.env.GITHUB_TOKEN;
|
|
115
|
+
if (!token)
|
|
116
|
+
return false;
|
|
117
|
+
try {
|
|
118
|
+
const user = await githubApi(token, "/user");
|
|
119
|
+
this._token = token;
|
|
120
|
+
this._username = user.login;
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
getCapabilities() {
|
|
128
|
+
return [
|
|
129
|
+
{ type: "pr", description: "Pull requests assigned or requesting your review" },
|
|
130
|
+
{ type: "issue", description: "Issues assigned to you" },
|
|
131
|
+
];
|
|
132
|
+
}
|
|
133
|
+
async fetch() {
|
|
134
|
+
if (!this._token || !this._username) {
|
|
135
|
+
const ok = await this.authenticate();
|
|
136
|
+
if (!ok)
|
|
137
|
+
throw new Error("GitHub authentication failed");
|
|
138
|
+
}
|
|
139
|
+
const token = this._token;
|
|
140
|
+
const username = this._username;
|
|
141
|
+
const events = [];
|
|
142
|
+
const now = new Date().toISOString();
|
|
143
|
+
const seen = new Set();
|
|
144
|
+
const errors = [];
|
|
145
|
+
const queries = [
|
|
146
|
+
{
|
|
147
|
+
label: "review-requested PRs",
|
|
148
|
+
q: `is:open+is:pr+review-requested:${username}+archived:false`,
|
|
149
|
+
sourceType: "pr",
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
label: "authored PRs",
|
|
153
|
+
q: `is:open+is:pr+author:${username}+archived:false`,
|
|
154
|
+
sourceType: "pr",
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
label: "assigned issues",
|
|
158
|
+
q: `is:open+is:issue+assignee:${username}+archived:false`,
|
|
159
|
+
sourceType: "issue",
|
|
160
|
+
},
|
|
161
|
+
];
|
|
162
|
+
for (const { label, q, sourceType } of queries) {
|
|
163
|
+
try {
|
|
164
|
+
const result = await githubApi(token, `/search/issues?q=${q}&per_page=25`);
|
|
165
|
+
for (const item of result.items ?? []) {
|
|
166
|
+
const repo = repoFromUrl(item.repository_url);
|
|
167
|
+
const key = `github-${sourceType}-${item.number}-${repo}`;
|
|
168
|
+
if (seen.has(key))
|
|
169
|
+
continue;
|
|
170
|
+
seen.add(key);
|
|
171
|
+
events.push({
|
|
172
|
+
id: key,
|
|
173
|
+
connectorId: this.id,
|
|
174
|
+
sourceType,
|
|
175
|
+
rawPayload: toPayload(item, username),
|
|
176
|
+
fetchedAt: now,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
errors.push(`${label}: ${err instanceof Error ? err.message : err}`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (events.length === 0 && errors.length > 0) {
|
|
185
|
+
throw new Error(`GitHub fetch failed: ${errors.join("; ")}`);
|
|
186
|
+
}
|
|
187
|
+
return events;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
exports.GitHubConnector = GitHubConnector;
|
|
191
|
+
function repoFromUrl(repositoryUrl) {
|
|
192
|
+
return repositoryUrl.replace("https://api.github.com/repos/", "");
|
|
193
|
+
}
|
|
194
|
+
function toPayload(item, currentUser) {
|
|
195
|
+
const authorLogin = item.user?.login ?? "unknown";
|
|
196
|
+
return {
|
|
197
|
+
number: item.number,
|
|
198
|
+
title: item.title,
|
|
199
|
+
url: item.html_url,
|
|
200
|
+
createdAt: item.created_at,
|
|
201
|
+
updatedAt: item.updated_at,
|
|
202
|
+
author: { login: authorLogin },
|
|
203
|
+
isAuthor: authorLogin.toLowerCase() === currentUser.toLowerCase(),
|
|
204
|
+
labels: (item.labels ?? []).map((l) => typeof l === "string" ? { name: l } : { name: l.name ?? "" }),
|
|
205
|
+
repository: { nameWithOwner: repoFromUrl(item.repository_url) },
|
|
206
|
+
headRefName: item.pull_request?.head?.ref ?? "",
|
|
207
|
+
additions: 0,
|
|
208
|
+
deletions: 0,
|
|
209
|
+
reviewRequests: [],
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=github.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/connectors/github.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Connector, ConnectorStatus, ConnectorCapability, RawEvent } from "../types";
|
|
2
|
+
export declare class LinearConnector implements Connector {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
icon: string;
|
|
6
|
+
private _token;
|
|
7
|
+
detect(): Promise<ConnectorStatus>;
|
|
8
|
+
authenticate(): Promise<boolean>;
|
|
9
|
+
getCapabilities(): ConnectorCapability[];
|
|
10
|
+
fetch(): Promise<RawEvent[]>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=linear.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear.d.ts","sourceRoot":"","sources":["../../src/connectors/linear.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EACf,mBAAmB,EACnB,QAAQ,EACT,MAAM,UAAU,CAAC;AAsDlB,qBAAa,eAAgB,YAAW,SAAS;IAC/C,EAAE,SAAY;IACd,IAAI,SAAY;IAChB,IAAI,SAAkB;IAEtB,OAAO,CAAC,MAAM,CAAuB;IAE/B,MAAM,IAAI,OAAO,CAAC,eAAe,CAAC;IAYlC,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAWtC,eAAe,IAAI,mBAAmB,EAAE;IAIlC,KAAK,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;CAoBnC"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.LinearConnector = void 0;
|
|
37
|
+
const https = __importStar(require("https"));
|
|
38
|
+
const LINEAR_API = "https://api.linear.app/graphql";
|
|
39
|
+
async function linearQuery(token, query, variables) {
|
|
40
|
+
return new Promise((resolve, reject) => {
|
|
41
|
+
const body = JSON.stringify({ query, variables });
|
|
42
|
+
const url = new URL(LINEAR_API);
|
|
43
|
+
const req = https.request({
|
|
44
|
+
hostname: url.hostname,
|
|
45
|
+
path: url.pathname,
|
|
46
|
+
method: "POST",
|
|
47
|
+
headers: {
|
|
48
|
+
"Content-Type": "application/json",
|
|
49
|
+
Authorization: `Bearer ${token}`,
|
|
50
|
+
"Content-Length": Buffer.byteLength(body),
|
|
51
|
+
},
|
|
52
|
+
}, (res) => {
|
|
53
|
+
let data = "";
|
|
54
|
+
res.on("data", (chunk) => (data += chunk));
|
|
55
|
+
res.on("end", () => {
|
|
56
|
+
try {
|
|
57
|
+
const parsed = JSON.parse(data);
|
|
58
|
+
if (parsed.errors) {
|
|
59
|
+
reject(new Error(parsed.errors[0]?.message ?? "Linear API error"));
|
|
60
|
+
}
|
|
61
|
+
else if (!parsed.data) {
|
|
62
|
+
reject(new Error("Linear API returned no data"));
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
resolve(parsed.data);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
reject(new Error(`Failed to parse Linear response (HTTP ${res.statusCode})`));
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
req.on("error", reject);
|
|
74
|
+
req.setTimeout(15_000, () => {
|
|
75
|
+
req.destroy();
|
|
76
|
+
reject(new Error("Linear API timeout"));
|
|
77
|
+
});
|
|
78
|
+
req.write(body);
|
|
79
|
+
req.end();
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
class LinearConnector {
|
|
83
|
+
id = "linear";
|
|
84
|
+
name = "Linear";
|
|
85
|
+
icon = "list-ordered";
|
|
86
|
+
_token = null;
|
|
87
|
+
async detect() {
|
|
88
|
+
if (!process.env.LINEAR_API_KEY) {
|
|
89
|
+
return {
|
|
90
|
+
available: false,
|
|
91
|
+
reason: "LINEAR_API_KEY is not set",
|
|
92
|
+
setupInstructions: "Set LINEAR_API_KEY in your environment with a personal API key from Linear settings.",
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
return { available: true, authMethod: "token" };
|
|
96
|
+
}
|
|
97
|
+
async authenticate() {
|
|
98
|
+
this._token = process.env.LINEAR_API_KEY ?? null;
|
|
99
|
+
if (!this._token)
|
|
100
|
+
return false;
|
|
101
|
+
try {
|
|
102
|
+
await linearQuery(this._token, `query { viewer { id } }`);
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
getCapabilities() {
|
|
110
|
+
return [{ type: "issue", description: "Issues assigned to you" }];
|
|
111
|
+
}
|
|
112
|
+
async fetch() {
|
|
113
|
+
if (!this._token) {
|
|
114
|
+
const ok = await this.authenticate();
|
|
115
|
+
if (!ok)
|
|
116
|
+
throw new Error("Linear authentication failed");
|
|
117
|
+
}
|
|
118
|
+
const now = new Date().toISOString();
|
|
119
|
+
const assigned = await linearQuery(this._token, ASSIGNED_ISSUES_QUERY);
|
|
120
|
+
return (assigned.viewer?.assignedIssues?.nodes ?? []).map((issue) => ({
|
|
121
|
+
id: `linear-issue-${issue.identifier}`,
|
|
122
|
+
connectorId: this.id,
|
|
123
|
+
sourceType: "issue",
|
|
124
|
+
rawPayload: issue,
|
|
125
|
+
fetchedAt: now,
|
|
126
|
+
}));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
exports.LinearConnector = LinearConnector;
|
|
130
|
+
const ISSUE_FIELDS = `
|
|
131
|
+
id
|
|
132
|
+
identifier
|
|
133
|
+
title
|
|
134
|
+
description
|
|
135
|
+
url
|
|
136
|
+
priority
|
|
137
|
+
priorityLabel
|
|
138
|
+
estimate
|
|
139
|
+
dueDate
|
|
140
|
+
createdAt
|
|
141
|
+
updatedAt
|
|
142
|
+
state { name type }
|
|
143
|
+
labels { nodes { name } }
|
|
144
|
+
project { name }
|
|
145
|
+
cycle { name startsAt endsAt }
|
|
146
|
+
`;
|
|
147
|
+
const ASSIGNED_ISSUES_QUERY = `
|
|
148
|
+
query {
|
|
149
|
+
viewer {
|
|
150
|
+
assignedIssues(
|
|
151
|
+
filter: { state: { type: { nin: ["completed", "canceled"] } } }
|
|
152
|
+
first: 50
|
|
153
|
+
orderBy: updatedAt
|
|
154
|
+
) {
|
|
155
|
+
nodes { ${ISSUE_FIELDS} }
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
`;
|
|
160
|
+
//# sourceMappingURL=linear.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear.js","sourceRoot":"","sources":["../../src/connectors/linear.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Connector, ConnectorInfo } from "../types";
|
|
2
|
+
export declare class ConnectorRegistry {
|
|
3
|
+
private _connectors;
|
|
4
|
+
register(connector: Connector): void;
|
|
5
|
+
get(id: string): Connector | undefined;
|
|
6
|
+
getAll(): Connector[];
|
|
7
|
+
getEnabled(enabledIds: string[]): Connector[];
|
|
8
|
+
detectAll(): Promise<ConnectorInfo[]>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=registry.d.ts.map
|