@m14i/sith 1.19.0 → 1.21.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}`);
@@ -44419,7 +44432,7 @@ function buildDockerClaudeCodeCommand(githubToken, prompt) {
44419
44432
  let claudeCommand = "source /opt/sith/nix/nix-scripts/setup.sh && cd /workspace && /root/.npm-global/bin/claude";
44420
44433
  if (prompt) {
44421
44434
  const escapedPrompt = prompt.replace(/'/g, "'\\''");
44422
- claudeCommand += ` -p '${escapedPrompt}'`;
44435
+ claudeCommand += ` '${escapedPrompt}'`;
44423
44436
  }
44424
44437
  args.push(claudeCommand);
44425
44438
  return args;
@@ -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/docker/Dockerfile CHANGED
@@ -67,6 +67,13 @@ COPY --from=builder /root/.opencode /root/.opencode
67
67
  COPY --from=builder /root/.npm-global /root/.npm-global
68
68
  COPY --from=builder /root/.npmrc /root/.npmrc
69
69
 
70
+ # Bake default Claude Code config (theme, permissions, caveman mode)
71
+ COPY docker/claude-defaults/ /root/.claude/
72
+
73
+ # Entrypoint script: generates .credentials.json from CLAUDE_CODE_OAUTH_TOKEN before nix-shell
74
+ COPY docker/entrypoint.sh /opt/sith/entrypoint.sh
75
+ RUN chmod +x /opt/sith/entrypoint.sh
76
+
70
77
  # Créer un utilisateur non-root pour l'exécution
71
78
  RUN mkdir -p /home/sith && \
72
79
  echo "sith:x:1000:1000:Sith User:/home/sith:/bin/sh" >> /etc/passwd && \
@@ -86,6 +93,8 @@ ENV OPENCODE_MODEL=github-copilot/claude-sonnet-4.5
86
93
  ENV OPENCODE_LOG_LEVEL=INFO
87
94
  ENV NODE_ENV=production
88
95
  ENV CLAUDE_CODE_OAUTH_TOKEN=""
96
+ ENV IS_DEMO=1
97
+ ENV CLAUDE_CONFIG_DIR=/root/.claude
89
98
  ENV PATH="/root/.opencode/bin:/root/.local/bin:/root/.npm-global/bin:${PATH}"
90
99
  ENV NPM_CONFIG_PREFIX=/root/.npm-global
91
100
  ENV HOME=/root
@@ -106,8 +115,8 @@ HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
106
115
  # Répertoire de travail pour les projets
107
116
  WORKDIR /workspace
108
117
 
109
- # Point d'entrée via nix-shell
110
- ENTRYPOINT ["nix-shell", "/opt/sith/nix/shell.nix", "--run"]
118
+ # Point d'entrée: génère .credentials.json puis lance nix-shell
119
+ ENTRYPOINT ["/opt/sith/entrypoint.sh"]
111
120
 
112
121
  # Commande par défaut
113
122
  CMD ["opencode --help"]
@@ -0,0 +1,10 @@
1
+ {
2
+ "firstStartTime": "2025-01-01T00:00:00.000Z",
3
+ "opusProMigrationComplete": true,
4
+ "sonnet1m45MigrationComplete": true,
5
+ "seenNotifications": {},
6
+ "migrationVersion": 13,
7
+ "hasCompletedOnboarding": true,
8
+ "theme": "dark",
9
+ "userID": "069fb867041624d227d787be4b08e8c6c165f945083ffdcc91a933153e9bc18e"
10
+ }
@@ -0,0 +1,25 @@
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.
@@ -0,0 +1,10 @@
1
+ {
2
+ "theme": "dark",
3
+ "verbose": true,
4
+ "dangerouslySkipPermissions": true,
5
+ "skipDangerousModePermissionPrompt": true,
6
+ "hasCompletedOnboarding": true,
7
+ "permissions": {
8
+ "allow": ["Bash(*)", "Read(*)", "Write(*)", "Edit(*)", "WebFetch(*)", "WebSearch(*)", "Agent(*)"]
9
+ }
10
+ }
@@ -0,0 +1,10 @@
1
+ #!/bin/sh
2
+ # Generate .credentials.json from CLAUDE_CODE_OAUTH_TOKEN if present and not already authenticated
3
+ if [ -n "$CLAUDE_CODE_OAUTH_TOKEN" ] && [ ! -f /root/.claude/.credentials.json ]; then
4
+ mkdir -p /root/.claude
5
+ printf '{"claudeAiOauth":{"accessToken":"%s","expiresAt":4102444800000}}\n' "$CLAUDE_CODE_OAUTH_TOKEN" \
6
+ > /root/.claude/.credentials.json
7
+ chmod 600 /root/.claude/.credentials.json
8
+ fi
9
+
10
+ exec nix-shell /opt/sith/nix/shell.nix --run "$@"
@@ -5,6 +5,15 @@ export OPENCODE_MODEL="${OPENCODE_MODEL:-github-copilot/claude-sonnet-4.5}"
5
5
  export OPENCODE_LOG_LEVEL="${OPENCODE_LOG_LEVEL:-INFO}"
6
6
  export NODE_ENV="${NODE_ENV:-production}"
7
7
  export CLAUDE_CODE_OAUTH_TOKEN="${CLAUDE_CODE_OAUTH_TOKEN:-}"
8
+ export IS_DEMO="${IS_DEMO:-1}"
9
+
10
+ # Generate .credentials.json from token so interactive claude skips login wizard
11
+ if [ -n "$CLAUDE_CODE_OAUTH_TOKEN" ] && [ ! -f /root/.claude/.credentials.json ]; then
12
+ mkdir -p /root/.claude
13
+ printf '{"claudeAiOauth":{"accessToken":"%s","expiresAt":4102444800000}}\n' "$CLAUDE_CODE_OAUTH_TOKEN" \
14
+ > /root/.claude/.credentials.json
15
+ chmod 600 /root/.claude/.credentials.json
16
+ fi
8
17
 
9
18
  # Chemins personnalisés
10
19
  export PATH="/root/.opencode/bin:$PATH"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@m14i/sith",
3
- "version": "1.19.0",
3
+ "version": "1.21.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": {