@neurcode-ai/cli 0.7.11 → 0.8.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/api-client.d.ts +37 -17
- package/dist/api-client.d.ts.map +1 -1
- package/dist/api-client.js +224 -120
- package/dist/api-client.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.map +1 -1
- package/dist/commands/doctor.js +14 -11
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +95 -33
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +47 -57
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/plan.d.ts +2 -0
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +177 -10
- package/dist/commands/plan.js.map +1 -1
- 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 +59 -3
- package/dist/commands/verify.js.map +1 -1
- package/dist/commands/watch.d.ts.map +1 -1
- package/dist/commands/watch.js +20 -15
- package/dist/commands/watch.js.map +1 -1
- package/dist/index.js +78 -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/Syncer.d.ts.map +1 -1
- package/dist/services/watch/Syncer.js +22 -1
- package/dist/services/watch/Syncer.js.map +1 -1
- 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/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/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 +4 -4
package/dist/commands/watch.js
CHANGED
|
@@ -4,6 +4,7 @@ exports.watchCommand = watchCommand;
|
|
|
4
4
|
const Sentinel_1 = require("../services/watch/Sentinel");
|
|
5
5
|
const CommandPoller_1 = require("../services/watch/CommandPoller");
|
|
6
6
|
const state_1 = require("../utils/state");
|
|
7
|
+
const messages_1 = require("../utils/messages");
|
|
7
8
|
/**
|
|
8
9
|
* Watch command - Start the Neurcode Watch service
|
|
9
10
|
*
|
|
@@ -19,7 +20,11 @@ async function watchCommand() {
|
|
|
19
20
|
const projectId = (0, state_1.getProjectId)() || state.projectId;
|
|
20
21
|
// Enforce project context: Require projectId to be set
|
|
21
22
|
if (!projectId) {
|
|
22
|
-
|
|
23
|
+
(0, messages_1.printError)('No Project Configured', undefined, [
|
|
24
|
+
'Neurcode Watch requires a project to be set up',
|
|
25
|
+
'Run: neurcode init',
|
|
26
|
+
'This will create or connect to a project for this directory'
|
|
27
|
+
]);
|
|
23
28
|
process.exit(1);
|
|
24
29
|
}
|
|
25
30
|
// Create and initialize Sentinel with projectId
|
|
@@ -30,29 +35,29 @@ async function watchCommand() {
|
|
|
30
35
|
commandPoller.start();
|
|
31
36
|
// Start watching
|
|
32
37
|
await sentinel.start();
|
|
33
|
-
|
|
38
|
+
await (0, messages_1.printSuccessBanner)('Neurcode Watch Started', 'Your code changes are being tracked in real-time');
|
|
34
39
|
// Check if cloud sync is configured
|
|
35
40
|
const syncer = sentinel.getSyncer();
|
|
36
41
|
if (syncer.isConfigured()) {
|
|
37
|
-
|
|
42
|
+
(0, messages_1.printSuccess)('Cloud Sync Enabled', 'All events will be synced to your dashboard at dashboard.neurcode.com');
|
|
38
43
|
}
|
|
39
44
|
else {
|
|
40
|
-
|
|
41
|
-
console.log(' Run "neurcode config --key <your_api_key>" to enable cloud sync');
|
|
45
|
+
(0, messages_1.printWarning)('Cloud Sync Disabled', 'Run "neurcode config --key <your_api_key>" to enable cloud sync and access your history on the dashboard');
|
|
42
46
|
}
|
|
43
47
|
// Check if command polling is configured
|
|
44
48
|
if (commandPoller.isConfigured()) {
|
|
45
|
-
|
|
49
|
+
(0, messages_1.printInfo)('Remote Commands Enabled', 'You can execute revert and other commands from your dashboard');
|
|
46
50
|
}
|
|
47
51
|
else {
|
|
48
|
-
|
|
52
|
+
(0, messages_1.printInfo)('Remote Commands Disabled', 'Configure an API key to enable remote command execution from the dashboard');
|
|
49
53
|
}
|
|
50
|
-
|
|
54
|
+
(0, messages_1.printInfo)('Watch Service', 'Press Ctrl+C to stop watching\n');
|
|
51
55
|
// Handle graceful shutdown
|
|
52
56
|
const shutdown = async () => {
|
|
53
|
-
|
|
57
|
+
(0, messages_1.printInfo)('Shutting down', 'Stopping watch service and syncing final changes...');
|
|
54
58
|
commandPoller.stop();
|
|
55
59
|
await sentinel.stop();
|
|
60
|
+
(0, messages_1.printSuccess)('Watch service stopped', 'All changes have been synced. Goodbye!');
|
|
56
61
|
process.exit(0);
|
|
57
62
|
};
|
|
58
63
|
process.on('SIGINT', shutdown);
|
|
@@ -61,12 +66,12 @@ async function watchCommand() {
|
|
|
61
66
|
// The watcher will keep the event loop alive
|
|
62
67
|
}
|
|
63
68
|
catch (error) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
69
|
+
(0, messages_1.printError)('Failed to Start Watch Service', error instanceof Error ? error : String(error), [
|
|
70
|
+
'Check if another watch process is running',
|
|
71
|
+
'Verify project configuration: neurcode doctor',
|
|
72
|
+
'Ensure you have write permissions in this directory',
|
|
73
|
+
'Try: neurcode init (if project not configured)'
|
|
74
|
+
]);
|
|
70
75
|
process.exit(1);
|
|
71
76
|
}
|
|
72
77
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":";;AAkBA,oCA+FC;AAjHD,yDAAsD;AACtD,mEAAgE;AAChE,0CAAyD;AACzD,gDAO2B;AAE3B;;;;;GAKG;AACI,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC;QACH,+CAA+C;QAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAElC,+BAA+B;QAC/B,MAAM,KAAK,GAAG,IAAA,iBAAS,GAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,IAAA,oBAAY,GAAE,IAAI,KAAK,CAAC,SAAS,CAAC;QAEpD,uDAAuD;QACvD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,IAAA,qBAAU,EACR,uBAAuB,EACvB,SAAS,EACT;gBACE,gDAAgD;gBAChD,oBAAoB;gBACpB,6DAA6D;aAC9D,CACF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,gDAAgD;QAChD,MAAM,QAAQ,GAAG,IAAI,mBAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACtD,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;QAE5B,qDAAqD;QACrD,MAAM,aAAa,GAAG,IAAI,6BAAa,CAAC,WAAW,CAAC,CAAC;QACrD,aAAa,CAAC,KAAK,EAAE,CAAC;QAEtB,iBAAiB;QACjB,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;QAEvB,MAAM,IAAA,6BAAkB,EACtB,wBAAwB,EACxB,kDAAkD,CACnD,CAAC;QAEF,oCAAoC;QACpC,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC;YAC1B,IAAA,uBAAY,EACV,oBAAoB,EACpB,uEAAuE,CACxE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAA,uBAAY,EACV,qBAAqB,EACrB,0GAA0G,CAC3G,CAAC;QACJ,CAAC;QAED,yCAAyC;QACzC,IAAI,aAAa,CAAC,YAAY,EAAE,EAAE,CAAC;YACjC,IAAA,oBAAS,EACP,yBAAyB,EACzB,+DAA+D,CAChE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAA,oBAAS,EACP,0BAA0B,EAC1B,4EAA4E,CAC7E,CAAC;QACJ,CAAC;QAED,IAAA,oBAAS,EAAC,eAAe,EAAE,iCAAiC,CAAC,CAAC;QAE9D,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;YAC1B,IAAA,oBAAS,EAAC,eAAe,EAAE,qDAAqD,CAAC,CAAC;YAClF,aAAa,CAAC,IAAI,EAAE,CAAC;YACrB,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACtB,IAAA,uBAAY,EAAC,uBAAuB,EAAE,wCAAwC,CAAC,CAAC;YAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC;QAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEhC,yBAAyB;QACzB,6CAA6C;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAA,qBAAU,EACR,+BAA+B,EAC/B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC9C;YACE,2CAA2C;YAC3C,+CAA+C;YAC/C,qDAAqD;YACrD,gDAAgD;SACjD,CACF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
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");
|
|
@@ -20,6 +30,9 @@ const login_1 = require("./commands/login");
|
|
|
20
30
|
const logout_1 = require("./commands/logout");
|
|
21
31
|
const init_1 = require("./commands/init");
|
|
22
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");
|
|
23
36
|
// Read version from package.json
|
|
24
37
|
let version = '0.1.2'; // fallback
|
|
25
38
|
try {
|
|
@@ -35,6 +48,21 @@ program
|
|
|
35
48
|
.name('neurcode')
|
|
36
49
|
.description('AI-powered code governance and diff analysis')
|
|
37
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
|
+
});
|
|
38
66
|
program
|
|
39
67
|
.command('check')
|
|
40
68
|
.description('Analyze git diff for risky changes')
|
|
@@ -99,11 +127,21 @@ program
|
|
|
99
127
|
program
|
|
100
128
|
.command('plan')
|
|
101
129
|
.description('Generate an execution plan for a user intent')
|
|
102
|
-
.argument('<intent
|
|
130
|
+
.argument('<intent...>', 'Description of what you want to accomplish')
|
|
103
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')
|
|
104
135
|
.action((intent, options) => {
|
|
105
|
-
(
|
|
106
|
-
|
|
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
|
|
107
145
|
});
|
|
108
146
|
});
|
|
109
147
|
program
|
|
@@ -129,6 +167,43 @@ program
|
|
|
129
167
|
.action(() => {
|
|
130
168
|
(0, watch_1.watchCommand)();
|
|
131
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
|
+
});
|
|
132
207
|
program
|
|
133
208
|
.command('verify')
|
|
134
209
|
.description('Verify plan adherence - Compare current changes against an Architect Plan')
|
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"}
|