workos 0.9.0 → 0.10.1

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.
Files changed (50) hide show
  1. package/README.md +5 -6
  2. package/dist/bin.js +39 -14
  3. package/dist/bin.js.map +1 -1
  4. package/dist/commands/install-skill.d.ts +0 -1
  5. package/dist/commands/install-skill.js +2 -10
  6. package/dist/commands/install-skill.js.map +1 -1
  7. package/dist/commands/list-skills.d.ts +4 -0
  8. package/dist/commands/list-skills.js +52 -0
  9. package/dist/commands/list-skills.js.map +1 -0
  10. package/dist/commands/login.d.ts +8 -0
  11. package/dist/commands/login.js +41 -1
  12. package/dist/commands/login.js.map +1 -1
  13. package/dist/commands/uninstall-skill.d.ts +11 -0
  14. package/dist/commands/uninstall-skill.js +116 -0
  15. package/dist/commands/uninstall-skill.js.map +1 -0
  16. package/dist/integrations/dotnet/index.js +7 -12
  17. package/dist/integrations/dotnet/index.js.map +1 -1
  18. package/dist/integrations/elixir/index.js +7 -13
  19. package/dist/integrations/elixir/index.js.map +1 -1
  20. package/dist/integrations/go/index.js +5 -11
  21. package/dist/integrations/go/index.js.map +1 -1
  22. package/dist/integrations/python/index.js +7 -13
  23. package/dist/integrations/python/index.js.map +1 -1
  24. package/dist/integrations/ruby/index.js +9 -14
  25. package/dist/integrations/ruby/index.js.map +1 -1
  26. package/dist/lib/agent-interface.js +5 -4
  27. package/dist/lib/agent-interface.js.map +1 -1
  28. package/dist/lib/agent-runner.js +24 -19
  29. package/dist/lib/agent-runner.js.map +1 -1
  30. package/dist/utils/help-json.js +55 -21
  31. package/dist/utils/help-json.js.map +1 -1
  32. package/package.json +2 -3
  33. package/.claude-plugin/plugin.json +0 -13
  34. package/skills/workos-authkit-base/SKILL.md +0 -123
  35. package/skills/workos-authkit-nextjs/SKILL.md +0 -247
  36. package/skills/workos-authkit-react/SKILL.md +0 -100
  37. package/skills/workos-authkit-react-router/SKILL.md +0 -117
  38. package/skills/workos-authkit-sveltekit/SKILL.md +0 -208
  39. package/skills/workos-authkit-tanstack-start/SKILL.md +0 -314
  40. package/skills/workos-authkit-vanilla-js/SKILL.md +0 -92
  41. package/skills/workos-dotnet/SKILL.md +0 -163
  42. package/skills/workos-elixir/SKILL.md +0 -231
  43. package/skills/workos-go/SKILL.md +0 -226
  44. package/skills/workos-kotlin/SKILL.md +0 -195
  45. package/skills/workos-management/SKILL.md +0 -250
  46. package/skills/workos-node/SKILL.md +0 -197
  47. package/skills/workos-php/SKILL.md +0 -160
  48. package/skills/workos-php-laravel/SKILL.md +0 -182
  49. package/skills/workos-python/SKILL.md +0 -193
  50. package/skills/workos-ruby/SKILL.md +0 -198
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integrations/elixir/index.ts"],"names":[],"mappings":"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","sourcesContent":["/* Elixir/Phoenix integration — auto-discovered by registry */\nimport type { FrameworkConfig } from '../../lib/framework-config.js';\nimport type { InstallerOptions } from '../../utils/types.js';\nimport { enableDebugLogs } from '../../utils/debug.js';\nimport { SPINNER_MESSAGE } from '../../lib/framework-config.js';\nimport { analytics } from '../../utils/analytics.js';\nimport { INSTALLER_INTERACTION_EVENT_NAME } from '../../lib/constants.js';\nimport { getOrAskForWorkOSCredentials } from '../../utils/clack-utils.js';\nimport { initializeAgent, runAgent } from '../../lib/agent-interface.js';\nimport { writeEnvLocal } from '../../lib/env-writer.js';\n\nexport const config: FrameworkConfig = {\n metadata: {\n name: 'Elixir (Phoenix)',\n integration: 'elixir',\n docsUrl: 'https://github.com/workos/workos-elixir',\n skillName: 'workos-elixir',\n language: 'elixir',\n stability: 'experimental',\n priority: 30,\n packageManager: 'mix',\n manifestFile: 'mix.exs',\n },\n\n detection: {\n // Required by FrameworkDetection interface — stubs for non-JS integration.\n // Actual detection uses language-detection.ts (mix.exs) + registry manifestFile check.\n packageName: 'workos',\n packageDisplayName: 'WorkOS Elixir',\n getVersion: () => undefined,\n },\n\n environment: {\n uploadToHosting: false,\n requiresApiKey: true,\n getEnvVars: (apiKey: string, clientId: string) => ({\n WORKOS_API_KEY: apiKey,\n WORKOS_CLIENT_ID: clientId,\n }),\n },\n\n analytics: {\n getTags: () => ({}),\n },\n\n prompts: {},\n\n ui: {\n successMessage: 'WorkOS AuthKit integration complete',\n getOutroChanges: () => [\n 'Analyzed your Phoenix project structure',\n 'Installed workos Hex package',\n 'Configured WorkOS in config/runtime.exs',\n 'Created auth controller and routes',\n ],\n getOutroNextSteps: () => [\n 'Run `mix phx.server` to test authentication',\n 'Visit the WorkOS Dashboard to manage users and settings',\n ],\n },\n};\n\n/**\n * Custom run function for Elixir — bypasses runAgentInstaller() which assumes\n * package.json exists. Directly calls initializeAgent/runAgent instead.\n */\nexport async function run(options: InstallerOptions): Promise<string> {\n if (options.debug) {\n enableDebugLogs();\n }\n\n options.emitter?.emit('status', {\n message: `Setting up WorkOS AuthKit for ${config.metadata.name}`,\n });\n\n analytics.capture(INSTALLER_INTERACTION_EVENT_NAME, {\n action: 'started agent integration',\n integration: config.metadata.integration,\n });\n\n // Get WorkOS credentials\n const { apiKey, clientId } = await getOrAskForWorkOSCredentials(options, config.environment.requiresApiKey);\n\n // Write env vars to .env.local for the agent to reference\n const callerHandledConfig = Boolean(options.apiKey || options.clientId);\n if (!callerHandledConfig) {\n const port = 4000; // Phoenix default\n const callbackPath = '/auth/callback';\n const redirectUri = options.redirectUri || `http://localhost:${port}${callbackPath}`;\n\n writeEnvLocal(options.installDir, {\n ...(apiKey ? { WORKOS_API_KEY: apiKey } : {}),\n WORKOS_CLIENT_ID: clientId,\n WORKOS_REDIRECT_URI: redirectUri,\n });\n }\n\n // Build Elixir-specific prompt\n const integrationPrompt = buildElixirPrompt();\n\n // Initialize and run agent\n const agent = await initializeAgent(\n {\n workingDirectory: options.installDir,\n workOSApiKey: apiKey,\n workOSApiHost: 'https://api.workos.com',\n },\n options,\n );\n\n const agentResult = await runAgent(\n agent,\n integrationPrompt,\n options,\n {\n spinnerMessage: SPINNER_MESSAGE,\n successMessage: config.ui.successMessage,\n errorMessage: 'Integration failed',\n },\n options.emitter,\n );\n\n if (agentResult.error) {\n await analytics.shutdown('error');\n const message = agentResult.errorMessage || agentResult.error;\n throw new Error(`Agent SDK error: ${message}`);\n }\n\n // Build summary\n const changes = config.ui.getOutroChanges({});\n const nextSteps = config.ui.getOutroNextSteps({});\n\n const lines: string[] = [\n 'Successfully installed WorkOS AuthKit!',\n '',\n 'What the agent did:',\n ...changes.map((c) => `• ${c}`),\n '',\n 'Next steps:',\n ...nextSteps.map((s) => `• ${s}`),\n '',\n `Learn more: ${config.metadata.docsUrl}`,\n '',\n 'Note: This installer uses an LLM agent to analyze and modify your project. Please review the changes made.',\n ];\n\n await analytics.shutdown('success');\n return lines.join('\\n');\n}\n\nfunction buildElixirPrompt(): string {\n return `You are integrating WorkOS AuthKit into this Elixir/Phoenix application.\n\n## Project Context\n\n- Framework: Phoenix (Elixir)\n- Package manager: mix (Hex)\n\n## Environment\n\nThe following environment variables have been configured in .env.local:\n- WORKOS_API_KEY\n- WORKOS_CLIENT_ID\n- WORKOS_REDIRECT_URI\n\nNote: For Elixir/Phoenix, these should be read via System.get_env() in config/runtime.exs rather than from .env.local directly.\n\n## Your Task\n\nUse the \\`workos-elixir\\` skill to integrate WorkOS AuthKit into this application.\n\nThe skill contains step-by-step instructions including:\n1. Fetching the SDK documentation\n2. Validating the Phoenix project structure\n3. Installing the workos Hex package\n4. Configuring WorkOS in runtime.exs\n5. Creating auth controller and routes\n6. Verification with mix compile\n\nReport your progress using [STATUS] prefixes.\n\nBegin by invoking the workos-elixir skill.`;\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integrations/elixir/index.ts"],"names":[],"mappings":"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","sourcesContent":["/* Elixir/Phoenix integration — auto-discovered by registry */\nimport type { FrameworkConfig } from '../../lib/framework-config.js';\nimport type { InstallerOptions } from '../../utils/types.js';\nimport { enableDebugLogs } from '../../utils/debug.js';\nimport { SPINNER_MESSAGE } from '../../lib/framework-config.js';\nimport { analytics } from '../../utils/analytics.js';\nimport { INSTALLER_INTERACTION_EVENT_NAME } from '../../lib/constants.js';\nimport { getOrAskForWorkOSCredentials } from '../../utils/clack-utils.js';\nimport { initializeAgent, runAgent } from '../../lib/agent-interface.js';\nimport { writeEnvLocal } from '../../lib/env-writer.js';\nimport { getReference } from '@workos/skills';\n\nexport const config: FrameworkConfig = {\n metadata: {\n name: 'Elixir (Phoenix)',\n integration: 'elixir',\n docsUrl: 'https://github.com/workos/workos-elixir',\n skillName: 'workos-elixir',\n language: 'elixir',\n stability: 'experimental',\n priority: 30,\n packageManager: 'mix',\n manifestFile: 'mix.exs',\n },\n\n detection: {\n // Required by FrameworkDetection interface — stubs for non-JS integration.\n // Actual detection uses language-detection.ts (mix.exs) + registry manifestFile check.\n packageName: 'workos',\n packageDisplayName: 'WorkOS Elixir',\n getVersion: () => undefined,\n },\n\n environment: {\n uploadToHosting: false,\n requiresApiKey: true,\n getEnvVars: (apiKey: string, clientId: string) => ({\n WORKOS_API_KEY: apiKey,\n WORKOS_CLIENT_ID: clientId,\n }),\n },\n\n analytics: {\n getTags: () => ({}),\n },\n\n prompts: {},\n\n ui: {\n successMessage: 'WorkOS AuthKit integration complete',\n getOutroChanges: () => [\n 'Analyzed your Phoenix project structure',\n 'Installed workos Hex package',\n 'Configured WorkOS in config/runtime.exs',\n 'Created auth controller and routes',\n ],\n getOutroNextSteps: () => [\n 'Run `mix phx.server` to test authentication',\n 'Visit the WorkOS Dashboard to manage users and settings',\n ],\n },\n};\n\n/**\n * Custom run function for Elixir — bypasses runAgentInstaller() which assumes\n * package.json exists. Directly calls initializeAgent/runAgent instead.\n */\nexport async function run(options: InstallerOptions): Promise<string> {\n if (options.debug) {\n enableDebugLogs();\n }\n\n options.emitter?.emit('status', {\n message: `Setting up WorkOS AuthKit for ${config.metadata.name}`,\n });\n\n analytics.capture(INSTALLER_INTERACTION_EVENT_NAME, {\n action: 'started agent integration',\n integration: config.metadata.integration,\n });\n\n // Get WorkOS credentials\n const { apiKey, clientId } = await getOrAskForWorkOSCredentials(options, config.environment.requiresApiKey);\n\n // Write env vars to .env.local for the agent to reference\n const callerHandledConfig = Boolean(options.apiKey || options.clientId);\n if (!callerHandledConfig) {\n const port = 4000; // Phoenix default\n const callbackPath = '/auth/callback';\n const redirectUri = options.redirectUri || `http://localhost:${port}${callbackPath}`;\n\n writeEnvLocal(options.installDir, {\n ...(apiKey ? { WORKOS_API_KEY: apiKey } : {}),\n WORKOS_CLIENT_ID: clientId,\n WORKOS_REDIRECT_URI: redirectUri,\n });\n }\n\n // Build Elixir-specific prompt\n const integrationPrompt = await buildElixirPrompt();\n\n // Initialize and run agent\n const agent = await initializeAgent(\n {\n workingDirectory: options.installDir,\n workOSApiKey: apiKey,\n workOSApiHost: 'https://api.workos.com',\n },\n options,\n );\n\n const agentResult = await runAgent(\n agent,\n integrationPrompt,\n options,\n {\n spinnerMessage: SPINNER_MESSAGE,\n successMessage: config.ui.successMessage,\n errorMessage: 'Integration failed',\n },\n options.emitter,\n );\n\n if (agentResult.error) {\n await analytics.shutdown('error');\n const message = agentResult.errorMessage || agentResult.error;\n throw new Error(`Agent SDK error: ${message}`);\n }\n\n // Build summary\n const changes = config.ui.getOutroChanges({});\n const nextSteps = config.ui.getOutroNextSteps({});\n\n const lines: string[] = [\n 'Successfully installed WorkOS AuthKit!',\n '',\n 'What the agent did:',\n ...changes.map((c) => `• ${c}`),\n '',\n 'Next steps:',\n ...nextSteps.map((s) => `• ${s}`),\n '',\n `Learn more: ${config.metadata.docsUrl}`,\n '',\n 'Note: This installer uses an LLM agent to analyze and modify your project. Please review the changes made.',\n ];\n\n await analytics.shutdown('success');\n return lines.join('\\n');\n}\n\nasync function buildElixirPrompt(): Promise<string> {\n const refContent = await getReference('workos-elixir');\n\n return `You are integrating WorkOS AuthKit into this Elixir/Phoenix application.\n\n## Project Context\n\n- Framework: Phoenix (Elixir)\n- Package manager: mix (Hex)\n\n## Environment\n\nThe following environment variables have been configured in .env.local:\n- WORKOS_API_KEY\n- WORKOS_CLIENT_ID\n- WORKOS_REDIRECT_URI\n\nNote: For Elixir/Phoenix, these should be read via System.get_env() in config/runtime.exs rather than from .env.local directly.\n\n## Integration Instructions\n\n${refContent}\n\nReport your progress using [STATUS] prefixes.\n\nBegin integration now.`;\n}\n"]}
@@ -10,6 +10,7 @@ import { getOrAskForWorkOSCredentials } from '../../utils/clack-utils.js';
10
10
  import { autoConfigureWorkOSEnvironment } from '../../lib/workos-management.js';
11
11
  import { validateInstallation } from '../../lib/validation/index.js';
12
12
  import { parseEnvFile } from '../../utils/env-parser.js';
13
+ import { getReference } from '@workos/skills';
13
14
  /** Default port for Go HTTP servers */
14
15
  const GO_DEFAULT_PORT = 8080;
15
16
  const GO_CALLBACK_PATH = '/auth/callback';
@@ -140,6 +141,7 @@ export async function run(options) {
140
141
  : [];
141
142
  const additionalContext = additionalLines.length > 0 ? '\n' + additionalLines.map((line) => `- ${line}`).join('\n') : '';
142
143
  const skillName = config.metadata.skillName;
144
+ const refContent = await getReference(skillName);
143
145
  const integrationPrompt = `You are integrating WorkOS AuthKit into this ${config.metadata.name} application.
144
146
 
145
147
  ## Project Context
@@ -154,21 +156,13 @@ The following environment variables have been configured in .env:
154
156
  - WORKOS_CLIENT_ID
155
157
  - WORKOS_REDIRECT_URI
156
158
 
157
- ## Your Task
159
+ ## Integration Instructions
158
160
 
159
- Use the \`${skillName}\` skill to integrate WorkOS AuthKit into this application.
160
-
161
- The skill contains step-by-step instructions including:
162
- 1. Fetching the SDK documentation
163
- 2. Installing the SDK
164
- 3. Detecting Gin vs stdlib
165
- 4. Creating authentication handlers
166
- 5. Wiring handlers into the router
167
- 6. Verification with go build and go vet
161
+ ${refContent}
168
162
 
169
163
  Report your progress using [STATUS] prefixes.
170
164
 
171
- Begin by invoking the ${skillName} skill.`;
165
+ Begin integration now.`;
172
166
  // Initialize and run agent
173
167
  const agent = await initializeAgent({
174
168
  workingDirectory: options.installDir,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integrations/go/index.ts"],"names":[],"mappings":"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","sourcesContent":["/* Go integration — auto-discovered by registry */\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { FrameworkConfig } from '../../lib/framework-config.js';\nimport { SPINNER_MESSAGE } from '../../lib/framework-config.js';\nimport type { InstallerOptions } from '../../utils/types.js';\nimport { enableDebugLogs } from '../../utils/debug.js';\nimport { analytics } from '../../utils/analytics.js';\nimport { INSTALLER_INTERACTION_EVENT_NAME } from '../../lib/constants.js';\nimport { initializeAgent, runAgent } from '../../lib/agent-interface.js';\nimport { getOrAskForWorkOSCredentials } from '../../utils/clack-utils.js';\nimport { autoConfigureWorkOSEnvironment } from '../../lib/workos-management.js';\nimport { validateInstallation } from '../../lib/validation/index.js';\nimport { parseEnvFile } from '../../utils/env-parser.js';\n\n/** Default port for Go HTTP servers */\nconst GO_DEFAULT_PORT = 8080;\nconst GO_CALLBACK_PATH = '/auth/callback';\n\n/**\n * Detect whether go.mod includes the Gin web framework.\n */\nfunction detectGoFramework(installDir: string): 'gin' | 'stdlib' {\n try {\n const goMod = readFileSync(join(installDir, 'go.mod'), 'utf-8');\n return goMod.includes('github.com/gin-gonic/gin') ? 'gin' : 'stdlib';\n } catch {\n return 'stdlib';\n }\n}\n\n/**\n * Write environment variables to .env (Go convention, not .env.local).\n * Merges with existing .env if present.\n */\nfunction writeGoEnv(installDir: string, envVars: Record<string, string>): void {\n const envPath = join(installDir, '.env');\n let existing: Record<string, string> = {};\n\n if (existsSync(envPath)) {\n existing = parseEnvFile(readFileSync(envPath, 'utf-8'));\n }\n\n const merged = { ...existing, ...envVars };\n const content = Object.entries(merged)\n .map(([key, value]) => `${key}=${value}`)\n .join('\\n');\n\n writeFileSync(envPath, content + '\\n');\n}\n\nexport const config: FrameworkConfig = {\n metadata: {\n name: 'Go',\n integration: 'go',\n docsUrl: 'https://workos.com/docs/authkit/vanilla/go',\n skillName: 'workos-go',\n language: 'go',\n stability: 'experimental',\n priority: 50,\n packageManager: 'go',\n manifestFile: 'go.mod',\n gatherContext: async (options) => {\n return { framework: detectGoFramework(options.installDir) };\n },\n },\n\n detection: {\n packageName: 'github.com/workos/workos-go/v4',\n packageDisplayName: 'Go',\n getVersion: () => undefined,\n },\n\n environment: {\n uploadToHosting: false,\n requiresApiKey: true,\n getEnvVars: (apiKey: string, clientId: string) => ({\n WORKOS_API_KEY: apiKey,\n WORKOS_CLIENT_ID: clientId,\n }),\n },\n\n analytics: {\n getTags: (context: any) => (context?.framework ? { 'go-framework': context.framework } : {}),\n },\n\n prompts: {\n getAdditionalContextLines: (context: any) => (context?.framework ? [`Go web framework: ${context.framework}`] : []),\n },\n\n ui: {\n successMessage: 'WorkOS AuthKit integration complete',\n getOutroChanges: () => [\n 'Analyzed your Go project structure',\n 'Installed workos-go SDK',\n 'Created authentication handlers',\n 'Configured environment variables',\n ],\n getOutroNextSteps: () => [\n 'Run `go run .` to start your server',\n 'Visit the WorkOS Dashboard to manage users and settings',\n ],\n },\n};\n\n/**\n * Run the Go integration.\n *\n * Custom flow that bypasses runAgentInstaller because the universal runner\n * assumes package.json exists (getPackageDotJson aborts without it) and\n * port-detection/env-writer are JS-specific.\n */\nexport async function run(options: InstallerOptions): Promise<string> {\n if (options.debug) {\n enableDebugLogs();\n }\n\n options.emitter?.emit('status', {\n message: `Setting up WorkOS AuthKit for ${config.metadata.name}`,\n });\n\n analytics.capture(INSTALLER_INTERACTION_EVENT_NAME, {\n action: 'started agent integration',\n integration: config.metadata.integration,\n });\n\n // Get WorkOS credentials\n const { apiKey, clientId } = await getOrAskForWorkOSCredentials(options, config.environment.requiresApiKey);\n\n // Auto-configure WorkOS environment (redirect URI, CORS)\n const callerHandledConfig = Boolean(options.apiKey || options.clientId);\n if (!callerHandledConfig && apiKey) {\n const redirectUri = options.redirectUri || `http://localhost:${GO_DEFAULT_PORT}${GO_CALLBACK_PATH}`;\n await autoConfigureWorkOSEnvironment(apiKey, config.metadata.integration, GO_DEFAULT_PORT, {\n homepageUrl: options.homepageUrl,\n redirectUri,\n });\n }\n\n // Gather Go-specific context\n const frameworkContext = config.metadata.gatherContext ? await config.metadata.gatherContext(options) : {};\n\n // Write .env (not .env.local — Go convention)\n if (!callerHandledConfig) {\n const redirectUri = options.redirectUri || `http://localhost:${GO_DEFAULT_PORT}${GO_CALLBACK_PATH}`;\n writeGoEnv(options.installDir, {\n ...(apiKey ? { WORKOS_API_KEY: apiKey } : {}),\n WORKOS_CLIENT_ID: clientId,\n WORKOS_REDIRECT_URI: redirectUri,\n });\n }\n\n // Set analytics tags\n const contextTags = config.analytics.getTags(frameworkContext);\n Object.entries(contextTags).forEach(([key, value]) => {\n analytics.setTag(key, value);\n });\n\n // Build prompt\n const additionalLines = config.prompts.getAdditionalContextLines\n ? config.prompts.getAdditionalContextLines(frameworkContext)\n : [];\n const additionalContext =\n additionalLines.length > 0 ? '\\n' + additionalLines.map((line) => `- ${line}`).join('\\n') : '';\n\n const skillName = config.metadata.skillName!;\n const integrationPrompt = `You are integrating WorkOS AuthKit into this ${config.metadata.name} application.\n\n## Project Context\n\n- Language: Go\n- Framework: ${frameworkContext.framework === 'gin' ? 'Gin' : 'stdlib net/http'}${additionalContext}\n\n## Environment\n\nThe following environment variables have been configured in .env:\n- WORKOS_API_KEY\n- WORKOS_CLIENT_ID\n- WORKOS_REDIRECT_URI\n\n## Your Task\n\nUse the \\`${skillName}\\` skill to integrate WorkOS AuthKit into this application.\n\nThe skill contains step-by-step instructions including:\n1. Fetching the SDK documentation\n2. Installing the SDK\n3. Detecting Gin vs stdlib\n4. Creating authentication handlers\n5. Wiring handlers into the router\n6. Verification with go build and go vet\n\nReport your progress using [STATUS] prefixes.\n\nBegin by invoking the ${skillName} skill.`;\n\n // Initialize and run agent\n const agent = await initializeAgent(\n {\n workingDirectory: options.installDir,\n workOSApiKey: apiKey,\n workOSApiHost: 'https://api.workos.com',\n },\n options,\n );\n\n const agentResult = await runAgent(\n agent,\n integrationPrompt,\n options,\n {\n spinnerMessage: SPINNER_MESSAGE,\n successMessage: config.ui.successMessage,\n errorMessage: 'Integration failed',\n },\n options.emitter,\n );\n\n if (agentResult.error) {\n await analytics.shutdown('error');\n const message = agentResult.errorMessage || agentResult.error;\n throw new Error(`Agent SDK error: ${message}`);\n }\n\n // Post-installation validation (gracefully skips — no rules file for Go)\n if (!options.noValidate) {\n options.emitter?.emit('validation:start', { framework: config.metadata.integration });\n\n const validationResult = await validateInstallation(config.metadata.integration, options.installDir, {\n runBuild: true,\n });\n\n if (validationResult.issues.length > 0) {\n options.emitter?.emit('validation:issues', { issues: validationResult.issues });\n }\n\n options.emitter?.emit('validation:complete', {\n passed: validationResult.passed,\n issueCount: validationResult.issues.length,\n durationMs: validationResult.durationMs,\n });\n }\n\n // Build summary\n const changes = config.ui.getOutroChanges(frameworkContext).filter(Boolean);\n const nextSteps = config.ui.getOutroNextSteps(frameworkContext).filter(Boolean);\n\n const lines: string[] = [\n 'Successfully installed WorkOS AuthKit!',\n '',\n ...(changes.length > 0 ? ['What the agent did:', ...changes.map((c) => `• ${c}`), ''] : []),\n ...(nextSteps.length > 0 ? ['Next steps:', ...nextSteps.map((s) => `• ${s}`), ''] : []),\n `Learn more: ${config.metadata.docsUrl}`,\n '',\n 'Note: This installer uses an LLM agent to analyze and modify your project. Please review the changes made.',\n ];\n\n await analytics.shutdown('success');\n\n return lines.join('\\n');\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integrations/go/index.ts"],"names":[],"mappings":"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","sourcesContent":["/* Go integration — auto-discovered by registry */\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { FrameworkConfig } from '../../lib/framework-config.js';\nimport { SPINNER_MESSAGE } from '../../lib/framework-config.js';\nimport type { InstallerOptions } from '../../utils/types.js';\nimport { enableDebugLogs } from '../../utils/debug.js';\nimport { analytics } from '../../utils/analytics.js';\nimport { INSTALLER_INTERACTION_EVENT_NAME } from '../../lib/constants.js';\nimport { initializeAgent, runAgent } from '../../lib/agent-interface.js';\nimport { getOrAskForWorkOSCredentials } from '../../utils/clack-utils.js';\nimport { autoConfigureWorkOSEnvironment } from '../../lib/workos-management.js';\nimport { validateInstallation } from '../../lib/validation/index.js';\nimport { parseEnvFile } from '../../utils/env-parser.js';\nimport { getReference } from '@workos/skills';\n\n/** Default port for Go HTTP servers */\nconst GO_DEFAULT_PORT = 8080;\nconst GO_CALLBACK_PATH = '/auth/callback';\n\n/**\n * Detect whether go.mod includes the Gin web framework.\n */\nfunction detectGoFramework(installDir: string): 'gin' | 'stdlib' {\n try {\n const goMod = readFileSync(join(installDir, 'go.mod'), 'utf-8');\n return goMod.includes('github.com/gin-gonic/gin') ? 'gin' : 'stdlib';\n } catch {\n return 'stdlib';\n }\n}\n\n/**\n * Write environment variables to .env (Go convention, not .env.local).\n * Merges with existing .env if present.\n */\nfunction writeGoEnv(installDir: string, envVars: Record<string, string>): void {\n const envPath = join(installDir, '.env');\n let existing: Record<string, string> = {};\n\n if (existsSync(envPath)) {\n existing = parseEnvFile(readFileSync(envPath, 'utf-8'));\n }\n\n const merged = { ...existing, ...envVars };\n const content = Object.entries(merged)\n .map(([key, value]) => `${key}=${value}`)\n .join('\\n');\n\n writeFileSync(envPath, content + '\\n');\n}\n\nexport const config: FrameworkConfig = {\n metadata: {\n name: 'Go',\n integration: 'go',\n docsUrl: 'https://workos.com/docs/authkit/vanilla/go',\n skillName: 'workos-go',\n language: 'go',\n stability: 'experimental',\n priority: 50,\n packageManager: 'go',\n manifestFile: 'go.mod',\n gatherContext: async (options) => {\n return { framework: detectGoFramework(options.installDir) };\n },\n },\n\n detection: {\n packageName: 'github.com/workos/workos-go/v4',\n packageDisplayName: 'Go',\n getVersion: () => undefined,\n },\n\n environment: {\n uploadToHosting: false,\n requiresApiKey: true,\n getEnvVars: (apiKey: string, clientId: string) => ({\n WORKOS_API_KEY: apiKey,\n WORKOS_CLIENT_ID: clientId,\n }),\n },\n\n analytics: {\n getTags: (context: any) => (context?.framework ? { 'go-framework': context.framework } : {}),\n },\n\n prompts: {\n getAdditionalContextLines: (context: any) => (context?.framework ? [`Go web framework: ${context.framework}`] : []),\n },\n\n ui: {\n successMessage: 'WorkOS AuthKit integration complete',\n getOutroChanges: () => [\n 'Analyzed your Go project structure',\n 'Installed workos-go SDK',\n 'Created authentication handlers',\n 'Configured environment variables',\n ],\n getOutroNextSteps: () => [\n 'Run `go run .` to start your server',\n 'Visit the WorkOS Dashboard to manage users and settings',\n ],\n },\n};\n\n/**\n * Run the Go integration.\n *\n * Custom flow that bypasses runAgentInstaller because the universal runner\n * assumes package.json exists (getPackageDotJson aborts without it) and\n * port-detection/env-writer are JS-specific.\n */\nexport async function run(options: InstallerOptions): Promise<string> {\n if (options.debug) {\n enableDebugLogs();\n }\n\n options.emitter?.emit('status', {\n message: `Setting up WorkOS AuthKit for ${config.metadata.name}`,\n });\n\n analytics.capture(INSTALLER_INTERACTION_EVENT_NAME, {\n action: 'started agent integration',\n integration: config.metadata.integration,\n });\n\n // Get WorkOS credentials\n const { apiKey, clientId } = await getOrAskForWorkOSCredentials(options, config.environment.requiresApiKey);\n\n // Auto-configure WorkOS environment (redirect URI, CORS)\n const callerHandledConfig = Boolean(options.apiKey || options.clientId);\n if (!callerHandledConfig && apiKey) {\n const redirectUri = options.redirectUri || `http://localhost:${GO_DEFAULT_PORT}${GO_CALLBACK_PATH}`;\n await autoConfigureWorkOSEnvironment(apiKey, config.metadata.integration, GO_DEFAULT_PORT, {\n homepageUrl: options.homepageUrl,\n redirectUri,\n });\n }\n\n // Gather Go-specific context\n const frameworkContext = config.metadata.gatherContext ? await config.metadata.gatherContext(options) : {};\n\n // Write .env (not .env.local — Go convention)\n if (!callerHandledConfig) {\n const redirectUri = options.redirectUri || `http://localhost:${GO_DEFAULT_PORT}${GO_CALLBACK_PATH}`;\n writeGoEnv(options.installDir, {\n ...(apiKey ? { WORKOS_API_KEY: apiKey } : {}),\n WORKOS_CLIENT_ID: clientId,\n WORKOS_REDIRECT_URI: redirectUri,\n });\n }\n\n // Set analytics tags\n const contextTags = config.analytics.getTags(frameworkContext);\n Object.entries(contextTags).forEach(([key, value]) => {\n analytics.setTag(key, value);\n });\n\n // Build prompt\n const additionalLines = config.prompts.getAdditionalContextLines\n ? config.prompts.getAdditionalContextLines(frameworkContext)\n : [];\n const additionalContext =\n additionalLines.length > 0 ? '\\n' + additionalLines.map((line) => `- ${line}`).join('\\n') : '';\n\n const skillName = config.metadata.skillName!;\n const refContent = await getReference(skillName);\n const integrationPrompt = `You are integrating WorkOS AuthKit into this ${config.metadata.name} application.\n\n## Project Context\n\n- Language: Go\n- Framework: ${frameworkContext.framework === 'gin' ? 'Gin' : 'stdlib net/http'}${additionalContext}\n\n## Environment\n\nThe following environment variables have been configured in .env:\n- WORKOS_API_KEY\n- WORKOS_CLIENT_ID\n- WORKOS_REDIRECT_URI\n\n## Integration Instructions\n\n${refContent}\n\nReport your progress using [STATUS] prefixes.\n\nBegin integration now.`;\n\n // Initialize and run agent\n const agent = await initializeAgent(\n {\n workingDirectory: options.installDir,\n workOSApiKey: apiKey,\n workOSApiHost: 'https://api.workos.com',\n },\n options,\n );\n\n const agentResult = await runAgent(\n agent,\n integrationPrompt,\n options,\n {\n spinnerMessage: SPINNER_MESSAGE,\n successMessage: config.ui.successMessage,\n errorMessage: 'Integration failed',\n },\n options.emitter,\n );\n\n if (agentResult.error) {\n await analytics.shutdown('error');\n const message = agentResult.errorMessage || agentResult.error;\n throw new Error(`Agent SDK error: ${message}`);\n }\n\n // Post-installation validation (gracefully skips — no rules file for Go)\n if (!options.noValidate) {\n options.emitter?.emit('validation:start', { framework: config.metadata.integration });\n\n const validationResult = await validateInstallation(config.metadata.integration, options.installDir, {\n runBuild: true,\n });\n\n if (validationResult.issues.length > 0) {\n options.emitter?.emit('validation:issues', { issues: validationResult.issues });\n }\n\n options.emitter?.emit('validation:complete', {\n passed: validationResult.passed,\n issueCount: validationResult.issues.length,\n durationMs: validationResult.durationMs,\n });\n }\n\n // Build summary\n const changes = config.ui.getOutroChanges(frameworkContext).filter(Boolean);\n const nextSteps = config.ui.getOutroNextSteps(frameworkContext).filter(Boolean);\n\n const lines: string[] = [\n 'Successfully installed WorkOS AuthKit!',\n '',\n ...(changes.length > 0 ? ['What the agent did:', ...changes.map((c) => `• ${c}`), ''] : []),\n ...(nextSteps.length > 0 ? ['Next steps:', ...nextSteps.map((s) => `• ${s}`), ''] : []),\n `Learn more: ${config.metadata.docsUrl}`,\n '',\n 'Note: This installer uses an LLM agent to analyze and modify your project. Please review the changes made.',\n ];\n\n await analytics.shutdown('success');\n\n return lines.join('\\n');\n}\n"]}
@@ -5,6 +5,7 @@ import { enableDebugLogs } from '../../utils/debug.js';
5
5
  import { analytics } from '../../utils/analytics.js';
6
6
  import { INSTALLER_INTERACTION_EVENT_NAME } from '../../lib/constants.js';
7
7
  import { parseEnvFile } from '../../utils/env-parser.js';
8
+ import { getReference } from '@workos/skills';
8
9
  /**
9
10
  * Detect which Python package manager the project uses.
10
11
  */
@@ -149,13 +150,14 @@ export const config = {
149
150
  /**
150
151
  * Build the agent prompt for Python/Django integration.
151
152
  */
152
- function buildPythonPrompt(frameworkContext) {
153
+ async function buildPythonPrompt(frameworkContext) {
153
154
  const contextLines = ['- Framework: Python (Django)'];
154
155
  if (frameworkContext.packageManager)
155
156
  contextLines.push(`- Package manager: ${frameworkContext.packageManager}`);
156
157
  if (frameworkContext.installCommand)
157
158
  contextLines.push(`- Install command: ${frameworkContext.installCommand}`);
158
159
  const skillName = config.metadata.skillName;
160
+ const refContent = await getReference(skillName);
159
161
  return `You are integrating WorkOS AuthKit into this Python/Django application.
160
162
 
161
163
  ## Project Context
@@ -168,21 +170,13 @@ The following environment variables have been configured in .env:
168
170
  - WORKOS_API_KEY
169
171
  - WORKOS_CLIENT_ID
170
172
 
171
- ## Your Task
173
+ ## Integration Instructions
172
174
 
173
- Use the \`${skillName}\` skill to integrate WorkOS AuthKit into this application.
174
-
175
- The skill contains step-by-step instructions including:
176
- 1. Fetching the SDK documentation
177
- 2. Installing the SDK and python-dotenv
178
- 3. Configuring Django settings
179
- 4. Creating authentication views
180
- 5. Setting up URL routing
181
- 6. Adding authentication UI
175
+ ${refContent}
182
176
 
183
177
  Report your progress using [STATUS] prefixes.
184
178
 
185
- Begin by invoking the ${skillName} skill.`;
179
+ Begin integration now.`;
186
180
  }
187
181
  /**
188
182
  * Custom run function that bypasses runAgentInstaller.
@@ -215,7 +209,7 @@ export async function run(options) {
215
209
  WORKOS_CLIENT_ID: clientId,
216
210
  });
217
211
  // Build Python-specific prompt
218
- const prompt = buildPythonPrompt(frameworkContext);
212
+ const prompt = await buildPythonPrompt(frameworkContext);
219
213
  // Initialize and run agent directly (bypass runAgentInstaller)
220
214
  const { initializeAgent, runAgent } = await import('../../lib/agent-interface.js');
221
215
  const agentConfig = await initializeAgent({
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integrations/python/index.ts"],"names":[],"mappings":"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","sourcesContent":["/* Python/Django integration — auto-discovered by registry */\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { FrameworkConfig } from '../../lib/framework-config.js';\nimport type { InstallerOptions } from '../../utils/types.js';\nimport { enableDebugLogs } from '../../utils/debug.js';\nimport { analytics } from '../../utils/analytics.js';\nimport { INSTALLER_INTERACTION_EVENT_NAME } from '../../lib/constants.js';\nimport { parseEnvFile } from '../../utils/env-parser.js';\n\n/**\n * Detect which Python package manager the project uses.\n */\nfunction detectPythonPackageManager(installDir: string): { name: string; installCmd: string } {\n if (existsSync(join(installDir, 'uv.lock'))) {\n return { name: 'uv', installCmd: 'uv add' };\n }\n\n if (existsSync(join(installDir, 'pyproject.toml'))) {\n try {\n const content = readFileSync(join(installDir, 'pyproject.toml'), 'utf-8');\n if (content.includes('[tool.poetry]')) {\n return { name: 'poetry', installCmd: 'poetry add' };\n }\n } catch {\n /* ignore */\n }\n }\n\n if (existsSync(join(installDir, 'Pipfile'))) {\n return { name: 'pipenv', installCmd: 'pipenv install' };\n }\n\n return { name: 'pip', installCmd: 'pip install' };\n}\n\n/**\n * Detect if this is a Django project.\n */\nfunction isDjangoProject(installDir: string): boolean {\n if (existsSync(join(installDir, 'manage.py'))) return true;\n\n const pyprojectPath = join(installDir, 'pyproject.toml');\n if (existsSync(pyprojectPath)) {\n try {\n const content = readFileSync(pyprojectPath, 'utf-8');\n if (/django/i.test(content)) return true;\n } catch {\n /* ignore */\n }\n }\n\n const reqPath = join(installDir, 'requirements.txt');\n if (existsSync(reqPath)) {\n try {\n const content = readFileSync(reqPath, 'utf-8');\n if (/^django/im.test(content)) return true;\n } catch {\n /* ignore */\n }\n }\n\n return false;\n}\n\n/**\n * Write .env file for Python projects (not .env.local).\n * Merges with existing .env. No cookie password generation.\n */\nfunction writeEnvFile(installDir: string, envVars: Record<string, string>): void {\n const envPath = join(installDir, '.env');\n\n let existingEnv: Record<string, string> = {};\n if (existsSync(envPath)) {\n try {\n existingEnv = parseEnvFile(readFileSync(envPath, 'utf-8'));\n } catch {\n /* ignore */\n }\n }\n\n const merged = { ...existingEnv, ...envVars };\n const content = Object.entries(merged)\n .map(([key, value]) => `${key}=${value}`)\n .join('\\n');\n\n writeFileSync(envPath, content + '\\n');\n}\n\nexport const config: FrameworkConfig = {\n metadata: {\n name: 'Python (Django)',\n integration: 'python',\n docsUrl: 'https://workos.com/docs/user-management/authkit/vanilla/python',\n skillName: 'workos-python',\n language: 'python',\n stability: 'experimental',\n priority: 60,\n packageManager: 'pip',\n manifestFile: 'pyproject.toml',\n gatherContext: async (options: InstallerOptions) => {\n const pkgMgr = detectPythonPackageManager(options.installDir);\n return {\n packageManager: pkgMgr.name,\n installCommand: pkgMgr.installCmd,\n isDjango: isDjangoProject(options.installDir),\n };\n },\n },\n\n detection: {\n // Dummy values for FrameworkDetection interface compat — Python doesn't use package.json\n packageName: 'workos',\n packageDisplayName: 'Python (Django)',\n getVersion: () => undefined,\n },\n\n environment: {\n uploadToHosting: false,\n requiresApiKey: true,\n getEnvVars: (apiKey: string, clientId: string) => ({\n WORKOS_API_KEY: apiKey,\n WORKOS_CLIENT_ID: clientId,\n }),\n },\n\n analytics: {\n getTags: (context: any) => ({\n 'python-package-manager': context?.packageManager || 'unknown',\n 'python-is-django': String(context?.isDjango ?? false),\n }),\n },\n\n prompts: {\n getAdditionalContextLines: (context: any) => {\n const lines: string[] = [];\n if (context?.packageManager) lines.push(`Package manager: ${context.packageManager}`);\n if (context?.installCommand) lines.push(`Install command: ${context.installCommand}`);\n if (context?.isDjango) lines.push('Framework: Django');\n return lines;\n },\n },\n\n ui: {\n successMessage: 'WorkOS AuthKit integration complete',\n getOutroChanges: () => [\n 'Analyzed your Python/Django project structure',\n 'Installed WorkOS Python SDK',\n 'Created authentication views (login, callback, logout)',\n 'Configured URL routing and environment variables',\n ],\n getOutroNextSteps: () => [\n 'Run `python manage.py runserver` to test authentication',\n 'Visit http://localhost:8000/auth/login to test the login flow',\n 'Visit the WorkOS Dashboard to manage users and settings',\n ],\n },\n};\n\n/**\n * Build the agent prompt for Python/Django integration.\n */\nfunction buildPythonPrompt(frameworkContext: Record<string, any>): string {\n const contextLines = ['- Framework: Python (Django)'];\n if (frameworkContext.packageManager) contextLines.push(`- Package manager: ${frameworkContext.packageManager}`);\n if (frameworkContext.installCommand) contextLines.push(`- Install command: ${frameworkContext.installCommand}`);\n\n const skillName = config.metadata.skillName!;\n\n return `You are integrating WorkOS AuthKit into this Python/Django application.\n\n## Project Context\n\n${contextLines.join('\\n')}\n\n## Environment\n\nThe following environment variables have been configured in .env:\n- WORKOS_API_KEY\n- WORKOS_CLIENT_ID\n\n## Your Task\n\nUse the \\`${skillName}\\` skill to integrate WorkOS AuthKit into this application.\n\nThe skill contains step-by-step instructions including:\n1. Fetching the SDK documentation\n2. Installing the SDK and python-dotenv\n3. Configuring Django settings\n4. Creating authentication views\n5. Setting up URL routing\n6. Adding authentication UI\n\nReport your progress using [STATUS] prefixes.\n\nBegin by invoking the ${skillName} skill.`;\n}\n\n/**\n * Custom run function that bypasses runAgentInstaller.\n * Calls initializeAgent + runAgent directly, handling Python-specific\n * env writing and prompt building.\n */\nexport async function run(options: InstallerOptions): Promise<string> {\n if (options.debug) {\n enableDebugLogs();\n }\n\n options.emitter?.emit('status', {\n message: 'Setting up WorkOS AuthKit for Python (Django)',\n });\n\n const apiKey = options.apiKey || '';\n const clientId = options.clientId || '';\n\n // Gather Python-specific context\n const frameworkContext = config.metadata.gatherContext ? await config.metadata.gatherContext(options) : {};\n\n analytics.capture(INSTALLER_INTERACTION_EVENT_NAME, {\n action: 'started agent integration',\n integration: 'python',\n });\n\n // Set analytics tags\n const contextTags = config.analytics.getTags(frameworkContext);\n for (const [key, value] of Object.entries(contextTags)) {\n analytics.setTag(key, value);\n }\n\n // Write .env (not .env.local) with WorkOS credentials\n writeEnvFile(options.installDir, {\n ...(apiKey ? { WORKOS_API_KEY: apiKey } : {}),\n WORKOS_CLIENT_ID: clientId,\n });\n\n // Build Python-specific prompt\n const prompt = buildPythonPrompt(frameworkContext);\n\n // Initialize and run agent directly (bypass runAgentInstaller)\n const { initializeAgent, runAgent } = await import('../../lib/agent-interface.js');\n\n const agentConfig = await initializeAgent(\n {\n workingDirectory: options.installDir,\n workOSApiKey: apiKey,\n workOSApiHost: 'https://api.workos.com',\n },\n options,\n );\n\n const result = await runAgent(\n agentConfig,\n prompt,\n options,\n {\n spinnerMessage: 'Setting up WorkOS AuthKit for Python/Django...',\n successMessage: config.ui.successMessage,\n errorMessage: 'Python integration failed',\n },\n options.emitter,\n );\n\n if (result.error) {\n await analytics.shutdown('error');\n throw new Error(`Agent error: ${result.errorMessage || result.error}`);\n }\n\n // Build completion summary\n const changes = config.ui.getOutroChanges({});\n const nextSteps = config.ui.getOutroNextSteps({});\n\n const lines: string[] = [\n 'Successfully installed WorkOS AuthKit!',\n '',\n 'What the agent did:',\n ...changes.map((c) => `• ${c}`),\n '',\n 'Next steps:',\n ...nextSteps.map((s) => `• ${s}`),\n '',\n `Learn more: ${config.metadata.docsUrl}`,\n '',\n 'Note: This installer uses an LLM agent to analyze and modify your project. Please review the changes made.',\n ];\n\n await analytics.shutdown('success');\n return lines.join('\\n');\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integrations/python/index.ts"],"names":[],"mappings":"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","sourcesContent":["/* Python/Django integration — auto-discovered by registry */\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { FrameworkConfig } from '../../lib/framework-config.js';\nimport type { InstallerOptions } from '../../utils/types.js';\nimport { enableDebugLogs } from '../../utils/debug.js';\nimport { analytics } from '../../utils/analytics.js';\nimport { INSTALLER_INTERACTION_EVENT_NAME } from '../../lib/constants.js';\nimport { parseEnvFile } from '../../utils/env-parser.js';\nimport { getReference } from '@workos/skills';\n\n/**\n * Detect which Python package manager the project uses.\n */\nfunction detectPythonPackageManager(installDir: string): { name: string; installCmd: string } {\n if (existsSync(join(installDir, 'uv.lock'))) {\n return { name: 'uv', installCmd: 'uv add' };\n }\n\n if (existsSync(join(installDir, 'pyproject.toml'))) {\n try {\n const content = readFileSync(join(installDir, 'pyproject.toml'), 'utf-8');\n if (content.includes('[tool.poetry]')) {\n return { name: 'poetry', installCmd: 'poetry add' };\n }\n } catch {\n /* ignore */\n }\n }\n\n if (existsSync(join(installDir, 'Pipfile'))) {\n return { name: 'pipenv', installCmd: 'pipenv install' };\n }\n\n return { name: 'pip', installCmd: 'pip install' };\n}\n\n/**\n * Detect if this is a Django project.\n */\nfunction isDjangoProject(installDir: string): boolean {\n if (existsSync(join(installDir, 'manage.py'))) return true;\n\n const pyprojectPath = join(installDir, 'pyproject.toml');\n if (existsSync(pyprojectPath)) {\n try {\n const content = readFileSync(pyprojectPath, 'utf-8');\n if (/django/i.test(content)) return true;\n } catch {\n /* ignore */\n }\n }\n\n const reqPath = join(installDir, 'requirements.txt');\n if (existsSync(reqPath)) {\n try {\n const content = readFileSync(reqPath, 'utf-8');\n if (/^django/im.test(content)) return true;\n } catch {\n /* ignore */\n }\n }\n\n return false;\n}\n\n/**\n * Write .env file for Python projects (not .env.local).\n * Merges with existing .env. No cookie password generation.\n */\nfunction writeEnvFile(installDir: string, envVars: Record<string, string>): void {\n const envPath = join(installDir, '.env');\n\n let existingEnv: Record<string, string> = {};\n if (existsSync(envPath)) {\n try {\n existingEnv = parseEnvFile(readFileSync(envPath, 'utf-8'));\n } catch {\n /* ignore */\n }\n }\n\n const merged = { ...existingEnv, ...envVars };\n const content = Object.entries(merged)\n .map(([key, value]) => `${key}=${value}`)\n .join('\\n');\n\n writeFileSync(envPath, content + '\\n');\n}\n\nexport const config: FrameworkConfig = {\n metadata: {\n name: 'Python (Django)',\n integration: 'python',\n docsUrl: 'https://workos.com/docs/user-management/authkit/vanilla/python',\n skillName: 'workos-python',\n language: 'python',\n stability: 'experimental',\n priority: 60,\n packageManager: 'pip',\n manifestFile: 'pyproject.toml',\n gatherContext: async (options: InstallerOptions) => {\n const pkgMgr = detectPythonPackageManager(options.installDir);\n return {\n packageManager: pkgMgr.name,\n installCommand: pkgMgr.installCmd,\n isDjango: isDjangoProject(options.installDir),\n };\n },\n },\n\n detection: {\n // Dummy values for FrameworkDetection interface compat — Python doesn't use package.json\n packageName: 'workos',\n packageDisplayName: 'Python (Django)',\n getVersion: () => undefined,\n },\n\n environment: {\n uploadToHosting: false,\n requiresApiKey: true,\n getEnvVars: (apiKey: string, clientId: string) => ({\n WORKOS_API_KEY: apiKey,\n WORKOS_CLIENT_ID: clientId,\n }),\n },\n\n analytics: {\n getTags: (context: any) => ({\n 'python-package-manager': context?.packageManager || 'unknown',\n 'python-is-django': String(context?.isDjango ?? false),\n }),\n },\n\n prompts: {\n getAdditionalContextLines: (context: any) => {\n const lines: string[] = [];\n if (context?.packageManager) lines.push(`Package manager: ${context.packageManager}`);\n if (context?.installCommand) lines.push(`Install command: ${context.installCommand}`);\n if (context?.isDjango) lines.push('Framework: Django');\n return lines;\n },\n },\n\n ui: {\n successMessage: 'WorkOS AuthKit integration complete',\n getOutroChanges: () => [\n 'Analyzed your Python/Django project structure',\n 'Installed WorkOS Python SDK',\n 'Created authentication views (login, callback, logout)',\n 'Configured URL routing and environment variables',\n ],\n getOutroNextSteps: () => [\n 'Run `python manage.py runserver` to test authentication',\n 'Visit http://localhost:8000/auth/login to test the login flow',\n 'Visit the WorkOS Dashboard to manage users and settings',\n ],\n },\n};\n\n/**\n * Build the agent prompt for Python/Django integration.\n */\nasync function buildPythonPrompt(frameworkContext: Record<string, any>): Promise<string> {\n const contextLines = ['- Framework: Python (Django)'];\n if (frameworkContext.packageManager) contextLines.push(`- Package manager: ${frameworkContext.packageManager}`);\n if (frameworkContext.installCommand) contextLines.push(`- Install command: ${frameworkContext.installCommand}`);\n\n const skillName = config.metadata.skillName!;\n const refContent = await getReference(skillName);\n\n return `You are integrating WorkOS AuthKit into this Python/Django application.\n\n## Project Context\n\n${contextLines.join('\\n')}\n\n## Environment\n\nThe following environment variables have been configured in .env:\n- WORKOS_API_KEY\n- WORKOS_CLIENT_ID\n\n## Integration Instructions\n\n${refContent}\n\nReport your progress using [STATUS] prefixes.\n\nBegin integration now.`;\n}\n\n/**\n * Custom run function that bypasses runAgentInstaller.\n * Calls initializeAgent + runAgent directly, handling Python-specific\n * env writing and prompt building.\n */\nexport async function run(options: InstallerOptions): Promise<string> {\n if (options.debug) {\n enableDebugLogs();\n }\n\n options.emitter?.emit('status', {\n message: 'Setting up WorkOS AuthKit for Python (Django)',\n });\n\n const apiKey = options.apiKey || '';\n const clientId = options.clientId || '';\n\n // Gather Python-specific context\n const frameworkContext = config.metadata.gatherContext ? await config.metadata.gatherContext(options) : {};\n\n analytics.capture(INSTALLER_INTERACTION_EVENT_NAME, {\n action: 'started agent integration',\n integration: 'python',\n });\n\n // Set analytics tags\n const contextTags = config.analytics.getTags(frameworkContext);\n for (const [key, value] of Object.entries(contextTags)) {\n analytics.setTag(key, value);\n }\n\n // Write .env (not .env.local) with WorkOS credentials\n writeEnvFile(options.installDir, {\n ...(apiKey ? { WORKOS_API_KEY: apiKey } : {}),\n WORKOS_CLIENT_ID: clientId,\n });\n\n // Build Python-specific prompt\n const prompt = await buildPythonPrompt(frameworkContext);\n\n // Initialize and run agent directly (bypass runAgentInstaller)\n const { initializeAgent, runAgent } = await import('../../lib/agent-interface.js');\n\n const agentConfig = await initializeAgent(\n {\n workingDirectory: options.installDir,\n workOSApiKey: apiKey,\n workOSApiHost: 'https://api.workos.com',\n },\n options,\n );\n\n const result = await runAgent(\n agentConfig,\n prompt,\n options,\n {\n spinnerMessage: 'Setting up WorkOS AuthKit for Python/Django...',\n successMessage: config.ui.successMessage,\n errorMessage: 'Python integration failed',\n },\n options.emitter,\n );\n\n if (result.error) {\n await analytics.shutdown('error');\n throw new Error(`Agent error: ${result.errorMessage || result.error}`);\n }\n\n // Build completion summary\n const changes = config.ui.getOutroChanges({});\n const nextSteps = config.ui.getOutroNextSteps({});\n\n const lines: string[] = [\n 'Successfully installed WorkOS AuthKit!',\n '',\n 'What the agent did:',\n ...changes.map((c) => `• ${c}`),\n '',\n 'Next steps:',\n ...nextSteps.map((s) => `• ${s}`),\n '',\n `Learn more: ${config.metadata.docsUrl}`,\n '',\n 'Note: This installer uses an LLM agent to analyze and modify your project. Please review the changes made.',\n ];\n\n await analytics.shutdown('success');\n return lines.join('\\n');\n}\n"]}
@@ -5,6 +5,7 @@ import { INSTALLER_INTERACTION_EVENT_NAME } from '../../lib/constants.js';
5
5
  import { initializeAgent, runAgent } from '../../lib/agent-interface.js';
6
6
  import { getOrAskForWorkOSCredentials } from '../../utils/clack-utils.js';
7
7
  import { autoConfigureWorkOSEnvironment } from '../../lib/workos-management.js';
8
+ import { getReference } from '@workos/skills';
8
9
  export const config = {
9
10
  metadata: {
10
11
  name: 'Ruby (Rails)',
@@ -64,7 +65,7 @@ export async function run(options) {
64
65
  integration: config.metadata.integration,
65
66
  });
66
67
  // Get WorkOS credentials
67
- const { apiKey, clientId } = await getOrAskForWorkOSCredentials(options, config.environment.requiresApiKey);
68
+ const { apiKey, clientId: _clientId } = await getOrAskForWorkOSCredentials(options, config.environment.requiresApiKey);
68
69
  // Auto-configure WorkOS environment (redirect URI, CORS, homepage) if not already done
69
70
  const callerHandledConfig = Boolean(options.apiKey || options.clientId);
70
71
  if (!callerHandledConfig && apiKey) {
@@ -76,6 +77,7 @@ export async function run(options) {
76
77
  }
77
78
  // Build prompt for the agent
78
79
  const redirectUri = options.redirectUri || 'http://localhost:3000/auth/callback';
80
+ const refContent = await getReference('workos-ruby');
79
81
  const prompt = `You are integrating WorkOS AuthKit into this Ruby on Rails application.
80
82
 
81
83
  ## Project Context
@@ -85,25 +87,18 @@ export async function run(options) {
85
87
 
86
88
  ## Environment
87
89
 
88
- The following environment variables should be configured in a .env file:
89
- - WORKOS_API_KEY=${apiKey ? '(provided)' : '(not set)'}
90
- - WORKOS_CLIENT_ID=${clientId || '(not set)'}
90
+ The following environment variables are needed (create a .env file if one does not exist):
91
+ - WORKOS_API_KEY
92
+ - WORKOS_CLIENT_ID
91
93
  - WORKOS_REDIRECT_URI=${redirectUri}
92
94
 
93
- ## Your Task
95
+ ## Integration Instructions
94
96
 
95
- Use the \`workos-ruby\` skill to integrate WorkOS AuthKit into this application.
96
-
97
- The skill contains step-by-step instructions including:
98
- 1. Fetching the SDK documentation
99
- 2. Installing the WorkOS Ruby gem
100
- 3. Creating the WorkOS initializer
101
- 4. Creating the AuthController with login, callback, and logout
102
- 5. Adding authentication routes
97
+ ${refContent}
103
98
 
104
99
  Report your progress using [STATUS] prefixes.
105
100
 
106
- Begin by invoking the workos-ruby skill.`;
101
+ Begin integration now.`;
107
102
  // Initialize and run agent
108
103
  const agent = await initializeAgent({
109
104
  workingDirectory: options.installDir,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integrations/ruby/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,gCAAgC,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAC;AAEhF,MAAM,CAAC,MAAM,MAAM,GAAoB;IACrC,QAAQ,EAAE;QACR,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,MAAM;QACnB,OAAO,EAAE,8CAA8C;QACvD,SAAS,EAAE,aAAa;QACxB,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,cAAc;QACzB,QAAQ,EAAE,EAAE;QACZ,cAAc,EAAE,QAAQ;QACxB,YAAY,EAAE,SAAS;KACxB;IAED,SAAS,EAAE;QACT,WAAW,EAAE,OAAO;QACpB,kBAAkB,EAAE,OAAO;QAC3B,UAAU,EAAE,GAAG,EAAE,CAAC,SAAS;KAC5B;IAED,WAAW,EAAE;QACX,eAAe,EAAE,KAAK;QACtB,cAAc,EAAE,IAAI;QACpB,UAAU,EAAE,CAAC,MAAc,EAAE,QAAgB,EAAE,EAAE,CAAC,CAAC;YACjD,cAAc,EAAE,MAAM;YACtB,gBAAgB,EAAE,QAAQ;SAC3B,CAAC;KACH;IAED,SAAS,EAAE;QACT,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;KACpB;IAED,OAAO,EAAE,EAAE;IAEX,EAAE,EAAE;QACF,cAAc,EAAE,qCAAqC;QACrD,eAAe,EAAE,GAAG,EAAE,CAAC;YACrB,uCAAuC;YACvC,8CAA8C;YAC9C,oEAAoE;YACpE,iDAAiD;SAClD;QACD,iBAAiB,EAAE,GAAG,EAAE,CAAC;YACvB,oEAAoE;YACpE,yDAAyD;SAC1D;KACF;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,OAAyB;IACjD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,eAAe,EAAE,CAAC;IACpB,CAAC;IAED,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE;QAC9B,OAAO,EAAE,iCAAiC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE;KACjE,CAAC,CAAC;IAEH,SAAS,CAAC,OAAO,CAAC,gCAAgC,EAAE;QAClD,MAAM,EAAE,2BAA2B;QACnC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW;KACzC,CAAC,CAAC;IAEH,yBAAyB;IACzB,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,4BAA4B,CAAC,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAE5G,uFAAuF;IACvF,MAAM,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxE,IAAI,CAAC,mBAAmB,IAAI,MAAM,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,gBAAgB;QACnC,MAAM,8BAA8B,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,EAAE;YAC9E,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAC;IACL,CAAC;IAED,6BAA6B;IAC7B,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,qCAAqC,CAAC;IACjF,MAAM,MAAM,GAAG;;;;;;;;;;mBAUE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW;qBACjC,QAAQ,IAAI,WAAW;wBACpB,WAAW;;;;;;;;;;;;;;;yCAeM,CAAC;IAExC,2BAA2B;IAC3B,MAAM,KAAK,GAAG,MAAM,eAAe,CACjC;QACE,gBAAgB,EAAE,OAAO,CAAC,UAAU;QACpC,YAAY,EAAE,MAAM;QACpB,aAAa,EAAE,wBAAwB;KACxC,EACD,OAAO,CACR,CAAC;IAEF,MAAM,WAAW,GAAG,MAAM,QAAQ,CAChC,KAAK,EACL,MAAM,EACN,OAAO,EACP;QACE,cAAc,EAAE,eAAe;QAC/B,cAAc,EAAE,MAAM,CAAC,EAAE,CAAC,cAAc;QACxC,YAAY,EAAE,oBAAoB;KACnC,EACD,OAAO,CAAC,OAAO,CAChB,CAAC;IAEF,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,IAAI,WAAW,CAAC,KAAK,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,2BAA2B;IAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAElD,MAAM,KAAK,GAAa;QACtB,wCAAwC;QACxC,EAAE;QACF,qBAAqB;QACrB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,EAAE;QACF,aAAa;QACb,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,EAAE;QACF,eAAe,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE;QACxC,EAAE;QACF,4GAA4G;KAC7G,CAAC;IAEF,MAAM,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAEpC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC","sourcesContent":["/* Ruby/Rails integration — auto-discovered by registry */\nimport type { FrameworkConfig } from '../../lib/framework-config.js';\nimport type { InstallerOptions } from '../../utils/types.js';\nimport { enableDebugLogs } from '../../utils/debug.js';\nimport { SPINNER_MESSAGE } from '../../lib/framework-config.js';\nimport { analytics } from '../../utils/analytics.js';\nimport { INSTALLER_INTERACTION_EVENT_NAME } from '../../lib/constants.js';\nimport { initializeAgent, runAgent } from '../../lib/agent-interface.js';\nimport { getOrAskForWorkOSCredentials } from '../../utils/clack-utils.js';\nimport { autoConfigureWorkOSEnvironment } from '../../lib/workos-management.js';\n\nexport const config: FrameworkConfig = {\n metadata: {\n name: 'Ruby (Rails)',\n integration: 'ruby',\n docsUrl: 'https://workos.com/docs/authkit/vanilla/ruby',\n skillName: 'workos-ruby',\n language: 'ruby',\n stability: 'experimental',\n priority: 55,\n packageManager: 'bundle',\n manifestFile: 'Gemfile',\n },\n\n detection: {\n packageName: 'rails',\n packageDisplayName: 'Rails',\n getVersion: () => undefined,\n },\n\n environment: {\n uploadToHosting: false,\n requiresApiKey: true,\n getEnvVars: (apiKey: string, clientId: string) => ({\n WORKOS_API_KEY: apiKey,\n WORKOS_CLIENT_ID: clientId,\n }),\n },\n\n analytics: {\n getTags: () => ({}),\n },\n\n prompts: {},\n\n ui: {\n successMessage: 'WorkOS AuthKit integration complete',\n getOutroChanges: () => [\n 'Analyzed your Rails project structure',\n 'Installed and configured the WorkOS Ruby SDK',\n 'Created authentication controller with login, callback, and logout',\n 'Added authentication routes to config/routes.rb',\n ],\n getOutroNextSteps: () => [\n 'Start your Rails server with `rails server` to test authentication',\n 'Visit the WorkOS Dashboard to manage users and settings',\n ],\n },\n};\n\n/**\n * Custom run function for Ruby/Rails — bypasses runAgentInstaller\n * since that assumes a JS project (package.json, node_modules, .env.local).\n */\nexport async function run(options: InstallerOptions): Promise<string> {\n if (options.debug) {\n enableDebugLogs();\n }\n\n options.emitter?.emit('status', {\n message: `Setting up WorkOS AuthKit for ${config.metadata.name}`,\n });\n\n analytics.capture(INSTALLER_INTERACTION_EVENT_NAME, {\n action: 'started agent integration',\n integration: config.metadata.integration,\n });\n\n // Get WorkOS credentials\n const { apiKey, clientId } = await getOrAskForWorkOSCredentials(options, config.environment.requiresApiKey);\n\n // Auto-configure WorkOS environment (redirect URI, CORS, homepage) if not already done\n const callerHandledConfig = Boolean(options.apiKey || options.clientId);\n if (!callerHandledConfig && apiKey) {\n const port = 3000; // Rails default\n await autoConfigureWorkOSEnvironment(apiKey, config.metadata.integration, port, {\n homepageUrl: options.homepageUrl,\n redirectUri: options.redirectUri,\n });\n }\n\n // Build prompt for the agent\n const redirectUri = options.redirectUri || 'http://localhost:3000/auth/callback';\n const prompt = `You are integrating WorkOS AuthKit into this Ruby on Rails application.\n\n## Project Context\n\n- Framework: Ruby (Rails)\n- Language: Ruby\n\n## Environment\n\nThe following environment variables should be configured in a .env file:\n- WORKOS_API_KEY=${apiKey ? '(provided)' : '(not set)'}\n- WORKOS_CLIENT_ID=${clientId || '(not set)'}\n- WORKOS_REDIRECT_URI=${redirectUri}\n\n## Your Task\n\nUse the \\`workos-ruby\\` skill to integrate WorkOS AuthKit into this application.\n\nThe skill contains step-by-step instructions including:\n1. Fetching the SDK documentation\n2. Installing the WorkOS Ruby gem\n3. Creating the WorkOS initializer\n4. Creating the AuthController with login, callback, and logout\n5. Adding authentication routes\n\nReport your progress using [STATUS] prefixes.\n\nBegin by invoking the workos-ruby skill.`;\n\n // Initialize and run agent\n const agent = await initializeAgent(\n {\n workingDirectory: options.installDir,\n workOSApiKey: apiKey,\n workOSApiHost: 'https://api.workos.com',\n },\n options,\n );\n\n const agentResult = await runAgent(\n agent,\n prompt,\n options,\n {\n spinnerMessage: SPINNER_MESSAGE,\n successMessage: config.ui.successMessage,\n errorMessage: 'Integration failed',\n },\n options.emitter,\n );\n\n if (agentResult.error) {\n await analytics.shutdown('error');\n const message = agentResult.errorMessage || agentResult.error;\n throw new Error(`Agent SDK error: ${message}`);\n }\n\n // Build completion summary\n const changes = config.ui.getOutroChanges({});\n const nextSteps = config.ui.getOutroNextSteps({});\n\n const lines: string[] = [\n 'Successfully installed WorkOS AuthKit!',\n '',\n 'What the agent did:',\n ...changes.map((c) => `• ${c}`),\n '',\n 'Next steps:',\n ...nextSteps.map((s) => `• ${s}`),\n '',\n `Learn more: ${config.metadata.docsUrl}`,\n '',\n 'Note: This installer uses an LLM agent to analyze and modify your project. Please review the changes made.',\n ];\n\n await analytics.shutdown('success');\n\n return lines.join('\\n');\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integrations/ruby/index.ts"],"names":[],"mappings":"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","sourcesContent":["/* Ruby/Rails integration — auto-discovered by registry */\nimport type { FrameworkConfig } from '../../lib/framework-config.js';\nimport type { InstallerOptions } from '../../utils/types.js';\nimport { enableDebugLogs } from '../../utils/debug.js';\nimport { SPINNER_MESSAGE } from '../../lib/framework-config.js';\nimport { analytics } from '../../utils/analytics.js';\nimport { INSTALLER_INTERACTION_EVENT_NAME } from '../../lib/constants.js';\nimport { initializeAgent, runAgent } from '../../lib/agent-interface.js';\nimport { getOrAskForWorkOSCredentials } from '../../utils/clack-utils.js';\nimport { autoConfigureWorkOSEnvironment } from '../../lib/workos-management.js';\nimport { getReference } from '@workos/skills';\n\nexport const config: FrameworkConfig = {\n metadata: {\n name: 'Ruby (Rails)',\n integration: 'ruby',\n docsUrl: 'https://workos.com/docs/authkit/vanilla/ruby',\n skillName: 'workos-ruby',\n language: 'ruby',\n stability: 'experimental',\n priority: 55,\n packageManager: 'bundle',\n manifestFile: 'Gemfile',\n },\n\n detection: {\n packageName: 'rails',\n packageDisplayName: 'Rails',\n getVersion: () => undefined,\n },\n\n environment: {\n uploadToHosting: false,\n requiresApiKey: true,\n getEnvVars: (apiKey: string, clientId: string) => ({\n WORKOS_API_KEY: apiKey,\n WORKOS_CLIENT_ID: clientId,\n }),\n },\n\n analytics: {\n getTags: () => ({}),\n },\n\n prompts: {},\n\n ui: {\n successMessage: 'WorkOS AuthKit integration complete',\n getOutroChanges: () => [\n 'Analyzed your Rails project structure',\n 'Installed and configured the WorkOS Ruby SDK',\n 'Created authentication controller with login, callback, and logout',\n 'Added authentication routes to config/routes.rb',\n ],\n getOutroNextSteps: () => [\n 'Start your Rails server with `rails server` to test authentication',\n 'Visit the WorkOS Dashboard to manage users and settings',\n ],\n },\n};\n\n/**\n * Custom run function for Ruby/Rails — bypasses runAgentInstaller\n * since that assumes a JS project (package.json, node_modules, .env.local).\n */\nexport async function run(options: InstallerOptions): Promise<string> {\n if (options.debug) {\n enableDebugLogs();\n }\n\n options.emitter?.emit('status', {\n message: `Setting up WorkOS AuthKit for ${config.metadata.name}`,\n });\n\n analytics.capture(INSTALLER_INTERACTION_EVENT_NAME, {\n action: 'started agent integration',\n integration: config.metadata.integration,\n });\n\n // Get WorkOS credentials\n const { apiKey, clientId: _clientId } = await getOrAskForWorkOSCredentials(\n options,\n config.environment.requiresApiKey,\n );\n\n // Auto-configure WorkOS environment (redirect URI, CORS, homepage) if not already done\n const callerHandledConfig = Boolean(options.apiKey || options.clientId);\n if (!callerHandledConfig && apiKey) {\n const port = 3000; // Rails default\n await autoConfigureWorkOSEnvironment(apiKey, config.metadata.integration, port, {\n homepageUrl: options.homepageUrl,\n redirectUri: options.redirectUri,\n });\n }\n\n // Build prompt for the agent\n const redirectUri = options.redirectUri || 'http://localhost:3000/auth/callback';\n const refContent = await getReference('workos-ruby');\n const prompt = `You are integrating WorkOS AuthKit into this Ruby on Rails application.\n\n## Project Context\n\n- Framework: Ruby (Rails)\n- Language: Ruby\n\n## Environment\n\nThe following environment variables are needed (create a .env file if one does not exist):\n- WORKOS_API_KEY\n- WORKOS_CLIENT_ID\n- WORKOS_REDIRECT_URI=${redirectUri}\n\n## Integration Instructions\n\n${refContent}\n\nReport your progress using [STATUS] prefixes.\n\nBegin integration now.`;\n\n // Initialize and run agent\n const agent = await initializeAgent(\n {\n workingDirectory: options.installDir,\n workOSApiKey: apiKey,\n workOSApiHost: 'https://api.workos.com',\n },\n options,\n );\n\n const agentResult = await runAgent(\n agent,\n prompt,\n options,\n {\n spinnerMessage: SPINNER_MESSAGE,\n successMessage: config.ui.successMessage,\n errorMessage: 'Integration failed',\n },\n options.emitter,\n );\n\n if (agentResult.error) {\n await analytics.shutdown('error');\n const message = agentResult.errorMessage || agentResult.error;\n throw new Error(`Agent SDK error: ${message}`);\n }\n\n // Build completion summary\n const changes = config.ui.getOutroChanges({});\n const nextSteps = config.ui.getOutroNextSteps({});\n\n const lines: string[] = [\n 'Successfully installed WorkOS AuthKit!',\n '',\n 'What the agent did:',\n ...changes.map((c) => `• ${c}`),\n '',\n 'Next steps:',\n ...nextSteps.map((s) => `• ${s}`),\n '',\n `Learn more: ${config.metadata.docsUrl}`,\n '',\n 'Note: This installer uses an LLM agent to analyze and modify your project. Please review the changes made.',\n ];\n\n await analytics.shutdown('success');\n\n return lines.join('\\n');\n}\n"]}
@@ -2,7 +2,8 @@
2
2
  * Shared agent interface for WorkOS wizards
3
3
  * Uses Claude Agent SDK directly with WorkOS MCP server
4
4
  */
5
- import { getPackageRoot } from '../utils/paths.js';
5
+ import { dirname } from 'path';
6
+ import { getSkillsDir as getSkillsPackageDir } from '@workos/skills';
6
7
  import { debug, logInfo, logWarn, logError, initLogFile, getLogFilePath } from '../utils/debug.js';
7
8
  import { analytics } from '../utils/analytics.js';
8
9
  import { INSTALLER_INTERACTION_EVENT_NAME } from './constants.js';
@@ -377,7 +378,7 @@ export async function initializeAgent(config, options) {
377
378
  },
378
379
  },
379
380
  model: getConfig().model,
380
- allowedTools: ['Skill', 'Read', 'Write', 'Edit', 'Bash', 'Glob', 'Grep', 'WebFetch'],
381
+ allowedTools: ['Read', 'Write', 'Edit', 'Bash', 'Glob', 'Grep', 'WebFetch'],
381
382
  sdkEnv,
382
383
  };
383
384
  const configInfo = { workingDirectory: agentRunConfig.workingDirectory, authMode, useMcp: false };
@@ -470,8 +471,8 @@ export async function runAgent(agentConfig, prompt, options, config, emitter, re
470
471
  }
471
472
  await currentTurnDone;
472
473
  };
473
- // Load plugin with bundled skills
474
- const pluginPath = getPackageRoot(import.meta.url);
474
+ // Load plugin from @workos/skills package
475
+ const pluginPath = dirname(getSkillsPackageDir());
475
476
  logInfo('Loading plugin from:', pluginPath);
476
477
  const response = query({
477
478
  prompt: createPromptStream(),