@m14i/sith 1.19.0 → 1.20.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.
package/README.md CHANGED
@@ -97,7 +97,39 @@ cosign verify \
97
97
 
98
98
  ## Authentication
99
99
 
100
- Sith uses **Claude Sonnet 4.6 via GitHub Copilot** by default. Authentication requires a GitHub token with Copilot access.
100
+ Sith supports two AI providers: **Claude Code** (via Anthropic) and **OpenCode** (via GitHub Copilot).
101
+
102
+ ### Claude Code (claude CLI)
103
+
104
+ Sith ships with the `claude` CLI. Authenticate it with your Anthropic account using a long-lived OAuth token — no API key required.
105
+
106
+ **Step 1 — Generate the token (once, on your local machine):**
107
+ ```bash
108
+ claude setup-token
109
+ ```
110
+ Follow the browser prompt, then copy the printed token. It is valid for one year and scoped to inference only.
111
+
112
+ **Step 2 — Export it:**
113
+ ```bash
114
+ export CLAUDE_CODE_OAUTH_TOKEN=your_token_here
115
+ ```
116
+
117
+ **Make it persistent (add to ~/.zshrc or ~/.bashrc):**
118
+ ```bash
119
+ export CLAUDE_CODE_OAUTH_TOKEN=your_token_here
120
+ ```
121
+
122
+ **Verify:**
123
+ ```bash
124
+ claude auth status
125
+ # Should show: "loggedIn": true, "authMethod": "claude.ai"
126
+ ```
127
+
128
+ **Requirements:** Claude Pro, Max, Team, or Enterprise subscription.
129
+
130
+ ### GitHub Copilot (opencode CLI)
131
+
132
+ Sith uses **Claude Sonnet 4.6 via GitHub Copilot** by default for OpenCode. Requires a GitHub token with Copilot access.
101
133
 
102
134
  **Automatic (recommended):**
103
135
  If you have GitHub CLI (`gh`) installed and authenticated, Sith automatically fetches your token:
@@ -129,6 +161,24 @@ opencode providers login
129
161
  # Follow prompts to authenticate with GitHub
