@jvittechs/jai1-cli 0.1.66 → 0.1.67

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/cli.js CHANGED
@@ -33,7 +33,7 @@ var NetworkError = class extends Jai1Error {
33
33
  // package.json
34
34
  var package_default = {
35
35
  name: "@jvittechs/jai1-cli",
36
- version: "0.1.66",
36
+ version: "0.1.67",
37
37
  description: "Unified CLI for Jai1 Framework Management and Redmine Context Sync",
38
38
  type: "module",
39
39
  bin: {
@@ -5717,12 +5717,271 @@ Examples:
5717
5717
  }
5718
5718
 
5719
5719
  // src/commands/utils/interactive.ts
5720
- import React28 from "react";
5720
+ import React31 from "react";
5721
5721
  import { render as render5 } from "ink";
5722
5722
 
5723
5723
  // src/ui/utils/UtilsApp.tsx
5724
+ import React30, { useState as useState17 } from "react";
5725
+ import { Box as Box20, Text as Text21, useInput as useInput15, useApp as useApp5 } from "ink";
5726
+
5727
+ // src/ui/utils/views/PasswordView.tsx
5724
5728
  import React27, { useState as useState14 } from "react";
5725
- import { Box as Box17, Text as Text18, useInput as useInput12, useApp as useApp5 } from "ink";
5729
+ import { Box as Box17, Text as Text18, useInput as useInput12 } from "ink";
5730
+ import TextInput4 from "ink-text-input";
5731
+ var PasswordView = () => {
5732
+ const [length, setLength] = useState14("16");
5733
+ const [count, setCount] = useState14("1");
5734
+ const [passwords, setPasswords] = useState14([]);
5735
+ const [focusedField, setFocusedField] = useState14("length");
5736
+ const [copiedIndex, setCopiedIndex] = useState14(null);
5737
+ const service = new UtilsService();
5738
+ useInput12((input, key) => {
5739
+ if (key.tab) {
5740
+ if (focusedField === "length") setFocusedField("count");
5741
+ else if (focusedField === "count") setFocusedField("generate");
5742
+ else setFocusedField("length");
5743
+ } else if (key.return && focusedField === "generate") {
5744
+ handleGenerate();
5745
+ } else if (input === "c" && passwords.length > 0) {
5746
+ handleCopy(0);
5747
+ }
5748
+ });
5749
+ const handleGenerate = () => {
5750
+ const newPasswords = [];
5751
+ const lengthNum = parseInt(length, 10) || 16;
5752
+ const countNum = parseInt(count, 10) || 1;
5753
+ for (let i = 0; i < countNum; i++) {
5754
+ newPasswords.push(
5755
+ service.generatePassword({
5756
+ length: lengthNum,
5757
+ lowercase: true,
5758
+ uppercase: true,
5759
+ digits: true,
5760
+ symbols: true
5761
+ })
5762
+ );
5763
+ }
5764
+ setPasswords(newPasswords);
5765
+ setCopiedIndex(null);
5766
+ };
5767
+ const handleCopy = async (index) => {
5768
+ try {
5769
+ const { default: clipboardy } = await import("clipboardy");
5770
+ await clipboardy.write(passwords[index]);
5771
+ setCopiedIndex(index);
5772
+ setTimeout(() => setCopiedIndex(null), 2e3);
5773
+ } catch (error) {
5774
+ }
5775
+ };
5776
+ return /* @__PURE__ */ React27.createElement(Box17, { flexDirection: "column" }, /* @__PURE__ */ React27.createElement(Box17, { marginBottom: 1 }, /* @__PURE__ */ React27.createElement(Text18, { bold: true, color: "cyan" }, "\u{1F510} Password Generator")), /* @__PURE__ */ React27.createElement(
5777
+ Box17,
5778
+ {
5779
+ flexDirection: "column",
5780
+ borderStyle: "single",
5781
+ borderColor: "gray",
5782
+ paddingX: 2,
5783
+ paddingY: 1,
5784
+ marginBottom: 1
5785
+ },
5786
+ /* @__PURE__ */ React27.createElement(Text18, { bold: true, color: "yellow", marginBottom: 1 }, "Options:"),
5787
+ /* @__PURE__ */ React27.createElement(Box17, { marginBottom: 1 }, /* @__PURE__ */ React27.createElement(Box17, { width: 20 }, /* @__PURE__ */ React27.createElement(Text18, { color: focusedField === "length" ? "green" : void 0 }, focusedField === "length" ? "\u25B6 " : " ", "Length:")), /* @__PURE__ */ React27.createElement(Box17, { width: 10 }, focusedField === "length" ? /* @__PURE__ */ React27.createElement(TextInput4, { value: length, onChange: setLength }) : /* @__PURE__ */ React27.createElement(Text18, null, length)), /* @__PURE__ */ React27.createElement(Text18, { dimColor: true }, "(characters)")),
5788
+ /* @__PURE__ */ React27.createElement(Box17, { marginBottom: 1 }, /* @__PURE__ */ React27.createElement(Box17, { width: 20 }, /* @__PURE__ */ React27.createElement(Text18, { color: focusedField === "count" ? "green" : void 0 }, focusedField === "count" ? "\u25B6 " : " ", "Count:")), /* @__PURE__ */ React27.createElement(Box17, { width: 10 }, focusedField === "count" ? /* @__PURE__ */ React27.createElement(TextInput4, { value: count, onChange: setCount }) : /* @__PURE__ */ React27.createElement(Text18, null, count)), /* @__PURE__ */ React27.createElement(Text18, { dimColor: true }, "(passwords to generate)")),
5789
+ /* @__PURE__ */ React27.createElement(Box17, { marginTop: 1 }, /* @__PURE__ */ React27.createElement(
5790
+ Text18,
5791
+ {
5792
+ bold: true,
5793
+ backgroundColor: focusedField === "generate" ? "green" : void 0,
5794
+ color: focusedField === "generate" ? "black" : "green"
5795
+ },
5796
+ focusedField === "generate" ? "\u25B6 " : " ",
5797
+ "[ Generate Passwords ]"
5798
+ ))
5799
+ ), passwords.length > 0 && /* @__PURE__ */ React27.createElement(
5800
+ Box17,
5801
+ {
5802
+ flexDirection: "column",
5803
+ borderStyle: "single",
5804
+ borderColor: "green",
5805
+ paddingX: 2,
5806
+ paddingY: 1
5807
+ },
5808
+ /* @__PURE__ */ React27.createElement(Text18, { bold: true, color: "green", marginBottom: 1 }, "\u2713 Generated Passwords:"),
5809
+ passwords.map((password, index) => /* @__PURE__ */ React27.createElement(Box17, { key: index, marginBottom: 0 }, /* @__PURE__ */ React27.createElement(Box17, { width: 4 }, /* @__PURE__ */ React27.createElement(Text18, { dimColor: true }, index + 1, ".")), /* @__PURE__ */ React27.createElement(Box17, { flexGrow: 1 }, /* @__PURE__ */ React27.createElement(Text18, null, password)), copiedIndex === index && /* @__PURE__ */ React27.createElement(Text18, { color: "green" }, " \u2713 Copied!")))
5810
+ ), /* @__PURE__ */ React27.createElement(Box17, { marginTop: 1, borderStyle: "single", borderColor: "gray", paddingX: 2 }, /* @__PURE__ */ React27.createElement(Text18, { dimColor: true }, "Tab: Next field | Enter: Generate | C: Copy | Esc: Back")));
5811
+ };
5812
+
5813
+ // src/ui/utils/views/UuidView.tsx
5814
+ import React28, { useState as useState15 } from "react";
5815
+ import { Box as Box18, Text as Text19, useInput as useInput13 } from "ink";
5816
+ import TextInput5 from "ink-text-input";
5817
+ var UuidView = () => {
5818
+ const [count, setCount] = useState15("1");
5819
+ const [uppercase, setUppercase] = useState15(false);
5820
+ const [noHyphens, setNoHyphens] = useState15(false);
5821
+ const [uuids, setUuids] = useState15([]);
5822
+ const [focusedField, setFocusedField] = useState15("count");
5823
+ const [copiedIndex, setCopiedIndex] = useState15(null);
5824
+ const service = new UtilsService();
5825
+ useInput13((input, key) => {
5826
+ if (key.tab) {
5827
+ const fields = ["count", "uppercase", "hyphens", "generate"];
5828
+ const currentIndex = fields.indexOf(focusedField);
5829
+ setFocusedField(fields[(currentIndex + 1) % fields.length]);
5830
+ } else if (key.return) {
5831
+ if (focusedField === "uppercase") {
5832
+ setUppercase(!uppercase);
5833
+ } else if (focusedField === "hyphens") {
5834
+ setNoHyphens(!noHyphens);
5835
+ } else if (focusedField === "generate") {
5836
+ handleGenerate();
5837
+ }
5838
+ } else if (input === "c" && uuids.length > 0) {
5839
+ handleCopy(0);
5840
+ }
5841
+ });
5842
+ const handleGenerate = () => {
5843
+ const newUuids = [];
5844
+ const countNum = parseInt(count, 10) || 1;
5845
+ for (let i = 0; i < countNum; i++) {
5846
+ newUuids.push(service.generateUuid({ uppercase, noHyphens }));
5847
+ }
5848
+ setUuids(newUuids);
5849
+ setCopiedIndex(null);
5850
+ };
5851
+ const handleCopy = async (index) => {
5852
+ try {
5853
+ const { default: clipboardy } = await import("clipboardy");
5854
+ await clipboardy.write(uuids[index]);
5855
+ setCopiedIndex(index);
5856
+ setTimeout(() => setCopiedIndex(null), 2e3);
5857
+ } catch (error) {
5858
+ }
5859
+ };
5860
+ return /* @__PURE__ */ React28.createElement(Box18, { flexDirection: "column" }, /* @__PURE__ */ React28.createElement(Box18, { marginBottom: 1 }, /* @__PURE__ */ React28.createElement(Text19, { bold: true, color: "cyan" }, "\u{1F194} UUID Generator")), /* @__PURE__ */ React28.createElement(
5861
+ Box18,
5862
+ {
5863
+ flexDirection: "column",
5864
+ borderStyle: "single",
5865
+ borderColor: "gray",
5866
+ paddingX: 2,
5867
+ paddingY: 1,
5868
+ marginBottom: 1
5869
+ },
5870
+ /* @__PURE__ */ React28.createElement(Text19, { bold: true, color: "yellow", marginBottom: 1 }, "Options:"),
5871
+ /* @__PURE__ */ React28.createElement(Box18, { marginBottom: 1 }, /* @__PURE__ */ React28.createElement(Box18, { width: 20 }, /* @__PURE__ */ React28.createElement(Text19, { color: focusedField === "count" ? "green" : void 0 }, focusedField === "count" ? "\u25B6 " : " ", "Count:")), /* @__PURE__ */ React28.createElement(Box18, { width: 10 }, focusedField === "count" ? /* @__PURE__ */ React28.createElement(TextInput5, { value: count, onChange: setCount }) : /* @__PURE__ */ React28.createElement(Text19, null, count))),
5872
+ /* @__PURE__ */ React28.createElement(Box18, { marginBottom: 1 }, /* @__PURE__ */ React28.createElement(Text19, { color: focusedField === "uppercase" ? "green" : void 0 }, focusedField === "uppercase" ? "\u25B6 " : " ", "[", uppercase ? "\u2713" : " ", "] Uppercase")),
5873
+ /* @__PURE__ */ React28.createElement(Box18, { marginBottom: 1 }, /* @__PURE__ */ React28.createElement(Text19, { color: focusedField === "hyphens" ? "green" : void 0 }, focusedField === "hyphens" ? "\u25B6 " : " ", "[", noHyphens ? "\u2713" : " ", "] No Hyphens")),
5874
+ /* @__PURE__ */ React28.createElement(Box18, { marginTop: 1 }, /* @__PURE__ */ React28.createElement(
5875
+ Text19,
5876
+ {
5877
+ bold: true,
5878
+ backgroundColor: focusedField === "generate" ? "green" : void 0,
5879
+ color: focusedField === "generate" ? "black" : "green"
5880
+ },
5881
+ focusedField === "generate" ? "\u25B6 " : " ",
5882
+ "[ Generate UUIDs ]"
5883
+ ))
5884
+ ), uuids.length > 0 && /* @__PURE__ */ React28.createElement(
5885
+ Box18,
5886
+ {
5887
+ flexDirection: "column",
5888
+ borderStyle: "single",
5889
+ borderColor: "green",
5890
+ paddingX: 2,
5891
+ paddingY: 1
5892
+ },
5893
+ /* @__PURE__ */ React28.createElement(Text19, { bold: true, color: "green", marginBottom: 1 }, "\u2713 Generated UUIDs:"),
5894
+ uuids.map((uuid, index) => /* @__PURE__ */ React28.createElement(Box18, { key: index, marginBottom: 0 }, /* @__PURE__ */ React28.createElement(Box18, { width: 4 }, /* @__PURE__ */ React28.createElement(Text19, { dimColor: true }, index + 1, ".")), /* @__PURE__ */ React28.createElement(Box18, { flexGrow: 1 }, /* @__PURE__ */ React28.createElement(Text19, null, uuid)), copiedIndex === index && /* @__PURE__ */ React28.createElement(Text19, { color: "green" }, " \u2713 Copied!")))
5895
+ ), /* @__PURE__ */ React28.createElement(Box18, { marginTop: 1, borderStyle: "single", borderColor: "gray", paddingX: 2 }, /* @__PURE__ */ React28.createElement(Text19, { dimColor: true }, "Tab: Next | Enter: Toggle/Generate | C: Copy | Esc: Back")));
5896
+ };
5897
+
5898
+ // src/ui/utils/views/HashView.tsx
5899
+ import React29, { useState as useState16 } from "react";
5900
+ import { Box as Box19, Text as Text20, useInput as useInput14 } from "ink";
5901
+ import TextInput6 from "ink-text-input";
5902
+ var ALGORITHMS = ["sha256", "sha512", "sha1", "md5", "bcrypt"];
5903
+ var HashView = () => {
5904
+ const [text, setText] = useState16("");
5905
+ const [algorithm, setAlgorithm] = useState16("sha256");
5906
+ const [hash, setHash] = useState16("");
5907
+ const [focusedField, setFocusedField] = useState16("text");
5908
+ const [copied, setCopied] = useState16(false);
5909
+ const service = new UtilsService();
5910
+ useInput14((input, key) => {
5911
+ if (key.tab) {
5912
+ const fields = ["text", "algorithm", "generate"];
5913
+ const currentIndex = fields.indexOf(focusedField);
5914
+ setFocusedField(fields[(currentIndex + 1) % fields.length]);
5915
+ } else if (key.return && focusedField === "generate") {
5916
+ handleGenerate();
5917
+ } else if (key.leftArrow && focusedField === "algorithm") {
5918
+ const currentIndex = ALGORITHMS.indexOf(algorithm);
5919
+ setAlgorithm(ALGORITHMS[currentIndex > 0 ? currentIndex - 1 : ALGORITHMS.length - 1]);
5920
+ } else if (key.rightArrow && focusedField === "algorithm") {
5921
+ const currentIndex = ALGORITHMS.indexOf(algorithm);
5922
+ setAlgorithm(ALGORITHMS[(currentIndex + 1) % ALGORITHMS.length]);
5923
+ } else if (input === "c" && hash) {
5924
+ handleCopy();
5925
+ }
5926
+ });
5927
+ const handleGenerate = async () => {
5928
+ if (!text) return;
5929
+ let result;
5930
+ if (algorithm === "bcrypt") {
5931
+ result = await service.hashBcrypt(text, 10);
5932
+ } else {
5933
+ result = await service.hash(text, algorithm);
5934
+ }
5935
+ setHash(result);
5936
+ setCopied(false);
5937
+ };
5938
+ const handleCopy = async () => {
5939
+ try {
5940
+ const { default: clipboardy } = await import("clipboardy");
5941
+ await clipboardy.write(hash);
5942
+ setCopied(true);
5943
+ setTimeout(() => setCopied(false), 2e3);
5944
+ } catch (error) {
5945
+ }
5946
+ };
5947
+ return /* @__PURE__ */ React29.createElement(Box19, { flexDirection: "column" }, /* @__PURE__ */ React29.createElement(Box19, { marginBottom: 1 }, /* @__PURE__ */ React29.createElement(Text20, { bold: true, color: "cyan" }, "\u{1F512} Hash Generator")), /* @__PURE__ */ React29.createElement(
5948
+ Box19,
5949
+ {
5950
+ flexDirection: "column",
5951
+ borderStyle: "single",
5952
+ borderColor: "gray",
5953
+ paddingX: 2,
5954
+ paddingY: 1,
5955
+ marginBottom: 1
5956
+ },
5957
+ /* @__PURE__ */ React29.createElement(Text20, { bold: true, color: "yellow", marginBottom: 1 }, "Options:"),
5958
+ /* @__PURE__ */ React29.createElement(Box19, { marginBottom: 1, flexDirection: "column" }, /* @__PURE__ */ React29.createElement(Box19, { marginBottom: 0 }, /* @__PURE__ */ React29.createElement(Text20, { color: focusedField === "text" ? "green" : void 0 }, focusedField === "text" ? "\u25B6 " : " ", "Text to hash:")), /* @__PURE__ */ React29.createElement(Box19, { marginLeft: 2, width: 60 }, focusedField === "text" ? /* @__PURE__ */ React29.createElement(TextInput6, { value: text, onChange: setText, placeholder: "Enter text..." }) : /* @__PURE__ */ React29.createElement(Text20, { dimColor: !text }, text || "(empty)"))),
5959
+ /* @__PURE__ */ React29.createElement(Box19, { marginBottom: 1 }, /* @__PURE__ */ React29.createElement(Box19, { width: 20 }, /* @__PURE__ */ React29.createElement(Text20, { color: focusedField === "algorithm" ? "green" : void 0 }, focusedField === "algorithm" ? "\u25B6 " : " ", "Algorithm:")), /* @__PURE__ */ React29.createElement(Text20, { bold: true, color: focusedField === "algorithm" ? "yellow" : void 0 }, algorithm.toUpperCase()), focusedField === "algorithm" && /* @__PURE__ */ React29.createElement(Text20, { dimColor: true }, " (\u2190 \u2192 to change)")),
5960
+ /* @__PURE__ */ React29.createElement(Box19, { marginTop: 1 }, /* @__PURE__ */ React29.createElement(
5961
+ Text20,
5962
+ {
5963
+ bold: true,
5964
+ backgroundColor: focusedField === "generate" ? "green" : void 0,
5965
+ color: focusedField === "generate" ? "black" : "green"
5966
+ },
5967
+ focusedField === "generate" ? "\u25B6 " : " ",
5968
+ "[ Generate Hash ]"
5969
+ ))
5970
+ ), hash && /* @__PURE__ */ React29.createElement(
5971
+ Box19,
5972
+ {
5973
+ flexDirection: "column",
5974
+ borderStyle: "single",
5975
+ borderColor: "green",
5976
+ paddingX: 2,
5977
+ paddingY: 1
5978
+ },
5979
+ /* @__PURE__ */ React29.createElement(Box19, { marginBottom: 1 }, /* @__PURE__ */ React29.createElement(Text20, { bold: true, color: "green" }, "\u2713 Hash Result:"), copied && /* @__PURE__ */ React29.createElement(Box19, { marginLeft: 2 }, /* @__PURE__ */ React29.createElement(Text20, { color: "green" }, "\u2713 Copied to clipboard!"))),
5980
+ /* @__PURE__ */ React29.createElement(Box19, { flexDirection: "column" }, /* @__PURE__ */ React29.createElement(Text20, { dimColor: true }, "Algorithm: ", algorithm.toUpperCase()), /* @__PURE__ */ React29.createElement(Box19, { marginTop: 1 }, /* @__PURE__ */ React29.createElement(Text20, { wrap: "wrap" }, hash)))
5981
+ ), /* @__PURE__ */ React29.createElement(Box19, { marginTop: 1, borderStyle: "single", borderColor: "gray", paddingX: 2 }, /* @__PURE__ */ React29.createElement(Text20, { dimColor: true }, "Tab: Next | \u2190/\u2192: Change algorithm | Enter: Generate | C: Copy | Esc: Back")));
5982
+ };
5983
+
5984
+ // src/ui/utils/UtilsApp.tsx
5726
5985
  var MENU_ITEMS2 = [
5727
5986
  { id: "password", icon: "\u{1F510}", label: "Password", description: "Generate secure passwords" },
5728
5987
  { id: "uuid", icon: "\u{1F194}", label: "UUID", description: "Generate UUID v4" },
@@ -5739,10 +5998,10 @@ var MENU_ITEMS2 = [
5739
5998
  { id: "markdown", icon: "\u{1F4C4}", label: "Markdown", description: "Preview markdown" }
5740
5999
  ];
5741
6000
  var UtilsApp = ({ onExit }) => {
5742
- const [selectedIndex, setSelectedIndex] = useState14(0);
5743
- const [activeView, setActiveView] = useState14(null);
6001
+ const [selectedIndex, setSelectedIndex] = useState17(0);
6002
+ const [activeView, setActiveView] = useState17(null);
5744
6003
  const { exit } = useApp5();
5745
- useInput12((input, key) => {
6004
+ useInput15((input, key) => {
5746
6005
  if (activeView) {
5747
6006
  if (key.escape) {
5748
6007
  setActiveView(null);
@@ -5760,8 +6019,8 @@ var UtilsApp = ({ onExit }) => {
5760
6019
  exit();
5761
6020
  }
5762
6021
  });
5763
- return /* @__PURE__ */ React27.createElement(Box17, { flexDirection: "column", width: "100%", height: "100%" }, /* @__PURE__ */ React27.createElement(
5764
- Box17,
6022
+ return /* @__PURE__ */ React30.createElement(Box20, { flexDirection: "column", width: "100%", height: "100%" }, /* @__PURE__ */ React30.createElement(
6023
+ Box20,
5765
6024
  {
5766
6025
  borderStyle: "single",
5767
6026
  borderColor: "cyan",
@@ -5769,10 +6028,10 @@ var UtilsApp = ({ onExit }) => {
5769
6028
  paddingY: 0,
5770
6029
  marginBottom: 1
5771
6030
  },
5772
- /* @__PURE__ */ React27.createElement(Text18, { bold: true, color: "cyan" }, "\u{1F6E0}\uFE0F Developer Utilities - Interactive Mode"),
5773
- /* @__PURE__ */ React27.createElement(Box17, { marginLeft: "auto" }, /* @__PURE__ */ React27.createElement(Text18, { dimColor: true }, "Press 'q' to quit"))
5774
- ), /* @__PURE__ */ React27.createElement(Box17, { flexGrow: 1 }, /* @__PURE__ */ React27.createElement(
5775
- Box17,
6031
+ /* @__PURE__ */ React30.createElement(Text21, { bold: true, color: "cyan" }, "\u{1F6E0}\uFE0F Developer Utilities - Interactive Mode"),
6032
+ /* @__PURE__ */ React30.createElement(Box20, { marginLeft: "auto" }, /* @__PURE__ */ React30.createElement(Text21, { dimColor: true }, "Press 'q' to quit"))
6033
+ ), /* @__PURE__ */ React30.createElement(Box20, { flexGrow: 1 }, /* @__PURE__ */ React30.createElement(
6034
+ Box20,
5776
6035
  {
5777
6036
  flexDirection: "column",
5778
6037
  width: 30,
@@ -5782,9 +6041,9 @@ var UtilsApp = ({ onExit }) => {
5782
6041
  paddingY: 1,
5783
6042
  marginRight: 1
5784
6043
  },
5785
- /* @__PURE__ */ React27.createElement(Box17, { marginBottom: 1 }, /* @__PURE__ */ React27.createElement(Text18, { bold: true, color: "yellow" }, "Select Utility:")),
5786
- MENU_ITEMS2.map((item, index) => /* @__PURE__ */ React27.createElement(Box17, { key: item.id, marginBottom: 0 }, /* @__PURE__ */ React27.createElement(
5787
- Text18,
6044
+ /* @__PURE__ */ React30.createElement(Box20, { marginBottom: 1 }, /* @__PURE__ */ React30.createElement(Text21, { bold: true, color: "yellow" }, "Select Utility:")),
6045
+ MENU_ITEMS2.map((item, index) => /* @__PURE__ */ React30.createElement(Box20, { key: item.id, marginBottom: 0 }, /* @__PURE__ */ React30.createElement(
6046
+ Text21,
5788
6047
  {
5789
6048
  color: selectedIndex === index && !activeView ? "green" : void 0,
5790
6049
  bold: selectedIndex === index && !activeView,
@@ -5795,9 +6054,9 @@ var UtilsApp = ({ onExit }) => {
5795
6054
  " ",
5796
6055
  item.label
5797
6056
  ))),
5798
- /* @__PURE__ */ React27.createElement(Box17, { marginTop: 1, borderStyle: "single", borderColor: "gray", paddingX: 1 }, /* @__PURE__ */ React27.createElement(Text18, { dimColor: true, fontSize: 10 }, "\u2191/\u2193: Navigate", "\n", "Enter: Select", "\n", "Esc: Back/Quit"))
5799
- ), /* @__PURE__ */ React27.createElement(
5800
- Box17,
6057
+ /* @__PURE__ */ React30.createElement(Box20, { marginTop: 1, borderStyle: "single", borderColor: "gray", paddingX: 1 }, /* @__PURE__ */ React30.createElement(Text21, { dimColor: true }, "\u2191/\u2193: Navigate", "\n", "Enter: Select", "\n", "Esc: Back/Quit"))
6058
+ ), /* @__PURE__ */ React30.createElement(
6059
+ Box20,
5801
6060
  {
5802
6061
  flexDirection: "column",
5803
6062
  flexGrow: 1,
@@ -5806,21 +6065,21 @@ var UtilsApp = ({ onExit }) => {
5806
6065
  paddingX: 2,
5807
6066
  paddingY: 1
5808
6067
  },
5809
- activeView ? /* @__PURE__ */ React27.createElement(ActiveUtilityView, { utilityType: activeView }) : /* @__PURE__ */ React27.createElement(WelcomeView, { selectedItem: MENU_ITEMS2[selectedIndex] })
5810
- )), /* @__PURE__ */ React27.createElement(
5811
- Box17,
6068
+ activeView ? /* @__PURE__ */ React30.createElement(ActiveUtilityView, { utilityType: activeView }) : /* @__PURE__ */ React30.createElement(WelcomeView, { selectedItem: MENU_ITEMS2[selectedIndex] })
6069
+ )), /* @__PURE__ */ React30.createElement(
6070
+ Box20,
5812
6071
  {
5813
6072
  borderStyle: "single",
5814
6073
  borderColor: "gray",
5815
6074
  paddingX: 2,
5816
6075
  marginTop: 1
5817
6076
  },
5818
- /* @__PURE__ */ React27.createElement(Text18, { dimColor: true }, "jai1-cli v0.1.63 | Use arrow keys to navigate")
6077
+ /* @__PURE__ */ React30.createElement(Text21, { dimColor: true }, "jai1-cli | Use arrow keys or j/k to navigate")
5819
6078
  ));
5820
6079
  };
5821
6080
  var WelcomeView = ({ selectedItem }) => {
5822
- return /* @__PURE__ */ React27.createElement(Box17, { flexDirection: "column" }, /* @__PURE__ */ React27.createElement(Box17, { marginBottom: 1 }, /* @__PURE__ */ React27.createElement(Text18, { bold: true, color: "cyan" }, "Welcome to Developer Utilities")), /* @__PURE__ */ React27.createElement(Box17, { marginBottom: 2 }, /* @__PURE__ */ React27.createElement(Text18, null, "Select a utility from the left menu to get started.")), /* @__PURE__ */ React27.createElement(
5823
- Box17,
6081
+ return /* @__PURE__ */ React30.createElement(Box20, { flexDirection: "column" }, /* @__PURE__ */ React30.createElement(Box20, { marginBottom: 1 }, /* @__PURE__ */ React30.createElement(Text21, { bold: true, color: "cyan" }, "Welcome to Developer Utilities")), /* @__PURE__ */ React30.createElement(Box20, { marginBottom: 2 }, /* @__PURE__ */ React30.createElement(Text21, null, "Select a utility from the left menu to get started.")), /* @__PURE__ */ React30.createElement(
6082
+ Box20,
5824
6083
  {
5825
6084
  borderStyle: "single",
5826
6085
  borderColor: "yellow",
@@ -5828,19 +6087,32 @@ var WelcomeView = ({ selectedItem }) => {
5828
6087
  paddingY: 1,
5829
6088
  marginBottom: 2
5830
6089
  },
5831
- /* @__PURE__ */ React27.createElement(Box17, { flexDirection: "column" }, /* @__PURE__ */ React27.createElement(Text18, { bold: true, color: "yellow" }, selectedItem.icon, " ", selectedItem.label), /* @__PURE__ */ React27.createElement(Text18, { dimColor: true }, selectedItem.description))
5832
- ), /* @__PURE__ */ React27.createElement(Box17, { marginBottom: 1 }, /* @__PURE__ */ React27.createElement(Text18, { bold: true }, "Quick Actions:")), /* @__PURE__ */ React27.createElement(Box17, { flexDirection: "column", marginLeft: 2 }, /* @__PURE__ */ React27.createElement(Text18, null, "\u2022 Press ", /* @__PURE__ */ React27.createElement(Text18, { color: "green" }, "Enter"), " to open selected utility"), /* @__PURE__ */ React27.createElement(Text18, null, "\u2022 Use ", /* @__PURE__ */ React27.createElement(Text18, { color: "green" }, "\u2191/\u2193"), " or ", /* @__PURE__ */ React27.createElement(Text18, { color: "green" }, "j/k"), " to navigate"), /* @__PURE__ */ React27.createElement(Text18, null, "\u2022 Press ", /* @__PURE__ */ React27.createElement(Text18, { color: "green" }, "Esc"), " to go back or quit"), /* @__PURE__ */ React27.createElement(Text18, null, "\u2022 Press ", /* @__PURE__ */ React27.createElement(Text18, { color: "green" }, "q"), " to quit anytime")), /* @__PURE__ */ React27.createElement(Box17, { marginTop: 2 }, /* @__PURE__ */ React27.createElement(Text18, { dimColor: true }, "\u{1F4A1} Tip: Each utility provides an interactive interface for easy usage.")));
6090
+ /* @__PURE__ */ React30.createElement(Box20, { flexDirection: "column" }, /* @__PURE__ */ React30.createElement(Text21, { bold: true, color: "yellow" }, selectedItem.icon, " ", selectedItem.label), /* @__PURE__ */ React30.createElement(Text21, { dimColor: true }, selectedItem.description))
6091
+ ), /* @__PURE__ */ React30.createElement(Box20, { marginBottom: 1 }, /* @__PURE__ */ React30.createElement(Text21, { bold: true }, "Quick Actions:")), /* @__PURE__ */ React30.createElement(Box20, { flexDirection: "column", marginLeft: 2 }, /* @__PURE__ */ React30.createElement(Text21, null, "\u2022 Press ", /* @__PURE__ */ React30.createElement(Text21, { color: "green" }, "Enter"), " to open selected utility"), /* @__PURE__ */ React30.createElement(Text21, null, "\u2022 Use ", /* @__PURE__ */ React30.createElement(Text21, { color: "green" }, "\u2191/\u2193"), " or ", /* @__PURE__ */ React30.createElement(Text21, { color: "green" }, "j/k"), " to navigate"), /* @__PURE__ */ React30.createElement(Text21, null, "\u2022 Press ", /* @__PURE__ */ React30.createElement(Text21, { color: "green" }, "Esc"), " to go back or quit"), /* @__PURE__ */ React30.createElement(Text21, null, "\u2022 Press ", /* @__PURE__ */ React30.createElement(Text21, { color: "green" }, "q"), " to quit anytime")), /* @__PURE__ */ React30.createElement(Box20, { marginTop: 2 }, /* @__PURE__ */ React30.createElement(Text21, { dimColor: true }, "\u{1F4A1} Tip: Each utility provides an interactive interface for easy usage.")));
5833
6092
  };
5834
6093
  var ActiveUtilityView = ({ utilityType }) => {
5835
- const service = new UtilsService();
5836
- return /* @__PURE__ */ React27.createElement(Box17, { flexDirection: "column" }, /* @__PURE__ */ React27.createElement(Box17, { marginBottom: 1 }, /* @__PURE__ */ React27.createElement(Text18, { bold: true, color: "cyan" }, MENU_ITEMS2.find((item) => item.id === utilityType)?.icon, " ", MENU_ITEMS2.find((item) => item.id === utilityType)?.label)), /* @__PURE__ */ React27.createElement(Box17, { borderStyle: "single", borderColor: "gray", paddingX: 2, paddingY: 1 }, /* @__PURE__ */ React27.createElement(Text18, null, "This utility interface is under construction.", "\n", "\n", "For now, use the command-line version:", "\n", /* @__PURE__ */ React27.createElement(Text18, { color: "green" }, "$ jai1 utils ", utilityType, " --help"), "\n", "\n", "Press ", /* @__PURE__ */ React27.createElement(Text18, { color: "yellow" }, "Esc"), " to return to the menu.")));
6094
+ switch (utilityType) {
6095
+ case "password":
6096
+ return /* @__PURE__ */ React30.createElement(PasswordView, null);
6097
+ case "uuid":
6098
+ return /* @__PURE__ */ React30.createElement(UuidView, null);
6099
+ case "hash":
6100
+ return /* @__PURE__ */ React30.createElement(HashView, null);
6101
+ // Add more views as they are created
6102
+ default:
6103
+ return /* @__PURE__ */ React30.createElement(PlaceholderView, { utilityType });
6104
+ }
6105
+ };
6106
+ var PlaceholderView = ({ utilityType }) => {
6107
+ const item = MENU_ITEMS2.find((m) => m.id === utilityType);
6108
+ return /* @__PURE__ */ React30.createElement(Box20, { flexDirection: "column" }, /* @__PURE__ */ React30.createElement(Box20, { marginBottom: 1 }, /* @__PURE__ */ React30.createElement(Text21, { bold: true, color: "cyan" }, item?.icon, " ", item?.label)), /* @__PURE__ */ React30.createElement(Box20, { borderStyle: "single", borderColor: "yellow", paddingX: 2, paddingY: 1 }, /* @__PURE__ */ React30.createElement(Text21, null, "\u{1F6A7} This utility view is under construction.", "\n", "\n", "For now, use the command-line version:", "\n", /* @__PURE__ */ React30.createElement(Text21, { color: "green" }, "$ jai1 utils ", utilityType, " --help"), "\n", "\n", "Press ", /* @__PURE__ */ React30.createElement(Text21, { color: "yellow" }, "Esc"), " to return to the menu.")));
5837
6109
  };
5838
6110
 
5839
6111
  // src/commands/utils/interactive.ts
5840
6112
  async function runInteractiveMode() {
5841
6113
  return new Promise((resolve3) => {
5842
6114
  const { unmount, waitUntilExit } = render5(
5843
- React28.createElement(UtilsApp, {
6115
+ React31.createElement(UtilsApp, {
5844
6116
  onExit: () => {
5845
6117
  unmount();
5846
6118
  resolve3();
@@ -7597,13 +7869,13 @@ async function resetSettings2(groupKeys) {
7597
7869
  }
7598
7870
 
7599
7871
  // src/commands/guide.ts
7600
- import React29 from "react";
7872
+ import React32 from "react";
7601
7873
  import { render as render6 } from "ink";
7602
7874
  import { Command as Command37 } from "commander";
7603
7875
  function createGuideCommand() {
7604
7876
  const cmd = new Command37("guide").description("Interactive guide center for Agentic Coding").option("--topic <topic>", "Open specific topic (intro, rules, workflows, prompts, skills)").action(async (options) => {
7605
7877
  const { waitUntilExit } = render6(
7606
- React29.createElement(GuideApp, {
7878
+ React32.createElement(GuideApp, {
7607
7879
  initialTopic: options.topic,
7608
7880
  onExit: () => {
7609
7881
  process.exit(0);
@@ -7616,7 +7888,7 @@ function createGuideCommand() {
7616
7888
  }
7617
7889
 
7618
7890
  // src/commands/context.ts
7619
- import React30 from "react";
7891
+ import React33 from "react";
7620
7892
  import { render as render7 } from "ink";
7621
7893
  import { Command as Command38 } from "commander";
7622
7894
  function createContextCommand() {
@@ -7646,7 +7918,7 @@ function createContextCommand() {
7646
7918
  return;
7647
7919
  }
7648
7920
  const { waitUntilExit } = render7(
7649
- React30.createElement(ContextApp, {
7921
+ React33.createElement(ContextApp, {
7650
7922
  initialIDE,
7651
7923
  initialType,
7652
7924
  onExit: () => {