@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 +305 -33
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
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.
|
|
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
|
|
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
|
|
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] =
|
|
5743
|
-
const [activeView, setActiveView] =
|
|
6001
|
+
const [selectedIndex, setSelectedIndex] = useState17(0);
|
|
6002
|
+
const [activeView, setActiveView] = useState17(null);
|
|
5744
6003
|
const { exit } = useApp5();
|
|
5745
|
-
|
|
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__ */
|
|
5764
|
-
|
|
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__ */
|
|
5773
|
-
/* @__PURE__ */
|
|
5774
|
-
), /* @__PURE__ */
|
|
5775
|
-
|
|
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__ */
|
|
5786
|
-
MENU_ITEMS2.map((item, index) => /* @__PURE__ */
|
|
5787
|
-
|
|
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__ */
|
|
5799
|
-
), /* @__PURE__ */
|
|
5800
|
-
|
|
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__ */
|
|
5810
|
-
)), /* @__PURE__ */
|
|
5811
|
-
|
|
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__ */
|
|
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__ */
|
|
5823
|
-
|
|
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__ */
|
|
5832
|
-
), /* @__PURE__ */
|
|
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
|
-
|
|
5836
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
7921
|
+
React33.createElement(ContextApp, {
|
|
7650
7922
|
initialIDE,
|
|
7651
7923
|
initialType,
|
|
7652
7924
|
onExit: () => {
|