archondev 2.1.2 → 2.1.6
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 +2 -2
- package/dist/{bug-COUVQ4X3.js → bug-K4V357B2.js} +1 -1
- package/dist/{chunk-XRWIU3RD.js → chunk-3NPZQOK2.js} +6 -6
- package/dist/{chunk-JDPFHHTO.js → chunk-F3RLDQTQ.js} +31 -8
- package/dist/{chunk-62OWYYHV.js → chunk-KF6MFAB4.js} +4 -4
- package/dist/{chunk-XKRAXJN5.js → chunk-P666JE3G.js} +13 -4
- package/dist/{chunk-UDBFDXJI.js → chunk-QSYKKPFF.js} +2 -2
- package/dist/{chunk-UZT2L27M.js → chunk-RCW22YNI.js} +2 -2
- package/dist/{chunk-N73LAU7W.js → chunk-TEY4GCMH.js} +1 -1
- package/dist/{chunk-OY7OJKFD.js → chunk-TSSFMB6E.js} +3 -3
- package/dist/{execute-2S2UHTLN.js → execute-5ZSLSWPZ.js} +2 -2
- package/dist/index.js +93 -75
- package/dist/{init-7EWVBX6O.js → init-6EXMDCWC.js} +1 -1
- package/dist/{list-6LNHTEOA.js → list-LEFAISNL.js} +2 -2
- package/dist/{parallel-N67PD2HF.js → parallel-5WJAXTYL.js} +2 -2
- package/dist/{plan-VRAS6IYQ.js → plan-W2UXAR6E.js} +1 -1
- package/dist/{preferences-ND2AKZYW.js → preferences-3Z4OCNTT.js} +3 -1
- package/dist/{review-3R6QXAXQ.js → review-QV4TQM2Z.js} +1 -1
- package/package.json +1 -2
package/README.md
CHANGED
|
@@ -9,10 +9,10 @@ The complete AI development system. It manages your entire development process s
|
|
|
9
9
|
|
|
10
10
|
```bash
|
|
11
11
|
# macOS/Linux:
|
|
12
|
-
npm install -g
|
|
12
|
+
npm install -g archondev && archon
|
|
13
13
|
|
|
14
14
|
# Windows PowerShell:
|
|
15
|
-
npm install -g
|
|
15
|
+
npm install -g archondev; archon
|
|
16
16
|
```
|
|
17
17
|
|
|
18
18
|
**What you get:**
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
} from "./chunk-M4LGRTLC.js";
|
|
5
5
|
import {
|
|
6
6
|
loadAtom
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-RCW22YNI.js";
|
|
8
8
|
import {
|
|
9
9
|
transitionAtom
|
|
10
10
|
} from "./chunk-5IQKC2TD.js";
|
|
@@ -4815,7 +4815,7 @@ function createPrompt() {
|
|
|
4815
4815
|
}
|
|
4816
4816
|
async function execute(atomId, options) {
|
|
4817
4817
|
if (options.parallel && options.parallel.length > 0) {
|
|
4818
|
-
const { parallelExecute } = await import("./parallel-
|
|
4818
|
+
const { parallelExecute } = await import("./parallel-5WJAXTYL.js");
|
|
4819
4819
|
const allAtomIds = [atomId, ...options.parallel];
|
|
4820
4820
|
await parallelExecute(allAtomIds);
|
|
4821
4821
|
return;
|
|
@@ -4928,9 +4928,9 @@ Repository: ${repoUrl}`));
|
|
|
4928
4928
|
});
|
|
4929
4929
|
if (conflictReport.hasConflicts) {
|
|
4930
4930
|
console.log(chalk3.yellow(`
|
|
4931
|
-
|
|
4931
|
+
[!] ${conflictReport.conflicts.length} conflict(s) detected:`));
|
|
4932
4932
|
for (const conflict of conflictReport.conflicts) {
|
|
4933
|
-
const icon = conflict.severity === "BLOCKER" ? chalk3.red("\u2717") : chalk3.yellow("
|
|
4933
|
+
const icon = conflict.severity === "BLOCKER" ? chalk3.red("\u2717") : chalk3.yellow("[!]");
|
|
4934
4934
|
console.log(` ${icon} [${conflict.type}] ${conflict.message}`);
|
|
4935
4935
|
}
|
|
4936
4936
|
if (conflictReport.blockerCount > 0) {
|
|
@@ -5051,7 +5051,7 @@ Running quality gates for ${targetEnvName}...`));
|
|
|
5051
5051
|
if (learningResult.success && learningResult.entriesAdded > 0) {
|
|
5052
5052
|
console.log(chalk3.green("\u2713 Learning captured to progress.txt"));
|
|
5053
5053
|
} else {
|
|
5054
|
-
console.log(chalk3.yellow("
|
|
5054
|
+
console.log(chalk3.yellow("[!] No learnings captured to progress.txt"));
|
|
5055
5055
|
}
|
|
5056
5056
|
}
|
|
5057
5057
|
const agentsMdUpdater = new AgentsMdUpdater(cwd);
|
|
@@ -5059,7 +5059,7 @@ Running quality gates for ${targetEnvName}...`));
|
|
|
5059
5059
|
if (verifyLearning) {
|
|
5060
5060
|
const agentsMdCount = agentsMdResult.filesCreated.length + agentsMdResult.filesUpdated.length;
|
|
5061
5061
|
if (agentsMdCount === 0) {
|
|
5062
|
-
console.log(chalk3.yellow("
|
|
5062
|
+
console.log(chalk3.yellow("[!] No AGENTS.md updates (no reusable patterns found)"));
|
|
5063
5063
|
} else {
|
|
5064
5064
|
console.log(chalk3.green(`\u2713 Updated ${agentsMdCount} AGENTS.md file(s)`));
|
|
5065
5065
|
}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import {
|
|
2
|
+
login
|
|
3
|
+
} from "./chunk-UI4UQ24R.js";
|
|
1
4
|
import {
|
|
2
5
|
keyManager
|
|
3
6
|
} from "./chunk-SMR7JQK6.js";
|
|
@@ -541,6 +544,23 @@ function prompt(question) {
|
|
|
541
544
|
});
|
|
542
545
|
});
|
|
543
546
|
}
|
|
547
|
+
function promptYesNo(question, defaultValue) {
|
|
548
|
+
return new Promise((resolve) => {
|
|
549
|
+
const rl = readline.createInterface({
|
|
550
|
+
input: process.stdin,
|
|
551
|
+
output: process.stdout
|
|
552
|
+
});
|
|
553
|
+
const hint = defaultValue ? "(Y/n)" : "(y/N)";
|
|
554
|
+
rl.question(`${chalk.cyan("?")} ${question} ${hint}: `, (answer) => {
|
|
555
|
+
rl.close();
|
|
556
|
+
if (answer.trim() === "") {
|
|
557
|
+
resolve(defaultValue);
|
|
558
|
+
} else {
|
|
559
|
+
resolve(answer.toLowerCase().startsWith("y"));
|
|
560
|
+
}
|
|
561
|
+
});
|
|
562
|
+
});
|
|
563
|
+
}
|
|
544
564
|
function formatCost(dollars) {
|
|
545
565
|
if (dollars < 0.01) {
|
|
546
566
|
return `$${dollars.toFixed(4)}`;
|
|
@@ -557,9 +577,7 @@ function formatTokens(tokens) {
|
|
|
557
577
|
return tokens.toString();
|
|
558
578
|
}
|
|
559
579
|
async function interactiveSettings() {
|
|
560
|
-
console.log(chalk.
|
|
561
|
-
console.log(chalk.bold.white(" Settings & Preferences"));
|
|
562
|
-
console.log(chalk.blue("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n"));
|
|
580
|
+
console.log(chalk.bold("\nSettings & Preferences\n"));
|
|
563
581
|
const spinner = ora("Loading settings...").start();
|
|
564
582
|
const [profile, usage, providers] = await Promise.all([
|
|
565
583
|
fetchUserProfile(),
|
|
@@ -568,7 +586,12 @@ async function interactiveSettings() {
|
|
|
568
586
|
]);
|
|
569
587
|
spinner.stop();
|
|
570
588
|
if (!profile) {
|
|
571
|
-
console.log(chalk.yellow("Not logged in
|
|
589
|
+
console.log(chalk.yellow("Not logged in.\n"));
|
|
590
|
+
const shouldLogin = await promptYesNo("Would you like to login now?", true);
|
|
591
|
+
if (shouldLogin) {
|
|
592
|
+
await login("github");
|
|
593
|
+
await interactiveSettings();
|
|
594
|
+
}
|
|
572
595
|
return;
|
|
573
596
|
}
|
|
574
597
|
await displayCurrentSettings(profile, usage, providers);
|
|
@@ -636,7 +659,7 @@ async function displayCurrentSettings(profile, usage, providers) {
|
|
|
636
659
|
console.log(` Secondary: ${formatModelDisplay(profile.pref_secondary_adversarial, defaults.secondary)}`);
|
|
637
660
|
}
|
|
638
661
|
async function changeBillingMode(currentTier) {
|
|
639
|
-
console.log(chalk.bold("\n
|
|
662
|
+
console.log(chalk.bold("\n-- Billing Mode --\n"));
|
|
640
663
|
console.log(chalk.dim("Choose how you want to pay for AI usage:\n"));
|
|
641
664
|
const byokSelected = currentTier === "BYOK";
|
|
642
665
|
const creditsSelected = currentTier === "CREDITS";
|
|
@@ -673,7 +696,7 @@ async function changeBillingMode(currentTier) {
|
|
|
673
696
|
}
|
|
674
697
|
}
|
|
675
698
|
async function setDefaultModelsMenu(profile, providers) {
|
|
676
|
-
console.log(chalk.bold("\n
|
|
699
|
+
console.log(chalk.bold("\n-- Default Models --\n"));
|
|
677
700
|
const defaults = getDefaultAdversarialModels();
|
|
678
701
|
console.log(` ${chalk.cyan("1")}) Fast Model: ${formatModelDisplay(profile.pref_fast_model, getDefaultModel("fast"))}`);
|
|
679
702
|
console.log(` ${chalk.cyan("2")}) Thinking Model: ${formatModelDisplay(profile.pref_thinking_model, getDefaultModel("thinking"))}`);
|
|
@@ -723,7 +746,7 @@ async function setDefaultModelsMenu(profile, providers) {
|
|
|
723
746
|
}
|
|
724
747
|
}
|
|
725
748
|
async function manageApiKeys() {
|
|
726
|
-
console.log(chalk.bold("\n
|
|
749
|
+
console.log(chalk.bold("\n-- API Keys --\n"));
|
|
727
750
|
const providers = await getUserProviders();
|
|
728
751
|
if (providers.length > 0) {
|
|
729
752
|
console.log(chalk.blue("Configured providers:"));
|
|
@@ -772,7 +795,7 @@ async function manageApiKeys() {
|
|
|
772
795
|
}
|
|
773
796
|
}
|
|
774
797
|
async function viewUsageDetails() {
|
|
775
|
-
console.log(chalk.bold("\n
|
|
798
|
+
console.log(chalk.bold("\n-- Usage Details --\n"));
|
|
776
799
|
const spinner = ora("Loading usage data...").start();
|
|
777
800
|
const config = await loadConfig();
|
|
778
801
|
const authToken = getAuthToken(config);
|
|
@@ -433,7 +433,7 @@ async function bugReport(title, options) {
|
|
|
433
433
|
const prompt = createPrompt();
|
|
434
434
|
const projectPath = process.cwd();
|
|
435
435
|
try {
|
|
436
|
-
console.log(chalk.blue("\
|
|
436
|
+
console.log(chalk.blue("\nBug Report: ") + chalk.bold(title));
|
|
437
437
|
console.log(chalk.dim("\u2500".repeat(40)));
|
|
438
438
|
const description = await prompt.ask(chalk.cyan("Description: "));
|
|
439
439
|
console.log(chalk.cyan("Steps to reproduce (enter each step, empty line to finish):"));
|
|
@@ -501,11 +501,11 @@ async function bugReport(title, options) {
|
|
|
501
501
|
}
|
|
502
502
|
} catch (error) {
|
|
503
503
|
console.log(chalk.yellow(`
|
|
504
|
-
|
|
504
|
+
[!] RCA generation failed: ${error instanceof Error ? error.message : "Unknown error"}`));
|
|
505
505
|
console.log(chalk.dim("Continuing without RCA..."));
|
|
506
506
|
}
|
|
507
507
|
} else {
|
|
508
|
-
console.log(chalk.yellow("\n
|
|
508
|
+
console.log(chalk.yellow("\n[!] No API key configured. Skipping RCA."));
|
|
509
509
|
console.log(chalk.dim('Set ANTHROPIC_API_KEY or use "archon keys add anthropic"'));
|
|
510
510
|
}
|
|
511
511
|
}
|
|
@@ -534,7 +534,7 @@ async function bugReport(title, options) {
|
|
|
534
534
|
console.log(chalk.green(`
|
|
535
535
|
\u2705 Atom created: ${atom.externalId}`));
|
|
536
536
|
console.log(chalk.dim(` Linked to: ${bug.id}`));
|
|
537
|
-
console.log(chalk.bold("\
|
|
537
|
+
console.log(chalk.bold("\nSummary"));
|
|
538
538
|
console.log(chalk.dim("\u2500".repeat(40)));
|
|
539
539
|
console.log(`Bug ID: ${chalk.cyan(bug.id)}`);
|
|
540
540
|
console.log(`Atom ID: ${chalk.cyan(atom.externalId)}`);
|
|
@@ -1,15 +1,24 @@
|
|
|
1
1
|
// src/cli/init.ts
|
|
2
2
|
import { readdir, readFile, writeFile, mkdir } from "fs/promises";
|
|
3
|
-
import { existsSync } from "fs";
|
|
3
|
+
import { existsSync, readFileSync } from "fs";
|
|
4
4
|
import { join, extname } from "path";
|
|
5
5
|
import { execSync } from "child_process";
|
|
6
6
|
import chalk from "chalk";
|
|
7
7
|
import ora from "ora";
|
|
8
8
|
import readline from "readline";
|
|
9
9
|
function isInitialized(cwd) {
|
|
10
|
-
const archMdPath = join(cwd, "ARCHITECTURE.md");
|
|
11
10
|
const archonDir = join(cwd, ".archon");
|
|
12
|
-
|
|
11
|
+
if (existsSync(archonDir)) return true;
|
|
12
|
+
const archMdPath = join(cwd, "ARCHITECTURE.md");
|
|
13
|
+
if (existsSync(archMdPath)) {
|
|
14
|
+
try {
|
|
15
|
+
const content = readFileSync(archMdPath, "utf-8");
|
|
16
|
+
return content.startsWith("---") && content.includes("version:") && content.includes("qualityLevel:");
|
|
17
|
+
} catch {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return false;
|
|
13
22
|
}
|
|
14
23
|
var LANGUAGE_EXTENSIONS = {
|
|
15
24
|
".ts": "TypeScript",
|
|
@@ -48,7 +57,7 @@ async function init(options = {}) {
|
|
|
48
57
|
const cwd = process.cwd();
|
|
49
58
|
const archMdPath = join(cwd, "ARCHITECTURE.md");
|
|
50
59
|
const archonDir = join(cwd, ".archon");
|
|
51
|
-
console.log(chalk.blue("\n
|
|
60
|
+
console.log(chalk.blue("\n[INIT] ArchonDev Initialization\n"));
|
|
52
61
|
if (existsSync(archMdPath)) {
|
|
53
62
|
const overwrite = await promptYesNo("ARCHITECTURE.md already exists. Overwrite?", false);
|
|
54
63
|
if (!overwrite) {
|
|
@@ -21,7 +21,7 @@ function formatStatus(status) {
|
|
|
21
21
|
case "completed":
|
|
22
22
|
return chalk.green("\u2713 completed");
|
|
23
23
|
case "needs_fix":
|
|
24
|
-
return chalk.red("
|
|
24
|
+
return chalk.red("[!] needs_fix");
|
|
25
25
|
default:
|
|
26
26
|
return status;
|
|
27
27
|
}
|
|
@@ -448,7 +448,7 @@ async function reviewPlan() {
|
|
|
448
448
|
console.log(` ${task.fixPlan}`);
|
|
449
449
|
}
|
|
450
450
|
if (task.architectureImpact) {
|
|
451
|
-
console.log(chalk.yellow("
|
|
451
|
+
console.log(chalk.yellow(" [!] Architecture Impact:"));
|
|
452
452
|
console.log(` ${task.architectureImpact}`);
|
|
453
453
|
}
|
|
454
454
|
console.log();
|
|
@@ -397,7 +397,7 @@ Atom saved: ${atom.externalId}`));
|
|
|
397
397
|
console.log(chalk.dim(`Next: Configure API key and run "archon plan ${atom.externalId} --continue"`));
|
|
398
398
|
return;
|
|
399
399
|
}
|
|
400
|
-
console.log(chalk.blue("\
|
|
400
|
+
console.log(chalk.blue("\nStarting adversarial planning..."));
|
|
401
401
|
console.log(chalk.dim("Architect will generate a plan, Sentinel will validate it.\n"));
|
|
402
402
|
const planner = new AdversarialPlanner({ apiKey });
|
|
403
403
|
const planResult = await planner.planAtom(atom, parseResult.schema);
|
|
@@ -487,7 +487,7 @@ function displayPlan(plan2) {
|
|
|
487
487
|
if (plan2.risks.length > 0) {
|
|
488
488
|
console.log(chalk.bold("\nRisks:"));
|
|
489
489
|
for (const risk of plan2.risks) {
|
|
490
|
-
console.log(chalk.yellow(`
|
|
490
|
+
console.log(chalk.yellow(` [!] ${risk}`));
|
|
491
491
|
}
|
|
492
492
|
}
|
|
493
493
|
console.log(chalk.bold("\nComplexity:"), plan2.estimated_complexity);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
loadAtom
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-RCW22YNI.js";
|
|
4
4
|
|
|
5
5
|
// src/cli/parallel.ts
|
|
6
6
|
import chalk from "chalk";
|
|
@@ -155,7 +155,7 @@ async function parallelExecute(atomIds) {
|
|
|
155
155
|
const completed = state.executions.filter((e) => e.status === "completed").length;
|
|
156
156
|
const failed = state.executions.filter((e) => e.status === "failed").length;
|
|
157
157
|
console.log(chalk.blue(`
|
|
158
|
-
|
|
158
|
+
Parallel execution complete:`));
|
|
159
159
|
console.log(chalk.green(` \u2713 Completed: ${completed}`));
|
|
160
160
|
if (failed > 0) {
|
|
161
161
|
console.log(chalk.red(` \u2717 Failed: ${failed}`));
|
|
@@ -171,7 +171,7 @@ async function parallelStatus() {
|
|
|
171
171
|
console.log(chalk.dim("No parallel executions found."));
|
|
172
172
|
return;
|
|
173
173
|
}
|
|
174
|
-
console.log(chalk.blue("\
|
|
174
|
+
console.log(chalk.blue("\nParallel Execution Status\n"));
|
|
175
175
|
for (const execution of state.executions) {
|
|
176
176
|
const statusIcon = execution.status === "completed" ? chalk.green("\u2713") : execution.status === "failed" ? chalk.red("\u2717") : execution.status === "running" ? chalk.yellow("\u25CF") : chalk.dim("\u25CB");
|
|
177
177
|
console.log(`${statusIcon} ${execution.atomId}`);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
execute
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-3NPZQOK2.js";
|
|
4
4
|
import "./chunk-M4LGRTLC.js";
|
|
5
|
-
import "./chunk-
|
|
5
|
+
import "./chunk-RCW22YNI.js";
|
|
6
6
|
import "./chunk-5IQKC2TD.js";
|
|
7
7
|
import "./chunk-A7QU6JC6.js";
|
|
8
8
|
import "./chunk-SMR7JQK6.js";
|
package/dist/index.js
CHANGED
|
@@ -7,13 +7,13 @@ import {
|
|
|
7
7
|
cloudLogs,
|
|
8
8
|
cloudStatus,
|
|
9
9
|
execute
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-3NPZQOK2.js";
|
|
11
11
|
import {
|
|
12
12
|
list
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-TEY4GCMH.js";
|
|
14
14
|
import {
|
|
15
15
|
bugReport
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-KF6MFAB4.js";
|
|
17
17
|
import {
|
|
18
18
|
addKey,
|
|
19
19
|
listKeys,
|
|
@@ -31,7 +31,7 @@ import {
|
|
|
31
31
|
reviewShow,
|
|
32
32
|
reviewStatus,
|
|
33
33
|
reviewUpdate
|
|
34
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-QSYKKPFF.js";
|
|
35
35
|
import "./chunk-VKM3HAHW.js";
|
|
36
36
|
import {
|
|
37
37
|
listModels,
|
|
@@ -40,7 +40,7 @@ import {
|
|
|
40
40
|
setPreference,
|
|
41
41
|
showExecutionPreferences,
|
|
42
42
|
showPreferences
|
|
43
|
-
} from "./chunk-
|
|
43
|
+
} from "./chunk-F3RLDQTQ.js";
|
|
44
44
|
import {
|
|
45
45
|
login,
|
|
46
46
|
logout,
|
|
@@ -54,17 +54,17 @@ import {
|
|
|
54
54
|
import {
|
|
55
55
|
init,
|
|
56
56
|
isInitialized
|
|
57
|
-
} from "./chunk-
|
|
57
|
+
} from "./chunk-P666JE3G.js";
|
|
58
58
|
import {
|
|
59
59
|
parallelClean,
|
|
60
60
|
parallelMerge,
|
|
61
61
|
parallelStatus
|
|
62
|
-
} from "./chunk-
|
|
62
|
+
} from "./chunk-TSSFMB6E.js";
|
|
63
63
|
import {
|
|
64
64
|
listLocalAtoms,
|
|
65
65
|
loadAtom,
|
|
66
66
|
plan
|
|
67
|
-
} from "./chunk-
|
|
67
|
+
} from "./chunk-RCW22YNI.js";
|
|
68
68
|
import {
|
|
69
69
|
ArchitectAgent
|
|
70
70
|
} from "./chunk-5IQKC2TD.js";
|
|
@@ -212,7 +212,7 @@ async function show(atomId) {
|
|
|
212
212
|
console.log("");
|
|
213
213
|
console.log(chalk2.bold("Risks:"));
|
|
214
214
|
for (const risk of atom.plan.risks) {
|
|
215
|
-
console.log(chalk2.yellow(`
|
|
215
|
+
console.log(chalk2.yellow(` [!] ${risk}`));
|
|
216
216
|
}
|
|
217
217
|
}
|
|
218
218
|
console.log("");
|
|
@@ -870,15 +870,25 @@ async function runAutoCleanupCheck(cwd) {
|
|
|
870
870
|
}
|
|
871
871
|
|
|
872
872
|
// src/cli/start.ts
|
|
873
|
-
async function start() {
|
|
873
|
+
async function start(options = {}) {
|
|
874
874
|
const cwd = process.cwd();
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
875
|
+
if (!options.skipGovernanceBanner) {
|
|
876
|
+
console.log(chalk4.bold("\nArchonDev - AI-Powered Development Governance"));
|
|
877
|
+
console.log(chalk4.blue("\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\n"));
|
|
878
|
+
}
|
|
879
|
+
const token = await getAuthToken();
|
|
880
|
+
if (!token) {
|
|
881
|
+
console.log(chalk4.yellow("[!] Not logged in"));
|
|
882
|
+
const shouldLogin = await promptYesNo("Would you like to login now?", true);
|
|
883
|
+
if (shouldLogin) {
|
|
884
|
+
await login();
|
|
885
|
+
console.log();
|
|
886
|
+
}
|
|
887
|
+
}
|
|
878
888
|
const contextManager = new ContextManager();
|
|
879
889
|
const pendingAtomsData = await contextManager.getPendingAtomsData(cwd);
|
|
880
890
|
if (pendingAtomsData && pendingAtomsData.atoms.length > 0) {
|
|
881
|
-
console.log(chalk4.yellow("
|
|
891
|
+
console.log(chalk4.yellow("[!] Previous session had pending atoms:\n"));
|
|
882
892
|
for (const atomId of pendingAtomsData.atoms) {
|
|
883
893
|
console.log(chalk4.dim(` \u2022 ${atomId}`));
|
|
884
894
|
}
|
|
@@ -899,8 +909,10 @@ async function start() {
|
|
|
899
909
|
}
|
|
900
910
|
}
|
|
901
911
|
const projectState = detectProjectState(cwd);
|
|
902
|
-
|
|
903
|
-
|
|
912
|
+
if (!options.skipGovernanceBanner) {
|
|
913
|
+
const governanceStatus = await gatherGovernanceStatus(cwd);
|
|
914
|
+
await displayGovernanceBanner(governanceStatus);
|
|
915
|
+
}
|
|
904
916
|
if (await shouldRunAutoCleanup(cwd)) {
|
|
905
917
|
await runAutoCleanupCheck(cwd);
|
|
906
918
|
}
|
|
@@ -1028,16 +1040,21 @@ async function gatherGovernanceStatus(cwd) {
|
|
|
1028
1040
|
}
|
|
1029
1041
|
return status2;
|
|
1030
1042
|
}
|
|
1031
|
-
function displayGovernanceBanner(status2) {
|
|
1032
|
-
console.log(chalk4.
|
|
1033
|
-
console.log(chalk4.
|
|
1034
|
-
console.log(chalk4.blue("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501"));
|
|
1043
|
+
async function displayGovernanceBanner(status2) {
|
|
1044
|
+
console.log(chalk4.bold("Governance Status"));
|
|
1045
|
+
console.log(chalk4.blue("\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"));
|
|
1035
1046
|
if (status2.hasArchitecture) {
|
|
1036
1047
|
console.log(chalk4.green(" \u2713") + ` ARCHITECTURE.md loaded (${status2.posture} posture)`);
|
|
1037
1048
|
console.log(chalk4.green(" \u2713") + ` ${status2.invariantsCount} invariants enforced`);
|
|
1038
1049
|
console.log(chalk4.green(" \u2713") + ` ${status2.protectedPathsCount} protected paths defined`);
|
|
1039
1050
|
} else {
|
|
1040
|
-
console.log(chalk4.yellow("
|
|
1051
|
+
console.log(chalk4.yellow(" [!]") + " ARCHITECTURE.md not found.");
|
|
1052
|
+
const shouldInit = await promptYesNo("Would you like to initialize now?", true);
|
|
1053
|
+
if (shouldInit) {
|
|
1054
|
+
const { init: init2 } = await import("./init-6EXMDCWC.js");
|
|
1055
|
+
await init2({ analyze: true, git: true });
|
|
1056
|
+
console.log();
|
|
1057
|
+
}
|
|
1041
1058
|
}
|
|
1042
1059
|
console.log(chalk4.green(" \u2713") + ` ${status2.dependencyRulesCount} dependency rules active`);
|
|
1043
1060
|
if (status2.lastSessionDate) {
|
|
@@ -1047,10 +1064,10 @@ function displayGovernanceBanner(status2) {
|
|
|
1047
1064
|
console.log();
|
|
1048
1065
|
console.log(chalk4.cyan(` Pending: ${status2.pendingAtomsCount} atoms ready for execution`));
|
|
1049
1066
|
}
|
|
1050
|
-
console.log(
|
|
1067
|
+
console.log();
|
|
1051
1068
|
}
|
|
1052
1069
|
async function handleNewProject(cwd, state) {
|
|
1053
|
-
console.log(chalk4.
|
|
1070
|
+
console.log(chalk4.bold("Starting a new project? Great!\n"));
|
|
1054
1071
|
console.log(chalk4.dim("I'll ask you a few quick questions to set things up right."));
|
|
1055
1072
|
console.log(chalk4.dim("Answer as much or as little as you want \u2014 you can always refine later.\n"));
|
|
1056
1073
|
console.log(chalk4.bold("What would you like to do?\n"));
|
|
@@ -1079,7 +1096,7 @@ async function handleNewProject(cwd, state) {
|
|
|
1079
1096
|
}
|
|
1080
1097
|
}
|
|
1081
1098
|
async function runNewProjectInterview(cwd) {
|
|
1082
|
-
console.log(chalk4.blue("\n
|
|
1099
|
+
console.log(chalk4.blue("\n-- Project Interview --\n"));
|
|
1083
1100
|
console.log(chalk4.bold("Phase 1: The Vision\n"));
|
|
1084
1101
|
const projectName = await prompt("What's the project name?");
|
|
1085
1102
|
const projectDescription = await prompt("In one sentence, what does this project do?");
|
|
@@ -1110,8 +1127,8 @@ async function runNewProjectInterview(cwd) {
|
|
|
1110
1127
|
console.log(chalk4.bold("\nPhase 3: Preferences ") + chalk4.dim("(press Enter to skip)\n"));
|
|
1111
1128
|
const protectedFiles = await prompt("Any files AI should NEVER modify without asking? (comma-separated)");
|
|
1112
1129
|
const noNoPatterns = await prompt('Anything AI should NEVER do? (e.g., "no console.log")');
|
|
1113
|
-
console.log(chalk4.blue("\n
|
|
1114
|
-
const { init: init2 } = await import("./init-
|
|
1130
|
+
console.log(chalk4.blue("\n-- Generating Project Files --\n"));
|
|
1131
|
+
const { init: init2 } = await import("./init-6EXMDCWC.js");
|
|
1115
1132
|
await init2({ analyze: false, git: true });
|
|
1116
1133
|
const today = (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
|
|
1117
1134
|
const progressEntry = `
|
|
@@ -1151,14 +1168,14 @@ ${noNoPatterns ? `- **Forbidden patterns:** ${noNoPatterns}` : "- No forbidden p
|
|
|
1151
1168
|
if (continueChoice) {
|
|
1152
1169
|
const description = await prompt("Describe what you want to build first");
|
|
1153
1170
|
if (description.trim()) {
|
|
1154
|
-
const { plan: plan2 } = await import("./plan-
|
|
1171
|
+
const { plan: plan2 } = await import("./plan-W2UXAR6E.js");
|
|
1155
1172
|
await plan2(description, {});
|
|
1156
1173
|
}
|
|
1157
1174
|
}
|
|
1158
1175
|
}
|
|
1159
1176
|
async function quickStart(cwd) {
|
|
1160
|
-
console.log(chalk4.blue("\n
|
|
1161
|
-
const { init: init2 } = await import("./init-
|
|
1177
|
+
console.log(chalk4.blue("\n-- Quick Start --\n"));
|
|
1178
|
+
const { init: init2 } = await import("./init-6EXMDCWC.js");
|
|
1162
1179
|
await init2({ analyze: false, git: true });
|
|
1163
1180
|
const today = (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
|
|
1164
1181
|
const progressPath = join4(cwd, "progress.txt");
|
|
@@ -1184,7 +1201,7 @@ This file tracks learnings and decisions across sessions.
|
|
|
1184
1201
|
await showMainMenu();
|
|
1185
1202
|
}
|
|
1186
1203
|
async function handleAdaptExisting(cwd, state) {
|
|
1187
|
-
console.log(chalk4.
|
|
1204
|
+
console.log(chalk4.bold("Existing project detected!\n"));
|
|
1188
1205
|
console.log(chalk4.dim("I can analyze your codebase and adapt the governance files to match your structure."));
|
|
1189
1206
|
console.log(chalk4.dim("This helps me understand your architecture without changing any code.\n"));
|
|
1190
1207
|
console.log(chalk4.bold("What would you like to do?\n"));
|
|
@@ -1216,8 +1233,8 @@ async function handleAdaptExisting(cwd, state) {
|
|
|
1216
1233
|
}
|
|
1217
1234
|
}
|
|
1218
1235
|
async function analyzeAndAdapt(cwd) {
|
|
1219
|
-
console.log(chalk4.blue("\n
|
|
1220
|
-
const { init: init2 } = await import("./init-
|
|
1236
|
+
console.log(chalk4.blue("\n-- Analyzing Project --\n"));
|
|
1237
|
+
const { init: init2 } = await import("./init-6EXMDCWC.js");
|
|
1221
1238
|
await init2({ analyze: true, git: true });
|
|
1222
1239
|
const today = (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
|
|
1223
1240
|
const progressPath = join4(cwd, "progress.txt");
|
|
@@ -1242,9 +1259,9 @@ async function analyzeAndAdapt(cwd) {
|
|
|
1242
1259
|
await showMainMenu();
|
|
1243
1260
|
}
|
|
1244
1261
|
async function codeReviewFirst(cwd) {
|
|
1245
|
-
console.log(chalk4.blue("\n
|
|
1262
|
+
console.log(chalk4.blue("\n-- Code Review Mode --\n"));
|
|
1246
1263
|
console.log(chalk4.dim("I'll analyze your code for issues without making any changes.\n"));
|
|
1247
|
-
const { reviewInit: reviewInit2, reviewAnalyze: reviewAnalyze2, reviewRun: reviewRun2 } = await import("./review-
|
|
1264
|
+
const { reviewInit: reviewInit2, reviewAnalyze: reviewAnalyze2, reviewRun: reviewRun2 } = await import("./review-QV4TQM2Z.js");
|
|
1248
1265
|
const reviewDbPath = join4(cwd, "docs", "code-review", "review-tasks.db");
|
|
1249
1266
|
if (!existsSync4(reviewDbPath)) {
|
|
1250
1267
|
await reviewInit2();
|
|
@@ -1257,9 +1274,9 @@ async function codeReviewFirst(cwd) {
|
|
|
1257
1274
|
console.log(chalk4.dim("\nAfter reviewing, you can run ") + chalk4.cyan("archon") + chalk4.dim(" again to set up governance.\n"));
|
|
1258
1275
|
}
|
|
1259
1276
|
async function manualSetup(cwd) {
|
|
1260
|
-
console.log(chalk4.blue("\n
|
|
1277
|
+
console.log(chalk4.blue("\n-- Manual Setup --\n"));
|
|
1261
1278
|
console.log(chalk4.dim("Creating template files. You can customize them manually.\n"));
|
|
1262
|
-
const { init: init2 } = await import("./init-
|
|
1279
|
+
const { init: init2 } = await import("./init-6EXMDCWC.js");
|
|
1263
1280
|
await init2({ analyze: false, git: true });
|
|
1264
1281
|
console.log(chalk4.bold("\nWhat to customize:\n"));
|
|
1265
1282
|
console.log(` ${chalk4.cyan("1. ARCHITECTURE.md")} \u2014 Update components to match your folders`);
|
|
@@ -1269,8 +1286,8 @@ async function manualSetup(cwd) {
|
|
|
1269
1286
|
await showMainMenu();
|
|
1270
1287
|
}
|
|
1271
1288
|
async function quickAdapt(cwd) {
|
|
1272
|
-
console.log(chalk4.blue("\n
|
|
1273
|
-
const { init: init2 } = await import("./init-
|
|
1289
|
+
console.log(chalk4.blue("\n> Using defaults \u2014 let's go!\n"));
|
|
1290
|
+
const { init: init2 } = await import("./init-6EXMDCWC.js");
|
|
1274
1291
|
await init2({ analyze: true, git: true });
|
|
1275
1292
|
const today = (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
|
|
1276
1293
|
const progressPath = join4(cwd, "progress.txt");
|
|
@@ -1288,7 +1305,7 @@ async function quickAdapt(cwd) {
|
|
|
1288
1305
|
await showMainMenu();
|
|
1289
1306
|
}
|
|
1290
1307
|
async function handleContinueSession(cwd, state) {
|
|
1291
|
-
console.log(chalk4.
|
|
1308
|
+
console.log(chalk4.bold("Welcome back!\n"));
|
|
1292
1309
|
if (state.lastProgressEntry) {
|
|
1293
1310
|
console.log(chalk4.dim("Last activity:"));
|
|
1294
1311
|
console.log(chalk4.dim(" " + state.lastProgressEntry.split("\n")[0]));
|
|
@@ -1296,7 +1313,7 @@ async function handleContinueSession(cwd, state) {
|
|
|
1296
1313
|
}
|
|
1297
1314
|
const handoff = checkForHandoff(cwd);
|
|
1298
1315
|
if (handoff) {
|
|
1299
|
-
console.log(chalk4.yellow("
|
|
1316
|
+
console.log(chalk4.yellow("[HANDOFF] Found from last session:\n"));
|
|
1300
1317
|
console.log(chalk4.dim(handoff.nextSteps));
|
|
1301
1318
|
console.log();
|
|
1302
1319
|
const continueHandoff = await promptYesNo("Continue from handoff?", true);
|
|
@@ -1365,27 +1382,27 @@ async function showReviewProgress(cwd) {
|
|
|
1365
1382
|
const pending = stats.pending + stats.inReview;
|
|
1366
1383
|
const needsFix = stats.needsFix;
|
|
1367
1384
|
console.log(
|
|
1368
|
-
chalk4.blue("
|
|
1385
|
+
chalk4.blue("Review Progress:") + chalk4.dim(` ${completed}/${total} completed`) + (needsFix > 0 ? chalk4.red(` (${needsFix} need fixes)`) : "") + (pending > 0 ? chalk4.yellow(` (${pending} pending)`) : "")
|
|
1369
1386
|
);
|
|
1370
1387
|
console.log();
|
|
1371
1388
|
} catch {
|
|
1372
1389
|
}
|
|
1373
1390
|
}
|
|
1374
1391
|
async function planTask() {
|
|
1375
|
-
const { plan: plan2 } = await import("./plan-
|
|
1392
|
+
const { plan: plan2 } = await import("./plan-W2UXAR6E.js");
|
|
1376
1393
|
const description = await prompt("Describe what you want to build");
|
|
1377
1394
|
if (description.trim()) {
|
|
1378
1395
|
await plan2(description, {});
|
|
1379
1396
|
}
|
|
1380
1397
|
}
|
|
1381
1398
|
async function listAtoms() {
|
|
1382
|
-
const { list: list2 } = await import("./list-
|
|
1399
|
+
const { list: list2 } = await import("./list-LEFAISNL.js");
|
|
1383
1400
|
await list2({});
|
|
1384
1401
|
}
|
|
1385
1402
|
async function executeNext() {
|
|
1386
|
-
const { listLocalAtoms: listLocalAtoms2 } = await import("./plan-
|
|
1403
|
+
const { listLocalAtoms: listLocalAtoms2 } = await import("./plan-W2UXAR6E.js");
|
|
1387
1404
|
const { analyzeProject, getComplexityDescription, getModeDescription } = await import("./orchestration-X6LHSHBJ.js");
|
|
1388
|
-
const { loadExecutionPreferences } = await import("./preferences-
|
|
1405
|
+
const { loadExecutionPreferences } = await import("./preferences-3Z4OCNTT.js");
|
|
1389
1406
|
const cwd = process.cwd();
|
|
1390
1407
|
const atoms = await listLocalAtoms2();
|
|
1391
1408
|
const pendingAtoms = atoms.filter((a) => a.status === "READY" || a.status === "IN_PROGRESS");
|
|
@@ -1396,7 +1413,7 @@ async function executeNext() {
|
|
|
1396
1413
|
if (pendingAtoms.length > 1) {
|
|
1397
1414
|
const analysis = analyzeProject(pendingAtoms);
|
|
1398
1415
|
const prefs = await loadExecutionPreferences(cwd);
|
|
1399
|
-
console.log(chalk4.blue("\n
|
|
1416
|
+
console.log(chalk4.blue("\n-- Project Analysis --\n"));
|
|
1400
1417
|
console.log(` ${chalk4.bold("Atoms:")} ${analysis.atomCount}`);
|
|
1401
1418
|
console.log(` ${chalk4.bold("Estimated:")} ${analysis.estimatedMinutes} minutes`);
|
|
1402
1419
|
console.log(` ${chalk4.bold("Complexity:")} ${analysis.complexity} - ${getComplexityDescription(analysis.complexity)}`);
|
|
@@ -1418,14 +1435,14 @@ async function executeNext() {
|
|
|
1418
1435
|
const atomId = await prompt("Enter atom ID to execute (or press Enter for first pending)");
|
|
1419
1436
|
const targetId = atomId.trim() || pendingAtoms[0]?.id;
|
|
1420
1437
|
if (targetId) {
|
|
1421
|
-
const { execute: execute2 } = await import("./execute-
|
|
1438
|
+
const { execute: execute2 } = await import("./execute-5ZSLSWPZ.js");
|
|
1422
1439
|
await execute2(targetId, {});
|
|
1423
1440
|
} else {
|
|
1424
1441
|
console.log(chalk4.yellow("No atom to execute."));
|
|
1425
1442
|
}
|
|
1426
1443
|
}
|
|
1427
1444
|
async function reportBug() {
|
|
1428
|
-
const { bugReport: bugReport2 } = await import("./bug-
|
|
1445
|
+
const { bugReport: bugReport2 } = await import("./bug-K4V357B2.js");
|
|
1429
1446
|
const title = await prompt("Bug title");
|
|
1430
1447
|
if (title.trim()) {
|
|
1431
1448
|
await bugReport2(title, {});
|
|
@@ -1436,7 +1453,7 @@ async function viewStatus() {
|
|
|
1436
1453
|
await status2();
|
|
1437
1454
|
}
|
|
1438
1455
|
async function settingsMenu() {
|
|
1439
|
-
const { interactiveSettings } = await import("./preferences-
|
|
1456
|
+
const { interactiveSettings } = await import("./preferences-3Z4OCNTT.js");
|
|
1440
1457
|
await interactiveSettings();
|
|
1441
1458
|
await showMainMenu();
|
|
1442
1459
|
}
|
|
@@ -1445,7 +1462,7 @@ async function reviewCode() {
|
|
|
1445
1462
|
const reviewDbPath = join4(cwd, "docs", "code-review", "review-tasks.db");
|
|
1446
1463
|
if (!existsSync4(reviewDbPath)) {
|
|
1447
1464
|
console.log(chalk4.dim("Code review not initialized. Starting setup...\n"));
|
|
1448
|
-
const { reviewInit: reviewInit2 } = await import("./review-
|
|
1465
|
+
const { reviewInit: reviewInit2 } = await import("./review-QV4TQM2Z.js");
|
|
1449
1466
|
await reviewInit2();
|
|
1450
1467
|
console.log();
|
|
1451
1468
|
}
|
|
@@ -1460,27 +1477,27 @@ async function reviewCode() {
|
|
|
1460
1477
|
const choice = await prompt("Enter choice");
|
|
1461
1478
|
switch (choice.toLowerCase()) {
|
|
1462
1479
|
case "1": {
|
|
1463
|
-
const { reviewAnalyze: reviewAnalyze2 } = await import("./review-
|
|
1480
|
+
const { reviewAnalyze: reviewAnalyze2 } = await import("./review-QV4TQM2Z.js");
|
|
1464
1481
|
await reviewAnalyze2();
|
|
1465
1482
|
break;
|
|
1466
1483
|
}
|
|
1467
1484
|
case "2": {
|
|
1468
|
-
const { reviewStatus: reviewStatus2 } = await import("./review-
|
|
1485
|
+
const { reviewStatus: reviewStatus2 } = await import("./review-QV4TQM2Z.js");
|
|
1469
1486
|
await reviewStatus2();
|
|
1470
1487
|
break;
|
|
1471
1488
|
}
|
|
1472
1489
|
case "3": {
|
|
1473
|
-
const { reviewNext: reviewNext2 } = await import("./review-
|
|
1490
|
+
const { reviewNext: reviewNext2 } = await import("./review-QV4TQM2Z.js");
|
|
1474
1491
|
await reviewNext2();
|
|
1475
1492
|
break;
|
|
1476
1493
|
}
|
|
1477
1494
|
case "4": {
|
|
1478
|
-
const { reviewList: reviewList2 } = await import("./review-
|
|
1495
|
+
const { reviewList: reviewList2 } = await import("./review-QV4TQM2Z.js");
|
|
1479
1496
|
await reviewList2({});
|
|
1480
1497
|
break;
|
|
1481
1498
|
}
|
|
1482
1499
|
case "5": {
|
|
1483
|
-
const { reviewRun: reviewRun2 } = await import("./review-
|
|
1500
|
+
const { reviewRun: reviewRun2 } = await import("./review-QV4TQM2Z.js");
|
|
1484
1501
|
await reviewRun2({ all: true });
|
|
1485
1502
|
break;
|
|
1486
1503
|
}
|
|
@@ -1661,7 +1678,7 @@ async function showHistory(options = {}) {
|
|
|
1661
1678
|
const usage = data;
|
|
1662
1679
|
spinner.stop();
|
|
1663
1680
|
console.log();
|
|
1664
|
-
console.log(chalk5.bold("
|
|
1681
|
+
console.log(chalk5.bold("Usage History"));
|
|
1665
1682
|
console.log();
|
|
1666
1683
|
if (!usage || usage.length === 0) {
|
|
1667
1684
|
console.log(chalk5.dim(" No usage recorded yet."));
|
|
@@ -1747,7 +1764,7 @@ async function manageBudget(options = {}) {
|
|
|
1747
1764
|
}
|
|
1748
1765
|
spinner.stop();
|
|
1749
1766
|
console.log();
|
|
1750
|
-
console.log(chalk5.bold("
|
|
1767
|
+
console.log(chalk5.bold("Monthly Budget"));
|
|
1751
1768
|
console.log();
|
|
1752
1769
|
if (profile.monthly_budget_cents === null) {
|
|
1753
1770
|
console.log(` Budget: ${chalk5.dim("No limit set")}`);
|
|
@@ -2195,7 +2212,7 @@ Examples:
|
|
|
2195
2212
|
process.exit(0);
|
|
2196
2213
|
}
|
|
2197
2214
|
console.log(chalk6.yellow(`
|
|
2198
|
-
|
|
2215
|
+
[!] Found ${result.impacts.length} dependency impact(s):
|
|
2199
2216
|
`));
|
|
2200
2217
|
for (const impact of result.impacts) {
|
|
2201
2218
|
const severityColor = impact.rule.severity === "BLOCKER" ? chalk6.red : impact.rule.severity === "WARNING" ? chalk6.yellow : chalk6.blue;
|
|
@@ -2516,7 +2533,7 @@ async function a11yCheck(options) {
|
|
|
2516
2533
|
console.log(chalk7.dim("Note: Run manual testing with screen readers for full compliance.\n"));
|
|
2517
2534
|
return;
|
|
2518
2535
|
}
|
|
2519
|
-
console.log(chalk7.red(
|
|
2536
|
+
console.log(chalk7.red(`[!] ${issues.length} Accessibility Issues Found
|
|
2520
2537
|
`));
|
|
2521
2538
|
const criticalCount = issues.filter((i) => i.severity === "critical").length;
|
|
2522
2539
|
const majorCount = issues.filter((i) => i.severity === "major").length;
|
|
@@ -2544,7 +2561,7 @@ async function a11yCheck(options) {
|
|
|
2544
2561
|
}
|
|
2545
2562
|
console.log();
|
|
2546
2563
|
}
|
|
2547
|
-
console.log(chalk7.bold.yellow("\n
|
|
2564
|
+
console.log(chalk7.bold.yellow("\n[LEGAL] Notice\n"));
|
|
2548
2565
|
console.log(chalk7.dim("Websites that don't meet accessibility standards may violate:"));
|
|
2549
2566
|
console.log(chalk7.dim(" \u2022 ADA (Americans with Disabilities Act) \u2014 US"));
|
|
2550
2567
|
console.log(chalk7.dim(" \u2022 EAA (European Accessibility Act) \u2014 EU, effective June 2025"));
|
|
@@ -2673,7 +2690,7 @@ async function a11yBadge(options) {
|
|
|
2673
2690
|
async function a11yPreDeploy() {
|
|
2674
2691
|
const prompt2 = createPrompt();
|
|
2675
2692
|
try {
|
|
2676
|
-
console.log(chalk7.blue("\n
|
|
2693
|
+
console.log(chalk7.blue("\n[CHECK] Pre-Deploy Accessibility\n"));
|
|
2677
2694
|
console.log(chalk7.dim("Before deploying a live website, accessibility compliance is required.\n"));
|
|
2678
2695
|
await a11yCheck({});
|
|
2679
2696
|
const reportPath = join6(process.cwd(), ".archon/a11y-report.json");
|
|
@@ -2699,7 +2716,7 @@ async function a11yPreDeploy() {
|
|
|
2699
2716
|
await a11yCheck({});
|
|
2700
2717
|
return true;
|
|
2701
2718
|
} else if (choice === "2") {
|
|
2702
|
-
console.log(chalk7.yellow("\n
|
|
2719
|
+
console.log(chalk7.yellow("\n[!] Acknowledged. Proceeding without full accessibility compliance."));
|
|
2703
2720
|
console.log(chalk7.dim("Consider addressing these issues in a future session.\n"));
|
|
2704
2721
|
return true;
|
|
2705
2722
|
} else {
|
|
@@ -2840,7 +2857,7 @@ async function geoIdentity() {
|
|
|
2840
2857
|
console.log(chalk8.blue("\n\u{1F3AF} GEO Identity Generator\n"));
|
|
2841
2858
|
const { allowed, tier } = await checkStrongModelAccess();
|
|
2842
2859
|
if (!allowed) {
|
|
2843
|
-
console.log(chalk8.yellow(
|
|
2860
|
+
console.log(chalk8.yellow(`[!] Your tier (${tier}) uses basic models.`));
|
|
2844
2861
|
console.log(chalk8.dim("For better results, add credits or use BYOK mode.\n"));
|
|
2845
2862
|
}
|
|
2846
2863
|
console.log(chalk8.dim("Reading homepage and about page content...\n"));
|
|
@@ -3020,7 +3037,7 @@ async function geoFaq(options) {
|
|
|
3020
3037
|
const { identityPhrase, shortDescription } = config.geo;
|
|
3021
3038
|
const { allowed, tier } = await checkStrongModelAccess();
|
|
3022
3039
|
if (!allowed) {
|
|
3023
|
-
console.log(chalk8.yellow(
|
|
3040
|
+
console.log(chalk8.yellow(`[!] Your tier (${tier}) uses basic models.`));
|
|
3024
3041
|
console.log(chalk8.dim("For better results, add credits or use BYOK mode.\n"));
|
|
3025
3042
|
}
|
|
3026
3043
|
console.log(chalk8.dim("Generating FAQ content with AI...\n"));
|
|
@@ -3103,7 +3120,7 @@ async function geoAudit() {
|
|
|
3103
3120
|
console.log(chalk8.green("\u2705 Brand keyword in H1"));
|
|
3104
3121
|
} else {
|
|
3105
3122
|
result.issues.push("Brand phrase keyword not found in H1");
|
|
3106
|
-
console.log(chalk8.yellow("
|
|
3123
|
+
console.log(chalk8.yellow("[!] Brand keyword not in H1"));
|
|
3107
3124
|
}
|
|
3108
3125
|
const metaMatch = content.match(/<meta[^>]*name=["']description["'][^>]*content=["']([^"']*)["']/i);
|
|
3109
3126
|
if (metaMatch?.[1] && metaMatch[1].toLowerCase().includes(firstKeyword)) {
|
|
@@ -3111,7 +3128,7 @@ async function geoAudit() {
|
|
|
3111
3128
|
console.log(chalk8.green("\u2705 Brand keyword in meta description"));
|
|
3112
3129
|
} else {
|
|
3113
3130
|
result.issues.push("Brand phrase keyword not found in meta description");
|
|
3114
|
-
console.log(chalk8.yellow("
|
|
3131
|
+
console.log(chalk8.yellow("[!] Brand keyword not in meta description"));
|
|
3115
3132
|
}
|
|
3116
3133
|
if (content.includes("application/ld+json")) {
|
|
3117
3134
|
if (content.includes('"@type":"Organization"') || content.includes('"@type": "Organization"')) {
|
|
@@ -3119,21 +3136,21 @@ async function geoAudit() {
|
|
|
3119
3136
|
console.log(chalk8.green("\u2705 Organization schema present"));
|
|
3120
3137
|
} else {
|
|
3121
3138
|
result.issues.push("Organization schema not found");
|
|
3122
|
-
console.log(chalk8.yellow("
|
|
3139
|
+
console.log(chalk8.yellow("[!] Organization schema missing"));
|
|
3123
3140
|
}
|
|
3124
3141
|
if (content.includes('"@type":"Service"') || content.includes('"@type": "Service"')) {
|
|
3125
3142
|
result.hasServiceSchema = true;
|
|
3126
3143
|
console.log(chalk8.green("\u2705 Service schema present"));
|
|
3127
3144
|
} else {
|
|
3128
3145
|
result.issues.push("Service schema not found");
|
|
3129
|
-
console.log(chalk8.yellow("
|
|
3146
|
+
console.log(chalk8.yellow("[!] Service schema missing"));
|
|
3130
3147
|
}
|
|
3131
3148
|
if (content.includes('"@type":"FAQPage"') || content.includes('"@type": "FAQPage"')) {
|
|
3132
3149
|
result.hasFAQSchema = true;
|
|
3133
3150
|
console.log(chalk8.green("\u2705 FAQPage schema present"));
|
|
3134
3151
|
} else {
|
|
3135
3152
|
result.issues.push("FAQPage schema not found");
|
|
3136
|
-
console.log(chalk8.yellow("
|
|
3153
|
+
console.log(chalk8.yellow("[!] FAQPage schema missing"));
|
|
3137
3154
|
}
|
|
3138
3155
|
} else {
|
|
3139
3156
|
result.issues.push("No JSON-LD schemas found");
|
|
@@ -3141,14 +3158,14 @@ async function geoAudit() {
|
|
|
3141
3158
|
}
|
|
3142
3159
|
} else if (htmlFiles.length === 0) {
|
|
3143
3160
|
result.issues.push("No index.html found");
|
|
3144
|
-
console.log(chalk8.yellow("
|
|
3161
|
+
console.log(chalk8.yellow("[!] No index.html found to audit"));
|
|
3145
3162
|
}
|
|
3146
3163
|
console.log();
|
|
3147
3164
|
const passed = result.issues.length === 0;
|
|
3148
3165
|
if (passed) {
|
|
3149
3166
|
console.log(chalk8.green.bold("\u2705 GEO Audit Passed"));
|
|
3150
3167
|
} else {
|
|
3151
|
-
console.log(chalk8.yellow.bold(
|
|
3168
|
+
console.log(chalk8.yellow.bold(`[!] ${result.issues.length} issue(s) found`));
|
|
3152
3169
|
console.log();
|
|
3153
3170
|
console.log(chalk8.bold("Recommendations:"));
|
|
3154
3171
|
result.issues.forEach((issue, i) => {
|
|
@@ -3366,7 +3383,7 @@ async function seoCheck(options) {
|
|
|
3366
3383
|
console.log(chalk9.dim("All essential meta tags are present."));
|
|
3367
3384
|
return;
|
|
3368
3385
|
}
|
|
3369
|
-
console.log(chalk9.yellow(
|
|
3386
|
+
console.log(chalk9.yellow(`[!] ${issues.length} SEO Issues Found
|
|
3370
3387
|
`));
|
|
3371
3388
|
const criticalCount = issues.filter((i) => i.severity === "critical").length;
|
|
3372
3389
|
const warningCount = issues.filter((i) => i.severity === "warning").length;
|
|
@@ -4487,7 +4504,7 @@ async function indexUpdate(options) {
|
|
|
4487
4504
|
}
|
|
4488
4505
|
} catch (error) {
|
|
4489
4506
|
console.log(`
|
|
4490
|
-
${chalk12.yellow(
|
|
4507
|
+
${chalk12.yellow(`[!] Skipped ${file}: ${error instanceof Error ? error.message : "Unknown error"}`)}`);
|
|
4491
4508
|
}
|
|
4492
4509
|
}
|
|
4493
4510
|
console.log("\r" + " ".repeat(70));
|
|
@@ -4735,11 +4752,12 @@ async function githubDisconnect() {
|
|
|
4735
4752
|
var program = new Command4();
|
|
4736
4753
|
program.name("archon").description("Local-first AI-powered development governance").version("1.1.0").action(async () => {
|
|
4737
4754
|
const cwd = process.cwd();
|
|
4738
|
-
|
|
4755
|
+
const wasInitialized = isInitialized(cwd);
|
|
4756
|
+
if (!wasInitialized) {
|
|
4739
4757
|
console.log(chalk14.blue("\nArchonDev is not initialized in this folder.\n"));
|
|
4740
4758
|
await init({ analyze: true, git: true });
|
|
4741
4759
|
}
|
|
4742
|
-
await start();
|
|
4760
|
+
await start({ skipGovernanceBanner: !wasInitialized });
|
|
4743
4761
|
});
|
|
4744
4762
|
program.command("login").description("Authenticate with ArchonDev").option("-p, --provider <provider>", "OAuth provider (github or google)", "github").action(async (options) => {
|
|
4745
4763
|
const provider = options.provider;
|
|
@@ -3,8 +3,8 @@ import {
|
|
|
3
3
|
parallelExecute,
|
|
4
4
|
parallelMerge,
|
|
5
5
|
parallelStatus
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-TSSFMB6E.js";
|
|
7
|
+
import "./chunk-RCW22YNI.js";
|
|
8
8
|
import "./chunk-5IQKC2TD.js";
|
|
9
9
|
import "./chunk-A7QU6JC6.js";
|
|
10
10
|
import "./chunk-SMR7JQK6.js";
|
|
@@ -7,7 +7,9 @@ import {
|
|
|
7
7
|
setPreference,
|
|
8
8
|
showExecutionPreferences,
|
|
9
9
|
showPreferences
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-F3RLDQTQ.js";
|
|
11
|
+
import "./chunk-UI4UQ24R.js";
|
|
12
|
+
import "./chunk-M4LGRTLC.js";
|
|
11
13
|
import "./chunk-SMR7JQK6.js";
|
|
12
14
|
import "./chunk-IVY5AHPS.js";
|
|
13
15
|
import "./chunk-QGM4M3NI.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "archondev",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.6",
|
|
4
4
|
"description": "Local-first AI-powered development governance system",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -57,7 +57,6 @@
|
|
|
57
57
|
"dependencies": {
|
|
58
58
|
"@anthropic-ai/sdk": "^0.71.2",
|
|
59
59
|
"@supabase/supabase-js": "^2.90.1",
|
|
60
|
-
"@types/glob": "^9.0.0",
|
|
61
60
|
"@types/node": "^25.0.9",
|
|
62
61
|
"better-sqlite3": "^12.6.2",
|
|
63
62
|
"chalk": "^5.6.2",
|