@codeledger/cli 0.6.8 → 0.7.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/commands/activate.d.ts.map +1 -1
- package/dist/commands/activate.js +94 -26
- package/dist/commands/activate.js.map +1 -1
- package/dist/commands/ci.d.ts +16 -0
- package/dist/commands/ci.d.ts.map +1 -0
- package/dist/commands/ci.js +323 -0
- package/dist/commands/ci.js.map +1 -0
- package/dist/commands/commit-msg.d.ts +58 -0
- package/dist/commands/commit-msg.d.ts.map +1 -0
- package/dist/commands/commit-msg.js +461 -0
- package/dist/commands/commit-msg.js.map +1 -0
- package/dist/commands/compare.d.ts.map +1 -1
- package/dist/commands/compare.js +8 -0
- package/dist/commands/compare.js.map +1 -1
- package/dist/commands/context.d.ts +17 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +687 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +65 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/enable.d.ts +7 -0
- package/dist/commands/enable.d.ts.map +1 -0
- package/dist/commands/enable.js +75 -0
- package/dist/commands/enable.js.map +1 -0
- package/dist/commands/features.d.ts +2 -0
- package/dist/commands/features.d.ts.map +1 -0
- package/dist/commands/features.js +182 -0
- package/dist/commands/features.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +22 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/intent.d.ts +5 -3
- package/dist/commands/intent.d.ts.map +1 -1
- package/dist/commands/intent.js +135 -4
- package/dist/commands/intent.js.map +1 -1
- package/dist/commands/ledger.d.ts +14 -0
- package/dist/commands/ledger.d.ts.map +1 -0
- package/dist/commands/ledger.js +128 -0
- package/dist/commands/ledger.js.map +1 -0
- package/dist/commands/license.d.ts +45 -0
- package/dist/commands/license.d.ts.map +1 -0
- package/dist/commands/license.js +240 -0
- package/dist/commands/license.js.map +1 -0
- package/dist/commands/orchestrate.d.ts +12 -0
- package/dist/commands/orchestrate.d.ts.map +1 -0
- package/dist/commands/orchestrate.js +119 -0
- package/dist/commands/orchestrate.js.map +1 -0
- package/dist/commands/policy-simulate.d.ts +9 -0
- package/dist/commands/policy-simulate.d.ts.map +1 -0
- package/dist/commands/policy-simulate.js +46 -0
- package/dist/commands/policy-simulate.js.map +1 -0
- package/dist/commands/pr-summary.d.ts +59 -0
- package/dist/commands/pr-summary.d.ts.map +1 -0
- package/dist/commands/pr-summary.js +524 -0
- package/dist/commands/pr-summary.js.map +1 -0
- package/dist/commands/provenance.d.ts +10 -0
- package/dist/commands/provenance.d.ts.map +1 -0
- package/dist/commands/provenance.js +87 -0
- package/dist/commands/provenance.js.map +1 -0
- package/dist/commands/replay.d.ts +2 -0
- package/dist/commands/replay.d.ts.map +1 -0
- package/dist/commands/replay.js +181 -0
- package/dist/commands/replay.js.map +1 -0
- package/dist/commands/serve.d.ts +3 -0
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +73 -1
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/session-cleanup.js +1 -0
- package/dist/commands/session-cleanup.js.map +1 -1
- package/dist/commands/session-summary.d.ts.map +1 -1
- package/dist/commands/session-summary.js +180 -3
- package/dist/commands/session-summary.js.map +1 -1
- package/dist/commands/setup-ci.d.ts +17 -1
- package/dist/commands/setup-ci.d.ts.map +1 -1
- package/dist/commands/setup-ci.js +202 -51
- package/dist/commands/setup-ci.js.map +1 -1
- package/dist/commands/share.js +1 -1
- package/dist/commands/share.js.map +1 -1
- package/dist/commands/stats.d.ts +8 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +164 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/team-ledger.d.ts +11 -0
- package/dist/commands/team-ledger.d.ts.map +1 -0
- package/dist/commands/team-ledger.js +74 -0
- package/dist/commands/team-ledger.js.map +1 -0
- package/dist/commands/team-metrics.d.ts +8 -0
- package/dist/commands/team-metrics.d.ts.map +1 -0
- package/dist/commands/team-metrics.js +57 -0
- package/dist/commands/team-metrics.js.map +1 -0
- package/dist/commands/upgrade.d.ts +6 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +39 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +35 -3
- package/dist/commands/verify.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +256 -36
- package/dist/index.js.map +1 -1
- package/dist/intent/extractor.d.ts +15 -0
- package/dist/intent/extractor.d.ts.map +1 -0
- package/dist/intent/extractor.js +149 -0
- package/dist/intent/extractor.js.map +1 -0
- package/dist/intent/fetcher.d.ts +33 -0
- package/dist/intent/fetcher.d.ts.map +1 -0
- package/dist/intent/fetcher.js +364 -0
- package/dist/intent/fetcher.js.map +1 -0
- package/dist/intent/loader.d.ts +26 -0
- package/dist/intent/loader.d.ts.map +1 -0
- package/dist/intent/loader.js +80 -0
- package/dist/intent/loader.js.map +1 -0
- package/dist/intent/types.d.ts +33 -0
- package/dist/intent/types.d.ts.map +1 -0
- package/dist/intent/types.js +9 -0
- package/dist/intent/types.js.map +1 -0
- package/dist/project-config.d.ts +38 -0
- package/dist/project-config.d.ts.map +1 -0
- package/dist/project-config.js +206 -0
- package/dist/project-config.js.map +1 -0
- package/dist/review-intelligence/detectors/architecture-graph.d.ts +18 -0
- package/dist/review-intelligence/detectors/architecture-graph.d.ts.map +1 -0
- package/dist/review-intelligence/detectors/architecture-graph.js +73 -0
- package/dist/review-intelligence/detectors/architecture-graph.js.map +1 -0
- package/dist/review-intelligence/detectors/pack-rules.d.ts +16 -0
- package/dist/review-intelligence/detectors/pack-rules.d.ts.map +1 -0
- package/dist/review-intelligence/detectors/pack-rules.js +107 -0
- package/dist/review-intelligence/detectors/pack-rules.js.map +1 -0
- package/dist/review-intelligence/fixes/index.d.ts +18 -0
- package/dist/review-intelligence/fixes/index.d.ts.map +1 -1
- package/dist/review-intelligence/fixes/index.js +198 -9
- package/dist/review-intelligence/fixes/index.js.map +1 -1
- package/dist/review-intelligence/index.d.ts +4 -1
- package/dist/review-intelligence/index.d.ts.map +1 -1
- package/dist/review-intelligence/index.js +20 -3
- package/dist/review-intelligence/index.js.map +1 -1
- package/dist/review-intelligence/invariants.d.ts +15 -0
- package/dist/review-intelligence/invariants.d.ts.map +1 -1
- package/dist/review-intelligence/invariants.js +36 -5
- package/dist/review-intelligence/invariants.js.map +1 -1
- package/dist/review-intelligence/types.d.ts +16 -12
- package/dist/review-intelligence/types.d.ts.map +1 -1
- package/dist/review-intelligence/types.js +9 -1
- package/dist/review-intelligence/types.js.map +1 -1
- package/dist/templates/claude-md.d.ts.map +1 -1
- package/dist/templates/claude-md.js +32 -127
- package/dist/templates/claude-md.js.map +1 -1
- package/dist/templates/config.js +4 -4
- package/dist/templates/config.js.map +1 -1
- package/dist/templates/hooks.d.ts +3 -1
- package/dist/templates/hooks.d.ts.map +1 -1
- package/dist/templates/hooks.js +101 -2
- package/dist/templates/hooks.js.map +1 -1
- package/package.json +11 -10
- package/LICENSE +0 -27
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* License management — local-first Pro license activation.
|
|
3
|
+
*
|
|
4
|
+
* Supports two key formats:
|
|
5
|
+
* 1. Signed: CL-PRO.<base64url-payload>.<base64url-signature> (primary)
|
|
6
|
+
* 2. Legacy: CL-PRO-XXXX-XXXX-XXXX (backward-compatible, temporary)
|
|
7
|
+
*
|
|
8
|
+
* Commands:
|
|
9
|
+
* license activate <key> — Verify and store a Pro license key
|
|
10
|
+
* license status — Show current license state
|
|
11
|
+
* license deactivate — Remove active license, return to free mode
|
|
12
|
+
*
|
|
13
|
+
* Storage: .codeledger/license.json (gitignored by default)
|
|
14
|
+
*/
|
|
15
|
+
import { existsSync, readFileSync, writeFileSync, unlinkSync } from 'node:fs';
|
|
16
|
+
import { join } from 'node:path';
|
|
17
|
+
import { parseLicenseKey, verifySignedLicense, } from '@codeledger/engine';
|
|
18
|
+
// ── Constants ──────────────────────────────────────────────────────────────
|
|
19
|
+
const LICENSE_FILE = 'license.json';
|
|
20
|
+
// ── Public helpers (used by feature gating) ────────────────────────────────
|
|
21
|
+
export function licensePath(cwd) {
|
|
22
|
+
return join(cwd, '.codeledger', LICENSE_FILE);
|
|
23
|
+
}
|
|
24
|
+
export function loadLicense(cwd) {
|
|
25
|
+
const p = licensePath(cwd);
|
|
26
|
+
if (!existsSync(p))
|
|
27
|
+
return null;
|
|
28
|
+
try {
|
|
29
|
+
const data = JSON.parse(readFileSync(p, 'utf-8'));
|
|
30
|
+
// Signed license format
|
|
31
|
+
if (typeof data['rawKey'] === 'string' && data['decoded'] && typeof data['decoded'] === 'object') {
|
|
32
|
+
const decoded = data['decoded'];
|
|
33
|
+
if (decoded['plan'] === 'pro' && Array.isArray(decoded['features'])) {
|
|
34
|
+
// Re-validate expiry on load
|
|
35
|
+
const payload = decoded;
|
|
36
|
+
if (payload.expiresAt) {
|
|
37
|
+
const expiry = new Date(payload.expiresAt);
|
|
38
|
+
if (!isNaN(expiry.getTime()) && expiry.getTime() < Date.now()) {
|
|
39
|
+
return null; // Expired
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return data;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Legacy license format
|
|
46
|
+
if (typeof data['licenseKey'] === 'string' &&
|
|
47
|
+
data['plan'] === 'pro' &&
|
|
48
|
+
typeof data['activatedAt'] === 'string' &&
|
|
49
|
+
Array.isArray(data['features'])) {
|
|
50
|
+
return data;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch { /* corrupted file — treat as inactive */ }
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
export function isProLicensed(cwd) {
|
|
57
|
+
return loadLicense(cwd) !== null;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Check whether a feature tier is unlocked. Returns true if:
|
|
61
|
+
* - tier is 'individual' (always free), OR
|
|
62
|
+
* - a valid Pro license is active (unlocks 'team' + 'enterprise')
|
|
63
|
+
*/
|
|
64
|
+
export function isTierUnlocked(cwd, tier) {
|
|
65
|
+
if (tier === 'individual')
|
|
66
|
+
return true;
|
|
67
|
+
return isProLicensed(cwd);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Print a calm, non-pushy gate message and return false.
|
|
71
|
+
* Commands should call this and early-return when the result is false.
|
|
72
|
+
*/
|
|
73
|
+
export function requireTier(cwd, tier, featureLabel) {
|
|
74
|
+
if (isTierUnlocked(cwd, tier))
|
|
75
|
+
return true;
|
|
76
|
+
const tierLabel = tier.charAt(0).toUpperCase() + tier.slice(1);
|
|
77
|
+
console.log(`${tierLabel} features require CodeLedger Pro.\n`);
|
|
78
|
+
console.log(` ${featureLabel} is a ${tierLabel}-tier feature.\n`);
|
|
79
|
+
console.log('See what\'s included:');
|
|
80
|
+
console.log(' codeledger upgrade\n');
|
|
81
|
+
console.log('Already purchased?');
|
|
82
|
+
console.log(' codeledger license activate <key>\n');
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
// ── Command implementation ─────────────────────────────────────────────────
|
|
86
|
+
export async function runLicense(cwd, flags) {
|
|
87
|
+
const sub = flags['_sub'] ?? 'status';
|
|
88
|
+
switch (sub) {
|
|
89
|
+
case 'activate':
|
|
90
|
+
return activate(cwd, flags);
|
|
91
|
+
case 'status':
|
|
92
|
+
return status(cwd);
|
|
93
|
+
case 'deactivate':
|
|
94
|
+
return deactivate(cwd, flags);
|
|
95
|
+
case 'show':
|
|
96
|
+
return status(cwd);
|
|
97
|
+
default:
|
|
98
|
+
console.error(`Unknown license subcommand: ${sub}`);
|
|
99
|
+
console.log('Usage: codeledger license [activate <key> | status | deactivate]');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// ── Subcommands ────────────────────────────────────────────────────────────
|
|
103
|
+
function activate(cwd, flags) {
|
|
104
|
+
const key = flags['_arg'] ?? flags['key'] ?? '';
|
|
105
|
+
if (!key) {
|
|
106
|
+
console.error('Usage: codeledger license activate <key>\n');
|
|
107
|
+
console.log('Enter the license key you received after purchase.');
|
|
108
|
+
console.log('Signed keys: CL-PRO.<payload>.<signature>');
|
|
109
|
+
console.log('Legacy keys: CL-PRO-XXXX-XXXX-XXXX\n');
|
|
110
|
+
console.log('Example: codeledger license activate CL-PRO.eyJwbGFu....<sig>');
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
// Parse the key
|
|
114
|
+
const parsed = parseLicenseKey(key);
|
|
115
|
+
if (parsed.kind === 'error') {
|
|
116
|
+
console.error(`Invalid license key: ${parsed.reason}\n`);
|
|
117
|
+
console.log('If you believe this is an error, check for typos or contact support.');
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
// Signed license path
|
|
121
|
+
if (parsed.kind === 'signed') {
|
|
122
|
+
return activateSigned(cwd, key, parsed);
|
|
123
|
+
}
|
|
124
|
+
// Legacy license path
|
|
125
|
+
return activateLegacy(cwd, key);
|
|
126
|
+
}
|
|
127
|
+
function activateSigned(cwd, rawKey, parsed) {
|
|
128
|
+
// Verify signature + claims
|
|
129
|
+
const result = verifySignedLicense(parsed);
|
|
130
|
+
if (!result.valid) {
|
|
131
|
+
console.error(`License verification failed: ${result.reason}\n`);
|
|
132
|
+
console.log('If you believe this is an error, contact support.');
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
// Check if already activated with same key
|
|
136
|
+
const existing = loadLicense(cwd);
|
|
137
|
+
if (existing && 'rawKey' in existing && existing.rawKey === rawKey) {
|
|
138
|
+
console.log('This license key is already active.\n');
|
|
139
|
+
status(cwd);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
const state = {
|
|
143
|
+
rawKey,
|
|
144
|
+
decoded: result.payload,
|
|
145
|
+
activatedAt: new Date().toISOString(),
|
|
146
|
+
};
|
|
147
|
+
const p = licensePath(cwd);
|
|
148
|
+
writeFileSync(p, JSON.stringify(state, null, 2) + '\n');
|
|
149
|
+
const expires = result.payload.expiresAt ?? 'Never';
|
|
150
|
+
console.log('License activated successfully.\n');
|
|
151
|
+
console.log(' Plan: Pro');
|
|
152
|
+
console.log(` Expires: ${expires}`);
|
|
153
|
+
console.log(' Unlocked: Team + Enterprise features\n');
|
|
154
|
+
console.log('Next steps:');
|
|
155
|
+
console.log(' codeledger enable team Enable team mode');
|
|
156
|
+
console.log(' codeledger enable enterprise Enable enterprise mode');
|
|
157
|
+
console.log(' codeledger features See all unlocked features\n');
|
|
158
|
+
}
|
|
159
|
+
function activateLegacy(cwd, key) {
|
|
160
|
+
// Check if already activated
|
|
161
|
+
const existing = loadLicense(cwd);
|
|
162
|
+
if (existing && 'licenseKey' in existing && existing.licenseKey === key) {
|
|
163
|
+
console.log('This license key is already active.\n');
|
|
164
|
+
status(cwd);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
const state = {
|
|
168
|
+
licenseKey: key,
|
|
169
|
+
plan: 'pro',
|
|
170
|
+
activatedAt: new Date().toISOString(),
|
|
171
|
+
features: ['team', 'enterprise'],
|
|
172
|
+
};
|
|
173
|
+
const p = licensePath(cwd);
|
|
174
|
+
writeFileSync(p, JSON.stringify(state, null, 2) + '\n');
|
|
175
|
+
console.log('License activated successfully.\n');
|
|
176
|
+
console.log(' Plan: Pro');
|
|
177
|
+
console.log(' Unlocked: Team + Enterprise features\n');
|
|
178
|
+
console.log('Next steps:');
|
|
179
|
+
console.log(' codeledger enable team Enable team mode');
|
|
180
|
+
console.log(' codeledger enable enterprise Enable enterprise mode');
|
|
181
|
+
console.log(' codeledger features See all unlocked features\n');
|
|
182
|
+
}
|
|
183
|
+
function status(cwd) {
|
|
184
|
+
const license = loadLicense(cwd);
|
|
185
|
+
if (!license) {
|
|
186
|
+
console.log('License: Not activated\n');
|
|
187
|
+
console.log('CodeLedger is running in Individual (free) mode.\n');
|
|
188
|
+
console.log('To unlock Team and Enterprise features:');
|
|
189
|
+
console.log(' codeledger upgrade');
|
|
190
|
+
console.log(' codeledger license activate <key>\n');
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
console.log('License: Active');
|
|
194
|
+
console.log('Plan: Pro');
|
|
195
|
+
// Show expiry for signed licenses
|
|
196
|
+
if ('decoded' in license) {
|
|
197
|
+
const expires = license.decoded.expiresAt ?? 'Never';
|
|
198
|
+
console.log(`Expires: ${expires}`);
|
|
199
|
+
console.log(`Key: ${maskKey(license.rawKey)}`);
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
console.log(`Key: ${maskKey(license.licenseKey)}`);
|
|
203
|
+
}
|
|
204
|
+
console.log(`Since: ${license.activatedAt}\n`);
|
|
205
|
+
console.log('Unlocked:');
|
|
206
|
+
console.log(' - Team features');
|
|
207
|
+
console.log(' - Enterprise features\n');
|
|
208
|
+
}
|
|
209
|
+
function deactivate(cwd, flags) {
|
|
210
|
+
const p = licensePath(cwd);
|
|
211
|
+
if (!existsSync(p)) {
|
|
212
|
+
console.log('No active license to deactivate.\n');
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
const confirmed = flags['yes'] === 'true' || flags['y'] === 'true';
|
|
216
|
+
if (!confirmed) {
|
|
217
|
+
console.log('This will remove your active Pro license and return to Individual (free) mode.\n');
|
|
218
|
+
console.log('Run with --yes to confirm:');
|
|
219
|
+
console.log(' codeledger license deactivate --yes\n');
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
unlinkSync(p);
|
|
223
|
+
console.log('License deactivated. CodeLedger is now in Individual (free) mode.\n');
|
|
224
|
+
console.log('Your license key is still valid — you can re-activate any time:');
|
|
225
|
+
console.log(' codeledger license activate <key>\n');
|
|
226
|
+
}
|
|
227
|
+
// ── Utilities ──────────────────────────────────────────────────────────────
|
|
228
|
+
function maskKey(key) {
|
|
229
|
+
if (key.includes('.')) {
|
|
230
|
+
// Signed key: show prefix, mask payload/signature
|
|
231
|
+
return 'CL-PRO.<...>.<...>';
|
|
232
|
+
}
|
|
233
|
+
// Legacy: show prefix + first segment, mask the rest
|
|
234
|
+
const parts = key.split('-');
|
|
235
|
+
if (parts.length >= 5) {
|
|
236
|
+
return `${parts[0]}-${parts[1]}-${parts[2]}-****-****`;
|
|
237
|
+
}
|
|
238
|
+
return key.slice(0, 10) + '****';
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=license.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"license.js","sourceRoot":"","sources":["../../src/commands/license.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `codeledger orchestrate [status|claim|release|partition]`
|
|
3
|
+
*
|
|
4
|
+
* Multi-Agent Orchestration — coordinate context across agents.
|
|
5
|
+
* Subcommands:
|
|
6
|
+
* status — Show current reservations and partitions
|
|
7
|
+
* claim — Claim a file reservation: --file <path> --agent <id>
|
|
8
|
+
* release — Release a file reservation: --file <path> --agent <id>
|
|
9
|
+
* partition — Partition files across agents: --agents <id1,id2,...>
|
|
10
|
+
*/
|
|
11
|
+
export declare function runOrchestrate(cwd: string, flags: Record<string, string>): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=orchestrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrate.d.ts","sourceRoot":"","sources":["../../src/commands/orchestrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAYH,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CAqHf"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `codeledger orchestrate [status|claim|release|partition]`
|
|
3
|
+
*
|
|
4
|
+
* Multi-Agent Orchestration — coordinate context across agents.
|
|
5
|
+
* Subcommands:
|
|
6
|
+
* status — Show current reservations and partitions
|
|
7
|
+
* claim — Claim a file reservation: --file <path> --agent <id>
|
|
8
|
+
* release — Release a file reservation: --file <path> --agent <id>
|
|
9
|
+
* partition — Partition files across agents: --agents <id1,id2,...>
|
|
10
|
+
*/
|
|
11
|
+
import { existsSync } from 'node:fs';
|
|
12
|
+
import { join } from 'node:path';
|
|
13
|
+
import { loadOrchestrationState, claimFile, releaseFile, releaseAllForAgent, partitionFiles, } from '@codeledger/engine';
|
|
14
|
+
export async function runOrchestrate(cwd, flags) {
|
|
15
|
+
const sub = flags['_sub'] ?? 'status';
|
|
16
|
+
switch (sub) {
|
|
17
|
+
case 'status': {
|
|
18
|
+
const state = loadOrchestrationState(cwd);
|
|
19
|
+
const now = Date.now();
|
|
20
|
+
console.log('\n🤖 Multi-Agent Orchestration — Status\n');
|
|
21
|
+
console.log(` Active reservations: ${state.reservations.length}`);
|
|
22
|
+
console.log(` Task partitions: ${state.partitions.length}`);
|
|
23
|
+
console.log(` Dependency edges: ${state.dependencyOrder.length}`);
|
|
24
|
+
if (state.reservations.length > 0) {
|
|
25
|
+
console.log('\n File Reservations:');
|
|
26
|
+
for (const r of state.reservations) {
|
|
27
|
+
const age = Math.round((now - r.claimedAt) / 1000 / 60);
|
|
28
|
+
const expired = r.expiresAt > 0 && r.expiresAt <= now;
|
|
29
|
+
const status = expired ? ' (expired)' : '';
|
|
30
|
+
console.log(` ${r.file} → ${r.agentId} (${age}m ago${status})`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (state.partitions.length > 0) {
|
|
34
|
+
console.log('\n Task Partitions:');
|
|
35
|
+
for (const p of state.partitions) {
|
|
36
|
+
const deps = p.dependsOn.length > 0 ? ` [depends on: ${p.dependsOn.join(', ')}]` : '';
|
|
37
|
+
console.log(` ${p.agentId}: ${p.files.length} files${deps}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
console.log();
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
case 'claim': {
|
|
44
|
+
const file = flags['file'];
|
|
45
|
+
const agentId = flags['agent'];
|
|
46
|
+
if (!file || !agentId) {
|
|
47
|
+
console.error('Usage: codeledger orchestrate claim --file <path> --agent <id>');
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
const result = claimFile(cwd, file, agentId);
|
|
51
|
+
if (result.granted) {
|
|
52
|
+
console.log(`✅ Reservation granted: ${file} → ${agentId}`);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
console.log(`❌ Reservation denied: ${file} is held by ${result.heldBy}`);
|
|
56
|
+
if (result.heldSince) {
|
|
57
|
+
const age = Math.round((Date.now() - result.heldSince) / 1000 / 60);
|
|
58
|
+
console.log(` Held for ${age} minutes.`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
case 'release': {
|
|
64
|
+
const file = flags['file'];
|
|
65
|
+
const agentId = flags['agent'];
|
|
66
|
+
if (!agentId) {
|
|
67
|
+
console.error('Usage: codeledger orchestrate release --agent <id> [--file <path>]');
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
if (file) {
|
|
71
|
+
const released = releaseFile(cwd, file, agentId);
|
|
72
|
+
console.log(released
|
|
73
|
+
? `✅ Released: ${file}`
|
|
74
|
+
: `No reservation found for ${file} by ${agentId}`);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
const count = releaseAllForAgent(cwd, agentId);
|
|
78
|
+
console.log(`✅ Released ${count} reservation(s) for agent ${agentId}`);
|
|
79
|
+
}
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
case 'partition': {
|
|
83
|
+
const agentsStr = flags['agents'];
|
|
84
|
+
if (!agentsStr) {
|
|
85
|
+
console.error('Usage: codeledger orchestrate partition --agents <id1,id2,...>');
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
const agentIds = agentsStr.split(',').map((s) => s.trim());
|
|
89
|
+
// Load bundle files for partitioning
|
|
90
|
+
const bundlePath = join(cwd, '.codeledger', 'active-bundle.md');
|
|
91
|
+
let files = [];
|
|
92
|
+
if (existsSync(bundlePath)) {
|
|
93
|
+
// Extract file paths from the bundle (lines starting with `### `)
|
|
94
|
+
const { readFileSync } = await import('node:fs');
|
|
95
|
+
const content = readFileSync(bundlePath, 'utf-8');
|
|
96
|
+
const fileLines = content.split('\n').filter((l) => l.startsWith('### '));
|
|
97
|
+
files = fileLines.map((l) => l.replace('### ', '').trim());
|
|
98
|
+
}
|
|
99
|
+
if (files.length === 0) {
|
|
100
|
+
console.log('No active bundle found. Run "codeledger activate" first.');
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const partitions = partitionFiles(files, agentIds, new Map());
|
|
104
|
+
console.log(`\n🤖 Task Partition (${files.length} files → ${agentIds.length} agents)\n`);
|
|
105
|
+
for (const p of partitions) {
|
|
106
|
+
console.log(` ${p.agentId}:`);
|
|
107
|
+
for (const f of p.files) {
|
|
108
|
+
console.log(` ${f}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
console.log();
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
default:
|
|
115
|
+
console.error(`Unknown subcommand: ${sub}. Use: status, claim, release, partition`);
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=orchestrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrate.js","sourceRoot":"","sources":["../../src/commands/orchestrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `codeledger policy simulate [--scope team|org]`
|
|
3
|
+
*
|
|
4
|
+
* Policy Simulation Engine — safe rollout of governance rules.
|
|
5
|
+
* Runs validation across historical ledger entries to predict
|
|
6
|
+
* the impact of policy changes before enforcement.
|
|
7
|
+
*/
|
|
8
|
+
export declare function runPolicySimulate(cwd: string, flags: Record<string, string>): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=policy-simulate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-simulate.d.ts","sourceRoot":"","sources":["../../src/commands/policy-simulate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CAyCf"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `codeledger policy simulate [--scope team|org]`
|
|
3
|
+
*
|
|
4
|
+
* Policy Simulation Engine — safe rollout of governance rules.
|
|
5
|
+
* Runs validation across historical ledger entries to predict
|
|
6
|
+
* the impact of policy changes before enforcement.
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync } from 'node:fs';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { simulatePolicy, loadTeamPolicy, loadEntries } from '@codeledger/engine';
|
|
11
|
+
export async function runPolicySimulate(cwd, flags) {
|
|
12
|
+
const configPath = join(cwd, '.codeledger', 'config.json');
|
|
13
|
+
if (!existsSync(configPath)) {
|
|
14
|
+
console.error('No .codeledger/config.json found. Run "codeledger init" first.');
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
const policy = loadTeamPolicy(cwd);
|
|
18
|
+
if (!policy.enabled) {
|
|
19
|
+
console.log('Team policy is not enabled. Create codeledger.team-policy.json with "enabled": true.');
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const entries = loadEntries(cwd);
|
|
23
|
+
if (entries.length === 0) {
|
|
24
|
+
console.log('No ECL-Lite entries found. Run some tasks first to build history.');
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const scope = (flags['scope'] ?? 'team');
|
|
28
|
+
const result = simulatePolicy(policy, entries, scope);
|
|
29
|
+
if (flags['json'] === 'true') {
|
|
30
|
+
console.log(JSON.stringify(result, null, 2));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
console.log('\n🔮 Policy Simulation\n');
|
|
34
|
+
console.log(` Scope: ${result.scope}`);
|
|
35
|
+
console.log(` Entries tested: ${result.totalEntries}`);
|
|
36
|
+
console.log(` Would block: ${result.blockedCount} (${(result.blockRate * 100).toFixed(1)}%)`);
|
|
37
|
+
console.log(` Would warn: ${result.warnedCount}`);
|
|
38
|
+
if (result.topViolations.length > 0) {
|
|
39
|
+
console.log('\n Top violations:');
|
|
40
|
+
for (const v of result.topViolations.slice(0, 5)) {
|
|
41
|
+
console.log(` ${v.reason}: ${v.count} (${v.percentage.toFixed(1)}%)`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
console.log();
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=policy-simulate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-simulate.js","sourceRoot":"","sources":["../../src/commands/policy-simulate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAW,EACX,KAA6B;IAE7B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;IAC3D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,sFAAsF,CAAC,CAAC;QACpG,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;QACjF,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,MAAM,CAAmB,CAAC;IAC3D,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAEtD,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,MAAM,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,YAAY,KAAK,CAAC,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACnG,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IAExD,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* codeledger pr-summary — Generate a structured PR summary from branch changes.
|
|
3
|
+
*
|
|
4
|
+
* Architecture:
|
|
5
|
+
* 1. collectPRContext() — gather diff vs base, commits, branch name
|
|
6
|
+
* 2. analyzePRChanges() — classify changes, detect risks, group by subsystem
|
|
7
|
+
* 3. renderPRSummary() — build markdown or JSON PR summary
|
|
8
|
+
*
|
|
9
|
+
* Flags:
|
|
10
|
+
* --base <branch> Base branch (default: main)
|
|
11
|
+
* --issue <ID> Issue identifier for intent context
|
|
12
|
+
* --intent-file <path> Path to pre-extracted intent JSON
|
|
13
|
+
* --format markdown|json Output format (default: markdown)
|
|
14
|
+
* --write <file> Write output to file instead of stdout
|
|
15
|
+
* --title-only Output only the PR title
|
|
16
|
+
* --body-only Output only the PR body (no title)
|
|
17
|
+
*/
|
|
18
|
+
import type { IssueIntent } from '../intent/types.js';
|
|
19
|
+
export interface PRContext {
|
|
20
|
+
diff: string;
|
|
21
|
+
filesChanged: string[];
|
|
22
|
+
commits: CommitInfo[];
|
|
23
|
+
branchName: string;
|
|
24
|
+
baseBranch: string;
|
|
25
|
+
additions: number;
|
|
26
|
+
deletions: number;
|
|
27
|
+
}
|
|
28
|
+
interface CommitInfo {
|
|
29
|
+
hash: string;
|
|
30
|
+
subject: string;
|
|
31
|
+
}
|
|
32
|
+
export interface PRAnalysis {
|
|
33
|
+
title: string;
|
|
34
|
+
summary: string;
|
|
35
|
+
whyThisChange: string | null;
|
|
36
|
+
keyChanges: ChangeGroup[];
|
|
37
|
+
risks: string[];
|
|
38
|
+
testingNotes: string[];
|
|
39
|
+
businessImpact: string | null;
|
|
40
|
+
subsystemsTouched: string[];
|
|
41
|
+
reviewerFocus: string[];
|
|
42
|
+
stats: {
|
|
43
|
+
filesChanged: number;
|
|
44
|
+
additions: number;
|
|
45
|
+
deletions: number;
|
|
46
|
+
commits: number;
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
interface ChangeGroup {
|
|
50
|
+
category: string;
|
|
51
|
+
items: string[];
|
|
52
|
+
}
|
|
53
|
+
export declare function collectPRContext(cwd: string, baseBranch: string): PRContext;
|
|
54
|
+
export declare function analyzePRChanges(ctx: PRContext, intent: IssueIntent | null): PRAnalysis;
|
|
55
|
+
export declare function renderPRMarkdown(analysis: PRAnalysis, intent: IssueIntent | null, sections?: string[]): string;
|
|
56
|
+
export declare function renderPRJSON(analysis: PRAnalysis): string;
|
|
57
|
+
export declare function runPRSummary(cwd: string, flags: Record<string, string>): Promise<void>;
|
|
58
|
+
export {};
|
|
59
|
+
//# sourceMappingURL=pr-summary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-summary.d.ts","sourceRoot":"","sources":["../../src/commands/pr-summary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAMtD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,WAAW,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,EAAE;QACL,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,UAAU,WAAW;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAID,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,CAqE3E;AAID,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,UAAU,CAuDvF;AA6RD,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,UAAU,EACpB,MAAM,EAAE,WAAW,GAAG,IAAI,EAC1B,QAAQ,CAAC,EAAE,MAAM,EAAE,GAClB,MAAM,CAuHR;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,UAAU,GAAG,MAAM,CAEzD;AAID,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA8C5F"}
|