@m14i/sith 1.21.0 → 1.22.0

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.
@@ -1,2 +1,7 @@
1
+ import React from "react";
2
+ declare function SkillsMenu({ onClose }: {
3
+ onClose?: () => void;
4
+ }): React.ReactElement;
5
+ export { SkillsMenu };
1
6
  export declare function skillsCommand(): void;
2
7
  //# sourceMappingURL=skills.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["file:///home/runner/work/sith/sith/src/commands/skills.tsx"],"names":[],"mappings":"AAuIA,wBAAgB,aAAa,IAAI,IAAI,CAEpC"}
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["file:///home/runner/work/sith/sith/src/commands/skills.tsx"],"names":[],"mappings":"AACA,OAAO,KAAmB,MAAM,OAAO,CAAC;AA+BxC,iBAAS,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,GAAG,KAAK,CAAC,YAAY,CAuI7E;AAED,OAAO,EAAE,UAAU,EAAE,CAAC;AAEtB,wBAAgB,aAAa,IAAI,IAAI,CAEpC"}
@@ -1 +1 @@
1
- {"version":3,"file":"TerminalUI.d.ts","sourceRoot":"","sources":["file:///home/runner/work/sith/sith/src/components/TerminalUI.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAgC,MAAM,OAAO,CAAC;AA0JrD,wBAAgB,UAAU,IAAI,KAAK,CAAC,YAAY,CA8R/C;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
1
+ {"version":3,"file":"TerminalUI.d.ts","sourceRoot":"","sources":["file:///home/runner/work/sith/sith/src/components/TerminalUI.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAwC,MAAM,OAAO,CAAC;AA4I7D,wBAAgB,UAAU,IAAI,KAAK,CAAC,YAAY,CA0N/C;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
@@ -1 +1 @@
1
- {"version":3,"file":"","sourceRoot":"","sources":["file:///home/runner/work/sith/sith/src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,eAAO,MAAM,cAAc,EAAE,UAAU,EA6CtC,CAAC;AAGF,eAAO,MAAM,aAAa;;;;;;;;;;;CAWhB,CAAC;AAGX,eAAO,MAAM,UAAU;;;;;;CAMb,CAAC;AAGX,eAAO,MAAM,cAAc;;;CAGjB,CAAC;AAGX,eAAO,MAAM,UAAU,mOAOb,CAAC"}
1
+ {"version":3,"file":"","sourceRoot":"","sources":["file:///home/runner/work/sith/sith/src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,eAAO,MAAM,cAAc,EAAE,UAAU,EA8CtC,CAAC;AAGF,eAAO,MAAM,aAAa;;;;;;;;;;;CAWhB,CAAC;AAGX,eAAO,MAAM,UAAU;;;;;;CAMb,CAAC;AAGX,eAAO,MAAM,cAAc;;;CAGjB,CAAC;AAGX,eAAO,MAAM,UAAU,mOAOb,CAAC"}
package/dist/index.js CHANGED
@@ -42966,9 +42966,9 @@ which.sync = whichSync
42966
42966
 
42967
42967
  __nccwpck_require__.a(module, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try {
42968
42968
  /* harmony export */ __nccwpck_require__.d(__webpack_exports__, {
42969
- /* harmony export */ Q: () => (/* binding */ dockerCommand),
42970
- /* harmony export */ l: () => (/* binding */ runShellDirect)
42969
+ /* harmony export */ Q: () => (/* binding */ dockerCommand)
42971
42970
  /* harmony export */ });
42971
+ /* unused harmony export runShellDirect */
42972
42972
  /* harmony import */ var node_fs__WEBPACK_IMPORTED_MODULE_0__ = __nccwpck_require__(3024);
42973
42973
  /* harmony import */ var node_fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__nccwpck_require__.n(node_fs__WEBPACK_IMPORTED_MODULE_0__);
42974
42974
  /* harmony import */ var node_path__WEBPACK_IMPORTED_MODULE_1__ = __nccwpck_require__(6760);
@@ -42980,7 +42980,7 @@ __nccwpck_require__.a(module, async (__webpack_handle_async_dependencies__, __we
42980
42980
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __nccwpck_require__(2864);
42981
42981
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__nccwpck_require__.n(react__WEBPACK_IMPORTED_MODULE_4__);
42982
42982
  /* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_5__ = __nccwpck_require__(6878);
42983
- /* harmony import */ var _utils_skills_js__WEBPACK_IMPORTED_MODULE_6__ = __nccwpck_require__(6400);
42983
+ /* harmony import */ var _utils_launcher_js__WEBPACK_IMPORTED_MODULE_6__ = __nccwpck_require__(5800);
42984
42984
  /* harmony import */ var _nix_js__WEBPACK_IMPORTED_MODULE_7__ = __nccwpck_require__(9922);
42985
42985
  /* harmony import */ var _skills_js__WEBPACK_IMPORTED_MODULE_8__ = __nccwpck_require__(9805);
42986
42986
  var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([ink__WEBPACK_IMPORTED_MODULE_3__, _skills_js__WEBPACK_IMPORTED_MODULE_8__]);
@@ -43075,7 +43075,7 @@ function Menu() {
43075
43075
  switch (value) {
43076
43076
  case "shell":
43077
43077
  exit();
43078
- await runShell();
43078
+ await (0,_utils_launcher_js__WEBPACK_IMPORTED_MODULE_6__/* .launchShell */ .k1)();
43079
43079
  return;
43080
43080
  case "skills":
43081
43081
  exit();
@@ -43231,7 +43231,7 @@ async function dockerCommand(options) {
43231
43231
  (0,ink__WEBPACK_IMPORTED_MODULE_3__/* .render */ .XX)(react__WEBPACK_IMPORTED_MODULE_4___default().createElement(Menu, null));
43232
43232
  }
43233
43233
  async function runShellDirect() {
43234
- await runShell();
43234
+ await launchShell();
43235
43235
  }
43236
43236
  async function pullDocker() {
43237
43237
  console.log("📦 Pulling prebuilt Docker image...");
@@ -43290,51 +43290,6 @@ async function buildDocker() {
43290
43290
  process.exit(1);
43291
43291
  }
43292
43292
  }
43293
- async function runShell() {
43294
- const skillsDir = (0,_utils_skills_js__WEBPACK_IMPORTED_MODULE_6__/* .getSkillsDir */ .YJ)();
43295
- const opencodeConfigPath = (0,_utils_skills_js__WEBPACK_IMPORTED_MODULE_6__/* .getOpenCodeConfigPath */ .Jn)();
43296
- console.log("🚀 Starting interactive shell...");
43297
- console.log(`Mounting workspace to ${_config_js__WEBPACK_IMPORTED_MODULE_5__/* .DOCKER_CONFIG */ .e6.workspaceMount}`);
43298
- console.log(`Mounting skills from ${skillsDir} to ${_config_js__WEBPACK_IMPORTED_MODULE_5__/* .DOCKER_CONFIG */ .e6.skillsMount}`);
43299
- console.log('Press Ctrl+D or type "exit" to leave');
43300
- console.log();
43301
- // Try to get GitHub token from gh CLI if not in env
43302
- let githubToken = process.env.GITHUB_TOKEN || "";
43303
- if (!githubToken) {
43304
- try {
43305
- const { stdout } = await (0,execa__WEBPACK_IMPORTED_MODULE_9__/* .execa */ .Ho)("gh", ["auth", "token"]);
43306
- githubToken = stdout.trim();
43307
- }
43308
- catch {
43309
- // Ignore if gh CLI not available or not authenticated
43310
- }
43311
- }
43312
- const claudeOauthToken = process.env.CLAUDE_CODE_OAUTH_TOKEN || "";
43313
- const dockerArgs = [
43314
- "run",
43315
- "--rm",
43316
- "-it",
43317
- "-v",
43318
- `${process.cwd()}:${_config_js__WEBPACK_IMPORTED_MODULE_5__/* .DOCKER_CONFIG */ .e6.workspaceMount}`,
43319
- "-v",
43320
- `${skillsDir}:${_config_js__WEBPACK_IMPORTED_MODULE_5__/* .DOCKER_CONFIG */ .e6.skillsMount}`,
43321
- "-v",
43322
- `${opencodeConfigPath}:${_config_js__WEBPACK_IMPORTED_MODULE_5__/* .DOCKER_CONFIG */ .e6.opencodeConfigMount}`,
43323
- "-e",
43324
- `GITHUB_TOKEN=${githubToken}`,
43325
- ...(claudeOauthToken
43326
- ? ["-e", `CLAUDE_CODE_OAUTH_TOKEN=${claudeOauthToken}`]
43327
- : []),
43328
- "--entrypoint",
43329
- "nix-shell",
43330
- _config_js__WEBPACK_IMPORTED_MODULE_5__/* .DOCKER_CONFIG */ .e6.imageName,
43331
- _config_js__WEBPACK_IMPORTED_MODULE_5__/* .DOCKER_CONFIG */ .e6.shellEntrypoint,
43332
- ];
43333
- await (0,execa__WEBPACK_IMPORTED_MODULE_9__/* .execa */ .Ho)("docker", dockerArgs, {
43334
- stdio: "inherit",
43335
- reject: false,
43336
- });
43337
- }
43338
43293
 
43339
43294
  __webpack_async_result__();
43340
43295
  } catch(e) { __webpack_async_result__(e); } });
@@ -43536,7 +43491,8 @@ async function nixCommand(options) {
43536
43491
 
43537
43492
  __nccwpck_require__.a(module, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try {
43538
43493
  /* harmony export */ __nccwpck_require__.d(__webpack_exports__, {
43539
- /* harmony export */ a: () => (/* binding */ skillsCommand)
43494
+ /* harmony export */ a: () => (/* binding */ skillsCommand),
43495
+ /* harmony export */ c: () => (/* binding */ SkillsMenu)
43540
43496
  /* harmony export */ });
43541
43497
  /* harmony import */ var ink__WEBPACK_IMPORTED_MODULE_0__ = __nccwpck_require__(3816);
43542
43498
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __nccwpck_require__(2864);
@@ -43559,11 +43515,12 @@ function statusIcon(row) {
43559
43515
  return row.installed ? "✅" : "☐";
43560
43516
  }
43561
43517
  }
43562
- function SkillsMenu() {
43518
+ function SkillsMenu({ onClose }) {
43563
43519
  const { exit } = (0,ink__WEBPACK_IMPORTED_MODULE_0__/* .useApp */ .nm)();
43564
43520
  const [selectedIndex, setSelectedIndex] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(0);
43565
43521
  const [rows, setRows] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(_config_js__WEBPACK_IMPORTED_MODULE_2__/* .SKILLS_CATALOG */ .XI.map((s) => ({
43566
43522
  installed: (0,_utils_skills_js__WEBPACK_IMPORTED_MODULE_3__/* .isInstalled */ .j$)(s.name),
43523
+ autoLoad: (0,_utils_skills_js__WEBPACK_IMPORTED_MODULE_3__/* .getSkillAutoLoad */ .z8)(s.name),
43567
43524
  status: "idle",
43568
43525
  message: "",
43569
43526
  })));
@@ -43588,6 +43545,7 @@ function SkillsMenu() {
43588
43545
  await (0,_utils_skills_js__WEBPACK_IMPORTED_MODULE_3__/* .installSkill */ .rP)(skill);
43589
43546
  setRow(index, {
43590
43547
  installed: true,
43548
+ autoLoad: skill.autoLoad ?? false,
43591
43549
  status: "done",
43592
43550
  message: "Installed",
43593
43551
  });
@@ -43616,8 +43574,26 @@ function SkillsMenu() {
43616
43574
  }
43617
43575
  return;
43618
43576
  }
43577
+ if (input === "a") {
43578
+ const row = rows[selectedIndex];
43579
+ if (row.installed && row.status !== "working") {
43580
+ const newAutoLoad = !row.autoLoad;
43581
+ (0,_utils_skills_js__WEBPACK_IMPORTED_MODULE_3__/* .setSkillAutoLoad */ .lJ)(_config_js__WEBPACK_IMPORTED_MODULE_2__/* .SKILLS_CATALOG */ .XI[selectedIndex].name, newAutoLoad);
43582
+ setRow(selectedIndex, {
43583
+ autoLoad: newAutoLoad,
43584
+ status: "done",
43585
+ message: newAutoLoad ? "Auto-load on" : "On-demand",
43586
+ });
43587
+ }
43588
+ return;
43589
+ }
43619
43590
  if (input === "q" || key.escape) {
43620
- exit();
43591
+ if (onClose) {
43592
+ onClose();
43593
+ }
43594
+ else {
43595
+ exit();
43596
+ }
43621
43597
  }
43622
43598
  });
43623
43599
  return (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Box */ .az, { flexDirection: "column", paddingX: 1 },
@@ -43634,13 +43610,17 @@ function SkillsMenu() {
43634
43610
  " ",
43635
43611
  skill.name.padEnd(12)),
43636
43612
  react__WEBPACK_IMPORTED_MODULE_1___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Text */ .EY, { dimColor: !isSelected }, skill.description),
43613
+ row.installed ? (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Text */ .EY, { color: row.autoLoad ? "green" : "yellow" },
43614
+ " ",
43615
+ row.autoLoad ? "[auto]" : "[on-demand]")) : null,
43637
43616
  row.message ? (react__WEBPACK_IMPORTED_MODULE_1___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Text */ .EY, { color: row.status === "error" ? "red" : "green" },
43638
43617
  " ",
43639
43618
  row.message)) : null));
43640
43619
  }),
43641
43620
  react__WEBPACK_IMPORTED_MODULE_1___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Box */ .az, { marginTop: 1 },
43642
- react__WEBPACK_IMPORTED_MODULE_1___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Text */ .EY, { dimColor: true }, "\u2191\u2193 navigate Enter install/uninstall q quit"))));
43621
+ react__WEBPACK_IMPORTED_MODULE_1___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Text */ .EY, { dimColor: true }, "\u2191\u2193 navigate Enter install/uninstall a toggle auto-load q quit"))));
43643
43622
  }
