archondev 2.19.15 → 2.19.17

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.
@@ -6,7 +6,7 @@ import {
6
6
  import {
7
7
  listLocalAtoms,
8
8
  loadAtom
9
- } from "./chunk-JFUG25H7.js";
9
+ } from "./chunk-VUT5XLKM.js";
10
10
  import {
11
11
  loadConfig
12
12
  } from "./chunk-SVU7MLG6.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  listLocalAtoms
3
- } from "./chunk-JFUG25H7.js";
3
+ } from "./chunk-VUT5XLKM.js";
4
4
 
5
5
  // src/cli/list.ts
6
6
  import chalk from "chalk";
@@ -7,7 +7,7 @@ import {
7
7
  UsageRecorder,
8
8
  handleInsufficientCreditsRecovery,
9
9
  loadAtom
10
- } from "./chunk-JFUG25H7.js";
10
+ } from "./chunk-VUT5XLKM.js";
11
11
  import {
12
12
  transitionAtom
13
13
  } from "./chunk-PCTP3LKJ.js";
@@ -4797,7 +4797,7 @@ function createPrompt() {
4797
4797
  }
4798
4798
  async function execute(atomId, options) {
4799
4799
  if (options.parallel && options.parallel.length > 0) {
4800
- const { parallelExecute } = await import("./parallel-ZBFFEUBW.js");
4800
+ const { parallelExecute } = await import("./parallel-3JTGAHOS.js");
4801
4801
  const allAtomIds = [atomId, ...options.parallel];
4802
4802
  await parallelExecute(allAtomIds, { skipGates: options.skipGates === true });
4803
4803
  return;
@@ -831,6 +831,7 @@ function createPrompt() {
831
831
  }
832
832
  async function plan(description, options) {
833
833
  const prompt2 = createPrompt();
834
+ const conversational = options.conversational === true;
834
835
  try {
835
836
  if (!await isAuthenticated()) {
836
837
  console.log(chalk2.yellow('Not authenticated. Run "archon login" first.'));
@@ -865,25 +866,30 @@ async function plan(description, options) {
865
866
  for (const missing of missingFiles) {
866
867
  console.log(chalk2.yellow(` - ${missing}`));
867
868
  }
868
- console.log(chalk2.dim("\nHow would you like to proceed?"));
869
- console.log(chalk2.dim(" 1) Cancel planning and add the missing files"));
870
- console.log(chalk2.dim(" 2) Continue and mark missing files as required"));
871
- console.log(chalk2.dim(" 3) Continue with default placeholders"));
872
- const proceedChoice = await prompt2.ask("Choose 1/2/3 (default: 1): ");
873
- const choice = proceedChoice.trim() || "1";
874
- if (choice === "1") {
875
- console.log(chalk2.dim("Planning cancelled."));
876
- return;
877
- }
878
- if (choice === "2") {
869
+ if (conversational) {
870
+ console.log(chalk2.dim("Continuing for now and marking missing inputs as required."));
879
871
  missingFiles.forEach((file) => requirements.push(`Missing input required: ${file}`));
880
- }
881
- if (choice === "3") {
882
- missingFiles.forEach((file) => requirements.push(`Use default placeholder for missing input: ${file}`));
872
+ } else {
873
+ console.log(chalk2.dim("\nHow would you like to proceed?"));
874
+ console.log(chalk2.dim(" 1) Cancel planning and add the missing files"));
875
+ console.log(chalk2.dim(" 2) Continue and mark missing files as required"));
876
+ console.log(chalk2.dim(" 3) Continue with default placeholders"));
877
+ const proceedChoice = await prompt2.ask("Choose 1/2/3 (default: 1): ");
878
+ const choice = proceedChoice.trim() || "1";
879
+ if (choice === "1") {
880
+ console.log(chalk2.dim("Planning cancelled."));
881
+ return;
882
+ }
883
+ if (choice === "2") {
884
+ missingFiles.forEach((file) => requirements.push(`Missing input required: ${file}`));
885
+ }
886
+ if (choice === "3") {
887
+ missingFiles.forEach((file) => requirements.push(`Use default placeholder for missing input: ${file}`));
888
+ }
883
889
  }
884
890
  }
885
891
  }
886
- const deliverableTarget = await promptForDeliverableTarget(
892
+ const deliverableTarget = conversational ? null : await promptForDeliverableTarget(
887
893
  prompt2,
888
894
  requirements,
889
895
  references
@@ -894,9 +900,11 @@ async function plan(description, options) {
894
900
  if (requirements.length > 0) {
895
901
  console.log(chalk2.dim("\nDetected requirements:"));
896
902
  requirements.forEach((req, i) => console.log(` ${i + 1}. ${req}`));
897
- const confirm = await prompt2.ask("\nUse these as acceptance criteria? (Y/n): ");
898
- if (confirm.toLowerCase() === "n") {
899
- requirements.length = 0;
903
+ if (!conversational) {
904
+ const confirm = await prompt2.ask("\nUse these as acceptance criteria? (Y/n): ");
905
+ if (confirm.toLowerCase() === "n") {
906
+ requirements.length = 0;
907
+ }
900
908
  }
901
909
  }
902
910
  let classification = classifyTaskIntent({
@@ -906,18 +914,13 @@ async function plan(description, options) {
906
914
  deliverableTarget: deliverableTarget ?? void 0
907
915
  });
908
916
  if (classification.kind === "mixed" && classification.confidence === "low") {
909
- const clarifiedKind = await promptForTaskKindClarification(prompt2, description);
910
- if (clarifiedKind) {
911
- classification = {
912
- ...classification,
913
- kind: clarifiedKind,
914
- confidence: "high",
915
- signals: [...classification.signals, `user:${clarifiedKind}`]
916
- };
917
- }
917
+ classification = {
918
+ ...classification,
919
+ confidence: "medium"
920
+ };
918
921
  }
919
922
  const isContentOnlyTask = classification.kind === "content";
920
- const designApproved = await promptForDesignApproval(prompt2, {
923
+ const designApproved = conversational ? true : await promptForDesignApproval(prompt2, {
921
924
  description,
922
925
  requirements,
923
926
  references,
@@ -1329,28 +1332,6 @@ ${input.requirements.join("\n")}`.toLowerCase();
1329
1332
  }
1330
1333
  return { kind, confidence, contentScore, codeScore, signals };
1331
1334
  }
1332
- async function promptForTaskKindClarification(prompt2, description) {
1333
- console.log(chalk2.yellow("\nThis request can be interpreted in multiple ways."));
1334
- console.log(chalk2.dim("To keep planning on track, choose the primary outcome:"));
1335
- console.log(chalk2.dim(" 1) Content deliverable (PDF/docs/slides/report)"));
1336
- console.log(chalk2.dim(" 2) Code implementation (features/refactors/tests)"));
1337
- console.log(chalk2.dim(" Enter to auto-pick based on your wording."));
1338
- const answer = (await prompt2.ask("Primary outcome (1/2): ")).trim().toLowerCase();
1339
- if (answer === "1" || answer.includes("content") || answer.includes("pdf") || answer.includes("doc")) {
1340
- return "content";
1341
- }
1342
- if (answer === "2" || answer.includes("code") || answer.includes("implement") || answer.includes("feature")) {
1343
- return "code";
1344
- }
1345
- const normalized = description.toLowerCase();
1346
- if (/(pdf|document|report|slides?|lesson|curriculum|format)/.test(normalized)) {
1347
- return "content";
1348
- }
1349
- if (/(api|endpoint|schema|migration|typescript|javascript|python|refactor|test|lint|build)/.test(normalized)) {
1350
- return "code";
1351
- }
1352
- return null;
1353
- }
1354
1335
  function shouldFallbackToContentPlan(input) {
1355
1336
  if (input.classification.kind === "content") return true;
1356
1337
  const text = input.description.toLowerCase();
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  execute
3
- } from "./chunk-4E3LJAXF.js";
3
+ } from "./chunk-HVXBKZDF.js";
4
4
  import "./chunk-EBHHIUCB.js";
5
- import "./chunk-JFUG25H7.js";
5
+ import "./chunk-VUT5XLKM.js";
6
6
  import "./chunk-PCTP3LKJ.js";
7
7
  import "./chunk-PJRQI5UN.js";
8
8
  import "./chunk-EIEU3IIY.js";
package/dist/index.js CHANGED
@@ -47,13 +47,13 @@ import {
47
47
  parallelRunWaves,
48
48
  parallelSchedule,
49
49
  parallelStatus
50
- } from "./chunk-FP4B73CC.js";
50
+ } from "./chunk-BUFMPKXX.js";
51
51
  import {
52
52
  DependencyParser,
53
53
  EnvironmentConfigLoader,
54
54
  EnvironmentValidator,
55
55
  execute
56
- } from "./chunk-4E3LJAXF.js";
56
+ } from "./chunk-HVXBKZDF.js";
57
57
  import {
58
58
  cloudCancel,
59
59
  cloudLogs,
@@ -61,12 +61,12 @@ import {
61
61
  } from "./chunk-EBHHIUCB.js";
62
62
  import {
63
63
  list
64
- } from "./chunk-MBRWJ3SX.js";
64
+ } from "./chunk-GU7OQ5EV.js";
65
65
  import {
66
66
  listLocalAtoms,
67
67
  loadAtom,
68
68
  plan
69
- } from "./chunk-JFUG25H7.js";
69
+ } from "./chunk-VUT5XLKM.js";
70
70
  import "./chunk-PCTP3LKJ.js";
71
71
  import "./chunk-PJRQI5UN.js";
72
72
  import {
@@ -1135,6 +1135,15 @@ function detectUserIntent(message) {
1135
1135
  };
1136
1136
  }
1137
1137
  }
1138
+ const startsWithExploreRequest = /^(analy[sz]e|review|explore|scan|audit|inspect|understand|examine|look at)\b/i.test(normalized) && /\b(codebase|code|project|repo|repository|folder|directory|files)\b/i.test(normalized);
1139
+ if (startsWithExploreRequest) {
1140
+ return {
1141
+ mode: "explore",
1142
+ confidence: 0.92,
1143
+ reasoning: "User starts with explicit project/file review intent",
1144
+ suggestedAction: "execute"
1145
+ };
1146
+ }
1138
1147
  for (const pattern of APP_BUILDER_PATTERNS) {
1139
1148
  if (pattern.test(normalized)) {
1140
1149
  return {
@@ -3311,8 +3320,8 @@ async function handleNewProject(cwd, _state) {
3311
3320
  }
3312
3321
  if (intent.mode === "ad_hoc" && intent.confidence >= 0.7) {
3313
3322
  console.log(chalk6.dim("\n> Got it! Creating a task for this...\n"));
3314
- const { plan: plan2 } = await import("./plan-AR6Y4QUD.js");
3315
- await plan2(initialResponse, {});
3323
+ const { plan: plan2 } = await import("./plan-3UKVNQDT.js");
3324
+ await plan2(initialResponse, { conversational: true });
3316
3325
  return;
3317
3326
  }
3318
3327
  if (intent.mode === "app_builder" && intent.confidence >= 0.7) {
@@ -3336,8 +3345,8 @@ async function handleNewProject(cwd, _state) {
3336
3345
  }
3337
3346
  if (trimmed === "2") {
3338
3347
  console.log(chalk6.dim("\n> Creating a task for this...\n"));
3339
- const { plan: plan2 } = await import("./plan-AR6Y4QUD.js");
3340
- await plan2(initialResponse, {});
3348
+ const { plan: plan2 } = await import("./plan-3UKVNQDT.js");
3349
+ await plan2(initialResponse, { conversational: true });
3341
3350
  return;
3342
3351
  }
3343
3352
  if (trimmed === "3") {
@@ -3375,8 +3384,8 @@ async function showNewProjectMenu(cwd) {
3375
3384
  case "3": {
3376
3385
  const description = await promptWithCommands("Describe what you want to do", { allowMultiline: true });
3377
3386
  if (description.trim()) {
3378
- const { plan: plan2 } = await import("./plan-AR6Y4QUD.js");
3379
- await plan2(description, {});
3387
+ const { plan: plan2 } = await import("./plan-3UKVNQDT.js");
3388
+ await plan2(description, { conversational: true });
3380
3389
  }
3381
3390
  break;
3382
3391
  }
@@ -3457,8 +3466,8 @@ async function runExploreFlow(cwd, followUpInput) {
3457
3466
  case "1": {
3458
3467
  const description = await promptWithCommands("Describe what you want to do", { allowMultiline: true });
3459
3468
  if (description.trim()) {
3460
- const { plan: plan2 } = await import("./plan-AR6Y4QUD.js");
3461
- await plan2(description, {});
3469
+ const { plan: plan2 } = await import("./plan-3UKVNQDT.js");
3470
+ await plan2(description, { conversational: true });
3462
3471
  }
3463
3472
  await showMainMenu();
3464
3473
  return;
@@ -3702,8 +3711,8 @@ ${state.forbiddenPatterns?.length ? `- **Forbidden patterns:** ${state.forbidden
3702
3711
  const hintedTask = initialTaskHint?.trim() ?? "";
3703
3712
  if (hintedTask) {
3704
3713
  console.log(chalk6.dim("Using your request above as the first task.\n"));
3705
- const { plan: plan2 } = await import("./plan-AR6Y4QUD.js");
3706
- await plan2(hintedTask, {});
3714
+ const { plan: plan2 } = await import("./plan-3UKVNQDT.js");
3715
+ await plan2(hintedTask, { conversational: true });
3707
3716
  return;
3708
3717
  }
3709
3718
  const continueAnswer = await prompt("Would you like to plan your first task now? (Y/n)");
@@ -3727,8 +3736,8 @@ ${state.forbiddenPatterns?.length ? `- **Forbidden patterns:** ${state.forbidden
3727
3736
  description = continueAnswer.trim();
3728
3737
  }
3729
3738
  if (description.trim()) {
3730
- const { plan: plan2 } = await import("./plan-AR6Y4QUD.js");
3731
- await plan2(description, {});
3739
+ const { plan: plan2 } = await import("./plan-3UKVNQDT.js");
3740
+ await plan2(description, { conversational: true });
3732
3741
  }
3733
3742
  }
3734
3743
  function inferAudienceFromMessage(message) {
@@ -3853,8 +3862,8 @@ async function handleAdaptExisting(cwd, state) {
3853
3862
  }
3854
3863
  if (intent.mode === "ad_hoc" && intent.confidence >= 0.7) {
3855
3864
  console.log(chalk6.dim("\n> Got it! Creating a task for this...\n"));
3856
- const { plan: plan2 } = await import("./plan-AR6Y4QUD.js");
3857
- await plan2(response, {});
3865
+ const { plan: plan2 } = await import("./plan-3UKVNQDT.js");
3866
+ await plan2(response, { conversational: true });
3858
3867
  return;
3859
3868
  }
3860
3869
  if (intent.mode === "app_builder" && intent.confidence >= 0.7) {
@@ -3891,8 +3900,8 @@ async function showAdaptExistingMenu(cwd, state) {
3891
3900
  case "2": {
3892
3901
  const description = await promptWithCommands("Describe what you want to do", { allowMultiline: true });
3893
3902
  if (description.trim()) {
3894
- const { plan: plan2 } = await import("./plan-AR6Y4QUD.js");
3895
- await plan2(description, {});
3903
+ const { plan: plan2 } = await import("./plan-3UKVNQDT.js");
3904
+ await plan2(description, { conversational: true });
3896
3905
  }
3897
3906
  break;
3898
3907
  }
@@ -3998,12 +4007,39 @@ async function continueConversationLoop(cwd) {
3998
4007
  await showMainMenu();
3999
4008
  return;
4000
4009
  }
4010
+ if (isContinuationDirective(response)) {
4011
+ await continueWithCurrentTask(cwd);
4012
+ continue;
4013
+ }
4001
4014
  const handled = await handleFreeformJourneyInput(cwd, response);
4002
4015
  if (!handled) {
4003
4016
  console.log(chalk6.yellow("I did not catch that. Try describing your goal in one sentence."));
4004
4017
  }
4005
4018
  }
4006
4019
  }
4020
+ function isContinuationDirective(input) {
4021
+ const normalized = input.trim().toLowerCase();
4022
+ return normalized === "continue" || normalized === "continue." || normalized === "go on" || normalized === "go ahead" || normalized === "next" || normalized === "proceed" || normalized === "do it";
4023
+ }
4024
+ async function continueWithCurrentTask(cwd) {
4025
+ const { listLocalAtoms: listLocalAtoms2 } = await import("./plan-3UKVNQDT.js");
4026
+ const atoms = await listLocalAtoms2();
4027
+ const pending = atoms.filter((a) => a.status === "READY" || a.status === "IN_PROGRESS").sort((a, b) => a.externalId.localeCompare(b.externalId));
4028
+ if (pending.length === 0) {
4029
+ console.log(chalk6.yellow("No pending atoms found. Tell me what to plan next."));
4030
+ return;
4031
+ }
4032
+ const nextAtom = pending[0];
4033
+ if (!nextAtom) {
4034
+ console.log(chalk6.yellow("No pending atoms found. Tell me what to plan next."));
4035
+ return;
4036
+ }
4037
+ console.log(chalk6.dim(`
4038
+ Continuing with ${nextAtom.externalId}...
4039
+ `));
4040
+ const { execute: execute2 } = await import("./execute-LJNJEXWD.js");
4041
+ await execute2(nextAtom.externalId, {});
4042
+ }
4007
4043
  function checkForHandoff(cwd) {
4008
4044
  try {
4009
4045
  const currentContextPath = join6(cwd, ".archon", "current_context.md");
@@ -4091,13 +4127,20 @@ async function handleFreeformJourneyInput(cwd, input) {
4091
4127
  return true;
4092
4128
  }
4093
4129
  if (intent.mode === "app_builder" && intent.confidence >= 0.7) {
4130
+ const state = detectProjectState(cwd);
4131
+ if (state.hasArchitecture) {
4132
+ console.log(chalk6.dim("\n> Got it! Creating a task for this...\n"));
4133
+ const { plan: plan3 } = await import("./plan-3UKVNQDT.js");
4134
+ await plan3(freeform, { conversational: true });
4135
+ return true;
4136
+ }
4094
4137
  console.log(chalk6.dim("\n> Let me understand your project better...\n"));
4095
4138
  await runConversationalInterview(cwd, freeform);
4096
4139
  return true;
4097
4140
  }
4098
4141
  console.log(chalk6.dim("\n> Got it! Creating a task for this...\n"));
4099
- const { plan: plan2 } = await import("./plan-AR6Y4QUD.js");
4100
- await plan2(freeform, {});
4142
+ const { plan: plan2 } = await import("./plan-3UKVNQDT.js");
4143
+ await plan2(freeform, { conversational: true });
4101
4144
  return true;
4102
4145
  }
4103
4146
  function extractActionableFollowUpFromExplore(input) {
@@ -4146,8 +4189,8 @@ async function handlePostExploreAction(cwd, request) {
4146
4189
  } else {
4147
4190
  console.log(chalk6.dim("> Got it! Creating a task for this...\n"));
4148
4191
  }
4149
- const { plan: plan2 } = await import("./plan-AR6Y4QUD.js");
4150
- await plan2(request, {});
4192
+ const { plan: plan2 } = await import("./plan-3UKVNQDT.js");
4193
+ await plan2(request, { conversational: true });
4151
4194
  }
4152
4195
  async function showReviewProgress(cwd) {
4153
4196
  try {
@@ -4168,18 +4211,18 @@ async function showReviewProgress(cwd) {
4168
4211
  }
4169
4212
  }
4170
4213
  async function planTask() {
4171
- const { plan: plan2 } = await import("./plan-AR6Y4QUD.js");
4214
+ const { plan: plan2 } = await import("./plan-3UKVNQDT.js");
4172
4215
  const description = await promptWithCommands("Describe what you want to build", { allowMultiline: true });
4173
4216
  if (description.trim()) {
4174
- await plan2(description, {});
4217
+ await plan2(description, { conversational: true });
4175
4218
  }
4176
4219
  }
4177
4220
  async function listAtoms() {
4178
- const { list: list2 } = await import("./list-3IMEKFQZ.js");
4221
+ const { list: list2 } = await import("./list-53NTME4Q.js");
4179
4222
  await list2({});
4180
4223
  }
4181
4224
  async function executeNext() {
4182
- const { listLocalAtoms: listLocalAtoms2 } = await import("./plan-AR6Y4QUD.js");
4225
+ const { listLocalAtoms: listLocalAtoms2 } = await import("./plan-3UKVNQDT.js");
4183
4226
  const { analyzeProject, getComplexityDescription, getModeDescription } = await import("./orchestration-HIF3KP25.js");
4184
4227
  const { loadExecutionPreferences } = await import("./preferences-4V4C7MVD.js");
4185
4228
  const cwd = process.cwd();
@@ -4250,11 +4293,11 @@ async function executeNext() {
4250
4293
  }
4251
4294
  }
4252
4295
  if (selectedMode === "parallel-cloud") {
4253
- const { parallelExecuteCloud: parallelExecuteCloud2 } = await import("./parallel-ZBFFEUBW.js");
4296
+ const { parallelExecuteCloud: parallelExecuteCloud2 } = await import("./parallel-3JTGAHOS.js");
4254
4297
  await parallelExecuteCloud2(runIds);
4255
4298
  return;
4256
4299
  }
4257
- const { parallelExecute } = await import("./parallel-ZBFFEUBW.js");
4300
+ const { parallelExecute } = await import("./parallel-3JTGAHOS.js");
4258
4301
  await parallelExecute(runIds);
4259
4302
  return;
4260
4303
  }
@@ -4262,7 +4305,7 @@ async function executeNext() {
4262
4305
  const atomId = await prompt("Enter atom ID to execute (or press Enter for first pending)");
4263
4306
  const targetId = atomId.trim() || pendingAtoms[0]?.id;
4264
4307
  if (targetId) {
4265
- const { execute: execute2 } = await import("./execute-UWJPIG6C.js");
4308
+ const { execute: execute2 } = await import("./execute-LJNJEXWD.js");
4266
4309
  await execute2(targetId, {});
4267
4310
  } else {
4268
4311
  console.log(chalk6.yellow("No atom to execute."));
@@ -4409,13 +4452,13 @@ async function handleSlashCommand(input) {
4409
4452
  const arg = parts.slice(1).join(" ").trim();
4410
4453
  switch (command) {
4411
4454
  case "/plan": {
4412
- const { plan: plan2 } = await import("./plan-AR6Y4QUD.js");
4455
+ const { plan: plan2 } = await import("./plan-3UKVNQDT.js");
4413
4456
  if (arg) {
4414
- await plan2(arg, {});
4457
+ await plan2(arg, { conversational: true });
4415
4458
  } else {
4416
4459
  const description = await promptWithCommands("Describe what you want to build", { allowMultiline: true });
4417
4460
  if (description.trim()) {
4418
- await plan2(description, {});
4461
+ await plan2(description, { conversational: true });
4419
4462
  }
4420
4463
  }
4421
4464
  return true;
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  list
3
- } from "./chunk-MBRWJ3SX.js";
4
- import "./chunk-JFUG25H7.js";
3
+ } from "./chunk-GU7OQ5EV.js";
4
+ import "./chunk-VUT5XLKM.js";
5
5
  import "./chunk-PCTP3LKJ.js";
6
6
  import "./chunk-PJRQI5UN.js";
7
7
  import "./chunk-EIEU3IIY.js";
@@ -6,9 +6,9 @@ import {
6
6
  parallelRunWaves,
7
7
  parallelSchedule,
8
8
  parallelStatus
9
- } from "./chunk-FP4B73CC.js";
9
+ } from "./chunk-BUFMPKXX.js";
10
10
  import "./chunk-EBHHIUCB.js";
11
- import "./chunk-JFUG25H7.js";
11
+ import "./chunk-VUT5XLKM.js";
12
12
  import "./chunk-PCTP3LKJ.js";
13
13
  import "./chunk-PJRQI5UN.js";
14
14
  import "./chunk-EIEU3IIY.js";
@@ -3,7 +3,7 @@ import {
3
3
  loadAtom,
4
4
  parseAtomDescription,
5
5
  plan
6
- } from "./chunk-JFUG25H7.js";
6
+ } from "./chunk-VUT5XLKM.js";
7
7
  import "./chunk-PCTP3LKJ.js";
8
8
  import "./chunk-PJRQI5UN.js";
9
9
  import "./chunk-EIEU3IIY.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "archondev",
3
- "version": "2.19.15",
3
+ "version": "2.19.17",
4
4
  "description": "Local-first AI-powered development governance system",
5
5
  "main": "dist/index.js",
6
6
  "bin": {