@neurcode-ai/cli 0.4.0 → 0.4.1
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/api-client.d.ts +105 -17
- package/dist/api-client.d.ts.map +1 -1
- package/dist/api-client.js +388 -85
- package/dist/api-client.js.map +1 -1
- package/dist/commands/allow.d.ts.map +1 -1
- package/dist/commands/allow.js +6 -33
- package/dist/commands/allow.js.map +1 -1
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +56 -13
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/doctor.d.ts +7 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +134 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +13 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +365 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +8 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +209 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +7 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +70 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/plan.d.ts +2 -0
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +210 -57
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/prompt.d.ts +6 -0
- package/dist/commands/prompt.d.ts.map +1 -0
- package/dist/commands/prompt.js +254 -0
- package/dist/commands/prompt.js.map +1 -0
- package/dist/commands/revert.d.ts.map +1 -1
- package/dist/commands/revert.js +10 -0
- package/dist/commands/revert.js.map +1 -1
- package/dist/commands/session.d.ts +29 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +382 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +127 -13
- package/dist/commands/verify.js.map +1 -1
- package/dist/commands/watch.d.ts +8 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +78 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/config.d.ts +29 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +186 -21
- package/dist/config.js.map +1 -1
- package/dist/index.js +120 -3
- package/dist/index.js.map +1 -1
- package/dist/services/integrations/TicketService.d.ts +68 -0
- package/dist/services/integrations/TicketService.d.ts.map +1 -0
- package/dist/services/integrations/TicketService.js +151 -0
- package/dist/services/integrations/TicketService.js.map +1 -0
- package/dist/services/security/SecurityGuard.d.ts +80 -0
- package/dist/services/security/SecurityGuard.d.ts.map +1 -0
- package/dist/services/security/SecurityGuard.js +410 -0
- package/dist/services/security/SecurityGuard.js.map +1 -0
- package/dist/services/watch/BlobStore.d.ts +33 -0
- package/dist/services/watch/BlobStore.d.ts.map +1 -0
- package/dist/services/watch/BlobStore.js +108 -0
- package/dist/services/watch/BlobStore.js.map +1 -0
- package/dist/services/watch/CommandPoller.d.ts +76 -0
- package/dist/services/watch/CommandPoller.d.ts.map +1 -0
- package/dist/services/watch/CommandPoller.js +298 -0
- package/dist/services/watch/CommandPoller.js.map +1 -0
- package/dist/services/watch/Journal.d.ts +58 -0
- package/dist/services/watch/Journal.d.ts.map +1 -0
- package/dist/services/watch/Journal.js +144 -0
- package/dist/services/watch/Journal.js.map +1 -0
- package/dist/services/watch/Sentinel.d.ts +49 -0
- package/dist/services/watch/Sentinel.d.ts.map +1 -0
- package/dist/services/watch/Sentinel.js +205 -0
- package/dist/services/watch/Sentinel.js.map +1 -0
- package/dist/services/watch/Syncer.d.ts +55 -0
- package/dist/services/watch/Syncer.d.ts.map +1 -0
- package/dist/services/watch/Syncer.js +231 -0
- package/dist/services/watch/Syncer.js.map +1 -0
- package/dist/utils/ROILogger.d.ts +16 -0
- package/dist/utils/ROILogger.d.ts.map +1 -0
- package/dist/utils/ROILogger.js +45 -0
- package/dist/utils/ROILogger.js.map +1 -0
- package/dist/utils/box.d.ts +16 -0
- package/dist/utils/box.d.ts.map +1 -0
- package/dist/utils/box.js +85 -0
- package/dist/utils/box.js.map +1 -0
- package/dist/utils/gitignore.d.ts +10 -0
- package/dist/utils/gitignore.d.ts.map +1 -0
- package/dist/utils/gitignore.js +34 -0
- package/dist/utils/gitignore.js.map +1 -0
- package/dist/utils/messages.d.ts +81 -0
- package/dist/utils/messages.d.ts.map +1 -0
- package/dist/utils/messages.js +306 -0
- package/dist/utils/messages.js.map +1 -0
- package/dist/utils/restore.d.ts +14 -0
- package/dist/utils/restore.d.ts.map +1 -0
- package/dist/utils/restore.js +89 -0
- package/dist/utils/restore.js.map +1 -0
- package/dist/utils/state.d.ts +69 -0
- package/dist/utils/state.d.ts.map +1 -0
- package/dist/utils/state.js +151 -0
- package/dist/utils/state.js.map +1 -0
- package/dist/utils/user-context.d.ts +28 -0
- package/dist/utils/user-context.d.ts.map +1 -0
- package/dist/utils/user-context.js +68 -0
- package/dist/utils/user-context.js.map +1 -0
- package/package.json +11 -4
package/dist/index.js
CHANGED
|
@@ -4,6 +4,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
4
4
|
const commander_1 = require("commander");
|
|
5
5
|
const fs_1 = require("fs");
|
|
6
6
|
const path_1 = require("path");
|
|
7
|
+
// Import chalk with fallback
|
|
8
|
+
let chalk;
|
|
9
|
+
try {
|
|
10
|
+
chalk = require('chalk');
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
chalk = {
|
|
14
|
+
yellow: (str) => str,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
7
17
|
const check_1 = require("./commands/check");
|
|
8
18
|
const revert_1 = require("./commands/revert");
|
|
9
19
|
const refactor_1 = require("./commands/refactor");
|
|
@@ -11,9 +21,18 @@ const security_1 = require("./commands/security");
|
|
|
11
21
|
const plan_1 = require("./commands/plan");
|
|
12
22
|
const apply_1 = require("./commands/apply");
|
|
13
23
|
const verify_1 = require("./commands/verify");
|
|
24
|
+
const prompt_1 = require("./commands/prompt");
|
|
14
25
|
const config_1 = require("./commands/config");
|
|
15
26
|
const map_1 = require("./commands/map");
|
|
16
27
|
const allow_1 = require("./commands/allow");
|
|
28
|
+
const watch_1 = require("./commands/watch");
|
|
29
|
+
const login_1 = require("./commands/login");
|
|
30
|
+
const logout_1 = require("./commands/logout");
|
|
31
|
+
const init_1 = require("./commands/init");
|
|
32
|
+
const doctor_1 = require("./commands/doctor");
|
|
33
|
+
const session_1 = require("./commands/session");
|
|
34
|
+
const messages_1 = require("./utils/messages");
|
|
35
|
+
const config_2 = require("./config");
|
|
17
36
|
// Read version from package.json
|
|
18
37
|
let version = '0.1.2'; // fallback
|
|
19
38
|
try {
|
|
@@ -29,6 +48,21 @@ program
|
|
|
29
48
|
.name('neurcode')
|
|
30
49
|
.description('AI-powered code governance and diff analysis')
|
|
31
50
|
.version(version);
|
|
51
|
+
// Show welcome banner before parsing (for help or unauthenticated users)
|
|
52
|
+
async function showWelcomeIfNeeded() {
|
|
53
|
+
if (!process.env.CI && process.stdout.isTTY) {
|
|
54
|
+
const args = process.argv.slice(2);
|
|
55
|
+
const isHelp = args.length === 0 || args.includes('--help') || args.includes('-h');
|
|
56
|
+
// Show welcome for help or if no API key is set (first-time users)
|
|
57
|
+
if (isHelp || !(0, config_2.getApiKey)()) {
|
|
58
|
+
await (0, messages_1.printWelcomeBanner)();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Call before parsing
|
|
63
|
+
showWelcomeIfNeeded().catch(() => {
|
|
64
|
+
// Ignore errors in welcome banner (non-critical)
|
|
65
|
+
});
|
|
32
66
|
program
|
|
33
67
|
.command('check')
|
|
34
68
|
.description('Analyze git diff for risky changes')
|
|
@@ -42,6 +76,30 @@ program
|
|
|
42
76
|
.action(check_1.checkCommand);
|
|
43
77
|
(0, refactor_1.refactorCommand)(program);
|
|
44
78
|
(0, security_1.securityCommand)(program);
|
|
79
|
+
program
|
|
80
|
+
.command('login')
|
|
81
|
+
.description('Authenticate CLI with Neurcode (opens browser for approval)')
|
|
82
|
+
.action(() => {
|
|
83
|
+
(0, login_1.loginCommand)();
|
|
84
|
+
});
|
|
85
|
+
program
|
|
86
|
+
.command('logout')
|
|
87
|
+
.description('Log out from Neurcode CLI (removes API key)')
|
|
88
|
+
.action(() => {
|
|
89
|
+
(0, logout_1.logoutCommand)();
|
|
90
|
+
});
|
|
91
|
+
program
|
|
92
|
+
.command('init')
|
|
93
|
+
.description('Initialize project configuration (select a project)')
|
|
94
|
+
.action(() => {
|
|
95
|
+
(0, init_1.initCommand)();
|
|
96
|
+
});
|
|
97
|
+
program
|
|
98
|
+
.command('doctor')
|
|
99
|
+
.description('Health check & connectivity diagnostics - verify API connectivity')
|
|
100
|
+
.action(() => {
|
|
101
|
+
(0, doctor_1.doctorCommand)();
|
|
102
|
+
});
|
|
45
103
|
program
|
|
46
104
|
.command('config')
|
|
47
105
|
.description('Configure Neurcode CLI settings')
|
|
@@ -69,11 +127,21 @@ program
|
|
|
69
127
|
program
|
|
70
128
|
.command('plan')
|
|
71
129
|
.description('Generate an execution plan for a user intent')
|
|
72
|
-
.argument('<intent
|
|
130
|
+
.argument('<intent...>', 'Description of what you want to accomplish')
|
|
73
131
|
.option('--project-id <id>', 'Project ID')
|
|
132
|
+
.option('--ticket <id>', 'Ticket ID from Linear or Jira (e.g., PROJ-123, ABC-123)')
|
|
133
|
+
.option('--mask', 'Mask detected secrets automatically (default: true)', true)
|
|
134
|
+
.option('--no-mask', 'Abort if secrets detected instead of masking')
|
|
74
135
|
.action((intent, options) => {
|
|
75
|
-
(
|
|
76
|
-
|
|
136
|
+
// Handle multiple arguments (when user doesn't quote)
|
|
137
|
+
const intentString = Array.isArray(intent) ? intent.join(' ') : intent;
|
|
138
|
+
if (Array.isArray(intent) && intent.length > 1) {
|
|
139
|
+
console.log(chalk.yellow('Tip: Wrap your intent in quotes for better shell compatibility.'));
|
|
140
|
+
}
|
|
141
|
+
(0, plan_1.planCommand)(intentString, {
|
|
142
|
+
projectId: options['project-id'] || options.projectId,
|
|
143
|
+
ticket: options.ticket,
|
|
144
|
+
mask: options.mask !== false, // Default to true unless --no-mask is used
|
|
77
145
|
});
|
|
78
146
|
});
|
|
79
147
|
program
|
|
@@ -93,6 +161,49 @@ program
|
|
|
93
161
|
.action((filePath) => {
|
|
94
162
|
(0, allow_1.allowCommand)(filePath);
|
|
95
163
|
});
|
|
164
|
+
program
|
|
165
|
+
.command('watch')
|
|
166
|
+
.description('Start Neurcode Watch - A local background service that records file changes for Time Machine feature')
|
|
167
|
+
.action(() => {
|
|
168
|
+
(0, watch_1.watchCommand)();
|
|
169
|
+
});
|
|
170
|
+
// Session management commands
|
|
171
|
+
const sessionCmd = program
|
|
172
|
+
.command('session')
|
|
173
|
+
.description('Manage AI coding sessions');
|
|
174
|
+
sessionCmd
|
|
175
|
+
.command('list')
|
|
176
|
+
.description('List all sessions for the current project')
|
|
177
|
+
.option('--project-id <id>', 'Project ID')
|
|
178
|
+
.option('--all', 'Show all sessions (including completed)')
|
|
179
|
+
.action((options) => {
|
|
180
|
+
(0, session_1.listSessionsCommand)({
|
|
181
|
+
projectId: options.projectId,
|
|
182
|
+
all: options.all || false,
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
sessionCmd
|
|
186
|
+
.command('end')
|
|
187
|
+
.description('End the current session or a specific session')
|
|
188
|
+
.option('--session-id <id>', 'Session ID to end (defaults to current session)')
|
|
189
|
+
.option('--project-id <id>', 'Project ID')
|
|
190
|
+
.action((options) => {
|
|
191
|
+
(0, session_1.endSessionCommand)({
|
|
192
|
+
sessionId: options.sessionId,
|
|
193
|
+
projectId: options.projectId,
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
sessionCmd
|
|
197
|
+
.command('status')
|
|
198
|
+
.description('Show status of the current session or a specific session')
|
|
199
|
+
.option('--session-id <id>', 'Session ID to check (defaults to current session)')
|
|
200
|
+
.option('--project-id <id>', 'Project ID')
|
|
201
|
+
.action((options) => {
|
|
202
|
+
(0, session_1.sessionStatusCommand)({
|
|
203
|
+
sessionId: options.sessionId,
|
|
204
|
+
projectId: options.projectId,
|
|
205
|
+
});
|
|
206
|
+
});
|
|
96
207
|
program
|
|
97
208
|
.command('verify')
|
|
98
209
|
.description('Verify plan adherence - Compare current changes against an Architect Plan')
|
|
@@ -118,6 +229,12 @@ program
|
|
|
118
229
|
apiUrl: options.apiUrl,
|
|
119
230
|
});
|
|
120
231
|
});
|
|
232
|
+
program
|
|
233
|
+
.command('prompt [plan-id]')
|
|
234
|
+
.description('Generate a Cursor/Claude prompt from an Architect Plan (uses last plan if ID not provided)')
|
|
235
|
+
.action((planId) => {
|
|
236
|
+
(0, prompt_1.promptCommand)(planId);
|
|
237
|
+
});
|
|
121
238
|
const revertCmd = program
|
|
122
239
|
.command('revert')
|
|
123
240
|
.description('Revert files to previous versions from Neurcode history');
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,2BAAkC;AAClC,+BAA4B;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ticket Service - Contextual Intent Mapping
|
|
3
|
+
*
|
|
4
|
+
* Fetches business requirements from issue trackers (Linear, Jira) to enrich user intents.
|
|
5
|
+
*/
|
|
6
|
+
export interface TicketMetadata {
|
|
7
|
+
id: string;
|
|
8
|
+
title: string;
|
|
9
|
+
description: string;
|
|
10
|
+
acceptanceCriteria?: string;
|
|
11
|
+
labels?: string[];
|
|
12
|
+
status?: string;
|
|
13
|
+
priority?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface TicketContext {
|
|
16
|
+
ticket: TicketMetadata;
|
|
17
|
+
enrichedIntent: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Ticket Service for fetching issue tracker data
|
|
21
|
+
*/
|
|
22
|
+
export declare class TicketService {
|
|
23
|
+
private integrationKey;
|
|
24
|
+
constructor();
|
|
25
|
+
/**
|
|
26
|
+
* Detect ticket format (Jira: PROJ-123, Linear: ABC-123)
|
|
27
|
+
*/
|
|
28
|
+
private detectTicketType;
|
|
29
|
+
/**
|
|
30
|
+
* Fetch ticket from Jira
|
|
31
|
+
*
|
|
32
|
+
* @param ticketId - Jira ticket ID (e.g., PROJ-123)
|
|
33
|
+
* @returns Ticket metadata or null if fetch fails
|
|
34
|
+
*/
|
|
35
|
+
private fetchFromJira;
|
|
36
|
+
/**
|
|
37
|
+
* Fetch ticket from Linear
|
|
38
|
+
*
|
|
39
|
+
* @param ticketId - Linear issue ID (e.g., ABC-123)
|
|
40
|
+
* @returns Ticket metadata or null if fetch fails
|
|
41
|
+
*/
|
|
42
|
+
private fetchFromLinear;
|
|
43
|
+
/**
|
|
44
|
+
* Fetch ticket from issue tracker
|
|
45
|
+
*
|
|
46
|
+
* @param ticketId - Ticket ID (e.g., PROJ-123 for Jira, ABC-123 for Linear)
|
|
47
|
+
* @returns Ticket metadata
|
|
48
|
+
* @throws Error if ticket cannot be fetched or format is unknown
|
|
49
|
+
*/
|
|
50
|
+
fetchTicket(ticketId: string): Promise<TicketMetadata>;
|
|
51
|
+
/**
|
|
52
|
+
* Enrich user intent with ticket context
|
|
53
|
+
*
|
|
54
|
+
* @param intent - User's original intent
|
|
55
|
+
* @param ticket - Ticket metadata
|
|
56
|
+
* @returns Enriched intent string
|
|
57
|
+
*/
|
|
58
|
+
enrichIntent(intent: string, ticket: TicketMetadata): string;
|
|
59
|
+
/**
|
|
60
|
+
* Fetch ticket and enrich intent in one call
|
|
61
|
+
*
|
|
62
|
+
* @param ticketId - Ticket ID
|
|
63
|
+
* @param intent - User's original intent
|
|
64
|
+
* @returns Ticket context with enriched intent
|
|
65
|
+
*/
|
|
66
|
+
fetchTicketAndEnrich(ticketId: string, intent: string): Promise<TicketContext>;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=TicketService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TicketService.d.ts","sourceRoot":"","sources":["../../../src/services/integrations/TicketService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,cAAc,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,cAAc,CAAgB;;IAMtC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAcxB;;;;;OAKG;YACW,aAAa;IAsB3B;;;;;OAKG;YACW,eAAe;IAsB7B;;;;;;OAMG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IA6B5D;;;;;;OAMG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,MAAM;IAsB5D;;;;;;OAMG;IACG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;CASrF"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Ticket Service - Contextual Intent Mapping
|
|
4
|
+
*
|
|
5
|
+
* Fetches business requirements from issue trackers (Linear, Jira) to enrich user intents.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.TicketService = void 0;
|
|
9
|
+
/**
|
|
10
|
+
* Ticket Service for fetching issue tracker data
|
|
11
|
+
*/
|
|
12
|
+
class TicketService {
|
|
13
|
+
integrationKey;
|
|
14
|
+
constructor() {
|
|
15
|
+
this.integrationKey = process.env.NEURCODE_INTEGRATION_KEY || null;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Detect ticket format (Jira: PROJ-123, Linear: ABC-123)
|
|
19
|
+
*/
|
|
20
|
+
detectTicketType(ticketId) {
|
|
21
|
+
// Jira format: PROJECT-123 (uppercase letters, dash, numbers)
|
|
22
|
+
if (/^[A-Z]+-\d+$/.test(ticketId)) {
|
|
23
|
+
return 'jira';
|
|
24
|
+
}
|
|
25
|
+
// Linear format: ABC-123 (3-4 letters, dash, numbers)
|
|
26
|
+
if (/^[A-Z]{3,4}-\d+$/.test(ticketId)) {
|
|
27
|
+
return 'linear';
|
|
28
|
+
}
|
|
29
|
+
return 'unknown';
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Fetch ticket from Jira
|
|
33
|
+
*
|
|
34
|
+
* @param ticketId - Jira ticket ID (e.g., PROJ-123)
|
|
35
|
+
* @returns Ticket metadata or null if fetch fails
|
|
36
|
+
*/
|
|
37
|
+
async fetchFromJira(ticketId) {
|
|
38
|
+
// TODO: Implement Jira API integration
|
|
39
|
+
// For now, return stub data
|
|
40
|
+
if (!this.integrationKey) {
|
|
41
|
+
throw new Error('Jira integration requires NEURCODE_INTEGRATION_KEY environment variable');
|
|
42
|
+
}
|
|
43
|
+
// Stub implementation - replace with actual Jira API call
|
|
44
|
+
// Example API endpoint: https://<domain>.atlassian.net/rest/api/3/issue/{ticketId}
|
|
45
|
+
// Requires: Jira API token or OAuth token in NEURCODE_INTEGRATION_KEY
|
|
46
|
+
return {
|
|
47
|
+
id: ticketId,
|
|
48
|
+
title: `[Jira Stub] Ticket ${ticketId}`,
|
|
49
|
+
description: 'Jira integration not yet implemented. Set NEURCODE_INTEGRATION_KEY to enable.',
|
|
50
|
+
acceptanceCriteria: 'This is a stub response. Actual Jira integration coming soon.',
|
|
51
|
+
labels: [],
|
|
52
|
+
status: 'TODO',
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Fetch ticket from Linear
|
|
57
|
+
*
|
|
58
|
+
* @param ticketId - Linear issue ID (e.g., ABC-123)
|
|
59
|
+
* @returns Ticket metadata or null if fetch fails
|
|
60
|
+
*/
|
|
61
|
+
async fetchFromLinear(ticketId) {
|
|
62
|
+
// TODO: Implement Linear API integration
|
|
63
|
+
// For now, return stub data
|
|
64
|
+
if (!this.integrationKey) {
|
|
65
|
+
throw new Error('Linear integration requires NEURCODE_INTEGRATION_KEY environment variable');
|
|
66
|
+
}
|
|
67
|
+
// Stub implementation - replace with actual Linear API call
|
|
68
|
+
// Example GraphQL endpoint: https://api.linear.app/graphql
|
|
69
|
+
// Requires: Linear API key in NEURCODE_INTEGRATION_KEY
|
|
70
|
+
return {
|
|
71
|
+
id: ticketId,
|
|
72
|
+
title: `[Linear Stub] Issue ${ticketId}`,
|
|
73
|
+
description: 'Linear integration not yet implemented. Set NEURCODE_INTEGRATION_KEY to enable.',
|
|
74
|
+
acceptanceCriteria: 'This is a stub response. Actual Linear integration coming soon.',
|
|
75
|
+
labels: [],
|
|
76
|
+
status: 'Todo',
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Fetch ticket from issue tracker
|
|
81
|
+
*
|
|
82
|
+
* @param ticketId - Ticket ID (e.g., PROJ-123 for Jira, ABC-123 for Linear)
|
|
83
|
+
* @returns Ticket metadata
|
|
84
|
+
* @throws Error if ticket cannot be fetched or format is unknown
|
|
85
|
+
*/
|
|
86
|
+
async fetchTicket(ticketId) {
|
|
87
|
+
const ticketType = this.detectTicketType(ticketId);
|
|
88
|
+
if (ticketType === 'unknown') {
|
|
89
|
+
throw new Error(`Unknown ticket format: ${ticketId}. Expected Jira format (PROJ-123) or Linear format (ABC-123)`);
|
|
90
|
+
}
|
|
91
|
+
let ticket;
|
|
92
|
+
try {
|
|
93
|
+
if (ticketType === 'jira') {
|
|
94
|
+
ticket = await this.fetchFromJira(ticketId);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
ticket = await this.fetchFromLinear(ticketId);
|
|
98
|
+
}
|
|
99
|
+
if (!ticket) {
|
|
100
|
+
throw new Error(`Failed to fetch ticket ${ticketId} from ${ticketType}`);
|
|
101
|
+
}
|
|
102
|
+
return ticket;
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
if (error instanceof Error) {
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
108
|
+
throw new Error(`Error fetching ticket ${ticketId}: ${String(error)}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Enrich user intent with ticket context
|
|
113
|
+
*
|
|
114
|
+
* @param intent - User's original intent
|
|
115
|
+
* @param ticket - Ticket metadata
|
|
116
|
+
* @returns Enriched intent string
|
|
117
|
+
*/
|
|
118
|
+
enrichIntent(intent, ticket) {
|
|
119
|
+
const parts = [];
|
|
120
|
+
// Add ticket title
|
|
121
|
+
parts.push(`Ticket: ${ticket.id} - ${ticket.title}`);
|
|
122
|
+
// Add ticket description
|
|
123
|
+
if (ticket.description) {
|
|
124
|
+
parts.push(`\nDescription: ${ticket.description}`);
|
|
125
|
+
}
|
|
126
|
+
// Add acceptance criteria if available
|
|
127
|
+
if (ticket.acceptanceCriteria) {
|
|
128
|
+
parts.push(`\nAcceptance Criteria:\n${ticket.acceptanceCriteria}`);
|
|
129
|
+
}
|
|
130
|
+
// Add user's original intent
|
|
131
|
+
parts.push(`\nUser Intent: ${intent}`);
|
|
132
|
+
return parts.join('\n');
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Fetch ticket and enrich intent in one call
|
|
136
|
+
*
|
|
137
|
+
* @param ticketId - Ticket ID
|
|
138
|
+
* @param intent - User's original intent
|
|
139
|
+
* @returns Ticket context with enriched intent
|
|
140
|
+
*/
|
|
141
|
+
async fetchTicketAndEnrich(ticketId, intent) {
|
|
142
|
+
const ticket = await this.fetchTicket(ticketId);
|
|
143
|
+
const enrichedIntent = this.enrichIntent(intent, ticket);
|
|
144
|
+
return {
|
|
145
|
+
ticket,
|
|
146
|
+
enrichedIntent,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
exports.TicketService = TicketService;
|
|
151
|
+
//# sourceMappingURL=TicketService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TicketService.js","sourceRoot":"","sources":["../../../src/services/integrations/TicketService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Guard - Shadow AI Shield
|
|
3
|
+
*
|
|
4
|
+
* Local privacy scanner that runs before any API call to detect and mask secrets.
|
|
5
|
+
* Uses regex patterns and AST analysis (via ts-morph) to identify sensitive data.
|
|
6
|
+
* Also includes hallucination detection for phantom packages.
|
|
7
|
+
*/
|
|
8
|
+
export interface SecretDetection {
|
|
9
|
+
type: 'aws_key' | 'bearer_token' | 'github_token' | 'generic_secret' | 'ast_literal';
|
|
10
|
+
severity: 'high' | 'medium' | 'low';
|
|
11
|
+
location: string;
|
|
12
|
+
pattern: string;
|
|
13
|
+
masked?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface HallucinationDetection {
|
|
16
|
+
packageName: string;
|
|
17
|
+
location: string;
|
|
18
|
+
importStatement: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ScanResult {
|
|
21
|
+
secrets: SecretDetection[];
|
|
22
|
+
hasSecrets: boolean;
|
|
23
|
+
maskedText?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface HallucinationScanResult {
|
|
26
|
+
hallucinations: HallucinationDetection[];
|
|
27
|
+
hasHallucinations: boolean;
|
|
28
|
+
blocked: boolean;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Security Guard for local secret detection and hallucination detection
|
|
32
|
+
*/
|
|
33
|
+
export declare class SecurityGuard {
|
|
34
|
+
private readonly REDACTION_PLACEHOLDER;
|
|
35
|
+
private readonly patterns;
|
|
36
|
+
private readonly sensitiveVarNames;
|
|
37
|
+
private readonly safePackageList;
|
|
38
|
+
/**
|
|
39
|
+
* Scan text content for secrets using regex patterns
|
|
40
|
+
*/
|
|
41
|
+
scanText(text: string, location?: string): SecretDetection[];
|
|
42
|
+
/**
|
|
43
|
+
* Extract package names from import/require statements
|
|
44
|
+
* Returns array of { packageName, importStatement }
|
|
45
|
+
*/
|
|
46
|
+
private extractPackageImports;
|
|
47
|
+
/**
|
|
48
|
+
* Load package.json dependencies from project root
|
|
49
|
+
*/
|
|
50
|
+
private loadProjectDependencies;
|
|
51
|
+
/**
|
|
52
|
+
* Scan code for hallucinated packages (phantom packages)
|
|
53
|
+
* Checks against safe list and project's package.json
|
|
54
|
+
*/
|
|
55
|
+
scanForHallucinations(code: string, location?: string, rootDir?: string): Promise<HallucinationScanResult>;
|
|
56
|
+
/**
|
|
57
|
+
* Scan TypeScript/JavaScript files using AST analysis
|
|
58
|
+
*/
|
|
59
|
+
scanFile(filePath: string, rootDir?: string): Promise<SecretDetection[]>;
|
|
60
|
+
/**
|
|
61
|
+
* Scan multiple files
|
|
62
|
+
*/
|
|
63
|
+
scanFiles(filePaths: string[], rootDir?: string): Promise<ScanResult>;
|
|
64
|
+
/**
|
|
65
|
+
* Scan intent string for secrets
|
|
66
|
+
*/
|
|
67
|
+
scanIntent(intent: string): ScanResult;
|
|
68
|
+
/**
|
|
69
|
+
* Mask secrets in text
|
|
70
|
+
*/
|
|
71
|
+
maskSecrets(text: string, detections: SecretDetection[]): string;
|
|
72
|
+
/**
|
|
73
|
+
* Complete scan with masking
|
|
74
|
+
*/
|
|
75
|
+
scanAndMask(intent: string, filePaths: string[], rootDir?: string): Promise<ScanResult & {
|
|
76
|
+
maskedIntent?: string;
|
|
77
|
+
maskedFiles?: Map<string, string>;
|
|
78
|
+
}>;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=SecurityGuard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SecurityGuard.d.ts","sourceRoot":"","sources":["../../../src/services/security/SecurityGuard.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,GAAG,cAAc,GAAG,cAAc,GAAG,gBAAgB,GAAG,aAAa,CAAC;IACrF,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,cAAc,EAAE,sBAAsB,EAAE,CAAC;IACzC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA4B;IAGlE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAYvB;IAGF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAQhC;IAIF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAwB7B;IAEH;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAe,GAAG,eAAe,EAAE;IAyDpE;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAiD7B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAiC/B;;;OAGG;IACG,qBAAqB,CACzB,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,MAAe,EACzB,OAAO,GAAE,MAAsB,GAC9B,OAAO,CAAC,uBAAuB,CAAC;IA8DnC;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,MAAsB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAyE7F;;OAEG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,MAAsB,GAAG,OAAO,CAAC,UAAU,CAAC;IAc1F;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU;IAQtC;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,MAAM;IAgBhE;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,MAAsB,GAAG,OAAO,CAAC,UAAU,GAAG;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;CAkD5K"}
|