43623
+
43644
43624
  function skillsCommand() {
43645
43625
  (0,ink__WEBPACK_IMPORTED_MODULE_0__/* .render */ .XX)(react__WEBPACK_IMPORTED_MODULE_1___default().createElement(SkillsMenu, null));
43646
43626
  }
@@ -43803,17 +43783,15 @@ __nccwpck_require__.a(module, async (__webpack_handle_async_dependencies__, __we
43803
43783
  /* harmony export */ t: () => (/* binding */ renderTerminalUI)
43804
43784
  /* harmony export */ });
43805
43785
  /* unused harmony export TerminalUI */
43806
- /* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_9__ = __nccwpck_require__(6181);
43807
43786
  /* harmony import */ var ink__WEBPACK_IMPORTED_MODULE_0__ = __nccwpck_require__(3816);
43808
43787
  /* harmony import */ var ink_text_input__WEBPACK_IMPORTED_MODULE_1__ = __nccwpck_require__(9046);
43809
43788
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __nccwpck_require__(2864);
43810
43789
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__nccwpck_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);
43811
43790
  /* harmony import */ var _commands_skills_js__WEBPACK_IMPORTED_MODULE_3__ = __nccwpck_require__(9805);
43812
43791
  /* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_4__ = __nccwpck_require__(6878);
43813
- /* harmony import */ var _utils_dockerArgs_js__WEBPACK_IMPORTED_MODULE_5__ = __nccwpck_require__(4495);
43814
- /* harmony import */ var _utils_githubToken_js__WEBPACK_IMPORTED_MODULE_8__ = __nccwpck_require__(1460);
43792
+ /* harmony import */ var _utils_launcher_js__WEBPACK_IMPORTED_MODULE_5__ = __nccwpck_require__(5800);
43815
43793
  /* harmony import */ var _utils_messageUtils_js__WEBPACK_IMPORTED_MODULE_7__ = __nccwpck_require__(5534);
43816
- /* harmony import */ var _utils_slashCommands_js__WEBPACK_IMPORTED_MODULE_10__ = __nccwpck_require__(9987);
43794
+ /* harmony import */ var _utils_slashCommands_js__WEBPACK_IMPORTED_MODULE_8__ = __nccwpck_require__(9987);
43817
43795
  /* harmony import */ var _ConfigModal_js__WEBPACK_IMPORTED_MODULE_6__ = __nccwpck_require__(3636);
43818
43796
  var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([ink__WEBPACK_IMPORTED_MODULE_0__, ink_text_input__WEBPACK_IMPORTED_MODULE_1__, _commands_skills_js__WEBPACK_IMPORTED_MODULE_3__, _ConfigModal_js__WEBPACK_IMPORTED_MODULE_6__]);
43819
43797
  ([ink__WEBPACK_IMPORTED_MODULE_0__, ink_text_input__WEBPACK_IMPORTED_MODULE_1__, _commands_skills_js__WEBPACK_IMPORTED_MODULE_3__, _ConfigModal_js__WEBPACK_IMPORTED_MODULE_6__] = __webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__);
@@ -43826,8 +43804,6 @@ var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([ink_
43826
43804
 
43827
43805
 
43828
43806
 
43829
-
43830
-
43831
43807
  const TOOLS = [
43832
43808
  {
43833
43809
  value: "opencode",
@@ -43836,13 +43812,16 @@ const TOOLS = [
43836
43812
  },
43837
43813
  { value: "claude", label: "Claude Code", description: "Anthropic Claude" },
43838
43814
  ];
43839
- function ToolPicker({ selectedIndex }) {
43840
- return (react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Box */ .az, { flexDirection: "column", justifyContent: "center", alignItems: "center", paddingY: 2 },
43841
- react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Box */ .az, { flexDirection: "column", marginBottom: 2 }, _config_js__WEBPACK_IMPORTED_MODULE_4__/* .ASCII_LOGO */ .mF.map((line, index) => (
43815
+ function SithHeader() {
43816
+ return (react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Box */ .az, { flexDirection: "column", alignItems: "center", paddingY: 1 },
43817
+ react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Box */ .az, { flexDirection: "column" }, _config_js__WEBPACK_IMPORTED_MODULE_4__/* .ASCII_LOGO */ .mF.map((line, index) => (
43842
43818
  // biome-ignore lint/suspicious/noArrayIndexKey: static array, order never changes
43843
43819
  react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Text */ .EY, { key: index, color: "red", bold: true }, line)))),
43844
- react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Box */ .az, { flexDirection: "column", alignItems: "center", marginTop: 1, marginBottom: 2 },
43845
- react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Text */ .EY, { dimColor: true }, "Turn your context to the dark side")),
43820
+ react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Text */ .EY, { dimColor: true }, "Turn your context to the dark side")));
43821
+ }
43822
+ function ToolPicker({ selectedIndex }) {
43823
+ return (react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Box */ .az, { flexDirection: "column", justifyContent: "center", alignItems: "center", paddingY: 2 },
43824
+ react__WEBPACK_IMPORTED_MODULE_2___default().createElement(SithHeader, null),
43846
43825
  react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Box */ .az, { flexDirection: "column", borderStyle: "single", borderColor: "gray", paddingX: 4, paddingY: 1 },
43847
43826
  react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Box */ .az, { marginBottom: 1 },
43848
43827
  react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Text */ .EY, { color: "cyan", bold: true }, "Select AI Tool")),
@@ -43858,12 +43837,8 @@ function ToolPicker({ selectedIndex }) {
43858
43837
  }
43859
43838
  function WelcomeScreen({ tool }) {
43860
43839
  const toolLabel = TOOLS.find((t) => t.value === tool)?.label ?? tool;
43861
- return (react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Box */ .az, { flexDirection: "column", justifyContent: "center", alignItems: "center", paddingY: 2 },
43862
- react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Box */ .az, { flexDirection: "column", marginBottom: 2 }, _config_js__WEBPACK_IMPORTED_MODULE_4__/* .ASCII_LOGO */ .mF.map((line, index) => (
43863
- // biome-ignore lint/suspicious/noArrayIndexKey: static array, order never changes
43864
- react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Text */ .EY, { key: index, color: "red", bold: true }, line)))),
43865
- react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Box */ .az, { flexDirection: "column", alignItems: "center", marginTop: 1 },
43866
- react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Text */ .EY, { dimColor: true }, "Turn your context to the dark side"),
43840
+ return (react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Box */ .az, { flexDirection: "column", justifyContent: "center", alignItems: "center" },
43841
+ react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Box */ .az, { flexDirection: "column", alignItems: "center" },
43867
43842
  react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Text */ .EY, { color: "cyan" },
43868
43843
  "Tool: ",
43869
43844
  react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Text */ .EY, { bold: true }, toolLabel))),
