workos 0.8.2 → 0.10.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.
Files changed (70) hide show
  1. package/README.md +10 -8
  2. package/dist/bin.js +62 -27
  3. package/dist/bin.js.map +1 -1
  4. package/dist/commands/auth-status.d.ts +1 -0
  5. package/dist/commands/auth-status.js +56 -0
  6. package/dist/commands/auth-status.js.map +1 -0
  7. package/dist/commands/install-skill.d.ts +0 -1
  8. package/dist/commands/install-skill.js +2 -10
  9. package/dist/commands/install-skill.js.map +1 -1
  10. package/dist/commands/list-skills.d.ts +4 -0
  11. package/dist/commands/list-skills.js +52 -0
  12. package/dist/commands/list-skills.js.map +1 -0
  13. package/dist/commands/login.js +5 -4
  14. package/dist/commands/login.js.map +1 -1
  15. package/dist/commands/uninstall-skill.d.ts +11 -0
  16. package/dist/commands/uninstall-skill.js +116 -0
  17. package/dist/commands/uninstall-skill.js.map +1 -0
  18. package/dist/doctor/checks/ai-analysis.js +3 -3
  19. package/dist/doctor/checks/ai-analysis.js.map +1 -1
  20. package/dist/integrations/dotnet/index.js +7 -12
  21. package/dist/integrations/dotnet/index.js.map +1 -1
  22. package/dist/integrations/elixir/index.js +7 -13
  23. package/dist/integrations/elixir/index.js.map +1 -1
  24. package/dist/integrations/go/index.js +5 -11
  25. package/dist/integrations/go/index.js.map +1 -1
  26. package/dist/integrations/python/index.js +7 -13
  27. package/dist/integrations/python/index.js.map +1 -1
  28. package/dist/integrations/ruby/index.js +9 -14
  29. package/dist/integrations/ruby/index.js.map +1 -1
  30. package/dist/lib/adapters/cli-adapter.js +1 -1
  31. package/dist/lib/adapters/cli-adapter.js.map +1 -1
  32. package/dist/lib/agent-interface.js +10 -9
  33. package/dist/lib/agent-interface.js.map +1 -1
  34. package/dist/lib/agent-runner.js +24 -19
  35. package/dist/lib/agent-runner.js.map +1 -1
  36. package/dist/lib/credential-proxy.js +1 -1
  37. package/dist/lib/credential-proxy.js.map +1 -1
  38. package/dist/lib/ensure-auth.js +3 -3
  39. package/dist/lib/ensure-auth.js.map +1 -1
  40. package/dist/lib/run-with-core.js +1 -1
  41. package/dist/lib/run-with-core.js.map +1 -1
  42. package/dist/lib/token-refresh-client.js +1 -1
  43. package/dist/lib/token-refresh-client.js.map +1 -1
  44. package/dist/lib/token-refresh.js +1 -1
  45. package/dist/lib/token-refresh.js.map +1 -1
  46. package/dist/lib/version-check.js +2 -1
  47. package/dist/lib/version-check.js.map +1 -1
  48. package/dist/utils/exit-codes.js +1 -1
  49. package/dist/utils/exit-codes.js.map +1 -1
  50. package/dist/utils/help-json.js +62 -23
  51. package/dist/utils/help-json.js.map +1 -1
  52. package/package.json +2 -3
  53. package/.claude-plugin/plugin.json +0 -13
  54. package/skills/workos-authkit-base/SKILL.md +0 -123
  55. package/skills/workos-authkit-nextjs/SKILL.md +0 -247
  56. package/skills/workos-authkit-react/SKILL.md +0 -91
  57. package/skills/workos-authkit-react-router/SKILL.md +0 -107
  58. package/skills/workos-authkit-sveltekit/SKILL.md +0 -160
  59. package/skills/workos-authkit-tanstack-start/SKILL.md +0 -300
  60. package/skills/workos-authkit-vanilla-js/SKILL.md +0 -83
  61. package/skills/workos-dotnet/SKILL.md +0 -163
  62. package/skills/workos-elixir/SKILL.md +0 -194
  63. package/skills/workos-go/SKILL.md +0 -191
  64. package/skills/workos-kotlin/SKILL.md +0 -161
  65. package/skills/workos-management/SKILL.md +0 -250
  66. package/skills/workos-node/SKILL.md +0 -164
  67. package/skills/workos-php/SKILL.md +0 -127
  68. package/skills/workos-php-laravel/SKILL.md +0 -147
  69. package/skills/workos-python/SKILL.md +0 -159
  70. package/skills/workos-ruby/SKILL.md +0 -163
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integrations/dotnet/index.ts"],"names":[],"mappings":"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","sourcesContent":["/* .NET (ASP.NET Core) 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 { getOrAskForWorkOSCredentials } from '../../utils/clack-utils.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 { autoConfigureWorkOSEnvironment } from '../../lib/workos-management.js';\nimport { validateInstallation } from '../../lib/validation/index.js';\n\nexport const config: FrameworkConfig = {\n metadata: {\n name: '.NET (ASP.NET Core)',\n integration: 'dotnet',\n docsUrl: 'https://github.com/workos/workos-dotnet',\n skillName: 'workos-dotnet',\n language: 'dotnet',\n stability: 'experimental',\n priority: 35,\n packageManager: 'dotnet',\n manifestFile: '*.csproj',\n },\n\n detection: {\n // Detection handled by language-detection.ts globExists('*.csproj').\n // These fields satisfy the FrameworkDetection interface but aren't used for non-JS SDKs.\n packageName: 'WorkOS.net',\n packageDisplayName: '.NET (ASP.NET Core)',\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 ASP.NET Core project structure',\n 'Installed WorkOS.net NuGet package',\n 'Created authentication endpoints (login, callback, logout)',\n 'Configured WorkOS in appsettings',\n ],\n getOutroNextSteps: () => [\n 'Run `dotnet run` to start your development server',\n 'Visit the WorkOS Dashboard to manage users and settings',\n ],\n },\n};\n\n/**\n * Custom run function for .NET — bypasses runAgentInstaller's JS-centric assumptions\n * (no package.json, no .env.local, no TypeScript detection, no JS port detection).\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 const { apiKey, clientId } = await getOrAskForWorkOSCredentials(options, config.environment.requiresApiKey);\n\n // Auto-configure WorkOS environment (redirect URI, CORS, homepage)\n const callerHandledConfig = Boolean(options.apiKey || options.clientId);\n if (!callerHandledConfig && apiKey) {\n const port = 5000; // ASP.NET Core default HTTP port\n await autoConfigureWorkOSEnvironment(apiKey, config.metadata.integration, port, {\n homepageUrl: options.homepageUrl,\n redirectUri: options.redirectUri,\n });\n }\n\n // Build prompt — credentials are passed via prompt context since .NET doesn't use .env.local\n const skillName = config.metadata.skillName!;\n const redirectUri = options.redirectUri || 'http://localhost:5000/auth/callback';\n\n const prompt = `You are integrating WorkOS AuthKit into this ASP.NET Core application.\n\n## Project Context\n\n- Framework: ASP.NET Core\n- Language: C#\n- Package manager: dotnet (NuGet)\n\n## Environment\n\nThe following WorkOS credentials should be configured in appsettings.Development.json:\n- WORKOS_API_KEY: ${apiKey || '(not provided)'}\n- WORKOS_CLIENT_ID: ${clientId}\n- WORKOS_REDIRECT_URI: ${redirectUri}\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 WorkOS.net NuGet package\n3. Configuring DI registration\n4. Creating authentication endpoints\n5. Setting up appsettings configuration\n\nReport your progress using [STATUS] prefixes.\n\nBegin by invoking the ${skillName} skill.`;\n\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 // Post-installation validation\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 const envVars = config.environment.getEnvVars(apiKey, clientId);\n\n const changes = [\n ...config.ui.getOutroChanges({}),\n Object.keys(envVars).length > 0 ? 'Configured WorkOS credentials in appsettings' : '',\n ].filter(Boolean);\n\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/dotnet/index.ts"],"names":[],"mappings":"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","sourcesContent":["/* .NET (ASP.NET Core) 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 { getOrAskForWorkOSCredentials } from '../../utils/clack-utils.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 { autoConfigureWorkOSEnvironment } from '../../lib/workos-management.js';\nimport { validateInstallation } from '../../lib/validation/index.js';\nimport { getReference } from '@workos/skills';\n\nexport const config: FrameworkConfig = {\n metadata: {\n name: '.NET (ASP.NET Core)',\n integration: 'dotnet',\n docsUrl: 'https://github.com/workos/workos-dotnet',\n skillName: 'workos-dotnet',\n language: 'dotnet',\n stability: 'experimental',\n priority: 35,\n packageManager: 'dotnet',\n manifestFile: '*.csproj',\n },\n\n detection: {\n // Detection handled by language-detection.ts globExists('*.csproj').\n // These fields satisfy the FrameworkDetection interface but aren't used for non-JS SDKs.\n packageName: 'WorkOS.net',\n packageDisplayName: '.NET (ASP.NET Core)',\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 ASP.NET Core project structure',\n 'Installed WorkOS.net NuGet package',\n 'Created authentication endpoints (login, callback, logout)',\n 'Configured WorkOS in appsettings',\n ],\n getOutroNextSteps: () => [\n 'Run `dotnet run` to start your development server',\n 'Visit the WorkOS Dashboard to manage users and settings',\n ],\n },\n};\n\n/**\n * Custom run function for .NET — bypasses runAgentInstaller's JS-centric assumptions\n * (no package.json, no .env.local, no TypeScript detection, no JS port detection).\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 const { apiKey, clientId } = await getOrAskForWorkOSCredentials(options, config.environment.requiresApiKey);\n\n // Auto-configure WorkOS environment (redirect URI, CORS, homepage)\n const callerHandledConfig = Boolean(options.apiKey || options.clientId);\n if (!callerHandledConfig && apiKey) {\n const port = 5000; // ASP.NET Core default HTTP port\n await autoConfigureWorkOSEnvironment(apiKey, config.metadata.integration, port, {\n homepageUrl: options.homepageUrl,\n redirectUri: options.redirectUri,\n });\n }\n\n // Build prompt — credentials are passed via prompt context since .NET doesn't use .env.local\n const skillName = config.metadata.skillName!;\n const redirectUri = options.redirectUri || 'http://localhost:5000/auth/callback';\n const refContent = await getReference(skillName);\n\n const prompt = `You are integrating WorkOS AuthKit into this ASP.NET Core application.\n\n## Project Context\n\n- Framework: ASP.NET Core\n- Language: C#\n- Package manager: dotnet (NuGet)\n\n## Environment\n\nThe following WorkOS credentials should be configured in appsettings.Development.json:\n- WORKOS_API_KEY: (configured)\n- WORKOS_CLIENT_ID: (configured)\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 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 // Post-installation validation\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 const envVars = config.environment.getEnvVars(apiKey, clientId);\n\n const changes = [\n ...config.ui.getOutroChanges({}),\n Object.keys(envVars).length > 0 ? 'Configured WorkOS credentials in appsettings' : '',\n ].filter(Boolean);\n\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"]}
@@ -5,6 +5,7 @@ import { INSTALLER_INTERACTION_EVENT_NAME } from '../../lib/constants.js';
5
5
  import { getOrAskForWorkOSCredentials } from '../../utils/clack-utils.js';
6
6
  import { initializeAgent, runAgent } from '../../lib/agent-interface.js';
7
7
  import { writeEnvLocal } from '../../lib/env-writer.js';
8
+ import { getReference } from '@workos/skills';
8
9
  export const config = {
9
10
  metadata: {
10
11
  name: 'Elixir (Phoenix)',
@@ -80,7 +81,7 @@ export async function run(options) {
80
81
  });
81
82
  }
82
83
  // Build Elixir-specific prompt
83
- const integrationPrompt = buildElixirPrompt();
84
+ const integrationPrompt = await buildElixirPrompt();
84
85
  // Initialize and run agent
85
86
  const agent = await initializeAgent({
86
87
  workingDirectory: options.installDir,
@@ -116,7 +117,8 @@ export async function run(options) {
116
117
  await analytics.shutdown('success');
117
118
  return lines.join('\n');
118
119
  }
119
- function buildElixirPrompt() {
120
+ async function buildElixirPrompt() {
121
+ const refContent = await getReference('workos-elixir');
120
122
  return `You are integrating WorkOS AuthKit into this Elixir/Phoenix application.
121
123
 
122
124
  ## Project Context
@@ -133,20 +135,12 @@ The following environment variables have been configured in .env.local:
133
135
 
134
136
  Note: For Elixir/Phoenix, these should be read via System.get_env() in config/runtime.exs rather than from .env.local directly.
135
137
 
136
- ## Your Task
138
+ ## Integration Instructions
137
139
 
138
- Use the \`workos-elixir\` skill to integrate WorkOS AuthKit into this application.
139
-
140
- The skill contains step-by-step instructions including:
141
- 1. Fetching the SDK documentation
142
- 2. Validating the Phoenix project structure
143
- 3. Installing the workos Hex package
144
- 4. Configuring WorkOS in runtime.exs
145
- 5. Creating auth controller and routes
146
- 6. Verification with mix compile
140
+ ${refContent}
147
141
 
148
142
  Report your progress using [STATUS] prefixes.
149
143
 
150
- Begin by invoking the workos-elixir skill.`;
144
+ Begin integration now.`;
151
145
  }
152
146
  //# sourceMappingURL=index.js.map
@@ -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":"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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';\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"]}
@@ -345,7 +345,7 @@ export class CLIAdapter {
345
345
  clack.log.error(message);
346
346
  // Add actionable hints for common errors
347
347
  if (message.includes('authentication') || message.includes('auth')) {
348
- clack.log.info('Try running: workos logout && workos install');
348
+ clack.log.info('Try running: workos auth logout && workos install');
349
349
  }
350
350
  if (message.includes('ENOENT') || message.includes('not found')) {
351
351
  clack.log.info('Ensure you are in a project directory');