@kodus/cli 0.4.3 → 0.4.5
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/README.md +110 -7
- package/dist/agents/agent.interface.d.ts.map +1 -1
- package/dist/agents/claude-code.agent.d.ts.map +1 -1
- package/dist/agents/claude-code.agent.js +12 -4
- package/dist/agents/claude-code.agent.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +8 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/config.d.ts +8 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +84 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/hook/index.js +4 -2
- package/dist/commands/hook/index.js.map +1 -1
- package/dist/commands/hook/install.d.ts +3 -1
- package/dist/commands/hook/install.d.ts.map +1 -1
- package/dist/commands/hook/install.js +76 -37
- package/dist/commands/hook/install.js.map +1 -1
- package/dist/commands/hook/uninstall.d.ts +4 -1
- package/dist/commands/hook/uninstall.d.ts.map +1 -1
- package/dist/commands/hook/uninstall.js +54 -19
- package/dist/commands/hook/uninstall.js.map +1 -1
- package/dist/commands/memory/capture.d.ts.map +1 -1
- package/dist/commands/memory/capture.js +3 -36
- package/dist/commands/memory/capture.js.map +1 -1
- package/dist/commands/memory/disable.d.ts +4 -1
- package/dist/commands/memory/disable.d.ts.map +1 -1
- package/dist/commands/memory/disable.js +53 -15
- package/dist/commands/memory/disable.js.map +1 -1
- package/dist/commands/memory/hooks.d.ts +2 -1
- package/dist/commands/memory/hooks.d.ts.map +1 -1
- package/dist/commands/memory/hooks.js +13 -5
- package/dist/commands/memory/hooks.js.map +1 -1
- package/dist/commands/memory/index.d.ts.map +1 -1
- package/dist/commands/memory/index.js +13 -3
- package/dist/commands/memory/index.js.map +1 -1
- package/dist/commands/memory/session-hooks/claude-code.js.map +1 -1
- package/dist/commands/memory/session-hooks/cursor.js.map +1 -1
- package/dist/commands/memory/session-hooks/index.d.ts.map +1 -1
- package/dist/commands/memory/session-hooks/index.js +1 -2
- package/dist/commands/memory/session-hooks/index.js.map +1 -1
- package/dist/commands/memory/session-hooks/shared.d.ts.map +1 -1
- package/dist/commands/memory/session-hooks/shared.js +7 -31
- package/dist/commands/memory/session-hooks/shared.js.map +1 -1
- package/dist/commands/memory/session-hooks-install.d.ts.map +1 -1
- package/dist/commands/memory/session-hooks-install.js +60 -27
- package/dist/commands/memory/session-hooks-install.js.map +1 -1
- package/dist/commands/pr.d.ts.map +1 -1
- package/dist/commands/pr.js +71 -20
- package/dist/commands/pr.js.map +1 -1
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +76 -24
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/schema.d.ts +3 -0
- package/dist/commands/schema.d.ts.map +1 -0
- package/dist/commands/schema.js +62 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/skills.d.ts +3 -0
- package/dist/commands/skills.d.ts.map +1 -0
- package/dist/commands/skills.js +85 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +3 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +17 -2
- package/dist/commands/update.js.map +1 -1
- package/dist/index.js +18 -1
- package/dist/index.js.map +1 -1
- package/dist/services/api/api.interface.d.ts +7 -4
- package/dist/services/api/api.interface.d.ts.map +1 -1
- package/dist/services/api/api.real.d.ts +2 -1
- package/dist/services/api/api.real.d.ts.map +1 -1
- package/dist/services/api/api.real.js +36 -10
- package/dist/services/api/api.real.js.map +1 -1
- package/dist/services/api/sessions.api.d.ts.map +1 -1
- package/dist/services/api/sessions.api.js +12 -6
- package/dist/services/api/sessions.api.js.map +1 -1
- package/dist/services/git-hooks.service.d.ts.map +1 -1
- package/dist/services/git-hooks.service.js +14 -6
- package/dist/services/git-hooks.service.js.map +1 -1
- package/dist/services/git.service.d.ts.map +1 -1
- package/dist/services/git.service.js +6 -2
- package/dist/services/git.service.js.map +1 -1
- package/dist/services/hook-logger.service.d.ts.map +1 -1
- package/dist/services/hook-logger.service.js +2 -1
- package/dist/services/hook-logger.service.js.map +1 -1
- package/dist/services/lifecycle.service.d.ts.map +1 -1
- package/dist/services/lifecycle.service.js +28 -14
- package/dist/services/lifecycle.service.js.map +1 -1
- package/dist/services/repo-config.service.d.ts +22 -0
- package/dist/services/repo-config.service.d.ts.map +1 -0
- package/dist/services/repo-config.service.js +87 -0
- package/dist/services/repo-config.service.js.map +1 -0
- package/dist/services/review.service.d.ts +0 -3
- package/dist/services/review.service.d.ts.map +1 -1
- package/dist/services/review.service.js.map +1 -1
- package/dist/services/session-local.service.d.ts.map +1 -1
- package/dist/services/session-local.service.js.map +1 -1
- package/dist/services/transcript.service.d.ts.map +1 -1
- package/dist/services/transcript.service.js +44 -13
- package/dist/services/transcript.service.js.map +1 -1
- package/dist/types/command-output.d.ts +29 -0
- package/dist/types/command-output.d.ts.map +1 -0
- package/dist/types/command-output.js +2 -0
- package/dist/types/command-output.js.map +1 -0
- package/dist/types/index.d.ts +18 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/session-events.d.ts +1 -0
- package/dist/types/session-events.d.ts.map +1 -1
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/session.js +5 -1
- package/dist/types/session.js.map +1 -1
- package/dist/utils/banner.d.ts.map +1 -1
- package/dist/utils/banner.js +2 -0
- package/dist/utils/banner.js.map +1 -1
- package/dist/utils/command-context.d.ts +12 -0
- package/dist/utils/command-context.d.ts.map +1 -0
- package/dist/utils/command-context.js +15 -0
- package/dist/utils/command-context.js.map +1 -0
- package/dist/utils/command-errors.d.ts +12 -0
- package/dist/utils/command-errors.d.ts.map +1 -0
- package/dist/utils/command-errors.js +88 -0
- package/dist/utils/command-errors.js.map +1 -0
- package/dist/utils/command-output.d.ts +5 -0
- package/dist/utils/command-output.d.ts.map +1 -0
- package/dist/utils/command-output.js +46 -0
- package/dist/utils/command-output.js.map +1 -0
- package/dist/utils/command-schema.d.ts +29 -0
- package/dist/utils/command-schema.d.ts.map +1 -0
- package/dist/utils/command-schema.js +74 -0
- package/dist/utils/command-schema.js.map +1 -0
- package/dist/utils/field-mask.d.ts +2 -0
- package/dist/utils/field-mask.d.ts.map +1 -0
- package/dist/utils/field-mask.js +93 -0
- package/dist/utils/field-mask.js.map +1 -0
- package/dist/utils/input-validation.d.ts +11 -0
- package/dist/utils/input-validation.d.ts.map +1 -0
- package/dist/utils/input-validation.js +73 -0
- package/dist/utils/input-validation.js.map +1 -0
- package/dist/utils/install-instructions.d.ts +6 -0
- package/dist/utils/install-instructions.d.ts.map +1 -0
- package/dist/utils/install-instructions.js +18 -0
- package/dist/utils/install-instructions.js.map +1 -0
- package/dist/utils/skills-sync.d.ts +39 -0
- package/dist/utils/skills-sync.d.ts.map +1 -0
- package/dist/utils/skills-sync.js +396 -0
- package/dist/utils/skills-sync.js.map +1 -0
- package/dist/utils/skills.d.ts +7 -0
- package/dist/utils/skills.d.ts.map +1 -1
- package/dist/utils/skills.js +61 -22
- package/dist/utils/skills.js.map +1 -1
- package/dist/utils/stream-input.d.ts +13 -0
- package/dist/utils/stream-input.d.ts.map +1 -0
- package/dist/utils/stream-input.js +36 -0
- package/dist/utils/stream-input.js.map +1 -0
- package/package.json +11 -9
- package/skills/README.md +12 -5
- package/skills/kodus-business-rules-validation/SKILL.md +65 -0
- package/skills/kodus-pr-suggestions-resolver/SKILL.md +6 -6
- package/skills/kodus-review/SKILL.md +20 -7
- package/skills/kodus-review-dev/SKILL.md +22 -8
- package/skills/business-rules-validation/SKILL.md +0 -43
|
@@ -11,20 +11,23 @@ async function readJsonObject(filePath) {
|
|
|
11
11
|
try {
|
|
12
12
|
const content = await fs.readFile(filePath, 'utf-8');
|
|
13
13
|
const parsed = JSON.parse(content);
|
|
14
|
-
if (!isRecord(parsed))
|
|
14
|
+
if (!isRecord(parsed)) {
|
|
15
15
|
throw new Error('JSON root must be an object');
|
|
16
|
+
}
|
|
16
17
|
return parsed;
|
|
17
18
|
}
|
|
18
19
|
catch (error) {
|
|
19
|
-
if (error.code === 'ENOENT')
|
|
20
|
+
if (error.code === 'ENOENT') {
|
|
20
21
|
return {};
|
|
22
|
+
}
|
|
21
23
|
throw error;
|
|
22
24
|
}
|
|
23
25
|
}
|
|
24
26
|
function ensureObject(root, key) {
|
|
25
27
|
const existing = root[key];
|
|
26
|
-
if (isRecord(existing))
|
|
28
|
+
if (isRecord(existing)) {
|
|
27
29
|
return existing;
|
|
30
|
+
}
|
|
28
31
|
const next = {};
|
|
29
32
|
root[key] = next;
|
|
30
33
|
return next;
|
|
@@ -32,24 +35,36 @@ function ensureObject(root, key) {
|
|
|
32
35
|
function upsertHook(hooks, eventKey, matcherName, command) {
|
|
33
36
|
const existing = hooks[eventKey];
|
|
34
37
|
const matchers = Array.isArray(existing) ? existing : [];
|
|
35
|
-
if (!Array.isArray(existing))
|
|
38
|
+
if (!Array.isArray(existing)) {
|
|
36
39
|
hooks[eventKey] = matchers;
|
|
40
|
+
}
|
|
37
41
|
for (const matcherValue of matchers) {
|
|
38
|
-
if (!isRecord(matcherValue))
|
|
42
|
+
if (!isRecord(matcherValue)) {
|
|
39
43
|
continue;
|
|
40
|
-
|
|
41
|
-
|
|
44
|
+
}
|
|
45
|
+
const currentMatcher = typeof matcherValue.matcher === 'string'
|
|
46
|
+
? matcherValue.matcher
|
|
47
|
+
: '';
|
|
48
|
+
if (currentMatcher !== matcherName) {
|
|
42
49
|
continue;
|
|
43
|
-
|
|
44
|
-
|
|
50
|
+
}
|
|
51
|
+
const hooksArray = Array.isArray(matcherValue.hooks)
|
|
52
|
+
? matcherValue.hooks
|
|
53
|
+
: [];
|
|
54
|
+
if (!Array.isArray(matcherValue.hooks)) {
|
|
45
55
|
matcherValue.hooks = hooksArray;
|
|
56
|
+
}
|
|
46
57
|
const alreadyExists = hooksArray.some((h) => isRecord(h) && h.type === 'command' && h.command === command);
|
|
47
|
-
if (alreadyExists)
|
|
58
|
+
if (alreadyExists) {
|
|
48
59
|
return false;
|
|
60
|
+
}
|
|
49
61
|
// Replace existing sessions hook command if present
|
|
50
62
|
for (const hookValue of hooksArray) {
|
|
51
|
-
if (!isRecord(hookValue) ||
|
|
63
|
+
if (!isRecord(hookValue) ||
|
|
64
|
+
hookValue.type !== 'command' ||
|
|
65
|
+
typeof hookValue.command !== 'string') {
|
|
52
66
|
continue;
|
|
67
|
+
}
|
|
53
68
|
if (isSessionsHookCommand(hookValue.command)) {
|
|
54
69
|
hookValue.command = command;
|
|
55
70
|
return true;
|
|
@@ -70,13 +85,21 @@ export async function installSessionHooks(repoRoot, agentName) {
|
|
|
70
85
|
const hooks = ensureObject(settings, 'hooks');
|
|
71
86
|
const cmd = (hookEvent) => `${SESSIONS_HOOK_PREFIX} ${agentName} ${hookEvent}`;
|
|
72
87
|
let changed = false;
|
|
73
|
-
changed =
|
|
74
|
-
|
|
88
|
+
changed =
|
|
89
|
+
upsertHook(hooks, 'SessionStart', '', cmd('session-start')) || changed;
|
|
90
|
+
changed =
|
|
91
|
+
upsertHook(hooks, 'SessionEnd', '', cmd('session-end')) || changed;
|
|
75
92
|
changed = upsertHook(hooks, 'Stop', '', cmd('stop')) || changed;
|
|
76
|
-
changed =
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
changed =
|
|
93
|
+
changed =
|
|
94
|
+
upsertHook(hooks, 'UserPromptSubmit', '', cmd('user-prompt-submit')) ||
|
|
95
|
+
changed;
|
|
96
|
+
changed =
|
|
97
|
+
upsertHook(hooks, 'PreToolUse', 'Task', cmd('pre-task')) || changed;
|
|
98
|
+
changed =
|
|
99
|
+
upsertHook(hooks, 'PostToolUse', 'Task', cmd('post-task')) || changed;
|
|
100
|
+
changed =
|
|
101
|
+
upsertHook(hooks, 'PostToolUse', 'TodoWrite', cmd('post-todo')) ||
|
|
102
|
+
changed;
|
|
80
103
|
if (changed) {
|
|
81
104
|
await fs.mkdir(path.dirname(settingsPath), { recursive: true });
|
|
82
105
|
await fs.writeFile(settingsPath, `${JSON.stringify(settings, null, 2)}\n`, 'utf-8');
|
|
@@ -89,43 +112,53 @@ export async function removeSessionHooks(repoRoot) {
|
|
|
89
112
|
try {
|
|
90
113
|
const content = await fs.readFile(settingsPath, 'utf-8');
|
|
91
114
|
const parsed = JSON.parse(content);
|
|
92
|
-
if (!isRecord(parsed))
|
|
115
|
+
if (!isRecord(parsed)) {
|
|
93
116
|
return { settingsPath, removed: false };
|
|
117
|
+
}
|
|
94
118
|
settings = parsed;
|
|
95
119
|
}
|
|
96
120
|
catch {
|
|
97
121
|
return { settingsPath, removed: false };
|
|
98
122
|
}
|
|
99
123
|
const hooks = settings.hooks;
|
|
100
|
-
if (!isRecord(hooks))
|
|
124
|
+
if (!isRecord(hooks)) {
|
|
101
125
|
return { settingsPath, removed: false };
|
|
126
|
+
}
|
|
102
127
|
let removed = false;
|
|
103
128
|
for (const eventKey of Object.keys(hooks)) {
|
|
104
129
|
const matchers = hooks[eventKey];
|
|
105
|
-
if (!Array.isArray(matchers))
|
|
130
|
+
if (!Array.isArray(matchers)) {
|
|
106
131
|
continue;
|
|
132
|
+
}
|
|
107
133
|
for (const matcher of matchers) {
|
|
108
|
-
if (!isRecord(matcher) || !Array.isArray(matcher.hooks))
|
|
134
|
+
if (!isRecord(matcher) || !Array.isArray(matcher.hooks)) {
|
|
109
135
|
continue;
|
|
136
|
+
}
|
|
110
137
|
const originalLength = matcher.hooks.length;
|
|
111
138
|
matcher.hooks = matcher.hooks.filter((h) => {
|
|
112
|
-
if (!isRecord(h))
|
|
139
|
+
if (!isRecord(h)) {
|
|
113
140
|
return true;
|
|
114
|
-
|
|
141
|
+
}
|
|
142
|
+
return (typeof h.command !== 'string' ||
|
|
143
|
+
!isSessionsHookCommand(h.command));
|
|
115
144
|
});
|
|
116
|
-
if (matcher.hooks.length < originalLength)
|
|
145
|
+
if (matcher.hooks.length < originalLength) {
|
|
117
146
|
removed = true;
|
|
147
|
+
}
|
|
118
148
|
}
|
|
119
149
|
hooks[eventKey] = matchers.filter((m) => {
|
|
120
|
-
if (!isRecord(m))
|
|
150
|
+
if (!isRecord(m)) {
|
|
121
151
|
return true;
|
|
152
|
+
}
|
|
122
153
|
return Array.isArray(m.hooks) && m.hooks.length > 0;
|
|
123
154
|
});
|
|
124
|
-
if (hooks[eventKey].length === 0)
|
|
155
|
+
if (hooks[eventKey].length === 0) {
|
|
125
156
|
delete hooks[eventKey];
|
|
157
|
+
}
|
|
126
158
|
}
|
|
127
|
-
if (Object.keys(hooks).length === 0)
|
|
159
|
+
if (Object.keys(hooks).length === 0) {
|
|
128
160
|
delete settings.hooks;
|
|
161
|
+
}
|
|
129
162
|
if (removed) {
|
|
130
163
|
if (Object.keys(settings).length === 0) {
|
|
131
164
|
await fs.writeFile(settingsPath, '{}\n', 'utf-8');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-hooks-install.js","sourceRoot":"","sources":["../../../src/commands/memory/session-hooks-install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,oBAAoB,GAAG,uBAAuB,CAAC;AAIrD,SAAS,QAAQ,CAAC,KAAc;
|
|
1
|
+
{"version":3,"file":"session-hooks-install.js","sourceRoot":"","sources":["../../../src/commands/memory/session-hooks-install.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pr.d.ts","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"pr.d.ts","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsCpC,eAAO,MAAM,SAAS,SAAyD,CAAC"}
|
package/dist/commands/pr.js
CHANGED
|
@@ -10,6 +10,11 @@ import { markdownFormatter } from '../formatters/markdown.js';
|
|
|
10
10
|
import { promptFormatter } from '../formatters/prompt.js';
|
|
11
11
|
import { exitWithCode } from '../utils/cli-exit.js';
|
|
12
12
|
import { cliDebug, cliError, cliInfo } from '../utils/logger.js';
|
|
13
|
+
import { createCommandContext } from '../utils/command-context.js';
|
|
14
|
+
import { buildAgentErrorEnvelope, buildAgentSuccessEnvelope, emitAgentEnvelope, } from '../utils/command-output.js';
|
|
15
|
+
import { CommandError, normalizeCommandError, } from '../utils/command-errors.js';
|
|
16
|
+
import { assertStructuredOutputForFields, parseCsvEnumList, parseFieldList, parseOptionalNumber, validateHttpUrl, } from '../utils/input-validation.js';
|
|
17
|
+
import { applyFieldMask } from '../utils/field-mask.js';
|
|
13
18
|
export const prCommand = new Command('pr').description('Pull request commands');
|
|
14
19
|
prCommand
|
|
15
20
|
.command('suggestions')
|
|
@@ -19,39 +24,74 @@ prCommand
|
|
|
19
24
|
.option('--repo-id <id>', 'Repository ID for the pull request')
|
|
20
25
|
.option('--severity <list>', 'Comma-separated severities to include')
|
|
21
26
|
.option('--category <list>', 'Comma-separated categories to include')
|
|
27
|
+
.option('--fields <csv>', 'Select response fields (JSON/agent mode only), e.g. summary,issues.file')
|
|
22
28
|
.action(async (options, cmd) => {
|
|
23
29
|
const globalOpts = cmd.optsWithGlobals();
|
|
30
|
+
const ctx = createCommandContext('pr suggestions', globalOpts);
|
|
24
31
|
const spinner = ora();
|
|
25
32
|
try {
|
|
26
|
-
|
|
27
|
-
|
|
33
|
+
assertStructuredOutputForFields({
|
|
34
|
+
fields: options.fields,
|
|
35
|
+
format: globalOpts.format,
|
|
36
|
+
isAgent: ctx.isAgent,
|
|
37
|
+
});
|
|
38
|
+
const prNumber = parseOptionalNumber(options.prNumber, '--pr-number');
|
|
39
|
+
const normalizedPrUrl = options.prUrl
|
|
40
|
+
? validateHttpUrl(options.prUrl, '--pr-url')
|
|
28
41
|
: undefined;
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
42
|
+
const allowedSeverities = [
|
|
43
|
+
'info',
|
|
44
|
+
'warning',
|
|
45
|
+
'error',
|
|
46
|
+
'critical',
|
|
47
|
+
'high',
|
|
48
|
+
'medium',
|
|
49
|
+
'low',
|
|
50
|
+
];
|
|
51
|
+
const allowedCategories = [
|
|
52
|
+
'security_vulnerability',
|
|
53
|
+
'performance',
|
|
54
|
+
'code_quality',
|
|
55
|
+
'best_practices',
|
|
56
|
+
'style',
|
|
57
|
+
'bug',
|
|
58
|
+
'complexity',
|
|
59
|
+
'maintainability',
|
|
60
|
+
'documentation',
|
|
61
|
+
];
|
|
62
|
+
const severityFilter = parseCsvEnumList(options.severity, '--severity', allowedSeverities);
|
|
63
|
+
const categoryFilter = parseCsvEnumList(options.category, '--category', allowedCategories);
|
|
64
|
+
const fields = parseFieldList(options.fields);
|
|
65
|
+
if (!normalizedPrUrl && !(prNumber && options.repoId)) {
|
|
66
|
+
throw new CommandError('INVALID_INPUT', 'Provide --pr-url or both --pr-number and --repo-id.');
|
|
67
|
+
}
|
|
68
|
+
const shouldRequestMarkdown = !ctx.isAgent &&
|
|
69
|
+
(globalOpts.format === 'prompt' ||
|
|
70
|
+
globalOpts.format === 'markdown');
|
|
71
|
+
if (!globalOpts.quiet && !ctx.isAgent) {
|
|
39
72
|
spinner.start(chalk.cyan('Fetching pull request suggestions...'));
|
|
40
73
|
}
|
|
41
74
|
const { result, markdown } = await reviewService.getPullRequestSuggestions({
|
|
42
|
-
prUrl:
|
|
75
|
+
prUrl: normalizedPrUrl,
|
|
43
76
|
prNumber,
|
|
44
77
|
repositoryId: options.repoId,
|
|
45
78
|
format: shouldRequestMarkdown ? 'markdown' : undefined,
|
|
46
|
-
severity:
|
|
47
|
-
category:
|
|
79
|
+
severity: severityFilter?.join(','),
|
|
80
|
+
category: categoryFilter?.join(','),
|
|
48
81
|
});
|
|
49
|
-
if (!globalOpts.quiet) {
|
|
82
|
+
if (!globalOpts.quiet && !ctx.isAgent) {
|
|
50
83
|
spinner.succeed(chalk.green('Suggestions fetched'));
|
|
51
84
|
}
|
|
85
|
+
const selectedResult = fields
|
|
86
|
+
? applyFieldMask(result, fields)
|
|
87
|
+
: result;
|
|
88
|
+
if (ctx.isAgent) {
|
|
89
|
+
await emitAgentEnvelope(buildAgentSuccessEnvelope(ctx.command, selectedResult, ctx.startedAt), ctx.outputFile);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
52
92
|
const output = markdown && shouldRequestMarkdown
|
|
53
93
|
? markdown
|
|
54
|
-
: formatOutput(
|
|
94
|
+
: formatOutput(selectedResult, globalOpts.format);
|
|
55
95
|
if (globalOpts.output) {
|
|
56
96
|
await fs.writeFile(globalOpts.output, output, 'utf-8');
|
|
57
97
|
cliInfo(chalk.green(`\nOutput saved to ${globalOpts.output}`));
|
|
@@ -61,19 +101,30 @@ prCommand
|
|
|
61
101
|
}
|
|
62
102
|
}
|
|
63
103
|
catch (error) {
|
|
104
|
+
const normalized = normalizeCommandError(error);
|
|
105
|
+
if (ctx.isAgent) {
|
|
106
|
+
await emitAgentEnvelope(buildAgentErrorEnvelope(ctx.command, {
|
|
107
|
+
code: normalized.code,
|
|
108
|
+
message: normalized.message,
|
|
109
|
+
details: normalized.details,
|
|
110
|
+
}, ctx.startedAt), ctx.outputFile);
|
|
111
|
+
if (normalized.exitCode > 0) {
|
|
112
|
+
exitWithCode(normalized.exitCode);
|
|
113
|
+
}
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
64
116
|
if (!globalOpts.quiet) {
|
|
65
117
|
spinner.fail(chalk.red('Failed to fetch pull request suggestions'));
|
|
66
118
|
}
|
|
67
119
|
if (error instanceof Error) {
|
|
68
120
|
cliError(chalk.red(error.message));
|
|
69
121
|
}
|
|
70
|
-
exitWithCode(
|
|
122
|
+
exitWithCode(normalized.exitCode);
|
|
71
123
|
}
|
|
72
124
|
});
|
|
73
125
|
prCommand
|
|
74
126
|
.command('business-validation')
|
|
75
|
-
.
|
|
76
|
-
.description('Run business rules validation for local diff')
|
|
127
|
+
.description('Run business rules validation for local diff only')
|
|
77
128
|
.argument('[files...]', 'Specific files to include in local diff mode')
|
|
78
129
|
.option('--task-url <url>', 'Task URL to append to the validation command')
|
|
79
130
|
.option('--task-id <id>', 'Task ID or issue key (e.g. KC-1441) to append')
|
package/dist/commands/pr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pr.js","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"pr.js","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmCpC,eAAO,MAAM,aAAa,SA+ZrB,CAAC"}
|
package/dist/commands/review.js
CHANGED
|
@@ -13,6 +13,11 @@ import { interactiveUI } from '../ui/interactive.js';
|
|
|
13
13
|
import { showTrialLimitPrompt, checkTrialStatus } from '../utils/rate-limit.js';
|
|
14
14
|
import { exitWithCode } from '../utils/cli-exit.js';
|
|
15
15
|
import { cliDebug, cliError, cliInfo } from '../utils/logger.js';
|
|
16
|
+
import { createCommandContext } from '../utils/command-context.js';
|
|
17
|
+
import { buildAgentErrorEnvelope, buildAgentSuccessEnvelope, emitAgentEnvelope, } from '../utils/command-output.js';
|
|
18
|
+
import { normalizeCommandError } from '../utils/command-errors.js';
|
|
19
|
+
import { assertStructuredOutputForFields, parseFieldList, } from '../utils/input-validation.js';
|
|
20
|
+
import { applyFieldMask } from '../utils/field-mask.js';
|
|
16
21
|
import fs from 'fs/promises';
|
|
17
22
|
export const reviewCommand = new Command('review')
|
|
18
23
|
.description('Analyze modified files for code review')
|
|
@@ -27,25 +32,40 @@ export const reviewCommand = new Command('review')
|
|
|
27
32
|
.option('--prompt-only', 'Output optimized for AI agents (minimal, structured)')
|
|
28
33
|
.option('--fail-on <severity>', 'Exit with code 1 if issues meet or exceed severity (info, warning, error, critical)')
|
|
29
34
|
.option('--context <file>', 'Custom context file to include in review')
|
|
35
|
+
.option('--fields <csv>', 'Select response fields (JSON/agent mode only), e.g. summary,issues.file')
|
|
30
36
|
.action(async (files, options, cmd) => {
|
|
31
37
|
const globalOpts = cmd.optsWithGlobals();
|
|
38
|
+
const ctx = createCommandContext('review', globalOpts);
|
|
32
39
|
const spinner = ora();
|
|
40
|
+
const fields = parseFieldList(options.fields);
|
|
33
41
|
try {
|
|
34
|
-
|
|
42
|
+
assertStructuredOutputForFields({
|
|
43
|
+
fields: options.fields,
|
|
44
|
+
format: globalOpts.format,
|
|
45
|
+
isAgent: ctx.isAgent,
|
|
46
|
+
});
|
|
35
47
|
// Override format if --prompt-only is set
|
|
36
|
-
if (options.promptOnly) {
|
|
48
|
+
if (options.promptOnly && !ctx.isAgent) {
|
|
37
49
|
globalOpts.format = 'prompt';
|
|
38
50
|
}
|
|
39
|
-
|
|
51
|
+
const isAuthenticated = await authService.isAuthenticated();
|
|
52
|
+
if (!globalOpts.quiet && !ctx.isAgent) {
|
|
40
53
|
spinner.start(chalk.cyan('Checking authentication...'));
|
|
41
54
|
}
|
|
42
55
|
let result;
|
|
43
56
|
if (isAuthenticated) {
|
|
44
|
-
if (!globalOpts.quiet) {
|
|
57
|
+
if (!globalOpts.quiet && !ctx.isAgent) {
|
|
45
58
|
spinner.text = chalk.cyan('Getting file changes...');
|
|
46
59
|
}
|
|
47
60
|
let diff = await getDiff(files, options, globalOpts.verbose);
|
|
48
61
|
if (!diff) {
|
|
62
|
+
if (ctx.isAgent) {
|
|
63
|
+
await emitAgentEnvelope(buildAgentErrorEnvelope(ctx.command, {
|
|
64
|
+
code: 'NO_CHANGES',
|
|
65
|
+
message: 'No changes to review',
|
|
66
|
+
}, ctx.startedAt), ctx.outputFile);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
49
69
|
if (!globalOpts.quiet) {
|
|
50
70
|
spinner.fail(chalk.yellow('No changes to review'));
|
|
51
71
|
}
|
|
@@ -60,14 +80,14 @@ export const reviewCommand = new Command('review')
|
|
|
60
80
|
return;
|
|
61
81
|
}
|
|
62
82
|
// Enrich with project context
|
|
63
|
-
if (!globalOpts.quiet) {
|
|
83
|
+
if (!globalOpts.quiet && !ctx.isAgent) {
|
|
64
84
|
spinner.text = chalk.cyan('Reading project context...');
|
|
65
85
|
}
|
|
66
86
|
if (globalOpts.verbose) {
|
|
67
87
|
cliDebug(chalk.dim('[verbose] Reading project context files...'));
|
|
68
88
|
}
|
|
69
89
|
diff = await contextService.enrichDiffWithContext(diff, options.context, globalOpts.verbose);
|
|
70
|
-
if (!globalOpts.quiet) {
|
|
90
|
+
if (!globalOpts.quiet && !ctx.isAgent) {
|
|
71
91
|
spinner.text = chalk.cyan('Analyzing code...');
|
|
72
92
|
}
|
|
73
93
|
if (globalOpts.verbose) {
|
|
@@ -81,12 +101,12 @@ export const reviewCommand = new Command('review')
|
|
|
81
101
|
quiet: globalOpts.quiet,
|
|
82
102
|
});
|
|
83
103
|
const modeLabel = options.fast ? ' (fast mode)' : '';
|
|
84
|
-
if (!globalOpts.quiet) {
|
|
104
|
+
if (!globalOpts.quiet && !ctx.isAgent) {
|
|
85
105
|
spinner.succeed(chalk.green(`Review complete!${modeLabel}`));
|
|
86
106
|
}
|
|
87
107
|
}
|
|
88
108
|
else {
|
|
89
|
-
if (!globalOpts.quiet) {
|
|
109
|
+
if (!globalOpts.quiet && !ctx.isAgent) {
|
|
90
110
|
spinner.text = chalk.cyan('Running in trial mode...');
|
|
91
111
|
}
|
|
92
112
|
const trialStatus = await checkTrialStatus();
|
|
@@ -95,11 +115,18 @@ export const reviewCommand = new Command('review')
|
|
|
95
115
|
showTrialLimitPrompt(trialStatus);
|
|
96
116
|
return;
|
|
97
117
|
}
|
|
98
|
-
if (!globalOpts.quiet) {
|
|
118
|
+
if (!globalOpts.quiet && !ctx.isAgent) {
|
|
99
119
|
spinner.text = chalk.cyan('Getting file changes...');
|
|
100
120
|
}
|
|
101
121
|
let diff = await getDiff(files, options, globalOpts.verbose);
|
|
102
122
|
if (!diff) {
|
|
123
|
+
if (ctx.isAgent) {
|
|
124
|
+
await emitAgentEnvelope(buildAgentErrorEnvelope(ctx.command, {
|
|
125
|
+
code: 'NO_CHANGES',
|
|
126
|
+
message: 'No changes to review',
|
|
127
|
+
}, ctx.startedAt), ctx.outputFile);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
103
130
|
if (!globalOpts.quiet) {
|
|
104
131
|
spinner.fail(chalk.yellow('No changes to review'));
|
|
105
132
|
}
|
|
@@ -114,14 +141,14 @@ export const reviewCommand = new Command('review')
|
|
|
114
141
|
return;
|
|
115
142
|
}
|
|
116
143
|
// Enrich with project context
|
|
117
|
-
if (!globalOpts.quiet) {
|
|
144
|
+
if (!globalOpts.quiet && !ctx.isAgent) {
|
|
118
145
|
spinner.text = chalk.cyan('Reading project context...');
|
|
119
146
|
}
|
|
120
147
|
if (globalOpts.verbose) {
|
|
121
148
|
cliDebug(chalk.dim('[verbose] Reading project context files...'));
|
|
122
149
|
}
|
|
123
150
|
diff = await contextService.enrichDiffWithContext(diff, options.context, globalOpts.verbose);
|
|
124
|
-
if (!globalOpts.quiet) {
|
|
151
|
+
if (!globalOpts.quiet && !ctx.isAgent) {
|
|
125
152
|
spinner.text = chalk.cyan('Analyzing code (trial mode)...');
|
|
126
153
|
}
|
|
127
154
|
if (globalOpts.verbose) {
|
|
@@ -129,33 +156,46 @@ export const reviewCommand = new Command('review')
|
|
|
129
156
|
}
|
|
130
157
|
const trialResult = await reviewService.trialAnalyze(diff);
|
|
131
158
|
result = trialResult;
|
|
132
|
-
if (!globalOpts.quiet) {
|
|
159
|
+
if (!globalOpts.quiet && !ctx.isAgent) {
|
|
133
160
|
spinner.succeed(chalk.green(formatTrialCompletionMessage(trialResult)));
|
|
134
161
|
}
|
|
135
162
|
}
|
|
136
163
|
// Handle fix mode
|
|
137
164
|
if (options.fix) {
|
|
138
165
|
await interactiveUI.runQuickFix(result);
|
|
166
|
+
if (ctx.isAgent) {
|
|
167
|
+
await emitAgentEnvelope(buildAgentSuccessEnvelope(ctx.command, { fixedIssues: true }, ctx.startedAt), ctx.outputFile);
|
|
168
|
+
}
|
|
139
169
|
return;
|
|
140
170
|
}
|
|
171
|
+
const selectedResult = fields
|
|
172
|
+
? applyFieldMask(result, fields)
|
|
173
|
+
: result;
|
|
141
174
|
// Handle interactive mode (now default if no output format specified)
|
|
142
|
-
const shouldUseInteractive = options.interactive ||
|
|
143
|
-
(!
|
|
175
|
+
const shouldUseInteractive = (!ctx.isAgent && options.interactive) ||
|
|
176
|
+
(!ctx.isAgent &&
|
|
177
|
+
!globalOpts.output &&
|
|
178
|
+
globalOpts.format === 'terminal');
|
|
144
179
|
if (shouldUseInteractive) {
|
|
145
180
|
await interactiveUI.run(result);
|
|
146
181
|
return;
|
|
147
182
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
if (globalOpts.output) {
|
|
151
|
-
await fs.writeFile(globalOpts.output, output, 'utf-8');
|
|
152
|
-
cliInfo(chalk.green(`\nOutput saved to ${globalOpts.output}`));
|
|
153
|
-
}
|
|
154
|
-
else if (globalOpts.format === 'terminal') {
|
|
155
|
-
cliInfo(output);
|
|
183
|
+
if (ctx.isAgent) {
|
|
184
|
+
await emitAgentEnvelope(buildAgentSuccessEnvelope(ctx.command, selectedResult, ctx.startedAt), ctx.outputFile);
|
|
156
185
|
}
|
|
157
186
|
else {
|
|
158
|
-
|
|
187
|
+
// Regular output (only when --format or --output is specified)
|
|
188
|
+
const output = formatOutput(selectedResult, globalOpts.format);
|
|
189
|
+
if (globalOpts.output) {
|
|
190
|
+
await fs.writeFile(globalOpts.output, output, 'utf-8');
|
|
191
|
+
cliInfo(chalk.green(`\nOutput saved to ${globalOpts.output}`));
|
|
192
|
+
}
|
|
193
|
+
else if (globalOpts.format === 'terminal') {
|
|
194
|
+
cliInfo(output);
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
cliInfo(output);
|
|
198
|
+
}
|
|
159
199
|
}
|
|
160
200
|
// Check --fail-on after output
|
|
161
201
|
if (options.failOn) {
|
|
@@ -173,6 +213,18 @@ export const reviewCommand = new Command('review')
|
|
|
173
213
|
}
|
|
174
214
|
}
|
|
175
215
|
catch (error) {
|
|
216
|
+
const normalized = normalizeCommandError(error);
|
|
217
|
+
if (ctx.isAgent) {
|
|
218
|
+
await emitAgentEnvelope(buildAgentErrorEnvelope(ctx.command, {
|
|
219
|
+
code: normalized.code,
|
|
220
|
+
message: normalized.message,
|
|
221
|
+
details: normalized.details,
|
|
222
|
+
}, ctx.startedAt), ctx.outputFile);
|
|
223
|
+
if (normalized.exitCode > 0) {
|
|
224
|
+
exitWithCode(normalized.exitCode);
|
|
225
|
+
}
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
176
228
|
if (!globalOpts.quiet) {
|
|
177
229
|
spinner.fail(chalk.red('Review failed'));
|
|
178
230
|
}
|
|
@@ -188,7 +240,7 @@ export const reviewCommand = new Command('review')
|
|
|
188
240
|
cliError(error);
|
|
189
241
|
}
|
|
190
242
|
}
|
|
191
|
-
exitWithCode(
|
|
243
|
+
exitWithCode(normalized.exitCode);
|
|
192
244
|
}
|
|
193
245
|
});
|
|
194
246
|
async function getDiff(files, options, verbose) {
|