@@ -43891,77 +43866,30 @@ function TerminalUI() {
43891
43866
  const [input, setInput] = (0,react__WEBPACK_IMPORTED_MODULE_2__.useState)("");
43892
43867
  const [messages, setMessages] = (0,react__WEBPACK_IMPORTED_MODULE_2__.useState)([]);
43893
43868
  const [showConfigModal, setShowConfigModal] = (0,react__WEBPACK_IMPORTED_MODULE_2__.useState)(false);
43894
- const [nextMessageId, setNextMessageId] = (0,react__WEBPACK_IMPORTED_MODULE_2__.useState)(1);
43869
+ const [showSkillsMenu, setShowSkillsMenu] = (0,react__WEBPACK_IMPORTED_MODULE_2__.useState)(false);
43870
+ const nextMessageId = (0,react__WEBPACK_IMPORTED_MODULE_2__.useRef)(1);
43895
43871
  const [selectedTool, setSelectedTool] = (0,react__WEBPACK_IMPORTED_MODULE_2__.useState)(null);
43896
43872
  const [toolPickerIndex, setToolPickerIndex] = (0,react__WEBPACK_IMPORTED_MODULE_2__.useState)(0);
43897
43873
  const addMessage = (0,react__WEBPACK_IMPORTED_MODULE_2__.useCallback)((text, type = "system") => {
43898
43874
  const newMessage = {
43899
- id: nextMessageId,
43875
+ id: nextMessageId.current++,
43900
43876
  text,
43901
43877
  type,
43902
43878
  timestamp: new Date(),
43903
43879
  };
43904
43880
  setMessages((previousMessages) => [...previousMessages, newMessage]);
43905
- setNextMessageId((previousId) => previousId + 1);
43906
- }, [nextMessageId]);
43881
+ }, []);
43907
43882
  const handleDockerShell = (0,react__WEBPACK_IMPORTED_MODULE_2__.useCallback)(async () => {
43908
43883
  exit();
43909
- console.log("🚀 Starting Docker shell...");
43910
- console.log(`Mounting current directory to ${_config_js__WEBPACK_IMPORTED_MODULE_4__/* .DOCKER_CONFIG */ .e6.workspaceMount}`);
43911
- console.log('Press Ctrl+D or type "exit" to leave');
43912
- console.log();
43913
- const githubToken = await (0,_utils_githubToken_js__WEBPACK_IMPORTED_MODULE_8__/* .getGitHubToken */ .l)();
43914
- const claudeOauthToken = process.env.CLAUDE_CODE_OAUTH_TOKEN || "";
43915
- const dockerArgs = (0,_utils_dockerArgs_js__WEBPACK_IMPORTED_MODULE_5__/* .buildDockerShellCommand */ .ac)(githubToken, claudeOauthToken);
43916
- await (0,execa__WEBPACK_IMPORTED_MODULE_9__/* .execa */ .Ho)("docker", dockerArgs, { stdio: "inherit", reject: false });
43917
- console.log();
43918
- console.log("✅ Exited shell");
43884
+ await (0,_utils_launcher_js__WEBPACK_IMPORTED_MODULE_5__/* .launchShell */ .k1)();
43919
43885
  }, [exit]);
43920
43886
  const handleOpenCode = (0,react__WEBPACK_IMPORTED_MODULE_2__.useCallback)(async (prompt) => {
43921
43887
  exit();
43922
- console.log("🚀 Starting OpenCode...");
43923
- console.log(`Mounting current directory to ${_config_js__WEBPACK_IMPORTED_MODULE_4__/* .DOCKER_CONFIG */ .e6.workspaceMount}`);
43924
- if (prompt) {
43925
- console.log(`Prompt: ${prompt}`);
43926
- }
43927
- console.log();
43928
- const githubToken = await (0,_utils_githubToken_js__WEBPACK_IMPORTED_MODULE_8__/* .getGitHubToken */ .l)();
43929
- const claudeOauthToken = process.env.CLAUDE_CODE_OAUTH_TOKEN || "";
43930
- const dockerArgs = (0,_utils_dockerArgs_js__WEBPACK_IMPORTED_MODULE_5__/* .buildDockerOpencodeCommand */ .Xs)(githubToken, prompt, claudeOauthToken);
43931
- try {
43932
- await (0,execa__WEBPACK_IMPORTED_MODULE_9__/* .execa */ .Ho)("docker", dockerArgs, { stdio: "inherit" });
43933
- console.log();
43934
- console.log("✅ Exited OpenCode");
43935
- }
43936
- catch (error) {
43937
- const errorMessage = error instanceof Error ? error.message : "Failed to start OpenCode";
43938
- console.error(`❌ ${errorMessage}`);
43939
- process.exit(1);
43940
- }
43888
+ await (0,_utils_launcher_js__WEBPACK_IMPORTED_MODULE_5__/* .launchOpencode */ .Tg)(prompt);
43941
43889
  }, [exit]);
43942
43890
  const handleClaudeCode = (0,react__WEBPACK_IMPORTED_MODULE_2__.useCallback)(async (prompt) => {
43943
43891
  exit();
43944
- console.log("🤖 Starting Claude Code...");
43945
- console.log(`Mounting current directory to ${_config_js__WEBPACK_IMPORTED_MODULE_4__/* .DOCKER_CONFIG */ .e6.workspaceMount}`);
43946
- if (prompt) {
43947
- console.log(`Prompt: ${prompt}`);
43948
- }
43949
- console.log();
43950
- const githubToken = await (0,_utils_githubToken_js__WEBPACK_IMPORTED_MODULE_8__/* .getGitHubToken */ .l)();
43951
- const claudeOauthToken = process.env.CLAUDE_CODE_OAUTH_TOKEN || "";
43952
- const dockerArgs = (0,_utils_dockerArgs_js__WEBPACK_IMPORTED_MODULE_5__/* .buildDockerClaudeCodeCommand */ .fn)(githubToken, prompt, claudeOauthToken);
43953
- try {
43954
- await (0,execa__WEBPACK_IMPORTED_MODULE_9__/* .execa */ .Ho)("docker", dockerArgs, { stdio: "inherit" });
43955
- console.log();
43956
- console.log("✅ Exited Claude Code");
43957
- }
43958
- catch (error) {
43959
- const errorMessage = error instanceof Error
43960
- ? error.message
43961
- : "Failed to start Claude Code";
43962
- console.error(`❌ ${errorMessage}`);
43963
- process.exit(1);
43964
- }
43892
+ await (0,_utils_launcher_js__WEBPACK_IMPORTED_MODULE_5__/* .launchClaude */ .Q7)(prompt);
43965
43893
  }, [exit]);
43966
43894
  const handleSlashCommand = (0,react__WEBPACK_IMPORTED_MODULE_2__.useCallback)(async (command, userInput) => {
43967
43895
  if (!command) {
@@ -43973,15 +43901,14 @@ function TerminalUI() {
43973
43901
  await handleDockerShell();
43974
43902
  break;
43975
43903
  case "skills":
43976
- exit();
43977
- (0,_commands_skills_js__WEBPACK_IMPORTED_MODULE_3__/* .skillsCommand */ .a)();
43904
+ setShowSkillsMenu(true);
43978
43905
  break;
43979
43906
  case "config":
43980
43907
  setShowConfigModal(true);
43981
43908
  break;
43982
43909
  case "help": {
43983
43910
  addMessage("Available commands:", "info");
43984
- const availableCommands = (0,_utils_slashCommands_js__WEBPACK_IMPORTED_MODULE_10__/* .getAvailableCommands */ .K)();
43911
+ const availableCommands = (0,_utils_slashCommands_js__WEBPACK_IMPORTED_MODULE_8__/* .getAvailableCommands */ .K)();
43985
43912
  for (const cmd of availableCommands) {
43986
43913
  addMessage(` ${cmd.command} - ${cmd.description}`, "info");
43987
43914
  }
@@ -43996,14 +43923,14 @@ function TerminalUI() {
43996
43923
  addMessage("Switched to Claude Code", "success");
43997
43924
  break;
43998
43925
  }
43999
- }, [addMessage, handleDockerShell, exit]);
43926
+ }, [addMessage, handleDockerShell]);
44000
43927
  const handleSubmit = (0,react__WEBPACK_IMPORTED_MODULE_2__.useCallback)(async (value) => {
44001
43928
  const trimmedValue = value.trim();
44002
43929
  if (!trimmedValue) {
44003
43930
  return;
44004
43931
  }
44005
43932
  setInput("");
44006
- const command = (0,_utils_slashCommands_js__WEBPACK_IMPORTED_MODULE_10__/* .parseSlashCommand */ .M)(trimmedValue);
43933
+ const command = (0,_utils_slashCommands_js__WEBPACK_IMPORTED_MODULE_8__/* .parseSlashCommand */ .M)(trimmedValue);
44007
43934
  if (command) {
44008
43935
  await handleSlashCommand(command, trimmedValue);
44009
43936
  }
@@ -44057,13 +43984,17 @@ function TerminalUI() {
44057
43984
  return (react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Box */ .az, { flexDirection: "column" },
44058
43985
  react__WEBPACK_IMPORTED_MODULE_2___default().createElement(_ConfigModal_js__WEBPACK_IMPORTED_MODULE_6__/* .ConfigModal */ .y, { onClose: handleConfigModalClose, onMessage: handleConfigModalMessage })));
44059
43986
  }
43987
+ if (showSkillsMenu) {
43988
+ return (react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Box */ .az, { flexDirection: "column" },
43989
+ react__WEBPACK_IMPORTED_MODULE_2___default().createElement(_commands_skills_js__WEBPACK_IMPORTED_MODULE_3__/* .SkillsMenu */ .c, { onClose: () => setShowSkillsMenu(false) })));
43990
+ }
44060
43991
  if (selectedTool === null) {
44061
43992
  return react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ToolPicker, { selectedIndex: toolPickerIndex });
44062
43993
  }
44063
- const shouldShowWelcome = messages.length === 0;
44064
43994
  const recentMessages = messages.slice(-10);
44065
43995
  return (react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Box */ .az, { flexDirection: "column", height: "100%" },
44066
- shouldShowWelcome ? (react__WEBPACK_IMPORTED_MODULE_2___default().createElement(WelcomeScreen, { tool: selectedTool })) : (react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Box */ .az, { flexDirection: "column", flexGrow: 1, marginBottom: 1 }, recentMessages.map((message) => (react__WEBPACK_IMPORTED_MODULE_2___default().createElement(MessageItem, { key: message.id, message: message }))))),
43996
+ react__WEBPACK_IMPORTED_MODULE_2___default().createElement(SithHeader, null),
43997
+ messages.length === 0 ? (react__WEBPACK_IMPORTED_MODULE_2___default().createElement(WelcomeScreen, { tool: selectedTool })) : (react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Box */ .az, { flexDirection: "column", flexGrow: 1, marginBottom: 1 }, recentMessages.map((message) => (react__WEBPACK_IMPORTED_MODULE_2___default().createElement(MessageItem, { key: message.id, message: message }))))),
44067
43998
  react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Box */ .az, { flexDirection: "column" },
44068
43999
  react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Box */ .az, { borderStyle: "single", borderColor: "gray", paddingX: 1 },
44069
44000
  react__WEBPACK_IMPORTED_MODULE_2___default().createElement(ink__WEBPACK_IMPORTED_MODULE_0__/* .Text */ .EY, { color: "cyan", bold: true }, "\u203A"),