130
162
  ```
131
163
 
164
+ ### CI / GitHub Actions
165
+
166
+ Add both tokens as repository secrets, then pass them to the container:
167
+
168
+ ```yaml
169
+ - name: Run sith
170
+ env:
171
+ CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
172
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
173
+ run: |
174
+ docker run --rm \
175
+ -e CLAUDE_CODE_OAUTH_TOKEN=$CLAUDE_CODE_OAUTH_TOKEN \
176
+ -e GITHUB_TOKEN=$GITHUB_TOKEN \
177
+ ghcr.io/merzoukemanouri/sith:latest "claude auth status"
178
+ ```
179
+
180
+ Generate `CLAUDE_CODE_OAUTH_TOKEN` once with `claude setup-token` and store it in **Settings → Secrets → Actions** as `CLAUDE_CODE_OAUTH_TOKEN`.
181
+
132
182
  ## Features
133
183
 
134
184
  - **Claude Code-style UI**: Interactive terminal interface with prompt input and slash commands
@@ -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,CAmR/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":"AAGA,OAAO,KAAgC,MAAM,OAAO,CAAC;AA0JrD,wBAAgB,UAAU,IAAI,KAAK,CAAC,YAAY,CA8R/C;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
package/dist/index.js CHANGED
@@ -43309,6 +43309,7 @@ async function runShell() {
43309
43309
  // Ignore if gh CLI not available or not authenticated
43310
43310
  }
43311
43311
  }
43312
+ const claudeOauthToken = process.env.CLAUDE_CODE_OAUTH_TOKEN || "";
43312
43313
  const dockerArgs = [
43313
43314
  "run",
43314
43315
  "--rm",
@@ -43321,6 +43322,9 @@ async function runShell() {
43321
43322
  `${opencodeConfigPath}:${_config_js__WEBPACK_IMPORTED_MODULE_5__/* .DOCKER_CONFIG */ .e6.opencodeConfigMount}`,
43322
43323
  "-e",
43323
43324
  `GITHUB_TOKEN=${githubToken}`,
43325
+ ...(claudeOauthToken
43326
+ ? ["-e", `CLAUDE_CODE_OAUTH_TOKEN=${claudeOauthToken}`]
43327
+ : []),
43324
43328
  "--entrypoint",
43325
43329
  "nix-shell",
43326
43330
  _config_js__WEBPACK_IMPORTED_MODULE_5__/* .DOCKER_CONFIG */ .e6.imageName,
@@ -43907,7 +43911,8 @@ function TerminalUI() {
43907
43911
  console.log('Press Ctrl+D or type "exit" to leave');
43908
43912
  console.log();
43909
43913
  const githubToken = await (0,_utils_githubToken_js__WEBPACK_IMPORTED_MODULE_8__/* .getGitHubToken */ .l)();
43910
- const dockerArgs = (0,_utils_dockerArgs_js__WEBPACK_IMPORTED_MODULE_5__/* .buildDockerShellCommand */ .ac)(githubToken);
43914
+ const claudeOauthToken = process.env.CLAUDE_CODE_OAUTH_TOKEN || "";
43915
+ const dockerArgs = (0,_utils_dockerArgs_js__WEBPACK_IMPORTED_MODULE_5__/* .buildDockerShellCommand */ .ac)(githubToken, claudeOauthToken);
43911
43916
  await (0,execa__WEBPACK_IMPORTED_MODULE_9__/* .execa */ .Ho)("docker", dockerArgs, { stdio: "inherit", reject: false });
43912
43917
  console.log();
43913
43918
  console.log("✅ Exited shell");
@@ -43921,7 +43926,8 @@ function TerminalUI() {
43921
43926
  }
43922
43927
  console.log();
43923
43928
  const githubToken = await (0,_utils_githubToken_js__WEBPACK_IMPORTED_MODULE_8__/* .getGitHubToken */ .l)();
43924
- const dockerArgs = (0,_utils_dockerArgs_js__WEBPACK_IMPORTED_MODULE_5__/* .buildDockerOpencodeCommand */ .Xs)(githubToken, prompt);
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);
43925
43931
  try {
43926
43932
  await (0,execa__WEBPACK_IMPORTED_MODULE_9__/* .execa */ .Ho)("docker", dockerArgs, { stdio: "inherit" });
43927
43933
  console.log();
@@ -43942,7 +43948,8 @@ function TerminalUI() {
43942
43948
  }
43943
43949
  console.log();
43944
43950
  const githubToken = await (0,_utils_githubToken_js__WEBPACK_IMPORTED_MODULE_8__/* .getGitHubToken */ .l)();
43945
- const dockerArgs = (0,_utils_dockerArgs_js__WEBPACK_IMPORTED_MODULE_5__/* .buildDockerClaudeCodeCommand */ .fn)(githubToken, prompt);
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);
43946
43953
  try {
43947
43954
  await (0,execa__WEBPACK_IMPORTED_MODULE_9__/* .execa */ .Ho)("docker", dockerArgs, { stdio: "inherit" });
43948
43955
  console.log();
@@ -44311,7 +44318,8 @@ function createProgram() {
44311
44318
  .option("-p, --prompt <prompt>", "Prompt to pass to OpenCode")
44312
44319
  .action(async (options) => {
44313
44320
  const token = await (0,_utils_githubToken_js__WEBPACK_IMPORTED_MODULE_12__/* .getGitHubToken */ .l)();
44314
- const args = (0,_utils_dockerArgs_js__WEBPACK_IMPORTED_MODULE_9__/* .buildDockerOpencodeCommand */ .Xs)(token, options.prompt);
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);
44315
44323
  (0,node_child_process__WEBPACK_IMPORTED_MODULE_0__.spawnSync)("docker", args, { stdio: "inherit" });
44316
44324
  });
44317
44325
  // Claude command - launch Claude Code in Docker
@@ -44321,7 +44329,8 @@ function createProgram() {
44321
44329
  .option("-p, --prompt <prompt>", "Prompt to pass to Claude Code")
44322
44330
  .action(async (options) => {
44323
44331
  const token = await (0,_utils_githubToken_js__WEBPACK_IMPORTED_MODULE_12__/* .getGitHubToken */ .l)();
44324
- const args = (0,_utils_dockerArgs_js__WEBPACK_IMPORTED_MODULE_9__/* .buildDockerClaudeCodeCommand */ .fn)(token, options.prompt);
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);
44325
44334
  (0,node_child_process__WEBPACK_IMPORTED_MODULE_0__.spawnSync)("docker", args, { stdio: "inherit" });
44326
44335
  });
44327
44336
  return program;
@@ -44350,8 +44359,8 @@ __webpack_async_result__();
44350
44359
 
44351
44360
 
44352
44361
 
44353
- function buildDockerShellCommand(githubToken) {
44354
- return [
44362
+ function buildDockerShellCommand(githubToken, claudeOauthToken) {
44363
+ const args = [
44355
44364
  "run",
44356
44365
  "--rm",
44357
44366
  "-it",
@@ -44363,13 +44372,14 @@ function buildDockerShellCommand(githubToken) {
44363
44372
  `${(0,_skills_js__WEBPACK_IMPORTED_MODULE_2__/* .getOpenCodeConfigPath */ .Jn)()}:${_config_js__WEBPACK_IMPORTED_MODULE_1__/* .DOCKER_CONFIG */ .e6.opencodeConfigMount}`,
44364
44373
  "-e",
44365
44374
  `GITHUB_TOKEN=${githubToken}`,
44366
- "--entrypoint",
44367
- "nix-shell",
44368
- _config_js__WEBPACK_IMPORTED_MODULE_1__/* .DOCKER_CONFIG */ .e6.imageName,
44369
- _config_js__WEBPACK_IMPORTED_MODULE_1__/* .DOCKER_CONFIG */ .e6.shellEntrypoint,
44370
44375
  ];
44376
+ if (claudeOauthToken) {
44377
+ args.push("-e", `CLAUDE_CODE_OAUTH_TOKEN=${claudeOauthToken}`);
44378
+ }
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);
44380
+ return args;
44371
44381
  }
44372
- function buildDockerOpencodeCommand(githubToken, prompt) {
44382
+ function buildDockerOpencodeCommand(githubToken, prompt, claudeOauthToken) {
44373
44383
  const args = [
44374
44384
  "run",
44375
44385
  "--rm",
@@ -44382,11 +44392,11 @@ function buildDockerOpencodeCommand(githubToken, prompt) {
44382
44392
  `${(0,_skills_js__WEBPACK_IMPORTED_MODULE_2__/* .getOpenCodeConfigPath */ .Jn)()}:${_config_js__WEBPACK_IMPORTED_MODULE_1__/* .DOCKER_CONFIG */ .e6.opencodeConfigMount}`,
44383
44393
  "-e",
44384
44394
  `GITHUB_TOKEN=${githubToken}`,
44385
- "--entrypoint",
44386
- "bash",
44387
- _config_js__WEBPACK_IMPORTED_MODULE_1__/* .DOCKER_CONFIG */ .e6.imageName,
44388
- "-c",
44389
44395
  ];
44396
+ if (claudeOauthToken) {
44397
+ args.push("-e", `CLAUDE_CODE_OAUTH_TOKEN=${claudeOauthToken}`);
44398
+ }
44399
+ args.push("--entrypoint", "bash", _config_js__WEBPACK_IMPORTED_MODULE_1__/* .DOCKER_CONFIG */ .e6.imageName, "-c");
44390
44400
  let opencodeCommand = "source /opt/sith/nix/nix-scripts/setup.sh && cd /workspace && opencode -m github-copilot/claude-sonnet-4.6";
44391
44401
  if (prompt) {
44392
44402
  const escapedPrompt = prompt.replace(/'/g, "'\\''");
@@ -44395,7 +44405,7 @@ function buildDockerOpencodeCommand(githubToken, prompt) {
44395
44405
  args.push(opencodeCommand);
44396
44406
  return args;
44397
44407
  }
44398
- function buildDockerClaudeCodeCommand(githubToken, prompt) {
44408
+ function buildDockerClaudeCodeCommand(githubToken, prompt, claudeOauthToken) {
44399
44409
  const claudeConfigDir = (0,_skills_js__WEBPACK_IMPORTED_MODULE_2__/* .getClaudeConfigDir */ .K1)();
44400
44410
  const claudeMdPath = (0,_skills_js__WEBPACK_IMPORTED_MODULE_2__/* .getClaudeMdPath */ .pF)();
44401
44411
  const args = [
@@ -44407,6 +44417,9 @@ function buildDockerClaudeCodeCommand(githubToken, prompt) {
44407
44417
  "-e",
44408
44418
  `GITHUB_TOKEN=${githubToken}`,
44409
44419
  ];
44420
+ if (claudeOauthToken) {
44421
+ args.push("-e", `CLAUDE_CODE_OAUTH_TOKEN=${claudeOauthToken}`);
44422
+ }
44410
44423
  // Mount ~/.claude first so subsequent mounts can shadow entries within it
44411
44424
  if (node_fs__WEBPACK_IMPORTED_MODULE_0___default().existsSync(claudeConfigDir)) {
44412
44425
  args.push("-v", `${claudeConfigDir}:${_config_js__WEBPACK_IMPORTED_MODULE_1__/* .DOCKER_CONFIG */ .e6.claudeConfigMount}`);
@@ -1,4 +1,4 @@
1
- export declare function buildDockerShellCommand(githubToken: string): string[];
2
- export declare function buildDockerOpencodeCommand(githubToken: string, prompt?: string): string[];
3
- export declare function buildDockerClaudeCodeCommand(githubToken: string, prompt?: string): string[];
1
+ export declare function buildDockerShellCommand(githubToken: string, claudeOauthToken?: string): string[];
2
+ export declare function buildDockerOpencodeCommand(githubToken: string, prompt?: string, claudeOauthToken?: string): string[];
3
+ export declare function buildDockerClaudeCodeCommand(githubToken: string, prompt?: string, claudeOauthToken?: string): string[];
4
4
  //# sourceMappingURL=dockerArgs.d.ts.map
@@ -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,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBrE;AAED,wBAAgB,0BAA0B,CACzC,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,GACb,MAAM,EAAE,CA6BV;AAED,wBAAgB,4BAA4B,CAC3C,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,GACb,MAAM,EAAE,CAuCV"}
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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@m14i/sith",
3
- "version": "1.19.0",
3
+ "version": "1.20.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": {