chiefwiggum 1.3.11 → 1.3.13

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.
Files changed (2) hide show
  1. package/dist/cli.cjs +151 -23
  2. package/package.json +1 -1
package/dist/cli.cjs CHANGED
@@ -95,6 +95,108 @@ async function multilineText(options) {
95
95
  });
96
96
  });
97
97
  }
98
+ async function searchSelect(options) {
99
+ const { message, items, placeholder = "Type to filter...", maxVisible = 10 } = options;
100
+ const readline = await import("readline");
101
+ return new Promise((resolve) => {
102
+ let query = "";
103
+ let selectedIndex = 0;
104
+ let filtered = items.slice(0, maxVisible);
105
+ const filterItems = () => {
106
+ if (!query) {
107
+ filtered = items.slice(0, maxVisible);
108
+ } else {
109
+ const lower = query.toLowerCase();
110
+ filtered = items.filter((item) => item.toLowerCase().includes(lower)).slice(0, maxVisible);
111
+ }
112
+ if (selectedIndex >= filtered.length) {
113
+ selectedIndex = Math.max(0, filtered.length - 1);
114
+ }
115
+ };
116
+ const render = () => {
117
+ process.stdout.write("\x1B[?25l");
118
+ let output = "";
119
+ output += `${import_picocolors.default.cyan("?")} ${import_picocolors.default.bold(message)}
120
+ `;
121
+ output += `${import_picocolors.default.dim("\u203A")} ${query || import_picocolors.default.dim(placeholder)}
122
+ `;
123
+ output += "\n";
124
+ if (filtered.length === 0) {
125
+ output += import_picocolors.default.dim(" No matches found\n");
126
+ } else {
127
+ for (let i = 0; i < filtered.length; i++) {
128
+ const isSelected = i === selectedIndex;
129
+ const prefix = isSelected ? import_picocolors.default.cyan("\u276F") : " ";
130
+ const text3 = isSelected ? import_picocolors.default.cyan(filtered[i]) : filtered[i];
131
+ output += `${prefix} ${text3}
132
+ `;
133
+ }
134
+ }
135
+ output += `
136
+ ${import_picocolors.default.dim("\u2191/\u2193 navigate \u2022 enter select \u2022 esc cancel")}`;
137
+ process.stdout.write(output);
138
+ };
139
+ const clearOutput = () => {
140
+ const lineCount = filtered.length + 5;
141
+ process.stdout.write(`\x1B[${lineCount}A\x1B[0J`);
142
+ };
143
+ const cleanup2 = () => {
144
+ process.stdout.write("\x1B[?25h");
145
+ process.stdin.setRawMode(false);
146
+ process.stdin.removeListener("data", onKeypress);
147
+ };
148
+ const onKeypress = (key) => {
149
+ const str = key.toString();
150
+ if (str === "\x1B" || str === "") {
151
+ clearOutput();
152
+ cleanup2();
153
+ p.cancel("Operation cancelled.");
154
+ process.exit(0);
155
+ }
156
+ if (str === "\r" || str === "\n") {
157
+ clearOutput();
158
+ cleanup2();
159
+ if (filtered.length > 0) {
160
+ console.log(`${import_picocolors.default.green("\u2713")} ${import_picocolors.default.bold(message)} ${import_picocolors.default.dim("\xB7")} ${filtered[selectedIndex]}`);
161
+ resolve(filtered[selectedIndex]);
162
+ } else {
163
+ resolve(null);
164
+ }
165
+ return;
166
+ }
167
+ if (str === "\x1B[A") {
168
+ clearOutput();
169
+ selectedIndex = Math.max(0, selectedIndex - 1);
170
+ render();
171
+ return;
172
+ }
173
+ if (str === "\x1B[B") {
174
+ clearOutput();
175
+ selectedIndex = Math.min(filtered.length - 1, selectedIndex + 1);
176
+ render();
177
+ return;
178
+ }
179
+ if (str === "\x7F" || str === "\b") {
180
+ clearOutput();
181
+ query = query.slice(0, -1);
182
+ filterItems();
183
+ render();
184
+ return;
185
+ }
186
+ if (str.length === 1 && str >= " ") {
187
+ clearOutput();
188
+ query += str;
189
+ filterItems();
190
+ render();
191
+ }
192
+ };
193
+ filterItems();
194
+ render();
195
+ process.stdin.setRawMode(true);
196
+ process.stdin.resume();
197
+ process.stdin.on("data", onKeypress);
198
+ });
199
+ }
98
200
 
99
201
  // src/utils/banner.ts