@@ -44097,6 +44028,7 @@ const SKILLS_CATALOG = [
44097
44028
  name: "caveman",
44098
44029
  description: "Ultra-compressed communication (~75% token reduction)",
44099
44030
  homepage: "https://github.com/JuliusBrussee/caveman",
44031
+ autoLoad: true,
44100
44032
  builtinInstructions: `---
44101
44033
  name: caveman
44102
44034
  description: Ultra-compressed communication mode (ultra — MAX compression, always active).
@@ -44181,27 +44113,22 @@ const ASCII_LOGO = [
44181
44113
  /***/ ((module, __unused_webpack___webpack_exports__, __nccwpck_require__) => {
44182
44114
 
44183
44115
  __nccwpck_require__.a(module, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try {
44184
- /* harmony import */ var node_child_process__WEBPACK_IMPORTED_MODULE_0__ = __nccwpck_require__(1421);
44185
- /* harmony import */ var node_child_process__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__nccwpck_require__.n(node_child_process__WEBPACK_IMPORTED_MODULE_0__);
44186
- /* harmony import */ var node_fs__WEBPACK_IMPORTED_MODULE_1__ = __nccwpck_require__(3024);
44187
- /* harmony import */ var node_fs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__nccwpck_require__.n(node_fs__WEBPACK_IMPORTED_MODULE_1__);
44188
- /* harmony import */ var node_path__WEBPACK_IMPORTED_MODULE_2__ = __nccwpck_require__(6760);
44189
- /* harmony import */ var node_path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__nccwpck_require__.n(node_path__WEBPACK_IMPORTED_MODULE_2__);
44190
- /* harmony import */ var node_url__WEBPACK_IMPORTED_MODULE_3__ = __nccwpck_require__(3136);
44191
- /* harmony import */ var node_url__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__nccwpck_require__.n(node_url__WEBPACK_IMPORTED_MODULE_3__);
44192
- /* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_11__ = __nccwpck_require__(9611);
44193
- /* harmony import */ var commander__WEBPACK_IMPORTED_MODULE_4__ = __nccwpck_require__(2202);
44194
- /* harmony import */ var update_notifier__WEBPACK_IMPORTED_MODULE_10__ = __nccwpck_require__(6213);
44195
- /* harmony import */ var _commands_docker_js__WEBPACK_IMPORTED_MODULE_5__ = __nccwpck_require__(5515);
44196
- /* harmony import */ var _commands_nix_js__WEBPACK_IMPORTED_MODULE_6__ = __nccwpck_require__(9922);
44197
- /* harmony import */ var _commands_skills_js__WEBPACK_IMPORTED_MODULE_7__ = __nccwpck_require__(9805);
44198
- /* harmony import */ var _components_TerminalUI_js__WEBPACK_IMPORTED_MODULE_8__ = __nccwpck_require__(3535);
44199
- /* harmony import */ var _utils_dockerArgs_js__WEBPACK_IMPORTED_MODULE_9__ = __nccwpck_require__(4495);
44200
- /* harmony import */ var _utils_githubToken_js__WEBPACK_IMPORTED_MODULE_12__ = __nccwpck_require__(1460);
44201
- var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([_commands_docker_js__WEBPACK_IMPORTED_MODULE_5__, _commands_skills_js__WEBPACK_IMPORTED_MODULE_7__, _components_TerminalUI_js__WEBPACK_IMPORTED_MODULE_8__]);
44202
- ([_commands_docker_js__WEBPACK_IMPORTED_MODULE_5__, _commands_skills_js__WEBPACK_IMPORTED_MODULE_7__, _components_TerminalUI_js__WEBPACK_IMPORTED_MODULE_8__] = __webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__);
44203
-
44204
-
44116
+ /* harmony import */ var node_fs__WEBPACK_IMPORTED_MODULE_0__ = __nccwpck_require__(3024);
44117
+ /* harmony import */ var node_fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__nccwpck_require__.n(node_fs__WEBPACK_IMPORTED_MODULE_0__);
44118
+ /* harmony import */ var node_path__WEBPACK_IMPORTED_MODULE_1__ = __nccwpck_require__(6760);
44119
+ /* harmony import */ var node_path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__nccwpck_require__.n(node_path__WEBPACK_IMPORTED_MODULE_1__);
44120
+ /* harmony import */ var node_url__WEBPACK_IMPORTED_MODULE_2__ = __nccwpck_require__(3136);
44121
+ /* harmony import */ var node_url__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__nccwpck_require__.n(node_url__WEBPACK_IMPORTED_MODULE_2__);
44122
+ /* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_10__ = __nccwpck_require__(9611);
44123
+ /* harmony import */ var commander__WEBPACK_IMPORTED_MODULE_3__ = __nccwpck_require__(2202);
44124
+ /* harmony import */ var update_notifier__WEBPACK_IMPORTED_MODULE_9__ = __nccwpck_require__(6213);
44125
+ /* harmony import */ var _commands_docker_js__WEBPACK_IMPORTED_MODULE_4__ = __nccwpck_require__(5515);
44126
+ /* harmony import */ var _commands_nix_js__WEBPACK_IMPORTED_MODULE_5__ = __nccwpck_require__(9922);
44127
+ /* harmony import */ var _commands_skills_js__WEBPACK_IMPORTED_MODULE_6__ = __nccwpck_require__(9805);
44128
+ /* harmony import */ var _components_TerminalUI_js__WEBPACK_IMPORTED_MODULE_7__ = __nccwpck_require__(3535);
44129
+ /* harmony import */ var _utils_launcher_js__WEBPACK_IMPORTED_MODULE_8__ = __nccwpck_require__(5800);
44130
+ var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([_commands_docker_js__WEBPACK_IMPORTED_MODULE_4__, _commands_skills_js__WEBPACK_IMPORTED_MODULE_6__, _components_TerminalUI_js__WEBPACK_IMPORTED_MODULE_7__]);
44131
+ ([_commands_docker_js__WEBPACK_IMPORTED_MODULE_4__, _commands_skills_js__WEBPACK_IMPORTED_MODULE_6__, _components_TerminalUI_js__WEBPACK_IMPORTED_MODULE_7__] = __webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__);
44205
44132
 
44206
44133
 
44207
44134
 
@@ -44214,19 +44141,19 @@ var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([_com
44214
44141
 
44215
44142
 
44216
44143
  // Import package.json for version and update checks
44217
- const __filename = (0,node_url__WEBPACK_IMPORTED_MODULE_3__.fileURLToPath)(import.meta.url);
44218
- const __dirname = (0,node_path__WEBPACK_IMPORTED_MODULE_2__.dirname)(__filename);
44219
- const pkg = JSON.parse((0,node_fs__WEBPACK_IMPORTED_MODULE_1__.readFileSync)((0,node_path__WEBPACK_IMPORTED_MODULE_2__.join)(__dirname, "../package.json"), "utf-8"));
44144
+ const __filename = (0,node_url__WEBPACK_IMPORTED_MODULE_2__.fileURLToPath)(import.meta.url);
44145
+ const __dirname = (0,node_path__WEBPACK_IMPORTED_MODULE_1__.dirname)(__filename);
44146
+ const pkg = JSON.parse((0,node_fs__WEBPACK_IMPORTED_MODULE_0__.readFileSync)((0,node_path__WEBPACK_IMPORTED_MODULE_1__.join)(__dirname, "../package.json"), "utf-8"));
44220
44147
  const PROGRAM_NAME = "sith";
44221
44148
  const PROGRAM_VERSION = pkg.version;
44222
44149
  const PROGRAM_DESCRIPTION = "Turn your context to the dark side. Standardize and share your OpenCode setup with a fully dockerized environment, designed for seamless collaboration and CI integration.";
44223
44150
  // Check for updates (automatic background check)
44224
- const notifier = (0,update_notifier__WEBPACK_IMPORTED_MODULE_10__/* ["default"] */ .A)({ pkg });
44151
+ const notifier = (0,update_notifier__WEBPACK_IMPORTED_MODULE_9__/* ["default"] */ .A)({ pkg });
44225
44152
  notifier.notify();
44226
44153
  async function checkForUpdates() {
44227
- console.log(chalk__WEBPACK_IMPORTED_MODULE_11__/* ["default"] */ .Ay.cyan("Checking for updates..."));
44154
+ console.log(chalk__WEBPACK_IMPORTED_MODULE_10__/* ["default"] */ .Ay.cyan("Checking for updates..."));
44228
44155
  // Force update check by setting updateCheckInterval to 0
44229
- const notifier = (0,update_notifier__WEBPACK_IMPORTED_MODULE_10__/* ["default"] */ .A)({
44156
+ const notifier = (0,update_notifier__WEBPACK_IMPORTED_MODULE_9__/* ["default"] */ .A)({
44230
44157
  pkg,
44231
44158
  updateCheckInterval: 0,
44232
44159
  });
@@ -44235,16 +44162,16 @@ async function checkForUpdates() {
44235
44162
  const update = notifier.update;
44236
44163
  if (update && update.latest !== pkg.version) {
44237
44164
  console.log();
44238
- console.log(chalk__WEBPACK_IMPORTED_MODULE_11__/* ["default"] */ .Ay.green(`Update available: ${chalk__WEBPACK_IMPORTED_MODULE_11__/* ["default"] */ .Ay.dim(pkg.version)} → ${chalk__WEBPACK_IMPORTED_MODULE_11__/* ["default"] */ .Ay.bold(update.latest)}`));
44239
- console.log(chalk__WEBPACK_IMPORTED_MODULE_11__/* ["default"] */ .Ay.cyan(`Run ${chalk__WEBPACK_IMPORTED_MODULE_11__/* ["default"] */ .Ay.bold(`npm install -g ${pkg.name}`)} to update`));
44165
+ console.log(chalk__WEBPACK_IMPORTED_MODULE_10__/* ["default"] */ .Ay.green(`Update available: ${chalk__WEBPACK_IMPORTED_MODULE_10__/* ["default"] */ .Ay.dim(pkg.version)} → ${chalk__WEBPACK_IMPORTED_MODULE_10__/* ["default"] */ .Ay.bold(update.latest)}`));
44166
+ console.log(chalk__WEBPACK_IMPORTED_MODULE_10__/* ["default"] */ .Ay.cyan(`Run ${chalk__WEBPACK_IMPORTED_MODULE_10__/* ["default"] */ .Ay.bold(`npm install -g ${pkg.name}`)} to update`));
44240
44167
  console.log();
44241
44168
  }
44242
44169
  else {
44243
- console.log(chalk__WEBPACK_IMPORTED_MODULE_11__/* ["default"] */ .Ay.green(`✓ You're on the latest version (${pkg.version})`));
44170
+ console.log(chalk__WEBPACK_IMPORTED_MODULE_10__/* ["default"] */ .Ay.green(`✓ You're on the latest version (${pkg.version})`));
44244
44171
  }
44245
44172
  }
