@stackmemoryai/stackmemory 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/scripts/initialize.js +15 -15
- package/dist/scripts/initialize.js.map +1 -1
- package/dist/scripts/status.js +21 -11
- package/dist/scripts/status.js.map +1 -1
- package/dist/src/beads/beads-task-store.d.ts +117 -0
- package/dist/src/beads/beads-task-store.d.ts.map +1 -0
- package/dist/src/beads/beads-task-store.js +318 -0
- package/dist/src/beads/beads-task-store.js.map +1 -0
- package/dist/src/beads/task-aware-context.d.ts +103 -0
- package/dist/src/beads/task-aware-context.d.ts.map +1 -0
- package/dist/src/beads/task-aware-context.js +395 -0
- package/dist/src/beads/task-aware-context.js.map +1 -0
- package/dist/src/beads-task-store.d.ts +117 -0
- package/dist/src/beads-task-store.d.ts.map +1 -0
- package/dist/src/beads-task-store.js +318 -0
- package/dist/src/beads-task-store.js.map +1 -0
- package/dist/src/cli/cli.d.ts +7 -0
- package/dist/src/cli/cli.d.ts.map +1 -0
- package/dist/src/cli/cli.js +471 -0
- package/dist/src/cli/cli.js.map +1 -0
- package/dist/src/core/error-handler.d.ts +46 -0
- package/dist/src/core/error-handler.d.ts.map +1 -0
- package/dist/src/core/error-handler.js +212 -0
- package/dist/src/core/error-handler.js.map +1 -0
- package/dist/src/core/frame-manager.d.ts +106 -0
- package/dist/src/core/frame-manager.d.ts.map +1 -0
- package/dist/src/core/frame-manager.js +387 -0
- package/dist/src/core/frame-manager.js.map +1 -0
- package/dist/src/core/logger.d.ts +24 -0
- package/dist/src/core/logger.d.ts.map +1 -0
- package/dist/src/core/logger.js +121 -0
- package/dist/src/core/logger.js.map +1 -0
- package/dist/src/core/logger.test.d.ts +2 -0
- package/dist/src/core/logger.test.d.ts.map +1 -0
- package/dist/src/core/logger.test.js +31 -0
- package/dist/src/core/logger.test.js.map +1 -0
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/integrations/linear-auth.d.ts +99 -0
- package/dist/src/integrations/linear-auth.d.ts.map +1 -0
- package/dist/src/integrations/linear-auth.js +319 -0
- package/dist/src/integrations/linear-auth.js.map +1 -0
- package/dist/src/integrations/linear-auto-sync.d.ts +77 -0
- package/dist/src/integrations/linear-auto-sync.d.ts.map +1 -0
- package/dist/src/integrations/linear-auto-sync.js +268 -0
- package/dist/src/integrations/linear-auto-sync.js.map +1 -0
- package/dist/src/integrations/linear-client.d.ts +86 -0
- package/dist/src/integrations/linear-client.d.ts.map +1 -0
- package/dist/src/integrations/linear-client.js +275 -0
- package/dist/src/integrations/linear-client.js.map +1 -0
- package/dist/src/integrations/linear-config.d.ts +51 -0
- package/dist/src/integrations/linear-config.d.ts.map +1 -0
- package/dist/src/integrations/linear-config.js +103 -0
- package/dist/src/integrations/linear-config.js.map +1 -0
- package/dist/src/integrations/linear-sync.d.ts +95 -0
- package/dist/src/integrations/linear-sync.d.ts.map +1 -0
- package/dist/src/integrations/linear-sync.js +340 -0
- package/dist/src/integrations/linear-sync.js.map +1 -0
- package/dist/src/mcp/mcp-server.d.ts +38 -0
- package/dist/src/mcp/mcp-server.d.ts.map +1 -0
- package/dist/src/mcp/mcp-server.js +812 -0
- package/dist/src/mcp/mcp-server.js.map +1 -0
- package/dist/src/pebbles/pebbles-task-store.d.ts +117 -0
- package/dist/src/pebbles/pebbles-task-store.d.ts.map +1 -0
- package/dist/src/pebbles/pebbles-task-store.js +335 -0
- package/dist/src/pebbles/pebbles-task-store.js.map +1 -0
- package/dist/src/pebbles/task-aware-context.d.ts +103 -0
- package/dist/src/pebbles/task-aware-context.d.ts.map +1 -0
- package/dist/src/pebbles/task-aware-context.js +412 -0
- package/dist/src/pebbles/task-aware-context.js.map +1 -0
- package/dist/src/task-aware-context.d.ts +103 -0
- package/dist/src/task-aware-context.d.ts.map +1 -0
- package/dist/src/task-aware-context.js +395 -0
- package/dist/src/task-aware-context.js.map +1 -0
- package/package.json +40 -9
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Linear OAuth Authentication Setup
|
|
3
|
+
* Handles initial OAuth flow and token management for Linear integration
|
|
4
|
+
*/
|
|
5
|
+
export interface LinearAuthConfig {
|
|
6
|
+
clientId: string;
|
|
7
|
+
clientSecret: string;
|
|
8
|
+
redirectUri: string;
|
|
9
|
+
scopes: string[];
|
|
10
|
+
}
|
|
11
|
+
export interface LinearTokens {
|
|
12
|
+
accessToken: string;
|
|
13
|
+
refreshToken?: string;
|
|
14
|
+
expiresAt: number;
|
|
15
|
+
scope: string[];
|
|
16
|
+
}
|
|
17
|
+
export interface LinearAuthResult {
|
|
18
|
+
accessToken: string;
|
|
19
|
+
refreshToken?: string;
|
|
20
|
+
expiresIn: number;
|
|
21
|
+
scope: string;
|
|
22
|
+
tokenType: string;
|
|
23
|
+
}
|
|
24
|
+
export declare class LinearAuthManager {
|
|
25
|
+
private configPath;
|
|
26
|
+
private tokensPath;
|
|
27
|
+
private config?;
|
|
28
|
+
constructor(projectRoot: string);
|
|
29
|
+
/**
|
|
30
|
+
* Check if Linear integration is configured
|
|
31
|
+
*/
|
|
32
|
+
isConfigured(): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Save OAuth application configuration
|
|
35
|
+
*/
|
|
36
|
+
saveConfig(config: LinearAuthConfig): void;
|
|
37
|
+
/**
|
|
38
|
+
* Load OAuth configuration
|
|
39
|
+
*/
|
|
40
|
+
loadConfig(): LinearAuthConfig | null;
|
|
41
|
+
/**
|
|
42
|
+
* Generate OAuth authorization URL with PKCE
|
|
43
|
+
*/
|
|
44
|
+
generateAuthUrl(state?: string): {
|
|
45
|
+
url: string;
|
|
46
|
+
codeVerifier: string;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Exchange authorization code for access token
|
|
50
|
+
*/
|
|
51
|
+
exchangeCodeForToken(authCode: string, codeVerifier: string): Promise<LinearTokens>;
|
|
52
|
+
/**
|
|
53
|
+
* Refresh access token using refresh token
|
|
54
|
+
*/
|
|
55
|
+
refreshAccessToken(): Promise<LinearTokens>;
|
|
56
|
+
/**
|
|
57
|
+
* Get valid access token (refresh if needed)
|
|
58
|
+
*/
|
|
59
|
+
getValidToken(): Promise<string>;
|
|
60
|
+
/**
|
|
61
|
+
* Save tokens to file
|
|
62
|
+
*/
|
|
63
|
+
private saveTokens;
|
|
64
|
+
/**
|
|
65
|
+
* Load tokens from file
|
|
66
|
+
*/
|
|
67
|
+
loadTokens(): LinearTokens | null;
|
|
68
|
+
/**
|
|
69
|
+
* Clear stored tokens and config
|
|
70
|
+
*/
|
|
71
|
+
clearAuth(): void;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Default Linear OAuth scopes for task management
|
|
75
|
+
*/
|
|
76
|
+
export declare const DEFAULT_LINEAR_SCOPES: string[];
|
|
77
|
+
/**
|
|
78
|
+
* Linear OAuth setup helper
|
|
79
|
+
*/
|
|
80
|
+
export declare class LinearOAuthSetup {
|
|
81
|
+
private authManager;
|
|
82
|
+
constructor(projectRoot: string);
|
|
83
|
+
/**
|
|
84
|
+
* Interactive setup for Linear OAuth
|
|
85
|
+
*/
|
|
86
|
+
setupInteractive(): Promise<{
|
|
87
|
+
authUrl: string;
|
|
88
|
+
instructions: string[];
|
|
89
|
+
}>;
|
|
90
|
+
/**
|
|
91
|
+
* Complete OAuth flow with authorization code
|
|
92
|
+
*/
|
|
93
|
+
completeAuth(authCode: string): Promise<boolean>;
|
|
94
|
+
/**
|
|
95
|
+
* Test the Linear connection
|
|
96
|
+
*/
|
|
97
|
+
testConnection(): Promise<boolean>;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=linear-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear-auth.d.ts","sourceRoot":"","sources":["../../../src/integrations/linear-auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAC,CAAmB;gBAEtB,WAAW,EAAE,MAAM;IAM/B;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAM1C;;OAEG;IACH,UAAU,IAAI,gBAAgB,GAAG,IAAI;IAerC;;OAEG;IACH,eAAe,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE;IA8BtE;;OAEG;IACG,oBAAoB,CACxB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,YAAY,CAAC;IA8CxB;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,YAAY,CAAC;IA8CjD;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAiBtC;;OAEG;IACH,OAAO,CAAC,UAAU;IAKlB;;OAEG;IACH,UAAU,IAAI,YAAY,GAAG,IAAI;IAcjC;;OAEG;IACH,SAAS,IAAI,IAAI;CASlB;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,UAIjC,CAAC;AAEF;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAoB;gBAE3B,WAAW,EAAE,MAAM;IAI/B;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC;QAChC,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC;IAgDF;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBtD;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;CAgCzC"}
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Linear OAuth Authentication Setup
|
|
3
|
+
* Handles initial OAuth flow and token management for Linear integration
|
|
4
|
+
*/
|
|
5
|
+
import { createHash, randomBytes } from 'crypto';
|
|
6
|
+
import { readFileSync, writeFileSync, existsSync } from 'fs';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
import { logger } from '../core/logger.js';
|
|
9
|
+
export class LinearAuthManager {
|
|
10
|
+
configPath;
|
|
11
|
+
tokensPath;
|
|
12
|
+
config;
|
|
13
|
+
constructor(projectRoot) {
|
|
14
|
+
const configDir = join(projectRoot, '.stackmemory');
|
|
15
|
+
this.configPath = join(configDir, 'linear-config.json');
|
|
16
|
+
this.tokensPath = join(configDir, 'linear-tokens.json');
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Check if Linear integration is configured
|
|
20
|
+
*/
|
|
21
|
+
isConfigured() {
|
|
22
|
+
return existsSync(this.configPath) && existsSync(this.tokensPath);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Save OAuth application configuration
|
|
26
|
+
*/
|
|
27
|
+
saveConfig(config) {
|
|
28
|
+
writeFileSync(this.configPath, JSON.stringify(config, null, 2));
|
|
29
|
+
this.config = config;
|
|
30
|
+
logger.info('Linear OAuth configuration saved');
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Load OAuth configuration
|
|
34
|
+
*/
|
|
35
|
+
loadConfig() {
|
|
36
|
+
if (!existsSync(this.configPath)) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
const configData = readFileSync(this.configPath, 'utf8');
|
|
41
|
+
this.config = JSON.parse(configData);
|
|
42
|
+
return this.config;
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
logger.error('Failed to load Linear configuration:', error);
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Generate OAuth authorization URL with PKCE
|
|
51
|
+
*/
|
|
52
|
+
generateAuthUrl(state) {
|
|
53
|
+
if (!this.config) {
|
|
54
|
+
throw new Error('Linear OAuth configuration not loaded');
|
|
55
|
+
}
|
|
56
|
+
// Generate PKCE parameters
|
|
57
|
+
const codeVerifier = randomBytes(32).toString('base64url');
|
|
58
|
+
const codeChallenge = createHash('sha256')
|
|
59
|
+
.update(codeVerifier)
|
|
60
|
+
.digest('base64url');
|
|
61
|
+
const params = new URLSearchParams({
|
|
62
|
+
client_id: this.config.clientId,
|
|
63
|
+
redirect_uri: this.config.redirectUri,
|
|
64
|
+
response_type: 'code',
|
|
65
|
+
scope: this.config.scopes.join(' '),
|
|
66
|
+
code_challenge: codeChallenge,
|
|
67
|
+
code_challenge_method: 'S256',
|
|
68
|
+
actor: 'app', // Enable actor authorization for service accounts
|
|
69
|
+
});
|
|
70
|
+
if (state) {
|
|
71
|
+
params.set('state', state);
|
|
72
|
+
}
|
|
73
|
+
const authUrl = `https://linear.app/oauth/authorize?${params.toString()}`;
|
|
74
|
+
return { url: authUrl, codeVerifier };
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Exchange authorization code for access token
|
|
78
|
+
*/
|
|
79
|
+
async exchangeCodeForToken(authCode, codeVerifier) {
|
|
80
|
+
if (!this.config) {
|
|
81
|
+
throw new Error('Linear OAuth configuration not loaded');
|
|
82
|
+
}
|
|
83
|
+
const tokenUrl = 'https://api.linear.app/oauth/token';
|
|
84
|
+
const body = new URLSearchParams({
|
|
85
|
+
grant_type: 'authorization_code',
|
|
86
|
+
client_id: this.config.clientId,
|
|
87
|
+
client_secret: this.config.clientSecret,
|
|
88
|
+
redirect_uri: this.config.redirectUri,
|
|
89
|
+
code: authCode,
|
|
90
|
+
code_verifier: codeVerifier,
|
|
91
|
+
});
|
|
92
|
+
const response = await fetch(tokenUrl, {
|
|
93
|
+
method: 'POST',
|
|
94
|
+
headers: {
|
|
95
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
96
|
+
Accept: 'application/json',
|
|
97
|
+
},
|
|
98
|
+
body: body.toString(),
|
|
99
|
+
});
|
|
100
|
+
if (!response.ok) {
|
|
101
|
+
const errorText = await response.text();
|
|
102
|
+
throw new Error(`Token exchange failed: ${response.status} ${errorText}`);
|
|
103
|
+
}
|
|
104
|
+
const result = (await response.json());
|
|
105
|
+
// Calculate expiration time (tokens expire in 24 hours)
|
|
106
|
+
const expiresAt = Date.now() + result.expiresIn * 1000;
|
|
107
|
+
const tokens = {
|
|
108
|
+
accessToken: result.accessToken,
|
|
109
|
+
refreshToken: result.refreshToken,
|
|
110
|
+
expiresAt,
|
|
111
|
+
scope: result.scope.split(' '),
|
|
112
|
+
};
|
|
113
|
+
this.saveTokens(tokens);
|
|
114
|
+
return tokens;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Refresh access token using refresh token
|
|
118
|
+
*/
|
|
119
|
+
async refreshAccessToken() {
|
|
120
|
+
if (!this.config) {
|
|
121
|
+
throw new Error('Linear OAuth configuration not loaded');
|
|
122
|
+
}
|
|
123
|
+
const currentTokens = this.loadTokens();
|
|
124
|
+
if (!currentTokens?.refreshToken) {
|
|
125
|
+
throw new Error('No refresh token available');
|
|
126
|
+
}
|
|
127
|
+
const tokenUrl = 'https://api.linear.app/oauth/token';
|
|
128
|
+
const body = new URLSearchParams({
|
|
129
|
+
grant_type: 'refresh_token',
|
|
130
|
+
client_id: this.config.clientId,
|
|
131
|
+
client_secret: this.config.clientSecret,
|
|
132
|
+
refresh_token: currentTokens.refreshToken,
|
|
133
|
+
});
|
|
134
|
+
const response = await fetch(tokenUrl, {
|
|
135
|
+
method: 'POST',
|
|
136
|
+
headers: {
|
|
137
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
138
|
+
Accept: 'application/json',
|
|
139
|
+
},
|
|
140
|
+
body: body.toString(),
|
|
141
|
+
});
|
|
142
|
+
if (!response.ok) {
|
|
143
|
+
const errorText = await response.text();
|
|
144
|
+
throw new Error(`Token refresh failed: ${response.status} ${errorText}`);
|
|
145
|
+
}
|
|
146
|
+
const result = (await response.json());
|
|
147
|
+
const tokens = {
|
|
148
|
+
accessToken: result.accessToken,
|
|
149
|
+
refreshToken: result.refreshToken || currentTokens.refreshToken,
|
|
150
|
+
expiresAt: Date.now() + result.expiresIn * 1000,
|
|
151
|
+
scope: result.scope.split(' '),
|
|
152
|
+
};
|
|
153
|
+
this.saveTokens(tokens);
|
|
154
|
+
return tokens;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Get valid access token (refresh if needed)
|
|
158
|
+
*/
|
|
159
|
+
async getValidToken() {
|
|
160
|
+
const tokens = this.loadTokens();
|
|
161
|
+
if (!tokens) {
|
|
162
|
+
throw new Error('No Linear tokens found. Please complete OAuth setup.');
|
|
163
|
+
}
|
|
164
|
+
// Check if token expires in next 5 minutes
|
|
165
|
+
const fiveMinutes = 5 * 60 * 1000;
|
|
166
|
+
if (tokens.expiresAt - Date.now() < fiveMinutes) {
|
|
167
|
+
logger.info('Linear token expiring soon, refreshing...');
|
|
168
|
+
const newTokens = await this.refreshAccessToken();
|
|
169
|
+
return newTokens.accessToken;
|
|
170
|
+
}
|
|
171
|
+
return tokens.accessToken;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Save tokens to file
|
|
175
|
+
*/
|
|
176
|
+
saveTokens(tokens) {
|
|
177
|
+
writeFileSync(this.tokensPath, JSON.stringify(tokens, null, 2));
|
|
178
|
+
logger.info('Linear tokens saved');
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Load tokens from file
|
|
182
|
+
*/
|
|
183
|
+
loadTokens() {
|
|
184
|
+
if (!existsSync(this.tokensPath)) {
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
try {
|
|
188
|
+
const tokensData = readFileSync(this.tokensPath, 'utf8');
|
|
189
|
+
return JSON.parse(tokensData);
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
logger.error('Failed to load Linear tokens:', error);
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Clear stored tokens and config
|
|
198
|
+
*/
|
|
199
|
+
clearAuth() {
|
|
200
|
+
if (existsSync(this.tokensPath)) {
|
|
201
|
+
writeFileSync(this.tokensPath, '');
|
|
202
|
+
}
|
|
203
|
+
if (existsSync(this.configPath)) {
|
|
204
|
+
writeFileSync(this.configPath, '');
|
|
205
|
+
}
|
|
206
|
+
logger.info('Linear authentication cleared');
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Default Linear OAuth scopes for task management
|
|
211
|
+
*/
|
|
212
|
+
export const DEFAULT_LINEAR_SCOPES = [
|
|
213
|
+
'read', // Read issues, projects, teams
|
|
214
|
+
'write', // Create and update issues
|
|
215
|
+
'admin', // Manage team settings and workflows
|
|
216
|
+
];
|
|
217
|
+
/**
|
|
218
|
+
* Linear OAuth setup helper
|
|
219
|
+
*/
|
|
220
|
+
export class LinearOAuthSetup {
|
|
221
|
+
authManager;
|
|
222
|
+
constructor(projectRoot) {
|
|
223
|
+
this.authManager = new LinearAuthManager(projectRoot);
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Interactive setup for Linear OAuth
|
|
227
|
+
*/
|
|
228
|
+
async setupInteractive() {
|
|
229
|
+
// For now, we'll provide manual setup instructions
|
|
230
|
+
// In a full implementation, this could open a browser or use a local server
|
|
231
|
+
const config = {
|
|
232
|
+
clientId: process.env.LINEAR_CLIENT_ID || '',
|
|
233
|
+
clientSecret: process.env.LINEAR_CLIENT_SECRET || '',
|
|
234
|
+
redirectUri: process.env.LINEAR_REDIRECT_URI ||
|
|
235
|
+
'http://localhost:3456/auth/linear/callback',
|
|
236
|
+
scopes: DEFAULT_LINEAR_SCOPES,
|
|
237
|
+
};
|
|
238
|
+
if (!config.clientId || !config.clientSecret) {
|
|
239
|
+
return {
|
|
240
|
+
authUrl: '',
|
|
241
|
+
instructions: [
|
|
242
|
+
'1. Create a Linear OAuth application at https://linear.app/settings/api',
|
|
243
|
+
'2. Set redirect URI to: http://localhost:3456/auth/linear/callback',
|
|
244
|
+
'3. Copy your Client ID and Client Secret',
|
|
245
|
+
'4. Set environment variables:',
|
|
246
|
+
' export LINEAR_CLIENT_ID="your_client_id"',
|
|
247
|
+
' export LINEAR_CLIENT_SECRET="your_client_secret"',
|
|
248
|
+
'5. Re-run this setup command',
|
|
249
|
+
],
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
this.authManager.saveConfig(config);
|
|
253
|
+
const { url, codeVerifier } = this.authManager.generateAuthUrl();
|
|
254
|
+
// Store code verifier temporarily (in a real app, this would be in a secure session store)
|
|
255
|
+
process.env._LINEAR_CODE_VERIFIER = codeVerifier;
|
|
256
|
+
return {
|
|
257
|
+
authUrl: url,
|
|
258
|
+
instructions: [
|
|
259
|
+
'1. Open this URL in your browser:',
|
|
260
|
+
url,
|
|
261
|
+
'',
|
|
262
|
+
'2. Approve the StackMemory integration',
|
|
263
|
+
'3. Copy the authorization code from the redirect URL',
|
|
264
|
+
'4. Run: stackmemory linear authorize <code>',
|
|
265
|
+
],
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Complete OAuth flow with authorization code
|
|
270
|
+
*/
|
|
271
|
+
async completeAuth(authCode) {
|
|
272
|
+
try {
|
|
273
|
+
const codeVerifier = process.env._LINEAR_CODE_VERIFIER;
|
|
274
|
+
if (!codeVerifier) {
|
|
275
|
+
throw new Error('Code verifier not found. Please restart the setup process.');
|
|
276
|
+
}
|
|
277
|
+
await this.authManager.exchangeCodeForToken(authCode, codeVerifier);
|
|
278
|
+
delete process.env._LINEAR_CODE_VERIFIER;
|
|
279
|
+
logger.info('Linear OAuth setup completed successfully!');
|
|
280
|
+
return true;
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
logger.error('Failed to complete Linear OAuth setup:', error);
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Test the Linear connection
|
|
289
|
+
*/
|
|
290
|
+
async testConnection() {
|
|
291
|
+
try {
|
|
292
|
+
const token = await this.authManager.getValidToken();
|
|
293
|
+
// Test with a simple GraphQL query
|
|
294
|
+
const response = await fetch('https://api.linear.app/graphql', {
|
|
295
|
+
method: 'POST',
|
|
296
|
+
headers: {
|
|
297
|
+
Authorization: `Bearer ${token}`,
|
|
298
|
+
'Content-Type': 'application/json',
|
|
299
|
+
},
|
|
300
|
+
body: JSON.stringify({
|
|
301
|
+
query: 'query { viewer { id name email } }',
|
|
302
|
+
}),
|
|
303
|
+
});
|
|
304
|
+
if (response.ok) {
|
|
305
|
+
const result = (await response.json());
|
|
306
|
+
if (result.data?.viewer) {
|
|
307
|
+
logger.info(`Connected to Linear as: ${result.data.viewer.name} (${result.data.viewer.email})`);
|
|
308
|
+
return true;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
return false;
|
|
312
|
+
}
|
|
313
|
+
catch (error) {
|
|
314
|
+
logger.error('Linear connection test failed:', error);
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
//# sourceMappingURL=linear-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear-auth.js","sourceRoot":"","sources":["../../../src/integrations/linear-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Linear Auto-Sync Service
|
|
3
|
+
* Background service for automatic bidirectional synchronization
|
|
4
|
+
*/
|
|
5
|
+
import { SyncConfig } from './linear-sync.js';
|
|
6
|
+
export interface AutoSyncConfig extends SyncConfig {
|
|
7
|
+
enabled: boolean;
|
|
8
|
+
interval: number;
|
|
9
|
+
retryAttempts: number;
|
|
10
|
+
retryDelay: number;
|
|
11
|
+
quietHours?: {
|
|
12
|
+
start: number;
|
|
13
|
+
end: number;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export declare class LinearAutoSyncService {
|
|
17
|
+
private config;
|
|
18
|
+
private projectRoot;
|
|
19
|
+
private configManager;
|
|
20
|
+
private syncEngine?;
|
|
21
|
+
private intervalId?;
|
|
22
|
+
private isRunning;
|
|
23
|
+
private lastSyncTime;
|
|
24
|
+
private retryCount;
|
|
25
|
+
constructor(projectRoot: string, config?: Partial<AutoSyncConfig>);
|
|
26
|
+
/**
|
|
27
|
+
* Start the auto-sync service
|
|
28
|
+
*/
|
|
29
|
+
start(): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Stop the auto-sync service
|
|
32
|
+
*/
|
|
33
|
+
stop(): void;
|
|
34
|
+
/**
|
|
35
|
+
* Get service status
|
|
36
|
+
*/
|
|
37
|
+
getStatus(): {
|
|
38
|
+
running: boolean;
|
|
39
|
+
lastSyncTime: number;
|
|
40
|
+
nextSyncTime?: number;
|
|
41
|
+
retryCount: number;
|
|
42
|
+
config: AutoSyncConfig;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Update configuration
|
|
46
|
+
*/
|
|
47
|
+
updateConfig(newConfig: Partial<AutoSyncConfig>): void;
|
|
48
|
+
/**
|
|
49
|
+
* Force immediate sync
|
|
50
|
+
*/
|
|
51
|
+
forceSync(): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Schedule next sync based on configuration
|
|
54
|
+
*/
|
|
55
|
+
private scheduleNextSync;
|
|
56
|
+
/**
|
|
57
|
+
* Perform synchronization with error handling and retries
|
|
58
|
+
*/
|
|
59
|
+
private performSync;
|
|
60
|
+
/**
|
|
61
|
+
* Check if current time is within quiet hours
|
|
62
|
+
*/
|
|
63
|
+
private isInQuietHours;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Initialize global auto-sync service
|
|
67
|
+
*/
|
|
68
|
+
export declare function initializeAutoSync(projectRoot: string, config?: Partial<AutoSyncConfig>): LinearAutoSyncService;
|
|
69
|
+
/**
|
|
70
|
+
* Get global auto-sync service
|
|
71
|
+
*/
|
|
72
|
+
export declare function getAutoSyncService(): LinearAutoSyncService | null;
|
|
73
|
+
/**
|
|
74
|
+
* Stop global auto-sync service
|
|
75
|
+
*/
|
|
76
|
+
export declare function stopAutoSync(): void;
|
|
77
|
+
//# sourceMappingURL=linear-auto-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear-auto-sync.d.ts","sourceRoot":"","sources":["../../../src/integrations/linear-auto-sync.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAGL,UAAU,EACX,MAAM,kBAAkB,CAAC;AAM1B,MAAM,WAAW,cAAe,SAAQ,UAAU;IAChD,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,UAAU,CAAC,CAAmB;IACtC,OAAO,CAAC,UAAU,CAAC,CAAiB;IACpC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,UAAU,CAAK;gBAEX,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC;IA4BjE;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyD5B;;OAEG;IACH,IAAI,IAAI,IAAI;IAUZ;;OAEG;IACH,SAAS,IAAI;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,cAAc,CAAC;KACxB;IAcD;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI;IAYtD;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAShC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;OAEG;YACW,WAAW;IAkFzB;;OAEG;IACH,OAAO,CAAC,cAAc;CAevB;AAOD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAC/B,qBAAqB,CAOvB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,qBAAqB,GAAG,IAAI,CAEjE;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAKnC"}
|