@rigstate/cli 0.7.9 → 0.7.11
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/index.cjs +249 -206
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +249 -206
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/daemon/core.ts +1 -0
- package/src/daemon/guardian-monitor.ts +34 -1
- package/src/utils/config.ts +28 -11
package/dist/index.js
CHANGED
|
@@ -94,23 +94,39 @@ function getApiUrl() {
|
|
|
94
94
|
}
|
|
95
95
|
async function discoverApiUrl() {
|
|
96
96
|
const configuredUrl = getApiUrl();
|
|
97
|
+
const { default: axios22 } = await import("axios");
|
|
98
|
+
const { default: chalk34 } = await import("chalk");
|
|
99
|
+
console.log(chalk34.gray(`\u{1F50D} Discovering local Rigstate API URL... Configured: ${configuredUrl}`));
|
|
97
100
|
if (!configuredUrl.includes("localhost") && !configuredUrl.includes("127.0.0.1")) {
|
|
101
|
+
console.log(chalk34.gray(` Configured URL is not localhost, trusting: ${configuredUrl}`));
|
|
98
102
|
return configuredUrl;
|
|
99
103
|
}
|
|
100
104
|
const ports = [3e3, 3001, 3002, 3003, 3004, 3005, 3006, 3007, 3008, 3009, 3010];
|
|
101
|
-
const { default: axios22 } = await import("axios");
|
|
102
105
|
for (const port of ports) {
|
|
106
|
+
const url = `http://localhost:${port}`;
|
|
103
107
|
try {
|
|
104
|
-
|
|
105
|
-
await axios22.get(`${url}/api/v1/system/health`, { timeout:
|
|
108
|
+
console.log(chalk34.gray(` Attempting to connect to ${url}/api/v1/system/health...`));
|
|
109
|
+
await axios22.get(`${url}/api/v1/system/health`, { timeout: 800 });
|
|
110
|
+
console.log(chalk34.green(` \u2705 Found Rigstate API at ${url}`));
|
|
106
111
|
if (url !== configuredUrl) {
|
|
112
|
+
console.log(chalk34.gray(` Updating stored API URL from ${configuredUrl} to ${url}`));
|
|
107
113
|
setApiUrl(url);
|
|
108
114
|
}
|
|
109
115
|
return url;
|
|
110
116
|
} catch (e) {
|
|
117
|
+
if (axios22.isAxiosError(e) && e.response && e.response.status === 404) {
|
|
118
|
+
console.log(chalk34.yellow(` \u26A0\uFE0F ${url} responded with 404, but might still be a Rigstate server. Skipping for now.`));
|
|
119
|
+
} else if (axios22.isAxiosError(e) && e.code === "ECONNABORTED") {
|
|
120
|
+
console.log(chalk34.gray(` Connection to ${url} timed out.`));
|
|
121
|
+
} else if (axios22.isAxiosError(e) && e.code === "ECONNREFUSED") {
|
|
122
|
+
console.log(chalk34.gray(` Connection to ${url} refused.`));
|
|
123
|
+
} else {
|
|
124
|
+
console.log(chalk34.gray(` Failed to connect to ${url}: ${e.message}`));
|
|
125
|
+
}
|
|
111
126
|
continue;
|
|
112
127
|
}
|
|
113
128
|
}
|
|
129
|
+
console.log(chalk34.yellow(` \u274C No local Rigstate API found on scanned ports. Falling back to configured URL: ${configuredUrl}`));
|
|
114
130
|
return configuredUrl;
|
|
115
131
|
}
|
|
116
132
|
function setApiUrl(url) {
|
|
@@ -1777,7 +1793,7 @@ var require_dist2 = __commonJS({
|
|
|
1777
1793
|
// src/index.ts
|
|
1778
1794
|
init_esm_shims();
|
|
1779
1795
|
import { Command as Command23 } from "commander";
|
|
1780
|
-
import
|
|
1796
|
+
import chalk33 from "chalk";
|
|
1781
1797
|
|
|
1782
1798
|
// src/commands/login.ts
|
|
1783
1799
|
init_esm_shims();
|
|
@@ -3197,7 +3213,7 @@ init_hooks();
|
|
|
3197
3213
|
// src/commands/daemon.ts
|
|
3198
3214
|
init_esm_shims();
|
|
3199
3215
|
import { Command as Command11 } from "commander";
|
|
3200
|
-
import
|
|
3216
|
+
import chalk19 from "chalk";
|
|
3201
3217
|
import ora8 from "ora";
|
|
3202
3218
|
import fs18 from "fs/promises";
|
|
3203
3219
|
import path20 from "path";
|
|
@@ -3209,7 +3225,7 @@ init_esm_shims();
|
|
|
3209
3225
|
|
|
3210
3226
|
// src/daemon/core.ts
|
|
3211
3227
|
init_esm_shims();
|
|
3212
|
-
import
|
|
3228
|
+
import chalk18 from "chalk";
|
|
3213
3229
|
import * as fs17 from "fs/promises";
|
|
3214
3230
|
import { EventEmitter as EventEmitter3 } from "events";
|
|
3215
3231
|
|
|
@@ -3545,6 +3561,7 @@ function createInterventionProtocol() {
|
|
|
3545
3561
|
// src/daemon/guardian-monitor.ts
|
|
3546
3562
|
init_esm_shims();
|
|
3547
3563
|
import axios12 from "axios";
|
|
3564
|
+
import chalk17 from "chalk";
|
|
3548
3565
|
import fs16 from "fs/promises";
|
|
3549
3566
|
import path19 from "path";
|
|
3550
3567
|
var CACHE_FILE3 = ".rigstate/rules-cache.json";
|
|
@@ -3569,8 +3586,33 @@ function createGuardianMonitor(projectId, apiUrl, apiKey) {
|
|
|
3569
3586
|
return;
|
|
3570
3587
|
}
|
|
3571
3588
|
} catch (error) {
|
|
3589
|
+
if (apiUrl.includes("localhost") || apiUrl.includes("127.0.0.1")) {
|
|
3590
|
+
const cloudUrl = "https://app.rigstate.com";
|
|
3591
|
+
console.log(chalk17.blue(` \u2601\uFE0F Local API not found. Attempting Cloud Fallback (${cloudUrl})...`));
|
|
3592
|
+
try {
|
|
3593
|
+
const cloudResponse = await axios12.get(`${cloudUrl}/api/v1/guardian/rules`, {
|
|
3594
|
+
params: { project_id: projectId },
|
|
3595
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
3596
|
+
timeout: 5e3
|
|
3597
|
+
});
|
|
3598
|
+
if (cloudResponse.data.success && cloudResponse.data.data.rules) {
|
|
3599
|
+
rules = cloudResponse.data.data.rules;
|
|
3600
|
+
console.log(chalk17.green(` \u2705 Successfully loaded rules from Rigstate Cloud!`));
|
|
3601
|
+
lastFetch = Date.now();
|
|
3602
|
+
await saveCachedRules2(projectId, rules);
|
|
3603
|
+
return;
|
|
3604
|
+
}
|
|
3605
|
+
} catch (cloudError) {
|
|
3606
|
+
console.error(chalk17.red(` \u274C Cloud Fallback failed: ${cloudError.message}`));
|
|
3607
|
+
}
|
|
3608
|
+
}
|
|
3609
|
+
console.error(chalk17.red(` \u26A0\uFE0F Failed to fetch rules from API: ${error.message}`));
|
|
3610
|
+
if (error.response) {
|
|
3611
|
+
console.error(chalk17.red(` Status: ${error.response.status} - ${JSON.stringify(error.response.data)}`));
|
|
3612
|
+
}
|
|
3572
3613
|
const cached = await loadCachedRules2(projectId);
|
|
3573
3614
|
if (cached) {
|
|
3615
|
+
console.log(chalk17.yellow(" \u2139\uFE0F Using cached rules as fallback"));
|
|
3574
3616
|
rules = cached.rules;
|
|
3575
3617
|
lastFetch = Date.now();
|
|
3576
3618
|
return;
|
|
@@ -3741,7 +3783,7 @@ var GuardianDaemon = class extends EventEmitter3 {
|
|
|
3741
3783
|
}
|
|
3742
3784
|
async start() {
|
|
3743
3785
|
if (this.state.isRunning) {
|
|
3744
|
-
console.log(
|
|
3786
|
+
console.log(chalk18.yellow("Daemon is already running."));
|
|
3745
3787
|
return;
|
|
3746
3788
|
}
|
|
3747
3789
|
this.printWelcome();
|
|
@@ -3751,7 +3793,7 @@ var GuardianDaemon = class extends EventEmitter3 {
|
|
|
3751
3793
|
this.interventionProtocol = createInterventionProtocol();
|
|
3752
3794
|
this.guardianMonitor = createGuardianMonitor(this.config.projectId, this.config.apiUrl, this.config.apiKey);
|
|
3753
3795
|
await this.guardianMonitor.loadRules();
|
|
3754
|
-
console.log(
|
|
3796
|
+
console.log(chalk18.green(` \u2713 Loaded ${this.guardianMonitor.getRuleCount()} rules`));
|
|
3755
3797
|
await this.syncHeuristics();
|
|
3756
3798
|
if (this.config.checkOnChange) {
|
|
3757
3799
|
this.setupFileWatcher();
|
|
@@ -3763,31 +3805,32 @@ var GuardianDaemon = class extends EventEmitter3 {
|
|
|
3763
3805
|
this.emit("started", this.state);
|
|
3764
3806
|
}
|
|
3765
3807
|
printWelcome() {
|
|
3766
|
-
console.log(
|
|
3767
|
-
console.log(
|
|
3768
|
-
console.log(
|
|
3769
|
-
console.log(
|
|
3808
|
+
console.log(chalk18.bold.blue("\n\u{1F6E1}\uFE0F Guardian Daemon Starting..."));
|
|
3809
|
+
console.log(chalk18.dim(`Project: ${this.config.projectId}`));
|
|
3810
|
+
console.log(chalk18.dim(`API URL: ${this.config.apiUrl}`));
|
|
3811
|
+
console.log(chalk18.dim(`Watch Path: ${this.config.watchPath}`));
|
|
3812
|
+
console.log(chalk18.dim("\u2500".repeat(50)));
|
|
3770
3813
|
}
|
|
3771
3814
|
printActive() {
|
|
3772
|
-
console.log(
|
|
3773
|
-
console.log(
|
|
3774
|
-
console.log(
|
|
3815
|
+
console.log(chalk18.dim("\u2500".repeat(50)));
|
|
3816
|
+
console.log(chalk18.green.bold("\u2705 Guardian Daemon is now active"));
|
|
3817
|
+
console.log(chalk18.dim("Press Ctrl+C to stop\n"));
|
|
3775
3818
|
}
|
|
3776
3819
|
async syncHeuristics() {
|
|
3777
3820
|
if (!this.heuristicEngine) return;
|
|
3778
3821
|
const synced = await this.heuristicEngine.refreshRules(this.config.projectId, this.config.apiUrl, this.config.apiKey);
|
|
3779
|
-
if (synced) console.log(
|
|
3822
|
+
if (synced) console.log(chalk18.green(" \u2713 Synced heuristic rules"));
|
|
3780
3823
|
}
|
|
3781
3824
|
setupFileWatcher() {
|
|
3782
|
-
console.log(
|
|
3825
|
+
console.log(chalk18.dim("\u{1F4C2} Starting file watcher..."));
|
|
3783
3826
|
this.fileWatcher = createFileWatcher(this.config.watchPath);
|
|
3784
3827
|
this.fileWatcher.on("change", (path25) => this.handleFileChange(path25));
|
|
3785
3828
|
this.fileWatcher.start();
|
|
3786
|
-
console.log(
|
|
3829
|
+
console.log(chalk18.green(" \u2713 File watcher active"));
|
|
3787
3830
|
}
|
|
3788
3831
|
async handleFileChange(filePath) {
|
|
3789
3832
|
this.state.lastActivity = (/* @__PURE__ */ new Date()).toISOString();
|
|
3790
|
-
if (this.config.verbose) console.log(
|
|
3833
|
+
if (this.config.verbose) console.log(chalk18.dim(` \u{1F4DD} File changed: ${filePath}`));
|
|
3791
3834
|
let lineCount = 0;
|
|
3792
3835
|
try {
|
|
3793
3836
|
const content = await fs17.readFile(filePath, "utf-8");
|
|
@@ -3800,8 +3843,8 @@ var GuardianDaemon = class extends EventEmitter3 {
|
|
|
3800
3843
|
rules: this.guardianMonitor.getRules()
|
|
3801
3844
|
});
|
|
3802
3845
|
for (const match of matches) {
|
|
3803
|
-
console.log(
|
|
3804
|
-
console.log(
|
|
3846
|
+
console.log(chalk18.magenta(` \u{1F4A1} PREDICTIVE ACTIVATION: ${match.skillId}`));
|
|
3847
|
+
console.log(chalk18.dim(` Reason: ${match.reason}`));
|
|
3805
3848
|
const decision = this.interventionProtocol.evaluateTrigger(match.skillId, match.confidence);
|
|
3806
3849
|
this.interventionProtocol.enforce(decision);
|
|
3807
3850
|
await jitProvisionSkill(match.skillId, this.config.apiUrl, this.config.apiKey, this.config.projectId, process.cwd());
|
|
@@ -3817,7 +3860,7 @@ var GuardianDaemon = class extends EventEmitter3 {
|
|
|
3817
3860
|
this.state.violationsFound += result.violations.length;
|
|
3818
3861
|
this.emit("violation", { file: filePath, violations: result.violations });
|
|
3819
3862
|
for (const v of result.violations) {
|
|
3820
|
-
const color = v.severity === "critical" ?
|
|
3863
|
+
const color = v.severity === "critical" ? chalk18.red : v.severity === "warning" ? chalk18.yellow : chalk18.blue;
|
|
3821
3864
|
console.log(color(` [${v.severity.toUpperCase()}] ${filePath}: ${v.message}`));
|
|
3822
3865
|
if (this.interventionProtocol) {
|
|
3823
3866
|
const decision = this.interventionProtocol.evaluateViolation(v.message, v.severity);
|
|
@@ -3829,25 +3872,25 @@ var GuardianDaemon = class extends EventEmitter3 {
|
|
|
3829
3872
|
}
|
|
3830
3873
|
}
|
|
3831
3874
|
async setupBridge() {
|
|
3832
|
-
console.log(
|
|
3875
|
+
console.log(chalk18.dim("\u{1F309} Connecting to Agent Bridge..."));
|
|
3833
3876
|
this.bridgeListener = createBridgeListener(this.config.projectId, this.config.apiUrl, this.config.apiKey);
|
|
3834
3877
|
this.bridgeListener.on("task", (task) => {
|
|
3835
3878
|
this.state.lastActivity = (/* @__PURE__ */ new Date()).toISOString();
|
|
3836
3879
|
this.state.tasksProcessed++;
|
|
3837
|
-
console.log(
|
|
3880
|
+
console.log(chalk18.cyan(`
|
|
3838
3881
|
\u{1F4E5} New task received: ${task.id}`));
|
|
3839
3882
|
this.emit("task", task);
|
|
3840
3883
|
});
|
|
3841
3884
|
await this.bridgeListener.connect();
|
|
3842
|
-
console.log(
|
|
3885
|
+
console.log(chalk18.green(" \u2713 Agent Bridge connected"));
|
|
3843
3886
|
}
|
|
3844
3887
|
async stop() {
|
|
3845
3888
|
if (!this.state.isRunning) return;
|
|
3846
|
-
console.log(
|
|
3889
|
+
console.log(chalk18.dim("\n\u{1F6D1} Stopping Guardian Daemon..."));
|
|
3847
3890
|
if (this.fileWatcher) await this.fileWatcher.stop();
|
|
3848
3891
|
if (this.bridgeListener) await this.bridgeListener.disconnect();
|
|
3849
3892
|
this.state.isRunning = false;
|
|
3850
|
-
console.log(
|
|
3893
|
+
console.log(chalk18.green("\u2713 Daemon stopped."));
|
|
3851
3894
|
this.emit("stopped", this.state);
|
|
3852
3895
|
}
|
|
3853
3896
|
getState() {
|
|
@@ -3905,9 +3948,9 @@ function createDaemonCommand() {
|
|
|
3905
3948
|
const spinner = ora8();
|
|
3906
3949
|
try {
|
|
3907
3950
|
if (await isRunning()) {
|
|
3908
|
-
console.log(
|
|
3909
|
-
console.log(
|
|
3910
|
-
console.log(
|
|
3951
|
+
console.log(chalk19.yellow("\u26A0 Another daemon instance may be running."));
|
|
3952
|
+
console.log(chalk19.dim(` Check ${PID_FILE} or run "rigstate daemon status"`));
|
|
3953
|
+
console.log(chalk19.dim(" Use Ctrl+C to stop the running daemon first.\n"));
|
|
3911
3954
|
}
|
|
3912
3955
|
spinner.start("Initializing Guardian Daemon...");
|
|
3913
3956
|
const daemonInstance = await createDaemon({
|
|
@@ -3919,7 +3962,7 @@ function createDaemonCommand() {
|
|
|
3919
3962
|
spinner.stop();
|
|
3920
3963
|
await writePidFile();
|
|
3921
3964
|
process.on("SIGINT", async () => {
|
|
3922
|
-
console.log(
|
|
3965
|
+
console.log(chalk19.dim("\n\nShutting down..."));
|
|
3923
3966
|
await daemonInstance.stop();
|
|
3924
3967
|
await cleanupPidFile();
|
|
3925
3968
|
process.exit(0);
|
|
@@ -3939,8 +3982,8 @@ function createDaemonCommand() {
|
|
|
3939
3982
|
await new Promise(() => {
|
|
3940
3983
|
});
|
|
3941
3984
|
} catch (error) {
|
|
3942
|
-
spinner.fail(
|
|
3943
|
-
console.error(
|
|
3985
|
+
spinner.fail(chalk19.red("Failed to start daemon"));
|
|
3986
|
+
console.error(chalk19.red("Error:"), error.message);
|
|
3944
3987
|
process.exit(1);
|
|
3945
3988
|
}
|
|
3946
3989
|
});
|
|
@@ -3989,46 +4032,46 @@ async function writeStateFile(state) {
|
|
|
3989
4032
|
}
|
|
3990
4033
|
}
|
|
3991
4034
|
async function showStatus() {
|
|
3992
|
-
console.log(
|
|
4035
|
+
console.log(chalk19.bold("\n\u{1F6E1}\uFE0F Guardian Daemon Status\n"));
|
|
3993
4036
|
const running = await isRunning();
|
|
3994
4037
|
if (!running) {
|
|
3995
|
-
console.log(
|
|
3996
|
-
console.log(
|
|
4038
|
+
console.log(chalk19.yellow("Status: Not running"));
|
|
4039
|
+
console.log(chalk19.dim('Use "rigstate daemon" to start.\n'));
|
|
3997
4040
|
return;
|
|
3998
4041
|
}
|
|
3999
|
-
console.log(
|
|
4042
|
+
console.log(chalk19.green("Status: Running"));
|
|
4000
4043
|
try {
|
|
4001
4044
|
const statePath = path20.join(process.cwd(), STATE_FILE);
|
|
4002
4045
|
const content = await fs18.readFile(statePath, "utf-8");
|
|
4003
4046
|
const state = JSON.parse(content);
|
|
4004
|
-
console.log(
|
|
4047
|
+
console.log(chalk19.dim("\u2500".repeat(40)));
|
|
4005
4048
|
console.log(`Started at: ${state.startedAt || "Unknown"}`);
|
|
4006
4049
|
console.log(`Files checked: ${state.filesChecked || 0}`);
|
|
4007
4050
|
console.log(`Violations: ${state.violationsFound || 0}`);
|
|
4008
4051
|
console.log(`Tasks processed: ${state.tasksProcessed || 0}`);
|
|
4009
4052
|
console.log(`Last activity: ${state.lastActivity || "None"}`);
|
|
4010
|
-
console.log(
|
|
4053
|
+
console.log(chalk19.dim("\u2500".repeat(40)));
|
|
4011
4054
|
} catch {
|
|
4012
|
-
console.log(
|
|
4055
|
+
console.log(chalk19.dim("(State file not found)"));
|
|
4013
4056
|
}
|
|
4014
4057
|
try {
|
|
4015
4058
|
const pidPath = path20.join(process.cwd(), PID_FILE);
|
|
4016
4059
|
const pid = await fs18.readFile(pidPath, "utf-8");
|
|
4017
|
-
console.log(
|
|
4060
|
+
console.log(chalk19.dim(`PID: ${pid.trim()}`));
|
|
4018
4061
|
} catch {
|
|
4019
4062
|
}
|
|
4020
4063
|
console.log("");
|
|
4021
4064
|
}
|
|
4022
4065
|
async function enableDaemon() {
|
|
4023
|
-
console.log(
|
|
4066
|
+
console.log(chalk19.bold("\n\u2699\uFE0F Enabling Rigstate Background Service (macOS)\n"));
|
|
4024
4067
|
if (process.platform !== "darwin") {
|
|
4025
|
-
console.error(
|
|
4026
|
-
console.error(
|
|
4068
|
+
console.error(chalk19.red("\u274C Currently only macOS is supported for auto-start."));
|
|
4069
|
+
console.error(chalk19.yellow("PRs welcome for Linux/Windows support!"));
|
|
4027
4070
|
return;
|
|
4028
4071
|
}
|
|
4029
4072
|
const homeDir = process.env.HOME || "";
|
|
4030
4073
|
if (!homeDir) {
|
|
4031
|
-
console.error(
|
|
4074
|
+
console.error(chalk19.red("\u274C Could not determine HOME directory."));
|
|
4032
4075
|
return;
|
|
4033
4076
|
}
|
|
4034
4077
|
const agentsDir = path20.join(homeDir, "Library/LaunchAgents");
|
|
@@ -4070,32 +4113,32 @@ async function enableDaemon() {
|
|
|
4070
4113
|
</plist>`;
|
|
4071
4114
|
try {
|
|
4072
4115
|
await fs18.writeFile(plistPath, plistContent);
|
|
4073
|
-
console.log(
|
|
4116
|
+
console.log(chalk19.dim(`Created plist at: ${plistPath}`));
|
|
4074
4117
|
try {
|
|
4075
4118
|
await execShellCommand(`launchctl unload ${plistPath}`);
|
|
4076
4119
|
} catch (e) {
|
|
4077
4120
|
}
|
|
4078
4121
|
await execShellCommand(`launchctl load ${plistPath}`);
|
|
4079
|
-
console.log(
|
|
4080
|
-
console.log(
|
|
4081
|
-
console.log(
|
|
4122
|
+
console.log(chalk19.green("\u2705 Successfully enabled background daemon!"));
|
|
4123
|
+
console.log(chalk19.dim(`Logs: ${logDir}`));
|
|
4124
|
+
console.log(chalk19.dim("The daemon will now restart automatically if it crashes or on reboot."));
|
|
4082
4125
|
} catch (error) {
|
|
4083
|
-
console.error(
|
|
4126
|
+
console.error(chalk19.red("\u274C Failed to enable daemon:"), error.message);
|
|
4084
4127
|
}
|
|
4085
4128
|
}
|
|
4086
4129
|
async function disableDaemon() {
|
|
4087
|
-
console.log(
|
|
4130
|
+
console.log(chalk19.bold("\n\u2699\uFE0F Disabling Rigstate Background Service\n"));
|
|
4088
4131
|
const homeDir = process.env.HOME || "";
|
|
4089
4132
|
const plistPath = path20.join(homeDir, "Library/LaunchAgents/com.rigstate.daemon.plist");
|
|
4090
4133
|
try {
|
|
4091
4134
|
await execShellCommand(`launchctl unload ${plistPath}`);
|
|
4092
4135
|
await fs18.unlink(plistPath);
|
|
4093
|
-
console.log(
|
|
4136
|
+
console.log(chalk19.green("\u2705 Successfully disabled background daemon."));
|
|
4094
4137
|
} catch (error) {
|
|
4095
4138
|
if (error.code === "ENOENT") {
|
|
4096
|
-
console.log(
|
|
4139
|
+
console.log(chalk19.green("\u2705 Daemon was not enabled."));
|
|
4097
4140
|
} else {
|
|
4098
|
-
console.error(
|
|
4141
|
+
console.error(chalk19.red("\u274C Failed to disable daemon:"), error.message);
|
|
4099
4142
|
}
|
|
4100
4143
|
}
|
|
4101
4144
|
}
|
|
@@ -4113,7 +4156,7 @@ init_esm_shims();
|
|
|
4113
4156
|
init_config();
|
|
4114
4157
|
init_suggest();
|
|
4115
4158
|
import { Command as Command12 } from "commander";
|
|
4116
|
-
import
|
|
4159
|
+
import chalk20 from "chalk";
|
|
4117
4160
|
import ora9 from "ora";
|
|
4118
4161
|
import axios15 from "axios";
|
|
4119
4162
|
import inquirer2 from "inquirer";
|
|
@@ -4148,7 +4191,7 @@ async function listInteractive() {
|
|
|
4148
4191
|
});
|
|
4149
4192
|
spinner.stop();
|
|
4150
4193
|
if (actionableTasks.length === 0) {
|
|
4151
|
-
console.log(
|
|
4194
|
+
console.log(chalk20.yellow("Roadmap clear. No actionable tasks found."));
|
|
4152
4195
|
return;
|
|
4153
4196
|
}
|
|
4154
4197
|
const choices = actionableTasks.map((t) => {
|
|
@@ -4157,7 +4200,7 @@ async function listInteractive() {
|
|
|
4157
4200
|
if (t.status === "IN_PROGRESS") icon = "\u{1F525}";
|
|
4158
4201
|
if (t.status === "ACTIVE") icon = "\u25B6\uFE0F";
|
|
4159
4202
|
return {
|
|
4160
|
-
name: `${icon} ${
|
|
4203
|
+
name: `${icon} ${chalk20.bold(id)}: ${t.title} [${t.status}]`,
|
|
4161
4204
|
value: t.id
|
|
4162
4205
|
};
|
|
4163
4206
|
});
|
|
@@ -4200,25 +4243,25 @@ async function setTaskStatus(taskId, status) {
|
|
|
4200
4243
|
{ step_id: realId, status, project_id: projectId },
|
|
4201
4244
|
{ headers: { "Authorization": `Bearer ${apiKey}` } }
|
|
4202
4245
|
);
|
|
4203
|
-
spinner.succeed(
|
|
4246
|
+
spinner.succeed(chalk20.green(`Task updated to ${status}.`));
|
|
4204
4247
|
if (status === "IN_PROGRESS") {
|
|
4205
|
-
console.log(
|
|
4248
|
+
console.log(chalk20.blue(`
|
|
4206
4249
|
\u{1F4A1} Tip: Provide 'Frank' with context by mentioning @.cursorrules in your chat.`));
|
|
4207
4250
|
}
|
|
4208
4251
|
} catch (e) {
|
|
4209
|
-
spinner.fail(
|
|
4252
|
+
spinner.fail(chalk20.red(`Failed: ${e.message}`));
|
|
4210
4253
|
}
|
|
4211
4254
|
}
|
|
4212
4255
|
async function finishTask(taskId) {
|
|
4213
4256
|
console.log("");
|
|
4214
|
-
console.log(
|
|
4215
|
-
console.log(
|
|
4257
|
+
console.log(chalk20.bold.yellow("\u{1F6E1}\uFE0F FRANK'S QUALITY GATE"));
|
|
4258
|
+
console.log(chalk20.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
|
|
4216
4259
|
const auditSpinner = ora9(" Analyzing architectural integrity...").start();
|
|
4217
4260
|
await new Promise((r) => setTimeout(r, 1500));
|
|
4218
4261
|
auditSpinner.succeed("Architecture: VALIDATED (SEC-ARCH-01 Pass)");
|
|
4219
4262
|
await setTaskStatus(taskId, "COMPLETED");
|
|
4220
4263
|
console.log("");
|
|
4221
|
-
console.log(
|
|
4264
|
+
console.log(chalk20.bold.green("\u{1F389} TASK COMPLETE! Momentum Preserved."));
|
|
4222
4265
|
const { projectId, apiKey, apiUrl } = getContext();
|
|
4223
4266
|
await suggestNextMove(projectId, apiKey, apiUrl);
|
|
4224
4267
|
}
|
|
@@ -4236,7 +4279,7 @@ function getContext() {
|
|
|
4236
4279
|
init_esm_shims();
|
|
4237
4280
|
init_config();
|
|
4238
4281
|
import { Command as Command13 } from "commander";
|
|
4239
|
-
import
|
|
4282
|
+
import chalk21 from "chalk";
|
|
4240
4283
|
import ora10 from "ora";
|
|
4241
4284
|
import chokidar2 from "chokidar";
|
|
4242
4285
|
import fs19 from "fs/promises";
|
|
@@ -4246,15 +4289,15 @@ import axios16 from "axios";
|
|
|
4246
4289
|
function createWatchCommand() {
|
|
4247
4290
|
const watch2 = new Command13("watch");
|
|
4248
4291
|
watch2.description("Watch for changes and auto-verify roadmap tasks").option("--no-auto-commit", "Disable auto-commit on verification").option("--no-auto-push", "Disable auto-push after commit").option("--run-tests", "Run tests before committing").option("--test-command <cmd>", "Custom test command (default: npm test)").action(async (options) => {
|
|
4249
|
-
console.log(
|
|
4250
|
-
console.log(
|
|
4292
|
+
console.log(chalk21.bold.blue("\u{1F52D} Rigstate Watch Mode"));
|
|
4293
|
+
console.log(chalk21.dim("Monitoring for task completion..."));
|
|
4251
4294
|
console.log("");
|
|
4252
4295
|
let apiKey;
|
|
4253
4296
|
let projectId;
|
|
4254
4297
|
try {
|
|
4255
4298
|
apiKey = getApiKey();
|
|
4256
4299
|
} catch (e) {
|
|
4257
|
-
console.log(
|
|
4300
|
+
console.log(chalk21.red('Not authenticated. Run "rigstate login" first.'));
|
|
4258
4301
|
return;
|
|
4259
4302
|
}
|
|
4260
4303
|
projectId = getProjectId();
|
|
@@ -4268,7 +4311,7 @@ function createWatchCommand() {
|
|
|
4268
4311
|
}
|
|
4269
4312
|
}
|
|
4270
4313
|
if (!projectId) {
|
|
4271
|
-
console.log(
|
|
4314
|
+
console.log(chalk21.red('No project context. Run "rigstate link" or "rigstate sync --project <id>" first.'));
|
|
4272
4315
|
return;
|
|
4273
4316
|
}
|
|
4274
4317
|
const apiUrl = getApiUrl();
|
|
@@ -4278,8 +4321,8 @@ function createWatchCommand() {
|
|
|
4278
4321
|
runTests: options.runTests || false,
|
|
4279
4322
|
testCommand: options.testCommand || "npm test"
|
|
4280
4323
|
};
|
|
4281
|
-
console.log(
|
|
4282
|
-
console.log(
|
|
4324
|
+
console.log(chalk21.dim(`Auto-commit: ${config2.autoCommit ? "ON" : "OFF"}`));
|
|
4325
|
+
console.log(chalk21.dim(`Auto-push: ${config2.autoPush ? "ON" : "OFF"}`));
|
|
4283
4326
|
console.log("");
|
|
4284
4327
|
const fetchActiveTask = async () => {
|
|
4285
4328
|
try {
|
|
@@ -4346,7 +4389,7 @@ function createWatchCommand() {
|
|
|
4346
4389
|
}, {
|
|
4347
4390
|
headers: { Authorization: `Bearer ${apiKey}` }
|
|
4348
4391
|
});
|
|
4349
|
-
spinner.succeed(
|
|
4392
|
+
spinner.succeed(chalk21.green(`\u2705 Task #${task.step_number} completed: ${task.title}`));
|
|
4350
4393
|
if (config2.autoCommit) {
|
|
4351
4394
|
spinner.start("Committing changes...");
|
|
4352
4395
|
try {
|
|
@@ -4368,7 +4411,7 @@ function createWatchCommand() {
|
|
|
4368
4411
|
}
|
|
4369
4412
|
}
|
|
4370
4413
|
console.log("");
|
|
4371
|
-
console.log(
|
|
4414
|
+
console.log(chalk21.blue("Watching for next task..."));
|
|
4372
4415
|
} catch (e) {
|
|
4373
4416
|
spinner.fail(`Failed to complete task: ${e.message}`);
|
|
4374
4417
|
}
|
|
@@ -4381,7 +4424,7 @@ function createWatchCommand() {
|
|
|
4381
4424
|
const task = await fetchActiveTask();
|
|
4382
4425
|
if (!task) {
|
|
4383
4426
|
if (currentTask) {
|
|
4384
|
-
console.log(
|
|
4427
|
+
console.log(chalk21.green("\u{1F389} All tasks completed! Watching for new tasks..."));
|
|
4385
4428
|
currentTask = null;
|
|
4386
4429
|
}
|
|
4387
4430
|
isProcessing = false;
|
|
@@ -4390,10 +4433,10 @@ function createWatchCommand() {
|
|
|
4390
4433
|
if (!currentTask || currentTask.id !== task.id) {
|
|
4391
4434
|
currentTask = task;
|
|
4392
4435
|
console.log("");
|
|
4393
|
-
console.log(
|
|
4394
|
-
console.log(
|
|
4436
|
+
console.log(chalk21.bold.yellow(`\u{1F4CC} Active Task #${task.step_number}: ${task.title}`));
|
|
4437
|
+
console.log(chalk21.dim(`Status: ${task.status}`));
|
|
4395
4438
|
if (task.verification_criteria) {
|
|
4396
|
-
console.log(
|
|
4439
|
+
console.log(chalk21.dim("Verification: Auto-checking criteria..."));
|
|
4397
4440
|
}
|
|
4398
4441
|
}
|
|
4399
4442
|
if (task.verification_criteria && Array.isArray(task.verification_criteria)) {
|
|
@@ -4406,7 +4449,7 @@ function createWatchCommand() {
|
|
|
4406
4449
|
}
|
|
4407
4450
|
}
|
|
4408
4451
|
if (allPassed) {
|
|
4409
|
-
console.log(
|
|
4452
|
+
console.log(chalk21.green("\u2713 All verification criteria passed!"));
|
|
4410
4453
|
await completeTask(task.id, task);
|
|
4411
4454
|
currentTask = null;
|
|
4412
4455
|
}
|
|
@@ -4431,11 +4474,11 @@ function createWatchCommand() {
|
|
|
4431
4474
|
setTimeout(() => processActiveTask(), 500);
|
|
4432
4475
|
}
|
|
4433
4476
|
});
|
|
4434
|
-
console.log(
|
|
4477
|
+
console.log(chalk21.dim("Watching for file changes... (Ctrl+C to exit)"));
|
|
4435
4478
|
setInterval(() => processActiveTask(), 3e4);
|
|
4436
4479
|
process.on("SIGINT", () => {
|
|
4437
4480
|
console.log("");
|
|
4438
|
-
console.log(
|
|
4481
|
+
console.log(chalk21.dim("Watch mode stopped."));
|
|
4439
4482
|
watcher.close();
|
|
4440
4483
|
process.exit(0);
|
|
4441
4484
|
});
|
|
@@ -4447,7 +4490,7 @@ function createWatchCommand() {
|
|
|
4447
4490
|
init_esm_shims();
|
|
4448
4491
|
init_config();
|
|
4449
4492
|
import { Command as Command14 } from "commander";
|
|
4450
|
-
import
|
|
4493
|
+
import chalk22 from "chalk";
|
|
4451
4494
|
import ora11 from "ora";
|
|
4452
4495
|
import axios17 from "axios";
|
|
4453
4496
|
import { execSync as execSync5 } from "child_process";
|
|
@@ -4462,7 +4505,7 @@ function createFocusCommand() {
|
|
|
4462
4505
|
try {
|
|
4463
4506
|
apiKey = getApiKey();
|
|
4464
4507
|
} catch (e) {
|
|
4465
|
-
spinner.fail(
|
|
4508
|
+
spinner.fail(chalk22.red('Not authenticated. Run "rigstate login" first.'));
|
|
4466
4509
|
return;
|
|
4467
4510
|
}
|
|
4468
4511
|
projectId = getProjectId();
|
|
@@ -4476,7 +4519,7 @@ function createFocusCommand() {
|
|
|
4476
4519
|
}
|
|
4477
4520
|
}
|
|
4478
4521
|
if (!projectId) {
|
|
4479
|
-
spinner.fail(
|
|
4522
|
+
spinner.fail(chalk22.red('No project context. Run "rigstate link" first.'));
|
|
4480
4523
|
return;
|
|
4481
4524
|
}
|
|
4482
4525
|
const apiUrl = getApiUrl();
|
|
@@ -4507,41 +4550,41 @@ function createFocusCommand() {
|
|
|
4507
4550
|
const nextTask = activeTasks[0];
|
|
4508
4551
|
spinner.stop();
|
|
4509
4552
|
console.log("");
|
|
4510
|
-
console.log(
|
|
4511
|
-
const statusColor = nextTask.status === "IN_PROGRESS" ?
|
|
4512
|
-
console.log(
|
|
4513
|
-
console.log(
|
|
4553
|
+
console.log(chalk22.bold.blue(`\u{1F4CC} Task #${nextTask.step_number || "?"}: ${nextTask.title}`));
|
|
4554
|
+
const statusColor = nextTask.status === "IN_PROGRESS" ? chalk22.yellow : nextTask.status === "ACTIVE" ? chalk22.green : chalk22.dim;
|
|
4555
|
+
console.log(chalk22.dim("Status: ") + statusColor(nextTask.status));
|
|
4556
|
+
console.log(chalk22.dim("\u2500".repeat(60)));
|
|
4514
4557
|
if (nextTask.prompt_content) {
|
|
4515
|
-
console.log(
|
|
4516
|
-
console.log(
|
|
4558
|
+
console.log(chalk22.white(nextTask.prompt_content));
|
|
4559
|
+
console.log(chalk22.dim("\u2500".repeat(60)));
|
|
4517
4560
|
if (options.copy !== false) {
|
|
4518
4561
|
try {
|
|
4519
4562
|
if (process.platform === "darwin") {
|
|
4520
4563
|
execSync5("pbcopy", { input: nextTask.prompt_content });
|
|
4521
|
-
console.log(
|
|
4564
|
+
console.log(chalk22.green("\u2705 Prompt copied to clipboard! Ready to paste (Cmd+V)."));
|
|
4522
4565
|
} else if (process.platform === "linux") {
|
|
4523
4566
|
try {
|
|
4524
4567
|
execSync5("xclip -selection clipboard", { input: nextTask.prompt_content });
|
|
4525
|
-
console.log(
|
|
4568
|
+
console.log(chalk22.green("\u2705 Prompt copied to clipboard!"));
|
|
4526
4569
|
} catch (e) {
|
|
4527
|
-
console.log(
|
|
4570
|
+
console.log(chalk22.yellow("\u2139\uFE0F Copy prompt manually (xclip not available)"));
|
|
4528
4571
|
}
|
|
4529
4572
|
} else {
|
|
4530
|
-
console.log(
|
|
4573
|
+
console.log(chalk22.yellow("\u2139\uFE0F Copy prompt manually (Auto-copy not supported on this OS)"));
|
|
4531
4574
|
}
|
|
4532
4575
|
} catch (e) {
|
|
4533
4576
|
}
|
|
4534
4577
|
}
|
|
4535
4578
|
} else {
|
|
4536
|
-
console.log(
|
|
4579
|
+
console.log(chalk22.yellow("No prompt instructions available."));
|
|
4537
4580
|
if (nextTask.architectural_brief) {
|
|
4538
|
-
console.log(
|
|
4581
|
+
console.log(chalk22.bold("Brief:"));
|
|
4539
4582
|
console.log(nextTask.architectural_brief);
|
|
4540
4583
|
}
|
|
4541
4584
|
}
|
|
4542
4585
|
console.log("");
|
|
4543
4586
|
} catch (e) {
|
|
4544
|
-
spinner.fail(
|
|
4587
|
+
spinner.fail(chalk22.red(`Failed to fetch task: ${e.message}`));
|
|
4545
4588
|
}
|
|
4546
4589
|
});
|
|
4547
4590
|
return focus;
|
|
@@ -4554,25 +4597,25 @@ init_env();
|
|
|
4554
4597
|
init_esm_shims();
|
|
4555
4598
|
init_config();
|
|
4556
4599
|
import { Command as Command15 } from "commander";
|
|
4557
|
-
import
|
|
4600
|
+
import chalk23 from "chalk";
|
|
4558
4601
|
function createConfigCommand() {
|
|
4559
4602
|
const config2 = new Command15("config");
|
|
4560
4603
|
config2.description("View or modify Rigstate configuration").argument("[key]", "Configuration key to view/set (api_key, project_id, api_url)").argument("[value]", "Value to set").action(async (key, value) => {
|
|
4561
4604
|
if (!key) {
|
|
4562
|
-
console.log(
|
|
4563
|
-
console.log(
|
|
4605
|
+
console.log(chalk23.bold("Rigstate Configuration"));
|
|
4606
|
+
console.log(chalk23.dim("\u2500".repeat(40)));
|
|
4564
4607
|
try {
|
|
4565
4608
|
const apiKey = getApiKey();
|
|
4566
|
-
console.log(`${
|
|
4609
|
+
console.log(`${chalk23.cyan("api_key")}: ${apiKey.substring(0, 20)}...`);
|
|
4567
4610
|
} catch (e) {
|
|
4568
|
-
console.log(`${
|
|
4611
|
+
console.log(`${chalk23.cyan("api_key")}: ${chalk23.dim("(not set)")}`);
|
|
4569
4612
|
}
|
|
4570
4613
|
const projectId = getProjectId();
|
|
4571
|
-
console.log(`${
|
|
4614
|
+
console.log(`${chalk23.cyan("project_id")}: ${projectId || chalk23.dim("(not set)")}`);
|
|
4572
4615
|
const apiUrl = getApiUrl();
|
|
4573
|
-
console.log(`${
|
|
4616
|
+
console.log(`${chalk23.cyan("api_url")}: ${apiUrl}`);
|
|
4574
4617
|
console.log("");
|
|
4575
|
-
console.log(
|
|
4618
|
+
console.log(chalk23.dim('Use "rigstate config <key> <value>" to set a value.'));
|
|
4576
4619
|
return;
|
|
4577
4620
|
}
|
|
4578
4621
|
if (!value) {
|
|
@@ -4582,36 +4625,36 @@ function createConfigCommand() {
|
|
|
4582
4625
|
const apiKey = getApiKey();
|
|
4583
4626
|
console.log(apiKey);
|
|
4584
4627
|
} catch (e) {
|
|
4585
|
-
console.log(
|
|
4628
|
+
console.log(chalk23.dim("(not set)"));
|
|
4586
4629
|
}
|
|
4587
4630
|
break;
|
|
4588
4631
|
case "project_id":
|
|
4589
|
-
console.log(getProjectId() ||
|
|
4632
|
+
console.log(getProjectId() || chalk23.dim("(not set)"));
|
|
4590
4633
|
break;
|
|
4591
4634
|
case "api_url":
|
|
4592
4635
|
console.log(getApiUrl());
|
|
4593
4636
|
break;
|
|
4594
4637
|
default:
|
|
4595
|
-
console.log(
|
|
4596
|
-
console.log(
|
|
4638
|
+
console.log(chalk23.red(`Unknown config key: ${key}`));
|
|
4639
|
+
console.log(chalk23.dim("Valid keys: api_key, project_id, api_url"));
|
|
4597
4640
|
}
|
|
4598
4641
|
return;
|
|
4599
4642
|
}
|
|
4600
4643
|
switch (key) {
|
|
4601
4644
|
case "api_key":
|
|
4602
4645
|
setApiKey(value);
|
|
4603
|
-
console.log(
|
|
4646
|
+
console.log(chalk23.green(`\u2705 api_key updated`));
|
|
4604
4647
|
break;
|
|
4605
4648
|
case "project_id":
|
|
4606
4649
|
setProjectId(value);
|
|
4607
|
-
console.log(
|
|
4650
|
+
console.log(chalk23.green(`\u2705 project_id updated`));
|
|
4608
4651
|
break;
|
|
4609
4652
|
case "api_url":
|
|
4610
|
-
console.log(
|
|
4653
|
+
console.log(chalk23.yellow("api_url is set via RIGSTATE_API_URL environment variable"));
|
|
4611
4654
|
break;
|
|
4612
4655
|
default:
|
|
4613
|
-
console.log(
|
|
4614
|
-
console.log(
|
|
4656
|
+
console.log(chalk23.red(`Unknown config key: ${key}`));
|
|
4657
|
+
console.log(chalk23.dim("Valid keys: api_key, project_id"));
|
|
4615
4658
|
}
|
|
4616
4659
|
});
|
|
4617
4660
|
return config2;
|
|
@@ -4620,7 +4663,7 @@ function createConfigCommand() {
|
|
|
4620
4663
|
// src/commands/mcp.ts
|
|
4621
4664
|
init_esm_shims();
|
|
4622
4665
|
import { Command as Command16 } from "commander";
|
|
4623
|
-
import
|
|
4666
|
+
import chalk24 from "chalk";
|
|
4624
4667
|
import { spawn } from "child_process";
|
|
4625
4668
|
import path23 from "path";
|
|
4626
4669
|
import fs21 from "fs";
|
|
@@ -4646,15 +4689,15 @@ function createMcpCommand() {
|
|
|
4646
4689
|
}
|
|
4647
4690
|
}
|
|
4648
4691
|
if (!serverPath) {
|
|
4649
|
-
console.error(
|
|
4650
|
-
console.error(
|
|
4651
|
-
console.error(
|
|
4692
|
+
console.error(chalk24.red("\u274C Error: Rigstate MCP Server binary not found."));
|
|
4693
|
+
console.error(chalk24.yellow("Please ensure that the mcp package is built:"));
|
|
4694
|
+
console.error(chalk24.white(" cd packages/mcp && npm run build"));
|
|
4652
4695
|
console.error("");
|
|
4653
|
-
console.error(
|
|
4654
|
-
console.error(
|
|
4696
|
+
console.error(chalk24.dim("Or run directly with:"));
|
|
4697
|
+
console.error(chalk24.white(" npx @rigstate/mcp"));
|
|
4655
4698
|
process.exit(1);
|
|
4656
4699
|
}
|
|
4657
|
-
console.log(
|
|
4700
|
+
console.log(chalk24.dim(`Starting MCP server from: ${serverPath}`));
|
|
4658
4701
|
if (process.env.VIBE_API_KEY && !process.env.RIGSTATE_API_KEY) {
|
|
4659
4702
|
process.env.RIGSTATE_API_KEY = process.env.VIBE_API_KEY;
|
|
4660
4703
|
}
|
|
@@ -4663,7 +4706,7 @@ function createMcpCommand() {
|
|
|
4663
4706
|
stdio: ["inherit", "inherit", "inherit"]
|
|
4664
4707
|
});
|
|
4665
4708
|
worker.on("error", (err) => {
|
|
4666
|
-
console.error(
|
|
4709
|
+
console.error(chalk24.red(`\u274C Failed to start MCP server: ${err.message}`));
|
|
4667
4710
|
process.exit(1);
|
|
4668
4711
|
});
|
|
4669
4712
|
worker.on("exit", (code) => {
|
|
@@ -4678,7 +4721,7 @@ function createMcpCommand() {
|
|
|
4678
4721
|
// src/commands/nexus.ts
|
|
4679
4722
|
init_esm_shims();
|
|
4680
4723
|
import { Command as Command17 } from "commander";
|
|
4681
|
-
import
|
|
4724
|
+
import chalk27 from "chalk";
|
|
4682
4725
|
|
|
4683
4726
|
// src/nexus/dispatcher.ts
|
|
4684
4727
|
init_esm_shims();
|
|
@@ -4746,7 +4789,7 @@ var HiveScrubber = class {
|
|
|
4746
4789
|
};
|
|
4747
4790
|
|
|
4748
4791
|
// src/hive/gateway.ts
|
|
4749
|
-
import
|
|
4792
|
+
import chalk25 from "chalk";
|
|
4750
4793
|
var HiveGateway = class {
|
|
4751
4794
|
client;
|
|
4752
4795
|
enabled;
|
|
@@ -4756,7 +4799,7 @@ var HiveGateway = class {
|
|
|
4756
4799
|
constructor(baseUrl, token) {
|
|
4757
4800
|
this.enabled = !!token;
|
|
4758
4801
|
if (!this.enabled) {
|
|
4759
|
-
console.log(
|
|
4802
|
+
console.log(chalk25.dim("\u26A0\uFE0F Hive Gateway disabled (No Token provided). Running in localized mode."));
|
|
4760
4803
|
}
|
|
4761
4804
|
this.client = axios18.create({
|
|
4762
4805
|
baseURL: baseUrl,
|
|
@@ -4776,23 +4819,23 @@ var HiveGateway = class {
|
|
|
4776
4819
|
if (!this.enabled) return false;
|
|
4777
4820
|
const now = Date.now();
|
|
4778
4821
|
if (now - this.lastSignalTime < this.MIN_INTERVAL_MS) {
|
|
4779
|
-
console.warn(
|
|
4822
|
+
console.warn(chalk25.yellow("\u23F3 Hive Gateway Throttled. Signal dropped to preventing spam."));
|
|
4780
4823
|
return false;
|
|
4781
4824
|
}
|
|
4782
4825
|
const scrubResult = HiveScrubber.scrub(signal.ruleContent);
|
|
4783
4826
|
if (scrubResult.riskScore > 20) {
|
|
4784
|
-
console.error(
|
|
4827
|
+
console.error(chalk25.red(`\u{1F6D1} HIVE BLOCKED: Signal contains sensitive data (Risk: ${scrubResult.riskScore})`));
|
|
4785
4828
|
return false;
|
|
4786
4829
|
}
|
|
4787
4830
|
try {
|
|
4788
|
-
console.log(
|
|
4831
|
+
console.log(chalk25.blue(`\u{1F4E1} Uplinking to Hive... [${signal.vector}]`));
|
|
4789
4832
|
const payload = { ...signal, ruleContent: scrubResult.sanitizedContent };
|
|
4790
4833
|
await this.client.post("/signal", payload);
|
|
4791
4834
|
this.lastSignalTime = now;
|
|
4792
|
-
console.log(
|
|
4835
|
+
console.log(chalk25.green("\u2705 Signal Received by Hive Core. Knowledge Shared."));
|
|
4793
4836
|
return true;
|
|
4794
4837
|
} catch (error) {
|
|
4795
|
-
console.error(
|
|
4838
|
+
console.error(chalk25.red(`\u274C Hive Transmission Failed: ${error.message}`));
|
|
4796
4839
|
return false;
|
|
4797
4840
|
}
|
|
4798
4841
|
}
|
|
@@ -4800,37 +4843,37 @@ var HiveGateway = class {
|
|
|
4800
4843
|
|
|
4801
4844
|
// src/utils/logger.ts
|
|
4802
4845
|
init_esm_shims();
|
|
4803
|
-
import
|
|
4846
|
+
import chalk26 from "chalk";
|
|
4804
4847
|
var Logger = class {
|
|
4805
4848
|
static formatMessage(level, message, context) {
|
|
4806
4849
|
const timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
4807
4850
|
let prefix = "";
|
|
4808
4851
|
switch (level) {
|
|
4809
4852
|
case "INFO" /* INFO */:
|
|
4810
|
-
prefix =
|
|
4853
|
+
prefix = chalk26.blue(`[${"INFO" /* INFO */}]`);
|
|
4811
4854
|
break;
|
|
4812
4855
|
case "WARN" /* WARN */:
|
|
4813
|
-
prefix =
|
|
4856
|
+
prefix = chalk26.yellow(`[${"WARN" /* WARN */}]`);
|
|
4814
4857
|
break;
|
|
4815
4858
|
case "ERROR" /* ERROR */:
|
|
4816
|
-
prefix =
|
|
4859
|
+
prefix = chalk26.red(`[${"ERROR" /* ERROR */}]`);
|
|
4817
4860
|
break;
|
|
4818
4861
|
case "DEBUG" /* DEBUG */:
|
|
4819
|
-
prefix =
|
|
4862
|
+
prefix = chalk26.gray(`[${"DEBUG" /* DEBUG */}]`);
|
|
4820
4863
|
break;
|
|
4821
4864
|
}
|
|
4822
|
-
let output = `${
|
|
4865
|
+
let output = `${chalk26.gray(timestamp)} ${prefix} ${message}`;
|
|
4823
4866
|
if (context) {
|
|
4824
4867
|
if (context instanceof Error) {
|
|
4825
4868
|
output += `
|
|
4826
|
-
${
|
|
4869
|
+
${chalk26.red(context.stack || context.message)}`;
|
|
4827
4870
|
} else if (typeof context === "object") {
|
|
4828
4871
|
try {
|
|
4829
4872
|
output += `
|
|
4830
|
-
${
|
|
4873
|
+
${chalk26.gray(JSON.stringify(context, null, 2))}`;
|
|
4831
4874
|
} catch (e) {
|
|
4832
4875
|
output += `
|
|
4833
|
-
${
|
|
4876
|
+
${chalk26.gray("[Circular or invalid object]")}`;
|
|
4834
4877
|
}
|
|
4835
4878
|
} else {
|
|
4836
4879
|
output += ` ${String(context)}`;
|
|
@@ -4950,10 +4993,10 @@ import inquirer3 from "inquirer";
|
|
|
4950
4993
|
function createNexusCommand() {
|
|
4951
4994
|
const command = new Command17("nexus");
|
|
4952
4995
|
command.description("Interact with The Multi-Agent Nexus (Phase 8)").argument("<intent>", "The natural language instruction for the swarm").option("--dry-run", "Enable Dry-Run mode (Kill-Switch Active)", true).option("--force", "Disable Dry-Run mode (DANGEROUS)", false).action(async (intent, options) => {
|
|
4953
|
-
console.log(
|
|
4996
|
+
console.log(chalk27.bold.magenta("\n\u{1F981} Welcome to The Nexus (Phase 8)\n"));
|
|
4954
4997
|
const dryRun = !options.force;
|
|
4955
4998
|
if (!dryRun) {
|
|
4956
|
-
console.log(
|
|
4999
|
+
console.log(chalk27.black.bgYellow(" WARNING ") + chalk27.yellow(" Dry-Run disabled! Eitri is authorized to write code."));
|
|
4957
5000
|
const { confirm } = await inquirer3.prompt([{
|
|
4958
5001
|
type: "confirm",
|
|
4959
5002
|
name: "confirm",
|
|
@@ -4974,26 +5017,26 @@ function createNexusCommand() {
|
|
|
4974
5017
|
};
|
|
4975
5018
|
const dispatcher = new NexusDispatcher(context);
|
|
4976
5019
|
dispatcher.on("order:created", (o) => {
|
|
4977
|
-
console.log(
|
|
5020
|
+
console.log(chalk27.blue(`\u{1F195} [${o.id.slice(0, 6)}] Order Created: `) + o.intent);
|
|
4978
5021
|
});
|
|
4979
5022
|
dispatcher.on("order:started", (o) => {
|
|
4980
|
-
console.log(
|
|
5023
|
+
console.log(chalk27.yellow(`\u23F3 [${o.id.slice(0, 6)}] Processing...`));
|
|
4981
5024
|
});
|
|
4982
5025
|
dispatcher.on("order:blocked", (o) => {
|
|
4983
|
-
console.log(
|
|
4984
|
-
console.log(
|
|
4985
|
-
console.log(
|
|
5026
|
+
console.log(chalk27.red(`\u{1F6D1} [${o.id.slice(0, 6)}] BLOCKED by Kill-Switch`));
|
|
5027
|
+
console.log(chalk27.dim(` Target: ${o.targetAgent} | Action: ${o.action}`));
|
|
5028
|
+
console.log(chalk27.dim(" Run with --force to execute automatically (NOT RECOMMENDED)."));
|
|
4986
5029
|
});
|
|
4987
|
-
dispatcher.on("agent:SINDRE", (o) => console.log(
|
|
4988
|
-
dispatcher.on("agent:EITRI", (o) => console.log(
|
|
4989
|
-
console.log(
|
|
5030
|
+
dispatcher.on("agent:SINDRE", (o) => console.log(chalk27.cyan(`\u{1F916} Sindre (Vault): I'm on it! (${o.action})`)));
|
|
5031
|
+
dispatcher.on("agent:EITRI", (o) => console.log(chalk27.green(`\u{1F477} Eitri (Smith): Ready to build! (${o.action})`)));
|
|
5032
|
+
console.log(chalk27.dim("\u{1F9E0} Frank is analyzing your intent..."));
|
|
4990
5033
|
await new Promise((r) => setTimeout(r, 800));
|
|
4991
5034
|
if (intent.toLowerCase().includes("db") || intent.toLowerCase().includes("database")) {
|
|
4992
5035
|
await dispatcher.dispatch("FRANK", "SINDRE", intent, "db.analyze", { raw: intent });
|
|
4993
5036
|
} else if (intent.toLowerCase().includes("create") || intent.toLowerCase().includes("code")) {
|
|
4994
5037
|
await dispatcher.dispatch("FRANK", "EITRI", intent, "fs.write", { path: "src/demo.ts", content: "// demo" });
|
|
4995
5038
|
} else {
|
|
4996
|
-
console.log(
|
|
5039
|
+
console.log(chalk27.gray("Frank didn't understand. Try 'create file' or 'check database'."));
|
|
4997
5040
|
}
|
|
4998
5041
|
});
|
|
4999
5042
|
return command;
|
|
@@ -5007,25 +5050,25 @@ init_esm_shims();
|
|
|
5007
5050
|
init_governance();
|
|
5008
5051
|
init_config();
|
|
5009
5052
|
import { Command as Command18 } from "commander";
|
|
5010
|
-
import
|
|
5053
|
+
import chalk28 from "chalk";
|
|
5011
5054
|
import axios19 from "axios";
|
|
5012
5055
|
function createOverrideCommand() {
|
|
5013
5056
|
const override = new Command18("override");
|
|
5014
5057
|
override.description("Emergency Override for Governance Soft Locks").argument("<violationId>", 'ID of the violation to override (or "all")').requiredOption("-r, --reason <reason>", "Description of why this override is necessary").action(async (violationId, options) => {
|
|
5015
5058
|
const { reason } = options;
|
|
5016
|
-
console.log(
|
|
5059
|
+
console.log(chalk28.bold(`
|
|
5017
5060
|
\u{1F513} Initiating Governance Override Protocol...`));
|
|
5018
5061
|
const session = await getSessionState(process.cwd());
|
|
5019
5062
|
if (session.status !== "SOFT_LOCK") {
|
|
5020
|
-
console.log(
|
|
5063
|
+
console.log(chalk28.yellow(" Info: Session is not currently locked."));
|
|
5021
5064
|
return;
|
|
5022
5065
|
}
|
|
5023
|
-
console.log(
|
|
5024
|
-
console.log(
|
|
5066
|
+
console.log(chalk28.dim(` Active Violation: ${session.active_violation}`));
|
|
5067
|
+
console.log(chalk28.dim(` Reason Provided: "${reason}"`));
|
|
5025
5068
|
const success = await performOverride(violationId, reason, process.cwd());
|
|
5026
5069
|
if (success) {
|
|
5027
|
-
console.log(
|
|
5028
|
-
console.log(
|
|
5070
|
+
console.log(chalk28.green(` \u2705 Session UNLOCKED.`));
|
|
5071
|
+
console.log(chalk28.dim(` This event has been logged to the Mission Report.`));
|
|
5029
5072
|
try {
|
|
5030
5073
|
const projectId = getProjectId();
|
|
5031
5074
|
if (projectId) {
|
|
@@ -5042,13 +5085,13 @@ function createOverrideCommand() {
|
|
|
5042
5085
|
}, {
|
|
5043
5086
|
headers: { Authorization: `Bearer ${apiKey}` }
|
|
5044
5087
|
});
|
|
5045
|
-
console.log(
|
|
5088
|
+
console.log(chalk28.dim(` \u2601 Audit log synced to Cloud.`));
|
|
5046
5089
|
}
|
|
5047
5090
|
} catch (e) {
|
|
5048
|
-
console.log(
|
|
5091
|
+
console.log(chalk28.dim(` (Cloud audit sync failed: ${e.message})`));
|
|
5049
5092
|
}
|
|
5050
5093
|
} else {
|
|
5051
|
-
console.log(
|
|
5094
|
+
console.log(chalk28.red(` \u{1F6D1} Override Failed. Check project configuration.`));
|
|
5052
5095
|
}
|
|
5053
5096
|
});
|
|
5054
5097
|
return override;
|
|
@@ -5058,7 +5101,7 @@ function createOverrideCommand() {
|
|
|
5058
5101
|
init_esm_shims();
|
|
5059
5102
|
init_config();
|
|
5060
5103
|
import { Command as Command19 } from "commander";
|
|
5061
|
-
import
|
|
5104
|
+
import chalk29 from "chalk";
|
|
5062
5105
|
import ora12 from "ora";
|
|
5063
5106
|
import axios20 from "axios";
|
|
5064
5107
|
import inquirer4 from "inquirer";
|
|
@@ -5069,7 +5112,7 @@ function createIdeaCommand() {
|
|
|
5069
5112
|
const apiUrl = getApiUrl();
|
|
5070
5113
|
const projectId = getProjectId();
|
|
5071
5114
|
if (!projectId) {
|
|
5072
|
-
console.error(
|
|
5115
|
+
console.error(chalk29.red("Project context missing. Run rigstate link."));
|
|
5073
5116
|
process.exit(1);
|
|
5074
5117
|
}
|
|
5075
5118
|
let ideaTitle = title;
|
|
@@ -5105,14 +5148,14 @@ function createIdeaCommand() {
|
|
|
5105
5148
|
{ headers: { Authorization: `Bearer ${apiKey}` } }
|
|
5106
5149
|
);
|
|
5107
5150
|
if (response.data.success) {
|
|
5108
|
-
spinner.succeed(
|
|
5109
|
-
console.log(
|
|
5151
|
+
spinner.succeed(chalk29.green("Idea Captured! \u{1F4A1}"));
|
|
5152
|
+
console.log(chalk29.dim(`ID: ${response.data.data?.id || "Saved"}`));
|
|
5110
5153
|
} else {
|
|
5111
5154
|
throw new Error(response.data.error);
|
|
5112
5155
|
}
|
|
5113
5156
|
} catch (e) {
|
|
5114
5157
|
const errorDetail = e.response?.data?.error || e.message;
|
|
5115
|
-
console.error(
|
|
5158
|
+
console.error(chalk29.red(`
|
|
5116
5159
|
Failed to capture idea: ${errorDetail}`));
|
|
5117
5160
|
}
|
|
5118
5161
|
});
|
|
@@ -5122,7 +5165,7 @@ Failed to capture idea: ${errorDetail}`));
|
|
|
5122
5165
|
init_esm_shims();
|
|
5123
5166
|
init_config();
|
|
5124
5167
|
import { Command as Command20 } from "commander";
|
|
5125
|
-
import
|
|
5168
|
+
import chalk30 from "chalk";
|
|
5126
5169
|
import ora13 from "ora";
|
|
5127
5170
|
import inquirer5 from "inquirer";
|
|
5128
5171
|
import fs22 from "fs/promises";
|
|
@@ -9698,7 +9741,7 @@ function createReleaseCommand() {
|
|
|
9698
9741
|
if (type === "major") newVersion = `${major + 1}.0.0`;
|
|
9699
9742
|
if (type === "minor") newVersion = `${major}.${minor + 1}.0`;
|
|
9700
9743
|
if (type === "patch") newVersion = `${major}.${minor}.${patch + 1}`;
|
|
9701
|
-
spinner.succeed(`Bumping ${pkg.name} from ${
|
|
9744
|
+
spinner.succeed(`Bumping ${pkg.name} from ${chalk30.dim(currentVersion)} to ${chalk30.green(newVersion)}`);
|
|
9702
9745
|
const { confirm } = await inquirer5.prompt([{
|
|
9703
9746
|
type: "confirm",
|
|
9704
9747
|
name: "confirm",
|
|
@@ -9728,7 +9771,7 @@ function createReleaseCommand() {
|
|
|
9728
9771
|
await git.addTag(`v${newVersion}`);
|
|
9729
9772
|
await git.push();
|
|
9730
9773
|
await git.pushTags();
|
|
9731
|
-
spinner.succeed(
|
|
9774
|
+
spinner.succeed(chalk30.bold.green(`\u{1F680} Release v${newVersion} shipped!`));
|
|
9732
9775
|
} catch (e) {
|
|
9733
9776
|
spinner.fail(e.message);
|
|
9734
9777
|
}
|
|
@@ -9746,7 +9789,7 @@ function getContext2() {
|
|
|
9746
9789
|
init_esm_shims();
|
|
9747
9790
|
init_config();
|
|
9748
9791
|
import { Command as Command21 } from "commander";
|
|
9749
|
-
import
|
|
9792
|
+
import chalk31 from "chalk";
|
|
9750
9793
|
import ora14 from "ora";
|
|
9751
9794
|
import axios21 from "axios";
|
|
9752
9795
|
function createRoadmapCommand() {
|
|
@@ -9757,7 +9800,7 @@ function createRoadmapCommand() {
|
|
|
9757
9800
|
const apiUrl = getApiUrl();
|
|
9758
9801
|
const projectId = getProjectId();
|
|
9759
9802
|
if (!projectId) {
|
|
9760
|
-
spinner.fail(
|
|
9803
|
+
spinner.fail(chalk31.red('Project context missing. Run "rigstate link".'));
|
|
9761
9804
|
return;
|
|
9762
9805
|
}
|
|
9763
9806
|
const response = await axios21.get(
|
|
@@ -9770,11 +9813,11 @@ function createRoadmapCommand() {
|
|
|
9770
9813
|
const tasks = response.data.data.roadmap || [];
|
|
9771
9814
|
spinner.stop();
|
|
9772
9815
|
if (tasks.length === 0) {
|
|
9773
|
-
console.log(
|
|
9816
|
+
console.log(chalk31.yellow("\nRoadmap is empty. Use the web UI to define your journey."));
|
|
9774
9817
|
return;
|
|
9775
9818
|
}
|
|
9776
|
-
console.log("\n" +
|
|
9777
|
-
console.log(
|
|
9819
|
+
console.log("\n" + chalk31.bold.underline("\u{1F6F0}\uFE0F TACTICAL OVERVIEW: PROJECT ROADMAP"));
|
|
9820
|
+
console.log(chalk31.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
|
|
9778
9821
|
const columns = {
|
|
9779
9822
|
"IN_PROGRESS": [],
|
|
9780
9823
|
"ACTIVE": [],
|
|
@@ -9786,14 +9829,14 @@ function createRoadmapCommand() {
|
|
|
9786
9829
|
columns[t.status].push(t);
|
|
9787
9830
|
}
|
|
9788
9831
|
});
|
|
9789
|
-
displayColumn("\u{1F525} IN PROGRESS", columns.IN_PROGRESS,
|
|
9790
|
-
displayColumn("\u25B6\uFE0F ACTIVE / NEXT", columns.ACTIVE,
|
|
9791
|
-
displayColumn("\u{1F512} LOCKED", columns.LOCKED,
|
|
9792
|
-
displayColumn("\u23F3 PENDING", columns.PENDING,
|
|
9793
|
-
console.log(
|
|
9794
|
-
console.log(
|
|
9832
|
+
displayColumn("\u{1F525} IN PROGRESS", columns.IN_PROGRESS, chalk31.yellow);
|
|
9833
|
+
displayColumn("\u25B6\uFE0F ACTIVE / NEXT", columns.ACTIVE, chalk31.green);
|
|
9834
|
+
displayColumn("\u{1F512} LOCKED", columns.LOCKED, chalk31.blue);
|
|
9835
|
+
displayColumn("\u23F3 PENDING", columns.PENDING, chalk31.gray);
|
|
9836
|
+
console.log(chalk31.dim("\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
|
|
9837
|
+
console.log(chalk31.dim(`Total: ${tasks.length} tasks | Run "rigstate work" to start coding.`));
|
|
9795
9838
|
} catch (e) {
|
|
9796
|
-
spinner.fail(
|
|
9839
|
+
spinner.fail(chalk31.red(`
|
|
9797
9840
|
Failed to fetch roadmap: ${e.message}`));
|
|
9798
9841
|
}
|
|
9799
9842
|
});
|
|
@@ -9804,8 +9847,8 @@ function displayColumn(title, items, color) {
|
|
|
9804
9847
|
${color.bold(title)}`);
|
|
9805
9848
|
items.sort((a, b) => a.step_number - b.step_number).forEach((item) => {
|
|
9806
9849
|
const id = `T-${item.step_number}`.padEnd(8);
|
|
9807
|
-
const priority = item.priority === "MVP" ?
|
|
9808
|
-
console.log(` ${color("\u2022")} ${
|
|
9850
|
+
const priority = item.priority === "MVP" ? chalk31.magenta(" [MVP]") : "";
|
|
9851
|
+
console.log(` ${color("\u2022")} ${chalk31.bold(id)} ${item.title}${priority}`);
|
|
9809
9852
|
});
|
|
9810
9853
|
}
|
|
9811
9854
|
|
|
@@ -9813,7 +9856,7 @@ ${color.bold(title)}`);
|
|
|
9813
9856
|
init_esm_shims();
|
|
9814
9857
|
init_config();
|
|
9815
9858
|
import { Command as Command22 } from "commander";
|
|
9816
|
-
import
|
|
9859
|
+
import chalk32 from "chalk";
|
|
9817
9860
|
import ora15 from "ora";
|
|
9818
9861
|
import inquirer6 from "inquirer";
|
|
9819
9862
|
function createCouncilCommand() {
|
|
@@ -9824,7 +9867,7 @@ function createCouncilCommand() {
|
|
|
9824
9867
|
const apiUrl = getApiUrl();
|
|
9825
9868
|
const projectId = getProjectId();
|
|
9826
9869
|
if (!projectId) {
|
|
9827
|
-
console.error(
|
|
9870
|
+
console.error(chalk32.red('Project context missing. Run "rigstate link".'));
|
|
9828
9871
|
return;
|
|
9829
9872
|
}
|
|
9830
9873
|
let sessionTopic = topic;
|
|
@@ -9836,25 +9879,25 @@ function createCouncilCommand() {
|
|
|
9836
9879
|
}]);
|
|
9837
9880
|
sessionTopic = ans.topic;
|
|
9838
9881
|
}
|
|
9839
|
-
console.log(
|
|
9840
|
-
console.log(
|
|
9841
|
-
console.log(
|
|
9842
|
-
console.log(
|
|
9882
|
+
console.log(chalk32.bold.magenta("\n\u2696\uFE0F CONVENING THE COUNCIL OF SOVEREIGNTY\n"));
|
|
9883
|
+
console.log(chalk32.dim(`Topic: ${sessionTopic}`));
|
|
9884
|
+
console.log(chalk32.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
|
|
9885
|
+
console.log(chalk32.yellow("\n\u{1F9E0} Frank (Architect): Analyzing alignment with Project DNA..."));
|
|
9843
9886
|
await sleep(1500);
|
|
9844
|
-
console.log(
|
|
9845
|
-
console.log(
|
|
9887
|
+
console.log(chalk32.gray(' "This decision affects our backend scalability. I recommend caution."'));
|
|
9888
|
+
console.log(chalk32.blue("\n\u{1F6E1}\uFE0F Sigrid (Curator): Checking historical precedents..."));
|
|
9846
9889
|
await sleep(1500);
|
|
9847
|
-
console.log(
|
|
9848
|
-
console.log(
|
|
9890
|
+
console.log(chalk32.gray(` "Similar patterns in other projects led to technical debt. Let's review RLS."`));
|
|
9891
|
+
console.log(chalk32.green("\n\u{1F4D0} Einar (Analyst): Scanning dependency impact..."));
|
|
9849
9892
|
await sleep(1500);
|
|
9850
|
-
console.log(
|
|
9851
|
-
console.log(
|
|
9852
|
-
console.log(
|
|
9853
|
-
console.log(
|
|
9854
|
-
console.log(
|
|
9855
|
-
console.log(
|
|
9893
|
+
console.log(chalk32.gray(' "Implementation will require updating 3 core services."'));
|
|
9894
|
+
console.log(chalk32.bold.white("\n\u{1F4CB} [FINAL DECISION RECORD]"));
|
|
9895
|
+
console.log(chalk32.white(" Status: Approved with conditions"));
|
|
9896
|
+
console.log(chalk32.white(" Rationale: Value outweighs migration cost. Ensure SEC-SQL-01 compliance."));
|
|
9897
|
+
console.log(chalk32.dim("\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
|
|
9898
|
+
console.log(chalk32.green("\u2705 Decision saved to Project Brain (ADR-102)"));
|
|
9856
9899
|
} catch (e) {
|
|
9857
|
-
console.error(
|
|
9900
|
+
console.error(chalk32.red(`
|
|
9858
9901
|
Council session aborted: ${e.message}`));
|
|
9859
9902
|
}
|
|
9860
9903
|
});
|
|
@@ -9900,19 +9943,19 @@ program.hook("preAction", async () => {
|
|
|
9900
9943
|
});
|
|
9901
9944
|
program.on("--help", () => {
|
|
9902
9945
|
console.log("");
|
|
9903
|
-
console.log(
|
|
9946
|
+
console.log(chalk33.bold("Examples:"));
|
|
9904
9947
|
console.log("");
|
|
9905
|
-
console.log(
|
|
9906
|
-
console.log(
|
|
9948
|
+
console.log(chalk33.cyan(" $ rigstate login sk_rigstate_your_api_key"));
|
|
9949
|
+
console.log(chalk33.dim(" Authenticate with your Rigstate API key"));
|
|
9907
9950
|
console.log("");
|
|
9908
|
-
console.log(
|
|
9909
|
-
console.log(
|
|
9951
|
+
console.log(chalk33.cyan(" $ rigstate scan"));
|
|
9952
|
+
console.log(chalk33.dim(" Scan the current directory"));
|
|
9910
9953
|
console.log("");
|
|
9911
|
-
console.log(
|
|
9912
|
-
console.log(
|
|
9954
|
+
console.log(chalk33.cyan(" $ rigstate scan ./src --project abc123"));
|
|
9955
|
+
console.log(chalk33.dim(" Scan a specific directory with project ID"));
|
|
9913
9956
|
console.log("");
|
|
9914
|
-
console.log(
|
|
9915
|
-
console.log(
|
|
9957
|
+
console.log(chalk33.cyan(" $ rigstate scan --json"));
|
|
9958
|
+
console.log(chalk33.dim(" Output results in JSON format (useful for IDE extensions)"));
|
|
9916
9959
|
console.log("");
|
|
9917
9960
|
});
|
|
9918
9961
|
program.parse(process.argv);
|