44246
44173
  function createProgram() {
44247
- const program = new commander__WEBPACK_IMPORTED_MODULE_4__/* .Command */ .uB();
44174
+ const program = new commander__WEBPACK_IMPORTED_MODULE_3__/* .Command */ .uB();
44248
44175
  program
44249
44176
  .name(PROGRAM_NAME)
44250
44177
  .description(PROGRAM_DESCRIPTION)
@@ -44262,21 +44189,21 @@ function createProgram() {
44262
44189
  await checkForUpdates();
44263
44190
  }
44264
44191
  else if (options.nix) {
44265
- await (0,_commands_nix_js__WEBPACK_IMPORTED_MODULE_6__/* .runNixShell */ .nb)();
44192
+ await (0,_commands_nix_js__WEBPACK_IMPORTED_MODULE_5__/* .runNixShell */ .nb)();
44266
44193
  }
44267
44194
  else if (options.nixInstall) {
44268
- await (0,_commands_nix_js__WEBPACK_IMPORTED_MODULE_6__/* .nixCommand */ .Dv)({ install: true });
44195
+ await (0,_commands_nix_js__WEBPACK_IMPORTED_MODULE_5__/* .nixCommand */ .Dv)({ install: true });
44269
44196
  }
44270
44197
  else if (options.it) {
44271
- await (0,_commands_docker_js__WEBPACK_IMPORTED_MODULE_5__/* .runShellDirect */ .l)();
44198
+ await (0,_utils_launcher_js__WEBPACK_IMPORTED_MODULE_8__/* .launchShell */ .k1)();
44272
44199
  }
44273
44200
  else if (options.legacy || options.pull || options.build) {
44274
44201
  // Use legacy menu for explicit pull/build or --legacy flag
44275
- await (0,_commands_docker_js__WEBPACK_IMPORTED_MODULE_5__/* .dockerCommand */ .Q)(options);
44202
+ await (0,_commands_docker_js__WEBPACK_IMPORTED_MODULE_4__/* .dockerCommand */ .Q)(options);
44276
44203
  }
44277
44204
  else {
44278
44205
  // Default: show new terminal UI
44279
- (0,_components_TerminalUI_js__WEBPACK_IMPORTED_MODULE_8__/* .renderTerminalUI */ .t)();
44206
+ (0,_components_TerminalUI_js__WEBPACK_IMPORTED_MODULE_7__/* .renderTerminalUI */ .t)();
44280
44207
  }
44281
44208
  });
44282
44209
  // Docker command - explicit Docker management
