diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f704854..c51c48b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -47,6 +47,14 @@ jobs: registry-url: "https://registry.npmjs.org" cache: "npm" - - run: npm publish --access public + - name: Publish (skip if version already exists) + run: | + PKG_NAME=$(node -p "require('./package.json').name") + PKG_VERSION=$(node -p "require('./package.json').version") + if npm view "${PKG_NAME}@${PKG_VERSION}" version 2>/dev/null; then + echo "Version ${PKG_VERSION} already published — skipping." + else + npm publish --access public + fi env: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/package.json b/package.json index fb2b1da..ca105c2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@farhoodliquor/paperclip-adapter-claude-k8s", - "version": "0.1.9", + "version": "0.1.10", "description": "Paperclip adapter plugin that runs Claude Code agents as Kubernetes Jobs", "license": "MIT", "repository": { diff --git a/src/server/config-schema.ts b/src/server/config-schema.ts index 1a80bf6..3b51325 100644 --- a/src/server/config-schema.ts +++ b/src/server/config-schema.ts @@ -24,6 +24,63 @@ interface AdapterConfigSchema { export function getConfigSchema(): AdapterConfigSchema { const fields: ConfigFieldSchema[] = [ + // Core Claude fields + { + type: "select", + key: "model", + label: "Model", + hint: "Claude model to use for this agent.", + options: [ + { value: "claude-opus-4-6", label: "Claude Opus 4.6" }, + { value: "claude-sonnet-4-6", label: "Claude Sonnet 4.6" }, + { value: "claude-haiku-4-6", label: "Claude Haiku 4.6" }, + { value: "claude-sonnet-4-5-20250929", label: "Claude Sonnet 4.5" }, + { value: "claude-haiku-4-5-20251001", label: "Claude Haiku 4.5" }, + ], + }, + { + type: "select", + key: "effort", + label: "Reasoning Effort", + hint: "Reasoning effort level passed via --effort.", + options: [ + { value: "low", label: "Low" }, + { value: "medium", label: "Medium" }, + { value: "high", label: "High" }, + ], + }, + { + type: "number", + key: "maxTurnsPerRun", + label: "Max Turns Per Run", + hint: "Maximum number of turns for a single run. 0 means unlimited.", + }, + { + type: "toggle", + key: "dangerouslySkipPermissions", + label: "Skip Permissions", + hint: "Pass --dangerously-skip-permissions to Claude. Enabled by default for unattended K8s Jobs.", + default: true, + }, + { + type: "text", + key: "instructionsFilePath", + label: "Instructions File Path", + hint: "Absolute path to a markdown instructions file injected at runtime via --append-system-prompt-file.", + }, + // Operational + { + type: "number", + key: "timeoutSec", + label: "Timeout (seconds)", + hint: "Run timeout in seconds. 0 means no timeout.", + }, + { + type: "number", + key: "graceSec", + label: "Grace Period (seconds)", + hint: "Additional grace period before adapter gives up after Job deadline. Default: 60.", + }, // Kubernetes { type: "text",