100
202
  var BANNER = `
@@ -524,6 +626,34 @@ var __dirname = (0, import_node_path2.dirname)((0, import_node_url.fileURLToPath
524
626
  var LOCAL_TEMPLATES_DIR = ".chiefwiggum/templates";
525
627
  var CONFIG_FILE = ".chiefwiggum/CLAUDE.md";
526
628
  var BUNDLED_TEMPLATES_DIR = (0, import_node_path2.join)(__dirname, "..", "templates");
629
+ var SKIP_DIRS = /* @__PURE__ */ new Set([
630
+ "node_modules",
631
+ ".git",
632
+ ".chiefwiggum",
633
+ "dist",
634
+ "build",
635
+ ".next",
636
+ "vendor",
637
+ "coverage"
638
+ ]);
639
+ function findMarkdownFiles(dir, basePath = "") {
640
+ const results = [];
641
+ try {
642
+ const entries = (0, import_node_fs3.readdirSync)(dir, { withFileTypes: true });
643
+ for (const entry of entries) {
644
+ const relativePath = basePath ? `${basePath}/${entry.name}` : entry.name;
645
+ if (entry.isDirectory()) {
646
+ if (!SKIP_DIRS.has(entry.name) && !entry.name.startsWith(".")) {
647
+ results.push(...findMarkdownFiles((0, import_node_path2.join)(dir, entry.name), relativePath));
648
+ }
649
+ } else if (entry.isFile() && entry.name.endsWith(".md")) {
650
+ results.push(relativePath);
651
+ }
652
+ }
653
+ } catch {
654
+ }
655
+ return results;
656
+ }
527
657
  async function cmdNew(planFile) {
528
658
  console.log(import_picocolors7.default.bold("Project Setup"));
529
659
  console.log();
@@ -550,24 +680,22 @@ async function cmdNew(planFile) {
550
680
  });
551
681
  switch (setupChoice) {
552
682
  case "plan": {
553
- if ((0, import_node_fs3.existsSync)("plans")) {
554
- const plans = (0, import_node_fs3.readdirSync)("plans").filter((f) => f.endsWith(".md"));
555
- if (plans.length > 0) {
556
- console.log();
557
- console.log(import_picocolors7.default.bold("Available plans:"));
558
- for (const f of plans) {
559
- console.log(` ${import_picocolors7.default.cyan(`plans/${f}`)}`);
560
- }
561
- console.log();
562
- }
683
+ const mdFiles = findMarkdownFiles(process.cwd());
684
+ if (mdFiles.length === 0) {
685
+ console.log(import_picocolors7.default.yellow("No markdown files found in project."));
686
+ console.log(import_picocolors7.default.dim("Create a plan file first, e.g., plans/plan.md"));
687
+ process.exit(1);
563
688
  }
564
- const planPath = await text2({
565
- message: "Path to plan file",
566
- defaultValue: "plans/plan.md"
689
+ console.log();
690
+ const planPath = await searchSelect({
691
+ message: "Select a plan file",
692
+ items: mdFiles,
693
+ placeholder: "Type to filter...",
694
+ maxVisible: 15
567
695
  });
568
- if (!(0, import_node_fs3.existsSync)(planPath)) {
569
- console.log(import_picocolors7.default.red(`Plan file not found: ${planPath}`));
570
- process.exit(1);
696
+ if (!planPath) {
697
+ console.log(import_picocolors7.default.yellow("No plan selected."));
698
+ process.exit(0);
571
699
  }
572
700
  await checkExistingFiles();
573
701
  await generateFromPlan(planPath);
@@ -655,7 +783,7 @@ async function setupProjectConfig() {
655
783
  initialValue: false
656
784
  });
657
785
  const config2 = {
658
- tracker: useGitHub ? "github" : "todo"
786
+ projectTracker: useGitHub ? "github" : "todo"
659
787
  };
660
788
  (0, import_node_fs3.writeFileSync)(CONFIG_FILE, JSON.stringify(config2, null, 2) + "\n");
661
789
  console.log(import_picocolors7.default.green(`\u2713 Config saved to ${CONFIG_FILE}`));
@@ -889,12 +1017,12 @@ var import_picocolors9 = __toESM(require("picocolors"), 1);
889
1017
  var CONFIG_FILE2 = ".chiefwiggum/CLAUDE.md";
890
1018
  function getConfig() {
891
1019
  if (!(0, import_node_fs5.existsSync)(CONFIG_FILE2)) {
892
- return { tracker: "todo" };
1020
+ return { projectTracker: "todo" };
893
1021
  }
894
1022
  try {
895
1023
  return JSON.parse((0, import_node_fs5.readFileSync)(CONFIG_FILE2, "utf-8"));
896
1024
  } catch {
897
- return { tracker: "todo" };
1025
+ return { projectTracker: "todo" };
898
1026
  }
899
1027
  }
900
1028
  function saveConfig(config2) {
@@ -905,7 +1033,7 @@ async function cmdConfig() {
905
1033
  console.log(import_picocolors9.default.bold("Configuration"));
906
1034
  console.log();
907
1035
  const config2 = getConfig();
908
- console.log(`Current tracker: ${import_picocolors9.default.cyan(config2.tracker)}`);
1036
+ console.log(`Current tracker: ${import_picocolors9.default.cyan(config2.projectTracker)}`);
909
1037
  console.log();
910
1038
  const newTracker = await select2({
911
1039
  message: "Project tracker",
@@ -913,10 +1041,10 @@ async function cmdConfig() {
913
1041
  { value: "github", label: "GitHub Issues", hint: "Track tasks as GitHub Issues" },
914
1042
  { value: "todo", label: "TODO.md", hint: "Track tasks in local TODO.md file" }
915
1043
  ],
916
- initialValue: config2.tracker
1044
+ initialValue: config2.projectTracker
917
1045
  });
918
- if (newTracker !== config2.tracker) {
919
- config2.tracker = newTracker;
1046
+ if (newTracker !== config2.projectTracker) {
1047
+ config2.projectTracker = newTracker;
920
1048
  saveConfig(config2);
921
1049
  console.log();
922
1050
  console.log(import_picocolors9.default.green(`\u2713 Tracker changed to ${newTracker}`));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chiefwiggum",
3
- "version": "1.3.11",
3
+ "version": "1.3.13",
4
4
  "description": "Autonomous coding agent CLI. Point it at a plan, watch it build.",
5
5
  "type": "module",
6
6
  "bin": {