@@ -44286,21 +44213,21 @@ function createProgram() {
44286
44213
  .option("--pull", "Pull prebuilt Docker image (recommended)")
44287
44214
  .option("--build", "Build the Docker image from scratch")
44288
44215
  .action(async (options) => {
44289
- await (0,_commands_docker_js__WEBPACK_IMPORTED_MODULE_5__/* .dockerCommand */ .Q)(options);
44216
+ await (0,_commands_docker_js__WEBPACK_IMPORTED_MODULE_4__/* .dockerCommand */ .Q)(options);
44290
44217
  });
44291
44218
  // Shell command - direct interactive shell (bypasses menu)
44292
44219
  program
44293
44220
  .command("shell")
44294
44221
  .description("Run interactive shell in Docker container")
44295
44222
  .action(async () => {
44296
- await (0,_commands_docker_js__WEBPACK_IMPORTED_MODULE_5__/* .runShellDirect */ .l)();
44223
+ await (0,_utils_launcher_js__WEBPACK_IMPORTED_MODULE_8__/* .launchShell */ .k1)();
44297
44224
  });
44298
44225
  // Skills command - install/uninstall skills from catalog
44299
44226
  program
44300
44227
  .command("skills")
44301
44228
  .description("Manage skills (~/.sith/skills/)")
44302
44229
  .action(() => {
44303
- (0,_commands_skills_js__WEBPACK_IMPORTED_MODULE_7__/* .skillsCommand */ .a)();
44230
+ (0,_commands_skills_js__WEBPACK_IMPORTED_MODULE_6__/* .skillsCommand */ .a)();
44304
44231
  });
44305
44232
  // Nix command - native Nix environment
44306
44233
  program
@@ -44309,7 +44236,7 @@ function createProgram() {
44309
44236
  .option("--install", "Install Nix package manager")
44310
44237
  .option("--shell", "Run Nix shell")
44311
44238
  .action(async (options) => {
44312
- await (0,_commands_nix_js__WEBPACK_IMPORTED_MODULE_6__/* .nixCommand */ .Dv)(options);
44239
+ await (0,_commands_nix_js__WEBPACK_IMPORTED_MODULE_5__/* .nixCommand */ .Dv)(options);
44313
44240
  });
44314
44241
  // OpenCode command - launch OpenCode in Docker
44315
44242
  program
@@ -44317,10 +44244,7 @@ function createProgram() {
44317
44244
  .description("Launch OpenCode in Docker")
44318
44245
  .option("-p, --prompt <prompt>", "Prompt to pass to OpenCode")
44319
44246
  .action(async (options) => {
44320
- const token = await (0,_utils_githubToken_js__WEBPACK_IMPORTED_MODULE_12__/* .getGitHubToken */ .l)();
44321
- const claudeOauthToken = process.env.CLAUDE_CODE_OAUTH_TOKEN || "";
44322
- const args = (0,_utils_dockerArgs_js__WEBPACK_IMPORTED_MODULE_9__/* .buildDockerOpencodeCommand */ .Xs)(token, options.prompt, claudeOauthToken);
44323
- (0,node_child_process__WEBPACK_IMPORTED_MODULE_0__.spawnSync)("docker", args, { stdio: "inherit" });
44247
+ await (0,_utils_launcher_js__WEBPACK_IMPORTED_MODULE_8__/* .launchOpencode */ .Tg)(options.prompt);
44324
44248
  });
44325
44249
  // Claude command - launch Claude Code in Docker
44326
44250
  program
@@ -44328,10 +44252,7 @@ function createProgram() {
44328
44252
  .description("Launch Claude Code in Docker")
44329
44253
  .option("-p, --prompt <prompt>", "Prompt to pass to Claude Code")
44330
44254
  .action(async (options) => {
44331
- const token = await (0,_utils_githubToken_js__WEBPACK_IMPORTED_MODULE_12__/* .getGitHubToken */ .l)();
44332
- const claudeOauthToken = process.env.CLAUDE_CODE_OAUTH_TOKEN || "";
44333
- const args = (0,_utils_dockerArgs_js__WEBPACK_IMPORTED_MODULE_9__/* .buildDockerClaudeCodeCommand */ .fn)(token, options.prompt, claudeOauthToken);
44334
- (0,node_child_process__WEBPACK_IMPORTED_MODULE_0__.spawnSync)("docker", args, { stdio: "inherit" });
44255
+ await (0,_utils_launcher_js__WEBPACK_IMPORTED_MODULE_8__/* .launchClaude */ .Q7)(options.prompt);
44335
44256
  });
44336
44257
  return program;
44337
44258
  }
@@ -44344,39 +44265,49 @@ __webpack_async_result__();
44344
44265
 
44345
44266
  /***/ }),
44346
44267
 
44347
- /***/ 4495:
44268
+ /***/ 5800:
44348
44269
  /***/ ((__unused_webpack_module, __webpack_exports__, __nccwpck_require__) => {
44349
44270
 
44350
- /* harmony export */ __nccwpck_require__.d(__webpack_exports__, {
44351
- /* harmony export */ Xs: () => (/* binding */ buildDockerOpencodeCommand),
44352
- /* harmony export */ ac: () => (/* binding */ buildDockerShellCommand),
44353
- /* harmony export */ fn: () => (/* binding */ buildDockerClaudeCodeCommand)
44354
- /* harmony export */ });
44355
- /* harmony import */ var node_fs__WEBPACK_IMPORTED_MODULE_0__ = __nccwpck_require__(3024);
44356
- /* harmony import */ var node_fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__nccwpck_require__.n(node_fs__WEBPACK_IMPORTED_MODULE_0__);
44357
- /* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_1__ = __nccwpck_require__(6878);
44358
- /* harmony import */ var _skills_js__WEBPACK_IMPORTED_MODULE_2__ = __nccwpck_require__(6400);
44359
44271
 
44272
+ // EXPORTS
44273
+ __nccwpck_require__.d(__webpack_exports__, {
44274
+ Q7: () => (/* binding */ launchClaude),
44275
+ Tg: () => (/* binding */ launchOpencode),
44276
+ k1: () => (/* binding */ launchShell)
44277
+ });
44278
+
44279
+ // EXTERNAL MODULE: ./node_modules/.pnpm/execa@9.6.1/node_modules/execa/index.js + 136 modules
44280
+ var execa = __nccwpck_require__(6181);
44281
+ // EXTERNAL MODULE: ./src/config.ts
44282
+ var config = __nccwpck_require__(6878);
44283
+ // EXTERNAL MODULE: ./src/utils/skills.ts
44284
+ var skills = __nccwpck_require__(6400);
44285
+ ;// CONCATENATED MODULE: ./src/utils/dockerArgs.ts
44360
44286
 
44361
44287
 
44362
44288
  function buildDockerShellCommand(githubToken, claudeOauthToken) {
44289
+ (0,skills/* syncClaudeMd */.RK)();
44363
44290
  const args = [
44364
44291
  "run",
44365
44292
  "--rm",
44366
44293
  "-it",
44367
44294
  "-v",
44368
- `${process.cwd()}:${_config_js__WEBPACK_IMPORTED_MODULE_1__/* .DOCKER_CONFIG */ .e6.workspaceMount}`,
44295
+ `${process.cwd()}:${config/* DOCKER_CONFIG */.e6.workspaceMount}`,
44296
+ "-v",
44297
+ `${(0,skills/* getSkillsDir */.YJ)()}:${config/* DOCKER_CONFIG */.e6.skillsMount}`,
44369
44298
  "-v",
44370
- `${(0,_skills_js__WEBPACK_IMPORTED_MODULE_2__/* .getSkillsDir */ .YJ)()}:${_config_js__WEBPACK_IMPORTED_MODULE_1__/* .DOCKER_CONFIG */ .e6.skillsMount}`,
44299
+ `${(0,skills/* getSkillsDir */.YJ)()}:${config/* DOCKER_CONFIG */.e6.claudeSkillsMount}`,
44371
44300
  "-v",
44372
- `${(0,_skills_js__WEBPACK_IMPORTED_MODULE_2__/* .getOpenCodeConfigPath */ .Jn)()}:${_config_js__WEBPACK_IMPORTED_MODULE_1__/* .DOCKER_CONFIG */ .e6.opencodeConfigMount}`,
44301
+ `${(0,skills/* getClaudeMdPath */.pF)()}:${config/* DOCKER_CONFIG */.e6.claudeConfigMount}/CLAUDE.md`,
44302
+ "-v",
44303
+ `${(0,skills/* getOpenCodeConfigPath */.Jn)()}:${config/* DOCKER_CONFIG */.e6.opencodeConfigMount}`,
44373
44304
  "-e",
44374
44305
  `GITHUB_TOKEN=${githubToken}`,
44375
44306
  ];
44376
44307
  if (claudeOauthToken) {
44377
44308
  args.push("-e", `CLAUDE_CODE_OAUTH_TOKEN=${claudeOauthToken}`);
44378
44309
  }
44379
- args.push("--entrypoint", "nix-shell", _config_js__WEBPACK_IMPORTED_MODULE_1__/* .DOCKER_CONFIG */ .e6.imageName, _config_js__WEBPACK_IMPORTED_MODULE_1__/* .DOCKER_CONFIG */ .e6.shellEntrypoint);
44310
+ args.push("--entrypoint", "nix-shell", config/* DOCKER_CONFIG */.e6.imageName, config/* DOCKER_CONFIG */.e6.shellEntrypoint);
44380
44311
  return args;
44381
44312
  }
44382
44313
  function buildDockerOpencodeCommand(githubToken, prompt, claudeOauthToken) {
@@ -44385,18 +44316,18 @@ function buildDockerOpencodeCommand(githubToken, prompt, claudeOauthToken) {
44385
44316
  "--rm",
44386
44317
  "-it",
44387
44318
  "-v",
44388
- `${process.cwd()}:${_config_js__WEBPACK_IMPORTED_MODULE_1__/* .DOCKER_CONFIG */ .e6.workspaceMount}`,
44319
+ `${process.cwd()}:${config/* DOCKER_CONFIG */.e6.workspaceMount}`,
44389
44320
  "-v",
44390
- `${(0,_skills_js__WEBPACK_IMPORTED_MODULE_2__/* .getSkillsDir */ .YJ)()}:${_config_js__WEBPACK_IMPORTED_MODULE_1__/* .DOCKER_CONFIG */ .e6.skillsMount}`,
44321
+ `${(0,skills/* getSkillsDir */.YJ)()}:${config/* DOCKER_CONFIG */.e6.skillsMount}`,
44391
44322
  "-v",
44392
- `${(0,_skills_js__WEBPACK_IMPORTED_MODULE_2__/* .getOpenCodeConfigPath */ .Jn)()}:${_config_js__WEBPACK_IMPORTED_MODULE_1__/* .DOCKER_CONFIG */ .e6.opencodeConfigMount}`,
44323
+ `${(0,skills/* getOpenCodeConfigPath */.Jn)()}:${config/* DOCKER_CONFIG */.e6.opencodeConfigMount}`,
44393
44324
  "-e",
44394
44325
  `GITHUB_TOKEN=${githubToken}`,
44395
44326
  ];
44396
44327
  if (claudeOauthToken) {
44397
44328
  args.push("-e", `CLAUDE_CODE_OAUTH_TOKEN=${claudeOauthToken}`);
44398
44329
  }
44399
- args.push("--entrypoint", "bash", _config_js__WEBPACK_IMPORTED_MODULE_1__/* .DOCKER_CONFIG */ .e6.imageName, "-c");
44330
+ args.push("--entrypoint", "bash", config/* DOCKER_CONFIG */.e6.imageName, "-c");
44400
44331
  let opencodeCommand = "source /opt/sith/nix/nix-scripts/setup.sh && cd /workspace && opencode -m github-copilot/claude-sonnet-4.6";
44401
44332
  if (prompt) {
44402
44333
  const escapedPrompt = prompt.replace(/'/g, "'\\''");
@@ -44406,29 +44337,25 @@ function buildDockerOpencodeCommand(githubToken, prompt, claudeOauthToken) {
44406
44337
  return args;
44407
44338
  }
44408
44339
  function buildDockerClaudeCodeCommand(githubToken, prompt, claudeOauthToken) {
44409
- const claudeConfigDir = (0,_skills_js__WEBPACK_IMPORTED_MODULE_2__/* .getClaudeConfigDir */ .K1)();
44410
- const claudeMdPath = (0,_skills_js__WEBPACK_IMPORTED_MODULE_2__/* .getClaudeMdPath */ .pF)();
44340
+ (0,skills/* syncClaudeMd */.RK)();
44341
+ const claudeMdPath = (0,skills/* getClaudeMdPath */.pF)();
44411
44342
  const args = [
44412
44343
  "run",
44413
44344
  "--rm",
44414
44345
  "-it",
44415
44346
  "-v",
44416
- `${process.cwd()}:${_config_js__WEBPACK_IMPORTED_MODULE_1__/* .DOCKER_CONFIG */ .e6.workspaceMount}`,
44347
+ `${process.cwd()}:${config/* DOCKER_CONFIG */.e6.workspaceMount}`,
44417
44348
  "-e",
44418
44349
  `GITHUB_TOKEN=${githubToken}`,
44419
44350
  ];
44420
44351
  if (claudeOauthToken) {
44421
44352
  args.push("-e", `CLAUDE_CODE_OAUTH_TOKEN=${claudeOauthToken}`);
44422
44353
  }
44423
- // Mount ~/.claude first so subsequent mounts can shadow entries within it
44424
- if (node_fs__WEBPACK_IMPORTED_MODULE_0___default().existsSync(claudeConfigDir)) {
44425
- args.push("-v", `${claudeConfigDir}:${_config_js__WEBPACK_IMPORTED_MODULE_1__/* .DOCKER_CONFIG */ .e6.claudeConfigMount}`);
44426
- }
44427
- // Skills dir overrides /root/.claude/skills inside the container
44428
- args.push("-v", `${(0,_skills_js__WEBPACK_IMPORTED_MODULE_2__/* .getSkillsDir */ .YJ)()}:${_config_js__WEBPACK_IMPORTED_MODULE_1__/* .DOCKER_CONFIG */ .e6.claudeSkillsMount}`);
44354
+ // Mount only ~/.sith/ contents never expose ~/.claude to the container
44355
+ args.push("-v", `${(0,skills/* getSkillsDir */.YJ)()}:${config/* DOCKER_CONFIG */.e6.claudeSkillsMount}`);
44429
44356
  // Generated CLAUDE.md (with skill @imports) overrides any CLAUDE.md from ~/.claude
44430
- args.push("-v", `${claudeMdPath}:${_config_js__WEBPACK_IMPORTED_MODULE_1__/* .DOCKER_CONFIG */ .e6.claudeConfigMount}/CLAUDE.md`);
44431
- args.push("--entrypoint", "bash", _config_js__WEBPACK_IMPORTED_MODULE_1__/* .DOCKER_CONFIG */ .e6.imageName, "-c");
44357
+ args.push("-v", `${claudeMdPath}:${config/* DOCKER_CONFIG */.e6.claudeConfigMount}/CLAUDE.md`);
44358
+ args.push("--entrypoint", "bash", config/* DOCKER_CONFIG */.e6.imageName, "-c");
44432
44359
  let claudeCommand = "source /opt/sith/nix/nix-scripts/setup.sh && cd /workspace && /root/.npm-global/bin/claude";
44433
44360
  if (prompt) {
44434
44361
  const escapedPrompt = prompt.replace(/'/g, "'\\''");
@@ -44438,22 +44365,13 @@ function buildDockerClaudeCodeCommand(githubToken, prompt, claudeOauthToken) {
44438
44365
  return args;
44439
44366
  }
44440
44367
 
44441
-
44442
- /***/ }),
44443
-
44444
- /***/ 1460:
44445
- /***/ ((__unused_webpack_module, __webpack_exports__, __nccwpck_require__) => {
44446
-
44447
- /* harmony export */ __nccwpck_require__.d(__webpack_exports__, {
44448
- /* harmony export */ l: () => (/* binding */ getGitHubToken)
44449
- /* harmony export */ });
44450
- /* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_0__ = __nccwpck_require__(6181);
44368
+ ;// CONCATENATED MODULE: ./src/utils/githubToken.ts
44451
44369
 
44452
44370
  async function getGitHubToken() {
44453
44371
  if (process.env.GITHUB_TOKEN)
44454
44372
  return process.env.GITHUB_TOKEN;
44455
44373
  try {
44456
- const { stdout } = await (0,execa__WEBPACK_IMPORTED_MODULE_0__/* .execa */ .Ho)("gh", ["auth", "token"]);
44374
+ const { stdout } = await (0,execa/* execa */.Ho)("gh", ["auth", "token"]);
44457
44375
  return stdout.trim();
44458
44376
  }
44459
44377
  catch {
@@ -44461,6 +44379,62 @@ async function getGitHubToken() {
44461
44379
  }
44462
44380
  }
44463
44381
 
44382
+ ;// CONCATENATED MODULE: ./src/utils/launcher.ts
44383
+
44384
+
44385
+
44386
+
44387
+ function getClaudeOauthToken() {
44388
+ return process.env.CLAUDE_CODE_OAUTH_TOKEN || "";
44389
+ }
44390
+ async function launchShell() {
44391
+ console.log("🚀 Starting Docker shell...");
44392
+ console.log(`Mounting current directory to ${config/* DOCKER_CONFIG */.e6.workspaceMount}`);
44393
+ console.log('Press Ctrl+D or type "exit" to leave');
44394
+ console.log();
44395
+ const githubToken = await getGitHubToken();
44396
+ const dockerArgs = buildDockerShellCommand(githubToken, getClaudeOauthToken());
44397
+ await (0,execa/* execa */.Ho)("docker", dockerArgs, { stdio: "inherit", reject: false });
44398
+ console.log();
44399
+ console.log("✅ Exited shell");
44400
+ }
44401
+ async function launchOpencode(prompt) {
44402
+ console.log("🚀 Starting OpenCode...");
44403
+ console.log(`Mounting current directory to ${config/* DOCKER_CONFIG */.e6.workspaceMount}`);
44404
+ if (prompt)
44405
+ console.log(`Prompt: ${prompt}`);
44406
+ console.log();
44407
+ const githubToken = await getGitHubToken();
44408
+ const dockerArgs = buildDockerOpencodeCommand(githubToken, prompt, getClaudeOauthToken());
44409
+ try {
44410
+ await (0,execa/* execa */.Ho)("docker", dockerArgs, { stdio: "inherit" });
44411
+ console.log();
44412
+ console.log("✅ Exited OpenCode");
44413
+ }
44414
+ catch (error) {
44415
+ console.error(`❌ ${error instanceof Error ? error.message : "Failed to start OpenCode"}`);
44416
+ process.exit(1);
44417
+ }
44418
+ }
44419
+ async function launchClaude(prompt) {
44420
+ console.log("🤖 Starting Claude Code...");
44421
+ console.log(`Mounting current directory to ${config/* DOCKER_CONFIG */.e6.workspaceMount}`);
44422
+ if (prompt)
44423
+ console.log(`Prompt: ${prompt}`);
44424
+ console.log();
44425
+ const githubToken = await getGitHubToken();
44426
+ const dockerArgs = buildDockerClaudeCodeCommand(githubToken, prompt, getClaudeOauthToken());
44427
+ try {
44428
+ await (0,execa/* execa */.Ho)("docker", dockerArgs, { stdio: "inherit" });
44429
+ console.log();
44430
+ console.log("✅ Exited Claude Code");
44431
+ }
44432
+ catch (error) {
44433
+ console.error(`❌ ${error instanceof Error ? error.message : "Failed to start Claude Code"}`);
44434
+ process.exit(1);
44435
+ }
44436
+ }
44437
+
44464
44438
 
44465
44439
  /***/ }),
44466
44440
 
@@ -44506,14 +44480,16 @@ function getMessagePrefix(type) {
44506
44480
 
44507
44481
  /* harmony export */ __nccwpck_require__.d(__webpack_exports__, {
44508
44482
  /* harmony export */ Jn: () => (/* binding */ getOpenCodeConfigPath),
44509
- /* harmony export */ K1: () => (/* binding */ getClaudeConfigDir),
44483
+ /* harmony export */ RK: () => (/* binding */ syncClaudeMd),
44510
44484
  /* harmony export */ YJ: () => (/* binding */ getSkillsDir),
44511
44485
  /* harmony export */ j$: () => (/* binding */ isInstalled),
44486
+ /* harmony export */ lJ: () => (/* binding */ setSkillAutoLoad),
44512
44487
  /* harmony export */ pF: () => (/* binding */ getClaudeMdPath),
44513
44488
  /* harmony export */ rP: () => (/* binding */ installSkill),
44514
- /* harmony export */ wW: () => (/* binding */ uninstallSkill)
44489
+ /* harmony export */ wW: () => (/* binding */ uninstallSkill),
44490
+ /* harmony export */ z8: () => (/* binding */ getSkillAutoLoad)
44515
44491
  /* harmony export */ });
44516
- /* unused harmony export findInstructionsFile */
44492
+ /* unused harmony exports getClaudeConfigDir, findInstructionsFile */
44517
44493
  /* harmony import */ var node_fs__WEBPACK_IMPORTED_MODULE_0__ = __nccwpck_require__(3024);
44518
44494
  /* harmony import */ var node_fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__nccwpck_require__.n(node_fs__WEBPACK_IMPORTED_MODULE_0__);
44519
44495
  /* harmony import */ var node_os__WEBPACK_IMPORTED_MODULE_1__ = __nccwpck_require__(8161);
@@ -44528,8 +44504,9 @@ function getMessagePrefix(type) {
44528
44504
 
44529
44505
 
44530
44506
  const OPENCODE_SCHEMA = "https://opencode.ai/config.json";
44507
+ const DEFAULT_MODEL = "github-copilot/claude-sonnet-4.6";
44531
44508
  function defaultConfig() {
44532
- return { $schema: OPENCODE_SCHEMA, instructions: [] };
44509
+ return { $schema: OPENCODE_SCHEMA, model: DEFAULT_MODEL, instructions: [] };
44533
44510
  }
44534
44511
  function getSkillsDir() {
44535
44512
  const dir = node_path__WEBPACK_IMPORTED_MODULE_2___default().join(node_os__WEBPACK_IMPORTED_MODULE_1___default().homedir(), ".sith", "skills");
@@ -44537,25 +44514,38 @@ function getSkillsDir() {
44537
44514
  return dir;
44538
44515
  }
44539
44516
  function getClaudeConfigDir() {
44540
- return node_path__WEBPACK_IMPORTED_MODULE_2___default().join(node_os__WEBPACK_IMPORTED_MODULE_1___default().homedir(), ".claude");
44517
+ return path.join(os.homedir(), ".claude");
44541
44518
  }
44542
44519
  function getClaudeMdPath() {
44543
44520
  const claudeMdPath = node_path__WEBPACK_IMPORTED_MODULE_2___default().join(node_os__WEBPACK_IMPORTED_MODULE_1___default().homedir(), ".sith", "CLAUDE.md");
44544
- if (!node_fs__WEBPACK_IMPORTED_MODULE_0___default().existsSync(claudeMdPath)) {
44545
- node_fs__WEBPACK_IMPORTED_MODULE_0___default().mkdirSync(node_path__WEBPACK_IMPORTED_MODULE_2___default().dirname(claudeMdPath), { recursive: true });
44546
- node_fs__WEBPACK_IMPORTED_MODULE_0___default().writeFileSync(claudeMdPath, "");
44521
+ node_fs__WEBPACK_IMPORTED_MODULE_0___default().mkdirSync(node_path__WEBPACK_IMPORTED_MODULE_2___default().dirname(claudeMdPath), { recursive: true });
44522
+ try {
44523
+ node_fs__WEBPACK_IMPORTED_MODULE_0___default().writeFileSync(claudeMdPath, "", { flag: "ax" });
44524
+ }
44525
+ catch {
44526
+ // already exists
44547
44527
  }
44548
44528
  return claudeMdPath;
44549
44529
  }
44550
44530
  function getOpenCodeConfigPath() {
44551
44531
  const configPath = node_path__WEBPACK_IMPORTED_MODULE_2___default().join(node_os__WEBPACK_IMPORTED_MODULE_1___default().homedir(), ".sith", "opencode.json");
44552
44532
  // Docker bind-mount creates a directory if the source doesn't exist; ensure it's a file.
44553
- if (node_fs__WEBPACK_IMPORTED_MODULE_0___default().existsSync(configPath) && node_fs__WEBPACK_IMPORTED_MODULE_0___default().statSync(configPath).isDirectory()) {
44554
- node_fs__WEBPACK_IMPORTED_MODULE_0___default().rmSync(configPath, { recursive: true, force: true });
44533
+ try {
44534
+ if (node_fs__WEBPACK_IMPORTED_MODULE_0___default().statSync(configPath).isDirectory()) {
44535
+ node_fs__WEBPACK_IMPORTED_MODULE_0___default().rmSync(configPath, { recursive: true, force: true });
44536
+ }
44555
44537
  }
44556
- if (!node_fs__WEBPACK_IMPORTED_MODULE_0___default().existsSync(configPath)) {
44557
- node_fs__WEBPACK_IMPORTED_MODULE_0___default().mkdirSync(node_path__WEBPACK_IMPORTED_MODULE_2___default().dirname(configPath), { recursive: true });
44558
- node_fs__WEBPACK_IMPORTED_MODULE_0___default().writeFileSync(configPath, JSON.stringify(defaultConfig(), null, 2));
44538
+ catch {
44539
+ // doesn't exist yet
44540
+ }
44541
+ node_fs__WEBPACK_IMPORTED_MODULE_0___default().mkdirSync(node_path__WEBPACK_IMPORTED_MODULE_2___default().dirname(configPath), { recursive: true });
44542
+ try {
44543
+ node_fs__WEBPACK_IMPORTED_MODULE_0___default().writeFileSync(configPath, JSON.stringify(defaultConfig(), null, 2), {
44544
+ flag: "ax",
44545
+ });
44546
+ }
44547
+ catch {
44548
+ // already exists
44559
44549
  }
44560
44550
  return configPath;
44561
44551
  }
@@ -44563,6 +44553,10 @@ function readConfig() {
44563
44553
  const parsed = JSON.parse(node_fs__WEBPACK_IMPORTED_MODULE_0___default().readFileSync(getOpenCodeConfigPath(), "utf8"));
44564
44554
  if (!Array.isArray(parsed.instructions))
44565
44555
  parsed.instructions = [];
44556
+ if (!parsed.model) {
44557
+ parsed.model = DEFAULT_MODEL;
44558
+ writeConfig(parsed);
44559
+ }
44566
44560
  return parsed;
44567
44561
  }
44568
44562
  function writeConfig(config) {
@@ -44576,8 +44570,21 @@ function addInstruction(containerPath) {
44576
44570
  }
44577
44571
  }
44578
44572
  function syncClaudeMd() {
44579
- const config = readConfig();
44580
- const lines = config.instructions.map((p) => `@${p.replace(_config_js__WEBPACK_IMPORTED_MODULE_3__/* .DOCKER_CONFIG */ .e6.skillsMount, _config_js__WEBPACK_IMPORTED_MODULE_3__/* .DOCKER_CONFIG */ .e6.claudeSkillsMount)}`);
44573
+ const skillsDir = getSkillsDir();
44574
+ const lines = [];
44575
+ for (const name of node_fs__WEBPACK_IMPORTED_MODULE_0___default().readdirSync(skillsDir)) {
44576
+ const skillDir = node_path__WEBPACK_IMPORTED_MODULE_2___default().join(skillsDir, name);
44577
+ const skillJsonPath = node_path__WEBPACK_IMPORTED_MODULE_2___default().join(skillDir, "skill.json");
44578
+ if (!node_fs__WEBPACK_IMPORTED_MODULE_0___default().existsSync(skillJsonPath))
44579
+ continue;
44580
+ const meta = JSON.parse(node_fs__WEBPACK_IMPORTED_MODULE_0___default().readFileSync(skillJsonPath, "utf8"));
44581
+ if (meta.autoLoad !== true)
44582
+ continue;
44583
+ const instructionsFile = findInstructionsFile(skillDir);
44584
+ if (instructionsFile) {
44585
+ lines.push(`@${_config_js__WEBPACK_IMPORTED_MODULE_3__/* .DOCKER_CONFIG */ .e6.claudeSkillsMount}/${name}/${instructionsFile}`);
44586
+ }
44587
+ }
44581
44588
  node_fs__WEBPACK_IMPORTED_MODULE_0___default().writeFileSync(getClaudeMdPath(), lines.join("\n") + (lines.length ? "\n" : ""));
44582
44589
  }
44583
44590
  function removeInstructionsUnder(skillContainerDir) {
@@ -44599,13 +44606,45 @@ function findInstructionsFile(skillDir) {
44599
44606
  function isInstalled(name) {
44600
44607
  return node_fs__WEBPACK_IMPORTED_MODULE_0___default().existsSync(node_path__WEBPACK_IMPORTED_MODULE_2___default().join(getSkillsDir(), name, "skill.json"));
44601
44608
  }
44609
+ function getSkillAutoLoad(name) {
44610
+ const skillJsonPath = node_path__WEBPACK_IMPORTED_MODULE_2___default().join(getSkillsDir(), name, "skill.json");
44611
+ if (!node_fs__WEBPACK_IMPORTED_MODULE_0___default().existsSync(skillJsonPath))
44612
+ return false;
44613
+ const meta = JSON.parse(node_fs__WEBPACK_IMPORTED_MODULE_0___default().readFileSync(skillJsonPath, "utf8"));
44614
+ return meta.autoLoad === true;
44615
+ }
44616
+ function setSkillAutoLoad(name, autoLoad) {
44617
+ const skillDir = node_path__WEBPACK_IMPORTED_MODULE_2___default().join(getSkillsDir(), name);
44618
+ const skillJsonPath = node_path__WEBPACK_IMPORTED_MODULE_2___default().join(skillDir, "skill.json");
44619
+ if (!node_fs__WEBPACK_IMPORTED_MODULE_0___default().existsSync(skillJsonPath))
44620
+ return;
44621
+ const meta = JSON.parse(node_fs__WEBPACK_IMPORTED_MODULE_0___default().readFileSync(skillJsonPath, "utf8"));
44622
+ meta.autoLoad = autoLoad;
44623
+ node_fs__WEBPACK_IMPORTED_MODULE_0___default().writeFileSync(skillJsonPath, JSON.stringify(meta, null, 2));
44624
+ if (autoLoad) {
44625
+ const instructionsFile = findInstructionsFile(skillDir);
44626
+ if (instructionsFile) {
44627
+ addInstruction(`${_config_js__WEBPACK_IMPORTED_MODULE_3__/* .DOCKER_CONFIG */ .e6.skillsMount}/${name}/${instructionsFile}`);
44628
+ }
44629
+ }
44630
+ else {
44631
+ removeInstructionsUnder(`${_config_js__WEBPACK_IMPORTED_MODULE_3__/* .DOCKER_CONFIG */ .e6.skillsMount}/${name}/`);
44632
+ }
44633
+ syncClaudeMd();
44634
+ }
44602
44635
  async function installSkill(skill) {
44603
44636
  const targetDir = node_path__WEBPACK_IMPORTED_MODULE_2___default().join(getSkillsDir(), skill.name);
44604
44637
  if (skill.builtinInstructions) {
44605
44638
  node_fs__WEBPACK_IMPORTED_MODULE_0___default().mkdirSync(targetDir, { recursive: true });
44606
44639
  node_fs__WEBPACK_IMPORTED_MODULE_0___default().writeFileSync(node_path__WEBPACK_IMPORTED_MODULE_2___default().join(targetDir, "SKILL.md"), skill.builtinInstructions);
44607
- node_fs__WEBPACK_IMPORTED_MODULE_0___default().writeFileSync(node_path__WEBPACK_IMPORTED_MODULE_2___default().join(targetDir, "skill.json"), JSON.stringify({ name: skill.name, version: "builtin" }, null, 2));
44608
- addInstruction(`${_config_js__WEBPACK_IMPORTED_MODULE_3__/* .DOCKER_CONFIG */ .e6.skillsMount}/${skill.name}/SKILL.md`);
44640
+ node_fs__WEBPACK_IMPORTED_MODULE_0___default().writeFileSync(node_path__WEBPACK_IMPORTED_MODULE_2___default().join(targetDir, "skill.json"), JSON.stringify({
44641
+ name: skill.name,
44642
+ version: "builtin",
44643
+ autoLoad: skill.autoLoad ?? false,
44644
+ }, null, 2));
44645
+ if (skill.autoLoad === true) {
44646
+ addInstruction(`${_config_js__WEBPACK_IMPORTED_MODULE_3__/* .DOCKER_CONFIG */ .e6.skillsMount}/${skill.name}/SKILL.md`);
44647
+ }
44609
44648
  syncClaudeMd();
44610
44649
  return;
44611
44650
  }
@@ -44625,11 +44664,18 @@ async function installSkill(skill) {
44625
44664
  node_fs__WEBPACK_IMPORTED_MODULE_0___default().rmSync(targetDir, { recursive: true, force: true });
44626
44665
  node_fs__WEBPACK_IMPORTED_MODULE_0___default().cpSync(extracted, targetDir, { recursive: true });
44627
44666
  const skillJson = node_path__WEBPACK_IMPORTED_MODULE_2___default().join(targetDir, "skill.json");
44628
- if (!node_fs__WEBPACK_IMPORTED_MODULE_0___default().existsSync(skillJson)) {
44629
- node_fs__WEBPACK_IMPORTED_MODULE_0___default().writeFileSync(skillJson, JSON.stringify({ name: skill.name, version: "local" }, null, 2));
44667
+ try {
44668
+ node_fs__WEBPACK_IMPORTED_MODULE_0___default().writeFileSync(skillJson, JSON.stringify({
44669
+ name: skill.name,
44670
+ version: "local",
44671
+ autoLoad: skill.autoLoad ?? false,
44672
+ }, null, 2), { flag: "ax" });
44673
+ }
44674
+ catch {
44675
+ // already exists (skill.json bundled in archive)
44630
44676
  }
44631
44677
  const instructionsFile = findInstructionsFile(targetDir);
44632
- if (instructionsFile) {
44678
+ if (instructionsFile && skill.autoLoad === true) {
44633
44679
  addInstruction(`${_config_js__WEBPACK_IMPORTED_MODULE_3__/* .DOCKER_CONFIG */ .e6.skillsMount}/${skill.name}/${instructionsFile}`);
44634
44680
  }
44635
44681
  syncClaudeMd();
package/dist/types.d.ts CHANGED
@@ -20,4 +20,5 @@ export interface SkillEntry {
20
20
  source?: string;
21
21
  homepage: string;
22
22
  builtinInstructions?: string;
23
+ autoLoad?: boolean;
23
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"","sourceRoot":"","sources":["file:///home/runner/work/sith/sith/src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,oBAAoB;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC7B"}
1
+ {"version":3,"file":"","sourceRoot":"","sources":["file:///home/runner/work/sith/sith/src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,oBAAoB;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB"}
@@ -1 +1 @@
1
- {"version":3,"file":"dockerArgs.d.ts","sourceRoot":"","sources":["file:///home/runner/work/sith/sith/src/utils/dockerArgs.ts"],"names":[],"mappings":"AASA,wBAAgB,uBAAuB,CACtC,WAAW,EAAE,MAAM,EACnB,gBAAgB,CAAC,EAAE,MAAM,GACvB,MAAM,EAAE,CAwBV;AAED,wBAAgB,0BAA0B,CACzC,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,EACf,gBAAgB,CAAC,EAAE,MAAM,GACvB,MAAM,EAAE,CA6BV;AAED,wBAAgB,4BAA4B,CAC3C,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,EACf,gBAAgB,CAAC,EAAE,MAAM,GACvB,MAAM,EAAE,CA0CV"}
1
+ {"version":3,"file":"dockerArgs.d.ts","sourceRoot":"","sources":["file:///home/runner/work/sith/sith/src/utils/dockerArgs.ts"],"names":[],"mappings":"AASA,wBAAgB,uBAAuB,CACtC,WAAW,EAAE,MAAM,EACnB,gBAAgB,CAAC,EAAE,MAAM,GACvB,MAAM,EAAE,CA6BV;AAED,wBAAgB,0BAA0B,CACzC,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,EACf,gBAAgB,CAAC,EAAE,MAAM,GACvB,MAAM,EAAE,CA6BV;AAED,wBAAgB,4BAA4B,CAC3C,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,EACf,gBAAgB,CAAC,EAAE,MAAM,GACvB,MAAM,EAAE,CAqCV"}
@@ -0,0 +1,4 @@
1
+ export declare function launchShell(): Promise<void>;
2
+ export declare function launchOpencode(prompt?: string): Promise<void>;
3
+ export declare function launchClaude(prompt?: string): Promise<void>;
4
+ //# sourceMappingURL=launcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["file:///home/runner/work/sith/sith/src/utils/launcher.ts"],"names":[],"mappings":"AAaA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAgBjD;AAED,wBAAsB,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBnE;AAED,wBAAsB,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBjE"}
@@ -3,8 +3,11 @@ export declare function getSkillsDir(): string;
3
3
  export declare function getClaudeConfigDir(): string;
4
4
  export declare function getClaudeMdPath(): string;
5
5
  export declare function getOpenCodeConfigPath(): string;
6
+ export declare function syncClaudeMd(): void;
6
7
  export declare function findInstructionsFile(skillDir: string): string | null;
7
8
  export declare function isInstalled(name: string): boolean;
9
+ export declare function getSkillAutoLoad(name: string): boolean;
10
+ export declare function setSkillAutoLoad(name: string, autoLoad: boolean): void;
8
11
  export declare function installSkill(skill: SkillEntry): Promise<void>;
9
12
  export declare function uninstallSkill(name: string): void;
10
13
  //# sourceMappingURL=skills.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["file:///home/runner/work/sith/sith/src/utils/skills.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAa9C,wBAAgB,YAAY,IAAI,MAAM,CAIrC;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,eAAe,IAAI,MAAM,CAOxC;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAW9C;AAwCD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYpE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAwDnE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAOjD"}
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["file:///home/runner/work/sith/sith/src/utils/skills.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAe9C,wBAAgB,YAAY,IAAI,MAAM,CAIrC;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,eAAe,IAAI,MAAM,CASxC;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAmB9C;AAwBD,wBAAgB,YAAY,IAAI,IAAI,CAoBnC;AAUD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYpE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKtD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAkBtE;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA6EnE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAOjD"}
@@ -1,25 +1 @@
1
- CAVEMAN MODE ACTIVE — level: ultra
2
-
3
- Respond terse like smart caveman. All technical substance stay. Only fluff die.
4
-
5
- ## Persistence
6
-
7
- ACTIVE EVERY RESPONSE. No revert after many turns. No filler drift. Still active if unsure. Off only: "stop caveman" / "normal mode".
8
-
9
- ## Rules
10
-
11
- Drop: articles (a/an/the), filler (just/really/basically/actually/simply), pleasantries (sure/certainly/of course/happy to), hedging. Fragments OK. Short synonyms (big not extensive, fix not "implement a solution for"). Technical terms exact. Code blocks unchanged. Errors quoted exact.
12
-
13
- Pattern: `[thing] [action] [reason]. [next step].`
14
-
15
- ## Ultra level
16
-
17
- Abbreviate (DB/auth/config/req/res/fn/impl), strip conjunctions, arrows for causality (X → Y), one word when one word enough.
18
-
19
- ## Auto-Clarity
20
-
21
- Drop caveman for: security warnings, irreversible action confirmations, multi-step sequences where fragment order risks misread. Resume caveman after clear part done.
22
-
23
- ## Boundaries
24
-
25
- Code/commits/PRs: write normal. "stop caveman" or "normal mode": revert.
1
+ @/root/.claude/skills/caveman/SKILL.md
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@m14i/sith",
3
- "version": "1.21.0",
3
+ "version": "1.22.0",
4
4
  "description": "Turn your context to the dark side. Standardize and share your OpenCode setup with a fully dockerized environment, designed for seamless collaboration and CI integration.",
5
5
  "type": "module",
6
6
  "repository": {
@@ -19,7 +19,8 @@
19
19
  "lint": "biome check src/",
20
20
  "typecheck": "tsc --noEmit",
21
21
  "clean": "rm -rf dist",
22
- "prepublishOnly": "pnpm build"
22
+ "prepublishOnly": "pnpm build",
23
+ "prepare": "husky"
23
24
  },
24
25
  "files": [
25
26
  "dist",
@@ -57,6 +58,8 @@
57
58
  "@types/update-notifier": "^6.0.8",
58
59
  "@vercel/ncc": "^0.38.1",
59
60
  "@vitest/coverage-v8": "^4.1.7",
61
+ "husky": "^9.1.7",
62
+ "lint-staged": "^17.0.7",
60
63
  "semantic-release": "^24.2.0",
61
64
  "tsx": "^4.7.2",
62
65
  "typescript": "^5.4.5",
@@ -65,6 +68,11 @@
65
68
  "engines": {
66
69
  "node": ">=18"
67
70
  },
71
+ "lint-staged": {
72
+ "src/**/*.{ts,tsx}": [
73
+ "biome check --write --unsafe"
74
+ ]
75
+ },
68
76
  "pnpm": {
69
77
  "overrides": {
70
78
  "esbuild": ">=0.28.1"