workos 0.9.0 → 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.
- package/README.md +5 -6
- package/dist/bin.js +39 -14
- package/dist/bin.js.map +1 -1
- package/dist/commands/install-skill.d.ts +0 -1
- package/dist/commands/install-skill.js +2 -10
- package/dist/commands/install-skill.js.map +1 -1
- package/dist/commands/list-skills.d.ts +4 -0
- package/dist/commands/list-skills.js +52 -0
- package/dist/commands/list-skills.js.map +1 -0
- package/dist/commands/uninstall-skill.d.ts +11 -0
- package/dist/commands/uninstall-skill.js +116 -0
- package/dist/commands/uninstall-skill.js.map +1 -0
- package/dist/integrations/dotnet/index.js +7 -12
- package/dist/integrations/dotnet/index.js.map +1 -1
- package/dist/integrations/elixir/index.js +7 -13
- package/dist/integrations/elixir/index.js.map +1 -1
- package/dist/integrations/go/index.js +5 -11
- package/dist/integrations/go/index.js.map +1 -1
- package/dist/integrations/python/index.js +7 -13
- package/dist/integrations/python/index.js.map +1 -1
- package/dist/integrations/ruby/index.js +9 -14
- package/dist/integrations/ruby/index.js.map +1 -1
- package/dist/lib/agent-interface.js +5 -4
- package/dist/lib/agent-interface.js.map +1 -1
- package/dist/lib/agent-runner.js +24 -19
- package/dist/lib/agent-runner.js.map +1 -1
- package/dist/utils/help-json.js +55 -21
- package/dist/utils/help-json.js.map +1 -1
- package/package.json +2 -3
- package/.claude-plugin/plugin.json +0 -13
- package/skills/workos-authkit-base/SKILL.md +0 -123
- package/skills/workos-authkit-nextjs/SKILL.md +0 -247
- package/skills/workos-authkit-react/SKILL.md +0 -100
- package/skills/workos-authkit-react-router/SKILL.md +0 -117
- package/skills/workos-authkit-sveltekit/SKILL.md +0 -208
- package/skills/workos-authkit-tanstack-start/SKILL.md +0 -314
- package/skills/workos-authkit-vanilla-js/SKILL.md +0 -92
- package/skills/workos-dotnet/SKILL.md +0 -163
- package/skills/workos-elixir/SKILL.md +0 -231
- package/skills/workos-go/SKILL.md +0 -226
- package/skills/workos-kotlin/SKILL.md +0 -195
- package/skills/workos-management/SKILL.md +0 -250
- package/skills/workos-node/SKILL.md +0 -197
- package/skills/workos-php/SKILL.md +0 -160
- package/skills/workos-php-laravel/SKILL.md +0 -182
- package/skills/workos-python/SKILL.md +0 -193
- package/skills/workos-ruby/SKILL.md +0 -198
|
@@ -3,7 +3,7 @@ import { join } from 'path';
|
|
|
3
3
|
import { existsSync } from 'fs';
|
|
4
4
|
import { mkdir, copyFile, readdir } from 'fs/promises';
|
|
5
5
|
import chalk from 'chalk';
|
|
6
|
-
import {
|
|
6
|
+
import { getSkillsDir as getSkillsPackageDir } from '@workos/skills';
|
|
7
7
|
export function createAgents(home) {
|
|
8
8
|
return {
|
|
9
9
|
'claude-code': {
|
|
@@ -33,7 +33,7 @@ export function createAgents(home) {
|
|
|
33
33
|
};
|
|
34
34
|
}
|
|
35
35
|
export function getSkillsDir() {
|
|
36
|
-
return
|
|
36
|
+
return getSkillsPackageDir();
|
|
37
37
|
}
|
|
38
38
|
export async function discoverSkills(skillsDir) {
|
|
39
39
|
const entries = await readdir(skillsDir, { withFileTypes: true });
|
|
@@ -71,14 +71,6 @@ export async function runInstallSkill(options) {
|
|
|
71
71
|
const agents = createAgents(home);
|
|
72
72
|
const skillsDir = getSkillsDir();
|
|
73
73
|
const skills = await discoverSkills(skillsDir);
|
|
74
|
-
if (options.list) {
|
|
75
|
-
console.log(chalk.bold('\nAvailable Skills:\n'));
|
|
76
|
-
for (const skill of skills) {
|
|
77
|
-
console.log(` ${chalk.cyan(skill)}`);
|
|
78
|
-
}
|
|
79
|
-
console.log();
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
74
|
const targetSkills = options.skill ? skills.filter((s) => options.skill.includes(s)) : skills;
|
|
83
75
|
if (targetSkills.length === 0) {
|
|
84
76
|
console.error(chalk.red('No matching skills found.'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-skill.js","sourceRoot":"","sources":["../../src/commands/install-skill.ts"],"names":[],"mappings":"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","sourcesContent":["import { homedir } from 'os';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\nimport { mkdir, copyFile, readdir } from 'fs/promises';\nimport chalk from 'chalk';\nimport { getPackageRoot } from '../utils/paths.js';\n\nexport interface AgentConfig {\n name: string;\n displayName: string;\n globalSkillsDir: string;\n detect: () => boolean;\n}\n\nexport function createAgents(home: string): Record<string, AgentConfig> {\n return {\n 'claude-code': {\n name: 'claude-code',\n displayName: 'Claude Code',\n globalSkillsDir: join(home, '.claude/skills'),\n detect: () => existsSync(join(home, '.claude')),\n },\n codex: {\n name: 'codex',\n displayName: 'Codex',\n globalSkillsDir: join(home, '.codex/skills'),\n detect: () => existsSync(join(home, '.codex')),\n },\n cursor: {\n name: 'cursor',\n displayName: 'Cursor',\n globalSkillsDir: join(home, '.cursor/skills'),\n detect: () => existsSync(join(home, '.cursor')),\n },\n goose: {\n name: 'goose',\n displayName: 'Goose',\n globalSkillsDir: join(home, '.config/goose/skills'),\n detect: () => existsSync(join(home, '.config/goose')),\n },\n };\n}\n\nexport interface InstallSkillOptions {\n list?: boolean;\n skill?: string[];\n agent?: string[];\n}\n\nexport function getSkillsDir(): string {\n return join(getPackageRoot(import.meta.url), 'skills');\n}\n\nexport async function discoverSkills(skillsDir: string): Promise<string[]> {\n const entries = await readdir(skillsDir, { withFileTypes: true });\n\n return entries.filter((e) => e.isDirectory() && existsSync(join(skillsDir, e.name, 'SKILL.md'))).map((e) => e.name);\n}\n\nexport function detectAgents(agents: Record<string, AgentConfig>, filter?: string[]): AgentConfig[] {\n const detected: AgentConfig[] = [];\n\n for (const [key, config] of Object.entries(agents)) {\n if (filter && !filter.includes(key)) continue;\n if (config.detect()) {\n detected.push(config);\n }\n }\n\n return detected;\n}\n\nexport async function installSkill(\n skillsDir: string,\n skillName: string,\n agent: AgentConfig,\n): Promise<{ success: boolean; error?: string }> {\n const sourceFile = join(skillsDir, skillName, 'SKILL.md');\n const targetDir = join(agent.globalSkillsDir, skillName);\n const targetFile = join(targetDir, 'SKILL.md');\n\n try {\n await mkdir(targetDir, { recursive: true });\n await copyFile(sourceFile, targetFile);\n return { success: true };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n\nexport async function runInstallSkill(options: InstallSkillOptions): Promise<void> {\n const home = homedir();\n const agents = createAgents(home);\n const skillsDir = getSkillsDir();\n const skills = await discoverSkills(skillsDir);\n\n if (options.list) {\n console.log(chalk.bold('\\nAvailable Skills:\\n'));\n for (const skill of skills) {\n console.log(` ${chalk.cyan(skill)}`);\n }\n console.log();\n return;\n }\n\n const targetSkills = options.skill ? skills.filter((s) => options.skill!.includes(s)) : skills;\n\n if (targetSkills.length === 0) {\n console.error(chalk.red('No matching skills found.'));\n console.log('Available skills:', skills.join(', '));\n process.exit(1);\n }\n\n const targetAgents = detectAgents(agents, options.agent);\n\n if (targetAgents.length === 0) {\n if (options.agent) {\n console.error(chalk.red('Specified agents not found.'));\n } else {\n console.error(chalk.red('No coding agents detected.'));\n }\n console.log('Supported agents:', Object.keys(agents).join(', '));\n process.exit(1);\n }\n\n console.log(chalk.bold('\\nInstalling skills...\\n'));\n\n const results: Array<{\n skill: string;\n agent: string;\n success: boolean;\n error?: string;\n }> = [];\n\n for (const skill of targetSkills) {\n for (const agent of targetAgents) {\n const result = await installSkill(skillsDir, skill, agent);\n results.push({\n skill,\n agent: agent.displayName,\n ...result,\n });\n }\n }\n\n const successful = results.filter((r) => r.success);\n const failed = results.filter((r) => !r.success);\n\n if (successful.length > 0) {\n console.log(chalk.green(`✓ Installed ${successful.length} skill(s):\\n`));\n for (const r of successful) {\n console.log(` ${chalk.cyan(r.skill)} → ${chalk.dim(r.agent)}`);\n }\n }\n\n if (failed.length > 0) {\n console.log(chalk.red(`\\n✗ Failed to install ${failed.length}:\\n`));\n for (const r of failed) {\n console.log(` ${r.skill} → ${r.agent}: ${chalk.dim(r.error)}`);\n }\n process.exit(1);\n }\n\n console.log(chalk.green('\\nDone!'));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"install-skill.js","sourceRoot":"","sources":["../../src/commands/install-skill.ts"],"names":[],"mappings":"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","sourcesContent":["import { homedir } from 'os';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\nimport { mkdir, copyFile, readdir } from 'fs/promises';\nimport chalk from 'chalk';\nimport { getSkillsDir as getSkillsPackageDir } from '@workos/skills';\n\nexport interface AgentConfig {\n name: string;\n displayName: string;\n globalSkillsDir: string;\n detect: () => boolean;\n}\n\nexport function createAgents(home: string): Record<string, AgentConfig> {\n return {\n 'claude-code': {\n name: 'claude-code',\n displayName: 'Claude Code',\n globalSkillsDir: join(home, '.claude/skills'),\n detect: () => existsSync(join(home, '.claude')),\n },\n codex: {\n name: 'codex',\n displayName: 'Codex',\n globalSkillsDir: join(home, '.codex/skills'),\n detect: () => existsSync(join(home, '.codex')),\n },\n cursor: {\n name: 'cursor',\n displayName: 'Cursor',\n globalSkillsDir: join(home, '.cursor/skills'),\n detect: () => existsSync(join(home, '.cursor')),\n },\n goose: {\n name: 'goose',\n displayName: 'Goose',\n globalSkillsDir: join(home, '.config/goose/skills'),\n detect: () => existsSync(join(home, '.config/goose')),\n },\n };\n}\n\nexport interface InstallSkillOptions {\n skill?: string[];\n agent?: string[];\n}\n\nexport function getSkillsDir(): string {\n return getSkillsPackageDir();\n}\n\nexport async function discoverSkills(skillsDir: string): Promise<string[]> {\n const entries = await readdir(skillsDir, { withFileTypes: true });\n\n return entries.filter((e) => e.isDirectory() && existsSync(join(skillsDir, e.name, 'SKILL.md'))).map((e) => e.name);\n}\n\nexport function detectAgents(agents: Record<string, AgentConfig>, filter?: string[]): AgentConfig[] {\n const detected: AgentConfig[] = [];\n\n for (const [key, config] of Object.entries(agents)) {\n if (filter && !filter.includes(key)) continue;\n if (config.detect()) {\n detected.push(config);\n }\n }\n\n return detected;\n}\n\nexport async function installSkill(\n skillsDir: string,\n skillName: string,\n agent: AgentConfig,\n): Promise<{ success: boolean; error?: string }> {\n const sourceFile = join(skillsDir, skillName, 'SKILL.md');\n const targetDir = join(agent.globalSkillsDir, skillName);\n const targetFile = join(targetDir, 'SKILL.md');\n\n try {\n await mkdir(targetDir, { recursive: true });\n await copyFile(sourceFile, targetFile);\n return { success: true };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n\nexport async function runInstallSkill(options: InstallSkillOptions): Promise<void> {\n const home = homedir();\n const agents = createAgents(home);\n const skillsDir = getSkillsDir();\n const skills = await discoverSkills(skillsDir);\n\n const targetSkills = options.skill ? skills.filter((s) => options.skill!.includes(s)) : skills;\n\n if (targetSkills.length === 0) {\n console.error(chalk.red('No matching skills found.'));\n console.log('Available skills:', skills.join(', '));\n process.exit(1);\n }\n\n const targetAgents = detectAgents(agents, options.agent);\n\n if (targetAgents.length === 0) {\n if (options.agent) {\n console.error(chalk.red('Specified agents not found.'));\n } else {\n console.error(chalk.red('No coding agents detected.'));\n }\n console.log('Supported agents:', Object.keys(agents).join(', '));\n process.exit(1);\n }\n\n console.log(chalk.bold('\\nInstalling skills...\\n'));\n\n const results: Array<{\n skill: string;\n agent: string;\n success: boolean;\n error?: string;\n }> = [];\n\n for (const skill of targetSkills) {\n for (const agent of targetAgents) {\n const result = await installSkill(skillsDir, skill, agent);\n results.push({\n skill,\n agent: agent.displayName,\n ...result,\n });\n }\n }\n\n const successful = results.filter((r) => r.success);\n const failed = results.filter((r) => !r.success);\n\n if (successful.length > 0) {\n console.log(chalk.green(`✓ Installed ${successful.length} skill(s):\\n`));\n for (const r of successful) {\n console.log(` ${chalk.cyan(r.skill)} → ${chalk.dim(r.agent)}`);\n }\n }\n\n if (failed.length > 0) {\n console.log(chalk.red(`\\n✗ Failed to install ${failed.length}:\\n`));\n for (const r of failed) {\n console.log(` ${r.skill} → ${r.agent}: ${chalk.dim(r.error)}`);\n }\n process.exit(1);\n }\n\n console.log(chalk.green('\\nDone!'));\n}\n"]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { homedir } from 'os';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { logError } from '../utils/debug.js';
|
|
4
|
+
import { exitWithError, isJsonMode, outputJson } from '../utils/output.js';
|
|
5
|
+
import { createAgents, detectAgents, discoverSkills, getSkillsDir } from './install-skill.js';
|
|
6
|
+
import { findInstalledSkills } from './uninstall-skill.js';
|
|
7
|
+
export async function runListSkills(options) {
|
|
8
|
+
const home = homedir();
|
|
9
|
+
const agents = createAgents(home);
|
|
10
|
+
const skillsDir = getSkillsDir();
|
|
11
|
+
let knownSkills;
|
|
12
|
+
try {
|
|
13
|
+
knownSkills = await discoverSkills(skillsDir);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
logError('Failed to read skills directory:', error);
|
|
17
|
+
exitWithError({
|
|
18
|
+
code: 'SKILLS_DIR_READ_FAILED',
|
|
19
|
+
message: `Could not read skills directory at ${skillsDir}. Your WorkOS CLI installation may be corrupted. Try reinstalling with \`npm install -g @workos-inc/cli\`.`,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
const targetAgents = detectAgents(agents, options.agent);
|
|
23
|
+
const listData = [];
|
|
24
|
+
for (const agent of targetAgents) {
|
|
25
|
+
const installed = findInstalledSkills(knownSkills, agent);
|
|
26
|
+
listData.push({ agent: agent.displayName, available: knownSkills, installed });
|
|
27
|
+
}
|
|
28
|
+
if (isJsonMode()) {
|
|
29
|
+
outputJson(listData);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
console.log(chalk.bold('\nWorkOS Skills:\n'));
|
|
33
|
+
console.log(` ${chalk.bold('Available:')} ${knownSkills.map((s) => chalk.cyan(s)).join(', ')}\n`);
|
|
34
|
+
if (targetAgents.length === 0) {
|
|
35
|
+
console.log(chalk.dim(' No coding agents detected.\n'));
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
console.log(chalk.bold(' Installed per agent:\n'));
|
|
39
|
+
for (const entry of listData) {
|
|
40
|
+
console.log(` ${chalk.bold(entry.agent)}:`);
|
|
41
|
+
if (entry.installed.length === 0) {
|
|
42
|
+
console.log(` ${chalk.dim('(none)')}`);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
for (const skill of entry.installed) {
|
|
46
|
+
console.log(` ${chalk.cyan(skill)}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
console.log();
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=list-skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-skills.js","sourceRoot":"","sources":["../../src/commands/list-skills.ts"],"names":[],"mappings":"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","sourcesContent":["import { homedir } from 'os';\nimport chalk from 'chalk';\nimport { logError } from '../utils/debug.js';\nimport { exitWithError, isJsonMode, outputJson } from '../utils/output.js';\nimport { createAgents, detectAgents, discoverSkills, getSkillsDir } from './install-skill.js';\nimport { findInstalledSkills } from './uninstall-skill.js';\n\nexport interface ListSkillsOptions {\n agent?: string[];\n}\n\nexport async function runListSkills(options: ListSkillsOptions): Promise<void> {\n const home = homedir();\n const agents = createAgents(home);\n const skillsDir = getSkillsDir();\n\n let knownSkills: string[];\n try {\n knownSkills = await discoverSkills(skillsDir);\n } catch (error) {\n logError('Failed to read skills directory:', error);\n exitWithError({\n code: 'SKILLS_DIR_READ_FAILED',\n message: `Could not read skills directory at ${skillsDir}. Your WorkOS CLI installation may be corrupted. Try reinstalling with \\`npm install -g @workos-inc/cli\\`.`,\n });\n }\n\n const targetAgents = detectAgents(agents, options.agent);\n\n const listData: Array<{ agent: string; available: string[]; installed: string[] }> = [];\n for (const agent of targetAgents) {\n const installed = findInstalledSkills(knownSkills, agent);\n listData.push({ agent: agent.displayName, available: knownSkills, installed });\n }\n\n if (isJsonMode()) {\n outputJson(listData);\n return;\n }\n\n console.log(chalk.bold('\\nWorkOS Skills:\\n'));\n console.log(` ${chalk.bold('Available:')} ${knownSkills.map((s) => chalk.cyan(s)).join(', ')}\\n`);\n\n if (targetAgents.length === 0) {\n console.log(chalk.dim(' No coding agents detected.\\n'));\n return;\n }\n\n console.log(chalk.bold(' Installed per agent:\\n'));\n for (const entry of listData) {\n console.log(` ${chalk.bold(entry.agent)}:`);\n if (entry.installed.length === 0) {\n console.log(` ${chalk.dim('(none)')}`);\n } else {\n for (const skill of entry.installed) {\n console.log(` ${chalk.cyan(skill)}`);\n }\n }\n }\n console.log();\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type AgentConfig } from './install-skill.js';
|
|
2
|
+
export interface UninstallSkillOptions {
|
|
3
|
+
skill?: string[];
|
|
4
|
+
agent?: string[];
|
|
5
|
+
}
|
|
6
|
+
export declare function findInstalledSkills(knownSkills: string[], agent: AgentConfig): string[];
|
|
7
|
+
export declare function uninstallSkill(skillName: string, agent: AgentConfig): Promise<{
|
|
8
|
+
success: boolean;
|
|
9
|
+
error?: string;
|
|
10
|
+
}>;
|
|
11
|
+
export declare function runUninstallSkill(options: UninstallSkillOptions): Promise<void>;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { existsSync } from 'fs';
|
|
2
|
+
import { rm } from 'fs/promises';
|
|
3
|
+
import { homedir } from 'os';
|
|
4
|
+
import { join } from 'path';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { logError, logInfo, logWarn } from '../utils/debug.js';
|
|
7
|
+
import { exitWithError, isJsonMode, outputJson } from '../utils/output.js';
|
|
8
|
+
import { createAgents, detectAgents, discoverSkills, getSkillsDir } from './install-skill.js';
|
|
9
|
+
export function findInstalledSkills(knownSkills, agent) {
|
|
10
|
+
return knownSkills.filter((name) => existsSync(join(agent.globalSkillsDir, name, 'SKILL.md')));
|
|
11
|
+
}
|
|
12
|
+
export async function uninstallSkill(skillName, agent) {
|
|
13
|
+
const targetDir = join(agent.globalSkillsDir, skillName);
|
|
14
|
+
try {
|
|
15
|
+
await rm(targetDir, { recursive: true, force: true });
|
|
16
|
+
return { success: true };
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
20
|
+
logError(`Failed to remove skill "${skillName}" for ${agent.displayName} at ${targetDir}:`, message);
|
|
21
|
+
return { success: false, error: message };
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export async function runUninstallSkill(options) {
|
|
25
|
+
const home = homedir();
|
|
26
|
+
const agents = createAgents(home);
|
|
27
|
+
const skillsDir = getSkillsDir();
|
|
28
|
+
let knownSkills;
|
|
29
|
+
try {
|
|
30
|
+
knownSkills = await discoverSkills(skillsDir);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
logError('Failed to read skills directory:', error);
|
|
34
|
+
exitWithError({
|
|
35
|
+
code: 'SKILLS_DIR_READ_FAILED',
|
|
36
|
+
message: `Could not read skills directory at ${skillsDir}. Your WorkOS CLI installation may be corrupted. Try reinstalling with \`npm install -g @workos-inc/cli\`.`,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
const targetAgents = detectAgents(agents, options.agent);
|
|
40
|
+
if (targetAgents.length === 0) {
|
|
41
|
+
const message = options.agent ? 'Specified agents not found.' : 'No coding agents detected.';
|
|
42
|
+
logWarn(message, 'Supported agents:', Object.keys(agents).join(', '));
|
|
43
|
+
exitWithError({
|
|
44
|
+
code: 'NO_AGENTS_FOUND',
|
|
45
|
+
message: `${message} Supported agents: ${Object.keys(agents).join(', ')}`,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
const targetSkillNames = options.skill ? knownSkills.filter((s) => options.skill.includes(s)) : knownSkills;
|
|
49
|
+
if (options.skill) {
|
|
50
|
+
const unrecognized = options.skill.filter((s) => !knownSkills.includes(s));
|
|
51
|
+
if (unrecognized.length > 0) {
|
|
52
|
+
logWarn('Unrecognized skill names requested for uninstall:', unrecognized);
|
|
53
|
+
if (!isJsonMode()) {
|
|
54
|
+
console.warn(chalk.yellow(`Unknown skills (ignored): ${unrecognized.join(', ')}`));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (options.skill && targetSkillNames.length === 0) {
|
|
59
|
+
logError('No matching skills found. Known skills:', knownSkills.join(', '));
|
|
60
|
+
exitWithError({
|
|
61
|
+
code: 'SKILL_NOT_FOUND',
|
|
62
|
+
message: `No matching skills found. Known skills: ${knownSkills.join(', ')}`,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
logInfo('Uninstalling skills:', targetSkillNames.join(', '), 'for agents:', targetAgents.map((a) => a.displayName).join(', '));
|
|
66
|
+
if (!isJsonMode()) {
|
|
67
|
+
console.log(chalk.bold('\nUninstalling skills...\n'));
|
|
68
|
+
}
|
|
69
|
+
const results = [];
|
|
70
|
+
for (const skill of targetSkillNames) {
|
|
71
|
+
for (const agent of targetAgents) {
|
|
72
|
+
const installed = findInstalledSkills([skill], agent);
|
|
73
|
+
if (installed.length === 0) {
|
|
74
|
+
results.push({ skill, agent: agent.displayName, success: true, skipped: true });
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
const result = await uninstallSkill(skill, agent);
|
|
78
|
+
results.push({
|
|
79
|
+
skill,
|
|
80
|
+
agent: agent.displayName,
|
|
81
|
+
skipped: false,
|
|
82
|
+
...result,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const removed = results.filter((r) => r.success && !r.skipped);
|
|
87
|
+
const skipped = results.filter((r) => r.skipped);
|
|
88
|
+
const failed = results.filter((r) => !r.success);
|
|
89
|
+
if (isJsonMode()) {
|
|
90
|
+
outputJson({ removed, skipped, failed });
|
|
91
|
+
if (failed.length > 0) {
|
|
92
|
+
process.exit(1);
|
|
93
|
+
}
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (removed.length > 0) {
|
|
97
|
+
logInfo(`Removed ${removed.length} skill(s)`);
|
|
98
|
+
console.log(chalk.green(`✓ Removed ${removed.length} skill(s):\n`));
|
|
99
|
+
for (const r of removed) {
|
|
100
|
+
console.log(` ${chalk.cyan(r.skill)} ← ${chalk.dim(r.agent)}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (skipped.length > 0 && removed.length === 0 && failed.length === 0) {
|
|
104
|
+
console.log(chalk.dim('No WorkOS skills were installed.'));
|
|
105
|
+
}
|
|
106
|
+
if (failed.length > 0) {
|
|
107
|
+
logError(`Failed to remove ${failed.length} skill(s)`);
|
|
108
|
+
console.log(chalk.red(`\n✗ Failed to remove ${failed.length}:\n`));
|
|
109
|
+
for (const r of failed) {
|
|
110
|
+
console.log(` ${r.skill} ← ${r.agent}: ${chalk.dim(r.error)}`);
|
|
111
|
+
}
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
console.log(chalk.green('\nDone!'));
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=uninstall-skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall-skill.js","sourceRoot":"","sources":["../../src/commands/uninstall-skill.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from 'fs';\nimport { rm } from 'fs/promises';\nimport { homedir } from 'os';\nimport { join } from 'path';\nimport chalk from 'chalk';\nimport { logError, logInfo, logWarn } from '../utils/debug.js';\nimport { exitWithError, isJsonMode, outputJson } from '../utils/output.js';\nimport { createAgents, detectAgents, discoverSkills, getSkillsDir, type AgentConfig } from './install-skill.js';\n\nexport interface UninstallSkillOptions {\n skill?: string[];\n agent?: string[];\n}\n\nexport function findInstalledSkills(knownSkills: string[], agent: AgentConfig): string[] {\n return knownSkills.filter((name) => existsSync(join(agent.globalSkillsDir, name, 'SKILL.md')));\n}\n\nexport async function uninstallSkill(\n skillName: string,\n agent: AgentConfig,\n): Promise<{ success: boolean; error?: string }> {\n const targetDir = join(agent.globalSkillsDir, skillName);\n try {\n await rm(targetDir, { recursive: true, force: true });\n return { success: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logError(`Failed to remove skill \"${skillName}\" for ${agent.displayName} at ${targetDir}:`, message);\n return { success: false, error: message };\n }\n}\n\nexport async function runUninstallSkill(options: UninstallSkillOptions): Promise<void> {\n const home = homedir();\n const agents = createAgents(home);\n const skillsDir = getSkillsDir();\n\n let knownSkills: string[];\n try {\n knownSkills = await discoverSkills(skillsDir);\n } catch (error) {\n logError('Failed to read skills directory:', error);\n exitWithError({\n code: 'SKILLS_DIR_READ_FAILED',\n message: `Could not read skills directory at ${skillsDir}. Your WorkOS CLI installation may be corrupted. Try reinstalling with \\`npm install -g @workos-inc/cli\\`.`,\n });\n }\n\n const targetAgents = detectAgents(agents, options.agent);\n\n if (targetAgents.length === 0) {\n const message = options.agent ? 'Specified agents not found.' : 'No coding agents detected.';\n logWarn(message, 'Supported agents:', Object.keys(agents).join(', '));\n exitWithError({\n code: 'NO_AGENTS_FOUND',\n message: `${message} Supported agents: ${Object.keys(agents).join(', ')}`,\n });\n }\n\n const targetSkillNames = options.skill ? knownSkills.filter((s) => options.skill!.includes(s)) : knownSkills;\n\n if (options.skill) {\n const unrecognized = options.skill.filter((s) => !knownSkills.includes(s));\n if (unrecognized.length > 0) {\n logWarn('Unrecognized skill names requested for uninstall:', unrecognized);\n if (!isJsonMode()) {\n console.warn(chalk.yellow(`Unknown skills (ignored): ${unrecognized.join(', ')}`));\n }\n }\n }\n\n if (options.skill && targetSkillNames.length === 0) {\n logError('No matching skills found. Known skills:', knownSkills.join(', '));\n exitWithError({\n code: 'SKILL_NOT_FOUND',\n message: `No matching skills found. Known skills: ${knownSkills.join(', ')}`,\n });\n }\n\n logInfo(\n 'Uninstalling skills:',\n targetSkillNames.join(', '),\n 'for agents:',\n targetAgents.map((a) => a.displayName).join(', '),\n );\n\n if (!isJsonMode()) {\n console.log(chalk.bold('\\nUninstalling skills...\\n'));\n }\n\n const results: Array<{\n skill: string;\n agent: string;\n success: boolean;\n skipped: boolean;\n error?: string;\n }> = [];\n\n for (const skill of targetSkillNames) {\n for (const agent of targetAgents) {\n const installed = findInstalledSkills([skill], agent);\n if (installed.length === 0) {\n results.push({ skill, agent: agent.displayName, success: true, skipped: true });\n continue;\n }\n const result = await uninstallSkill(skill, agent);\n results.push({\n skill,\n agent: agent.displayName,\n skipped: false,\n ...result,\n });\n }\n }\n\n const removed = results.filter((r) => r.success && !r.skipped);\n const skipped = results.filter((r) => r.skipped);\n const failed = results.filter((r) => !r.success);\n\n if (isJsonMode()) {\n outputJson({ removed, skipped, failed });\n if (failed.length > 0) {\n process.exit(1);\n }\n return;\n }\n\n if (removed.length > 0) {\n logInfo(`Removed ${removed.length} skill(s)`);\n console.log(chalk.green(`✓ Removed ${removed.length} skill(s):\\n`));\n for (const r of removed) {\n console.log(` ${chalk.cyan(r.skill)} ← ${chalk.dim(r.agent)}`);\n }\n }\n\n if (skipped.length > 0 && removed.length === 0 && failed.length === 0) {\n console.log(chalk.dim('No WorkOS skills were installed.'));\n }\n\n if (failed.length > 0) {\n logError(`Failed to remove ${failed.length} skill(s)`);\n console.log(chalk.red(`\\n✗ Failed to remove ${failed.length}:\\n`));\n for (const r of failed) {\n console.log(` ${r.skill} ← ${r.agent}: ${chalk.dim(r.error)}`);\n }\n process.exit(1);\n }\n\n console.log(chalk.green('\\nDone!'));\n}\n"]}
|
|
@@ -6,6 +6,7 @@ import { INSTALLER_INTERACTION_EVENT_NAME } from '../../lib/constants.js';
|
|
|
6
6
|
import { initializeAgent, runAgent } from '../../lib/agent-interface.js';
|
|
7
7
|
import { autoConfigureWorkOSEnvironment } from '../../lib/workos-management.js';
|
|
8
8
|
import { validateInstallation } from '../../lib/validation/index.js';
|
|
9
|
+
import { getReference } from '@workos/skills';
|
|
9
10
|
export const config = {
|
|
10
11
|
metadata: {
|
|
11
12
|
name: '.NET (ASP.NET Core)',
|
|
@@ -79,6 +80,7 @@ export async function run(options) {
|
|
|
79
80
|
// Build prompt — credentials are passed via prompt context since .NET doesn't use .env.local
|
|
80
81
|
const skillName = config.metadata.skillName;
|
|
81
82
|
const redirectUri = options.redirectUri || 'http://localhost:5000/auth/callback';
|
|
83
|
+
const refContent = await getReference(skillName);
|
|
82
84
|
const prompt = `You are integrating WorkOS AuthKit into this ASP.NET Core application.
|
|
83
85
|
|
|
84
86
|
## Project Context
|
|
@@ -90,24 +92,17 @@ export async function run(options) {
|
|
|
90
92
|
## Environment
|
|
91
93
|
|
|
92
94
|
The following WorkOS credentials should be configured in appsettings.Development.json:
|
|
93
|
-
- WORKOS_API_KEY:
|
|
94
|
-
- WORKOS_CLIENT_ID:
|
|
95
|
+
- WORKOS_API_KEY: (configured)
|
|
96
|
+
- WORKOS_CLIENT_ID: (configured)
|
|
95
97
|
- WORKOS_REDIRECT_URI: ${redirectUri}
|
|
96
98
|
|
|
97
|
-
##
|
|
99
|
+
## Integration Instructions
|
|
98
100
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
The skill contains step-by-step instructions including:
|
|
102
|
-
1. Fetching the SDK documentation
|
|
103
|
-
2. Installing the WorkOS.net NuGet package
|
|
104
|
-
3. Configuring DI registration
|
|
105
|
-
4. Creating authentication endpoints
|
|
106
|
-
5. Setting up appsettings configuration
|
|
101
|
+
${refContent}
|
|
107
102
|
|
|
108
103
|
Report your progress using [STATUS] prefixes.
|
|
109
104
|
|
|
110
|
-
Begin
|
|
105
|
+
Begin integration now.`;
|
|
111
106
|
const agent = await initializeAgent({
|
|
112
107
|
workingDirectory: options.installDir,
|
|
113
108
|
workOSApiKey: apiKey,
|
|
@@ -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
|
-
##
|
|
138
|
+
## Integration Instructions
|
|
137
139
|
|
|
138
|
-
|
|
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
|
|
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":"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,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;
|
|
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
|
-
##
|
|
159
|
+
## Integration Instructions
|
|
158
160
|
|
|
159
|
-
|
|
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
|
|
165
|
+
Begin integration now.`;
|
|
172
166
|
// Initialize and run agent
|
|
173
167
|
const agent = await initializeAgent({
|
|
174
168
|
workingDirectory: options.installDir,
|