@grant-vine/wunderkind 0.3.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/.claude-plugin/plugin.json +6 -0
- package/README.md +110 -0
- package/agents/brand-builder.md +215 -0
- package/agents/ciso.md +267 -0
- package/agents/creative-director.md +231 -0
- package/agents/fullstack-wunderkind.md +304 -0
- package/agents/marketing-wunderkind.md +230 -0
- package/agents/operations-lead.md +253 -0
- package/agents/product-wunderkind.md +253 -0
- package/agents/qa-specialist.md +234 -0
- package/bin/wunderkind.js +2 -0
- package/dist/agents/brand-builder.d.ts +8 -0
- package/dist/agents/brand-builder.d.ts.map +1 -0
- package/dist/agents/brand-builder.js +251 -0
- package/dist/agents/brand-builder.js.map +1 -0
- package/dist/agents/ciso.d.ts +8 -0
- package/dist/agents/ciso.d.ts.map +1 -0
- package/dist/agents/ciso.js +304 -0
- package/dist/agents/ciso.js.map +1 -0
- package/dist/agents/creative-director.d.ts +8 -0
- package/dist/agents/creative-director.d.ts.map +1 -0
- package/dist/agents/creative-director.js +268 -0
- package/dist/agents/creative-director.js.map +1 -0
- package/dist/agents/fullstack-wunderkind.d.ts +8 -0
- package/dist/agents/fullstack-wunderkind.d.ts.map +1 -0
- package/dist/agents/fullstack-wunderkind.js +332 -0
- package/dist/agents/fullstack-wunderkind.js.map +1 -0
- package/dist/agents/index.d.ts +11 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +10 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/marketing-wunderkind.d.ts +8 -0
- package/dist/agents/marketing-wunderkind.d.ts.map +1 -0
- package/dist/agents/marketing-wunderkind.js +267 -0
- package/dist/agents/marketing-wunderkind.js.map +1 -0
- package/dist/agents/operations-lead.d.ts +8 -0
- package/dist/agents/operations-lead.d.ts.map +1 -0
- package/dist/agents/operations-lead.js +290 -0
- package/dist/agents/operations-lead.js.map +1 -0
- package/dist/agents/product-wunderkind.d.ts +8 -0
- package/dist/agents/product-wunderkind.d.ts.map +1 -0
- package/dist/agents/product-wunderkind.js +289 -0
- package/dist/agents/product-wunderkind.js.map +1 -0
- package/dist/agents/qa-specialist.d.ts +8 -0
- package/dist/agents/qa-specialist.d.ts.map +1 -0
- package/dist/agents/qa-specialist.js +271 -0
- package/dist/agents/qa-specialist.js.map +1 -0
- package/dist/agents/types.d.ts +26 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +6 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/build-agents.d.ts +2 -0
- package/dist/build-agents.d.ts.map +1 -0
- package/dist/build-agents.js +30 -0
- package/dist/build-agents.js.map +1 -0
- package/dist/cli/cli-installer.d.ts +23 -0
- package/dist/cli/cli-installer.d.ts.map +1 -0
- package/dist/cli/cli-installer.js +116 -0
- package/dist/cli/cli-installer.js.map +1 -0
- package/dist/cli/config-manager/index.d.ts +5 -0
- package/dist/cli/config-manager/index.d.ts.map +1 -0
- package/dist/cli/config-manager/index.js +145 -0
- package/dist/cli/config-manager/index.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +34 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/tui-installer.d.ts +2 -0
- package/dist/cli/tui-installer.d.ts.map +1 -0
- package/dist/cli/tui-installer.js +89 -0
- package/dist/cli/tui-installer.js.map +1 -0
- package/dist/cli/types.d.ts +27 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +65 -0
- package/dist/index.js.map +1 -0
- package/oh-my-opencode.jsonc +86 -0
- package/package.json +56 -0
- package/skills/agile-pm/SKILL.md +128 -0
- package/skills/compliance-officer/SKILL.md +355 -0
- package/skills/db-architect/SKILL.md +367 -0
- package/skills/pen-tester/SKILL.md +276 -0
- package/skills/security-analyst/SKILL.md +228 -0
- package/skills/social-media-maven/SKILL.md +205 -0
- package/skills/vercel-architect/SKILL.md +229 -0
- package/skills/visual-artist/SKILL.md +126 -0
- package/wunderkind.config.jsonc +85 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { InstallArgs } from "./types.js";
|
|
2
|
+
export declare const SYMBOLS: {
|
|
3
|
+
check: string;
|
|
4
|
+
cross: string;
|
|
5
|
+
arrow: string;
|
|
6
|
+
bullet: string;
|
|
7
|
+
info: string;
|
|
8
|
+
warn: string;
|
|
9
|
+
star: string;
|
|
10
|
+
};
|
|
11
|
+
export declare function printHeader(isUpdate: boolean): void;
|
|
12
|
+
export declare function printStep(step: number, total: number, message: string): void;
|
|
13
|
+
export declare function printSuccess(message: string): void;
|
|
14
|
+
export declare function printError(message: string): void;
|
|
15
|
+
export declare function printInfo(message: string): void;
|
|
16
|
+
export declare function printWarning(message: string): void;
|
|
17
|
+
export declare function printBox(content: string, title?: string): void;
|
|
18
|
+
export declare function validateNonTuiArgs(args: InstallArgs): {
|
|
19
|
+
valid: boolean;
|
|
20
|
+
errors: string[];
|
|
21
|
+
};
|
|
22
|
+
export declare function runCliInstaller(args: InstallArgs): Promise<number>;
|
|
23
|
+
//# sourceMappingURL=cli-installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-installer.d.ts","sourceRoot":"","sources":["../../src/cli/cli-installer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAG7C,eAAO,MAAM,OAAO;;;;;;;;CAQnB,CAAA;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAKnD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAE5E;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CA6B9D;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAM1F;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAgExE"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import color from "picocolors";
|
|
2
|
+
import { addPluginToOpenCodeConfig, detectCurrentConfig, writeWunderkindConfig } from "./config-manager/index.js";
|
|
3
|
+
export const SYMBOLS = {
|
|
4
|
+
check: color.green("[OK]"),
|
|
5
|
+
cross: color.red("[X]"),
|
|
6
|
+
arrow: color.cyan("->"),
|
|
7
|
+
bullet: color.dim("*"),
|
|
8
|
+
info: color.blue("[i]"),
|
|
9
|
+
warn: color.yellow("[!]"),
|
|
10
|
+
star: color.yellow("*"),
|
|
11
|
+
};
|
|
12
|
+
export function printHeader(isUpdate) {
|
|
13
|
+
const mode = isUpdate ? "Update" : "Install";
|
|
14
|
+
console.log();
|
|
15
|
+
console.log(color.bgMagenta(color.white(` Wunderkind... ${mode} `)));
|
|
16
|
+
console.log();
|
|
17
|
+
}
|
|
18
|
+
export function printStep(step, total, message) {
|
|
19
|
+
console.log(`${color.dim(`[${step}/${total}]`)} ${message}`);
|
|
20
|
+
}
|
|
21
|
+
export function printSuccess(message) {
|
|
22
|
+
console.log(`${SYMBOLS.check} ${message}`);
|
|
23
|
+
}
|
|
24
|
+
export function printError(message) {
|
|
25
|
+
console.log(`${SYMBOLS.cross} ${color.red(message)}`);
|
|
26
|
+
}
|
|
27
|
+
export function printInfo(message) {
|
|
28
|
+
console.log(`${SYMBOLS.info} ${message}`);
|
|
29
|
+
}
|
|
30
|
+
export function printWarning(message) {
|
|
31
|
+
console.log(`${SYMBOLS.warn} ${color.yellow(message)}`);
|
|
32
|
+
}
|
|
33
|
+
export function printBox(content, title) {
|
|
34
|
+
const lines = content.split("\n");
|
|
35
|
+
const maxWidth = Math.max(...lines.map((line) => line.replace(/\u001b\[[0-9;]*m/g, "").length), title?.length ?? 0) + 4;
|
|
36
|
+
const border = color.dim("─".repeat(maxWidth));
|
|
37
|
+
console.log();
|
|
38
|
+
if (title) {
|
|
39
|
+
console.log(color.dim("┌─") +
|
|
40
|
+
color.bold(` ${title} `) +
|
|
41
|
+
color.dim("─".repeat(maxWidth - title.length - 4)) +
|
|
42
|
+
color.dim("┐"));
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
console.log(color.dim("┌") + border + color.dim("┐"));
|
|
46
|
+
}
|
|
47
|
+
for (const line of lines) {
|
|
48
|
+
const stripped = line.replace(/\u001b\[[0-9;]*m/g, "");
|
|
49
|
+
const padding = maxWidth - stripped.length;
|
|
50
|
+
console.log(color.dim("│") + ` ${line}${" ".repeat(padding - 1)}` + color.dim("│"));
|
|
51
|
+
}
|
|
52
|
+
console.log(color.dim("└") + border + color.dim("┘"));
|
|
53
|
+
console.log();
|
|
54
|
+
}
|
|
55
|
+
export function validateNonTuiArgs(args) {
|
|
56
|
+
const errors = [];
|
|
57
|
+
if (!args.region)
|
|
58
|
+
errors.push("--region is required (e.g. --region='South Africa')");
|
|
59
|
+
if (!args.industry)
|
|
60
|
+
errors.push("--industry is required (e.g. --industry=SaaS)");
|
|
61
|
+
if (!args.primaryRegulation)
|
|
62
|
+
errors.push("--primary-regulation is required (e.g. --primary-regulation=GDPR)");
|
|
63
|
+
return { valid: errors.length === 0, errors };
|
|
64
|
+
}
|
|
65
|
+
export async function runCliInstaller(args) {
|
|
66
|
+
const validation = validateNonTuiArgs(args);
|
|
67
|
+
if (!validation.valid) {
|
|
68
|
+
printHeader(false);
|
|
69
|
+
printError("Validation failed:");
|
|
70
|
+
for (const err of validation.errors) {
|
|
71
|
+
console.log(` ${SYMBOLS.bullet} ${err}`);
|
|
72
|
+
}
|
|
73
|
+
console.log();
|
|
74
|
+
printInfo("Usage: bunx wunderkind install --no-tui --region='South Africa' --industry=SaaS --primary-regulation=POPIA");
|
|
75
|
+
console.log();
|
|
76
|
+
return 1;
|
|
77
|
+
}
|
|
78
|
+
const detected = detectCurrentConfig();
|
|
79
|
+
const isUpdate = detected.isInstalled;
|
|
80
|
+
printHeader(isUpdate);
|
|
81
|
+
const totalSteps = 2;
|
|
82
|
+
let step = 1;
|
|
83
|
+
const config = {
|
|
84
|
+
region: args.region ?? "Global",
|
|
85
|
+
industry: args.industry ?? "",
|
|
86
|
+
primaryRegulation: args.primaryRegulation ?? "GDPR",
|
|
87
|
+
secondaryRegulation: args.secondaryRegulation ?? "",
|
|
88
|
+
};
|
|
89
|
+
printStep(step++, totalSteps, "Adding wunderkind to OpenCode config...");
|
|
90
|
+
const pluginResult = addPluginToOpenCodeConfig();
|
|
91
|
+
if (!pluginResult.success) {
|
|
92
|
+
printError(`Failed: ${pluginResult.error}`);
|
|
93
|
+
return 1;
|
|
94
|
+
}
|
|
95
|
+
printSuccess(`Plugin ${isUpdate ? "verified" : "added"} ${SYMBOLS.arrow} ${color.dim(pluginResult.configPath)}`);
|
|
96
|
+
printStep(step++, totalSteps, "Writing wunderkind configuration...");
|
|
97
|
+
const configResult = writeWunderkindConfig(config);
|
|
98
|
+
if (!configResult.success) {
|
|
99
|
+
printError(`Failed: ${configResult.error}`);
|
|
100
|
+
return 1;
|
|
101
|
+
}
|
|
102
|
+
printSuccess(`Config written ${SYMBOLS.arrow} ${color.dim(configResult.configPath)}`);
|
|
103
|
+
printBox([
|
|
104
|
+
` ${color.bold("Region:")} ${color.cyan(config.region)}`,
|
|
105
|
+
` ${color.bold("Industry:")} ${color.cyan(config.industry || color.dim("(not set)"))}`,
|
|
106
|
+
` ${color.bold("Primary regulation:")} ${color.cyan(config.primaryRegulation)}`,
|
|
107
|
+
config.secondaryRegulation ? ` ${color.bold("Secondary:")} ${color.cyan(config.secondaryRegulation)}` : "",
|
|
108
|
+
]
|
|
109
|
+
.filter(Boolean)
|
|
110
|
+
.join("\n"), isUpdate ? "Updated Configuration" : "Installation Complete");
|
|
111
|
+
console.log(`${SYMBOLS.star} ${color.bold(color.green(isUpdate ? "Configuration updated!" : "Installation complete!"))}`);
|
|
112
|
+
console.log(` Run ${color.cyan("opencode")} to start!`);
|
|
113
|
+
console.log();
|
|
114
|
+
return 0;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=cli-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-installer.js","sourceRoot":"","sources":["../../src/cli/cli-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ConfigMergeResult, DetectedConfig, InstallConfig } from "../types.js";
|
|
2
|
+
export declare function detectCurrentConfig(): DetectedConfig;
|
|
3
|
+
export declare function addPluginToOpenCodeConfig(): ConfigMergeResult;
|
|
4
|
+
export declare function writeWunderkindConfig(installConfig: InstallConfig): ConfigMergeResult;
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/config-manager/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAqCnF,wBAAgB,mBAAmB,IAAI,cAAc,CAmCpD;AAED,wBAAgB,yBAAyB,IAAI,iBAAiB,CAmD7D;AAED,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,aAAa,GAAG,iBAAiB,CAwBrF"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { parse as parseJsonc } from "jsonc-parser";
|
|
5
|
+
const PACKAGE_NAME = "wunderkind";
|
|
6
|
+
const CONFIG_DIR = join(homedir(), ".config", "opencode");
|
|
7
|
+
const CONFIG_JSON = join(CONFIG_DIR, "config.json");
|
|
8
|
+
const CONFIG_JSONC = join(CONFIG_DIR, "config.jsonc");
|
|
9
|
+
const WUNDERKIND_CONFIG = join(process.cwd(), "wunderkind.config.jsonc");
|
|
10
|
+
function getConfigPath() {
|
|
11
|
+
if (existsSync(CONFIG_JSONC))
|
|
12
|
+
return { path: CONFIG_JSONC, format: "jsonc" };
|
|
13
|
+
if (existsSync(CONFIG_JSON))
|
|
14
|
+
return { path: CONFIG_JSON, format: "json" };
|
|
15
|
+
return { path: CONFIG_JSON, format: "none" };
|
|
16
|
+
}
|
|
17
|
+
function ensureConfigDir() {
|
|
18
|
+
if (!existsSync(CONFIG_DIR)) {
|
|
19
|
+
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function parseConfig(path) {
|
|
23
|
+
try {
|
|
24
|
+
const content = readFileSync(path, "utf-8");
|
|
25
|
+
if (!content.trim())
|
|
26
|
+
return null;
|
|
27
|
+
const result = parseJsonc(content);
|
|
28
|
+
if (!result || typeof result !== "object" || Array.isArray(result))
|
|
29
|
+
return null;
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export function detectCurrentConfig() {
|
|
37
|
+
const defaults = {
|
|
38
|
+
isInstalled: false,
|
|
39
|
+
region: "Global",
|
|
40
|
+
industry: "",
|
|
41
|
+
primaryRegulation: "GDPR",
|
|
42
|
+
secondaryRegulation: "",
|
|
43
|
+
};
|
|
44
|
+
const { path, format } = getConfigPath();
|
|
45
|
+
if (format === "none")
|
|
46
|
+
return defaults;
|
|
47
|
+
const config = parseConfig(path);
|
|
48
|
+
if (!config)
|
|
49
|
+
return defaults;
|
|
50
|
+
const plugins = config.plugin ?? [];
|
|
51
|
+
const isInstalled = plugins.some((p) => p === PACKAGE_NAME || p.startsWith(`${PACKAGE_NAME}@`));
|
|
52
|
+
if (!isInstalled)
|
|
53
|
+
return defaults;
|
|
54
|
+
if (existsSync(WUNDERKIND_CONFIG)) {
|
|
55
|
+
try {
|
|
56
|
+
const wk = parseJsonc(readFileSync(WUNDERKIND_CONFIG, "utf-8"));
|
|
57
|
+
return {
|
|
58
|
+
isInstalled: true,
|
|
59
|
+
region: typeof wk["REGION"] === "string" ? wk["REGION"] : defaults.region,
|
|
60
|
+
industry: typeof wk["INDUSTRY"] === "string" ? wk["INDUSTRY"] : defaults.industry,
|
|
61
|
+
primaryRegulation: typeof wk["PRIMARY_REGULATION"] === "string" ? wk["PRIMARY_REGULATION"] : defaults.primaryRegulation,
|
|
62
|
+
secondaryRegulation: typeof wk["SECONDARY_REGULATION"] === "string" ? wk["SECONDARY_REGULATION"] : defaults.secondaryRegulation,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return { ...defaults, isInstalled: true };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return { ...defaults, isInstalled: true };
|
|
70
|
+
}
|
|
71
|
+
export function addPluginToOpenCodeConfig() {
|
|
72
|
+
try {
|
|
73
|
+
ensureConfigDir();
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
return { success: false, configPath: CONFIG_DIR, error: String(err) };
|
|
77
|
+
}
|
|
78
|
+
const { path, format } = getConfigPath();
|
|
79
|
+
try {
|
|
80
|
+
if (format === "none") {
|
|
81
|
+
const config = { plugin: [PACKAGE_NAME] };
|
|
82
|
+
writeFileSync(path, JSON.stringify(config, null, 2) + "\n");
|
|
83
|
+
return { success: true, configPath: path };
|
|
84
|
+
}
|
|
85
|
+
const config = parseConfig(path) ?? {};
|
|
86
|
+
const plugins = (config.plugin ?? []);
|
|
87
|
+
const existingIndex = plugins.findIndex((p) => p === PACKAGE_NAME || p.startsWith(`${PACKAGE_NAME}@`));
|
|
88
|
+
if (existingIndex !== -1) {
|
|
89
|
+
if (plugins[existingIndex] === PACKAGE_NAME) {
|
|
90
|
+
return { success: true, configPath: path };
|
|
91
|
+
}
|
|
92
|
+
plugins[existingIndex] = PACKAGE_NAME;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
plugins.push(PACKAGE_NAME);
|
|
96
|
+
}
|
|
97
|
+
config.plugin = plugins;
|
|
98
|
+
if (format === "jsonc") {
|
|
99
|
+
const content = readFileSync(path, "utf-8");
|
|
100
|
+
const pluginArrayRegex = /"plugin"\s*:\s*\[([\s\S]*?)\]/;
|
|
101
|
+
const match = content.match(pluginArrayRegex);
|
|
102
|
+
if (match) {
|
|
103
|
+
const formatted = plugins.map((p) => `"${p}"`).join(",\n ");
|
|
104
|
+
const newContent = content.replace(pluginArrayRegex, `"plugin": [\n ${formatted}\n ]`);
|
|
105
|
+
writeFileSync(path, newContent);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
const newContent = content.replace(/(\{)/, `$1\n "plugin": ["${PACKAGE_NAME}"],`);
|
|
109
|
+
writeFileSync(path, newContent);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
writeFileSync(path, JSON.stringify(config, null, 2) + "\n");
|
|
114
|
+
}
|
|
115
|
+
return { success: true, configPath: path };
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
return { success: false, configPath: path, error: String(err) };
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
export function writeWunderkindConfig(installConfig) {
|
|
122
|
+
const configPath = WUNDERKIND_CONFIG;
|
|
123
|
+
try {
|
|
124
|
+
const content = [
|
|
125
|
+
`// Wunderkind configuration — edit these values to tailor agents to your project context`,
|
|
126
|
+
`{`,
|
|
127
|
+
` // Geographic region — e.g. "South Africa", "United States", "United Kingdom", "Australia"`,
|
|
128
|
+
` "REGION": ${JSON.stringify(installConfig.region)},`,
|
|
129
|
+
` // Industry vertical — e.g. "SaaS", "FinTech", "eCommerce", "HealthTech"`,
|
|
130
|
+
` "INDUSTRY": ${JSON.stringify(installConfig.industry)},`,
|
|
131
|
+
` // Primary data-protection regulation — e.g. "GDPR", "POPIA", "CCPA", "LGPD"`,
|
|
132
|
+
` "PRIMARY_REGULATION": ${JSON.stringify(installConfig.primaryRegulation)},`,
|
|
133
|
+
` // Optional secondary regulation`,
|
|
134
|
+
` "SECONDARY_REGULATION": ${JSON.stringify(installConfig.secondaryRegulation)}`,
|
|
135
|
+
`}`,
|
|
136
|
+
``,
|
|
137
|
+
].join("\n");
|
|
138
|
+
writeFileSync(configPath, content);
|
|
139
|
+
return { success: true, configPath };
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
return { success: false, configPath, error: String(err) };
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/config-manager/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
import { runCliInstaller } from "./cli-installer.js";
|
|
5
|
+
import { runTuiInstaller } from "./tui-installer.js";
|
|
6
|
+
const require = createRequire(import.meta.url);
|
|
7
|
+
const pkg = require("../../package.json");
|
|
8
|
+
const program = new Command();
|
|
9
|
+
program
|
|
10
|
+
.name("wunderkind")
|
|
11
|
+
.description("Install and configure the Wunderkind oh-my-opencode addon")
|
|
12
|
+
.version(pkg.version);
|
|
13
|
+
program
|
|
14
|
+
.command("install", { isDefault: true })
|
|
15
|
+
.description("Install Wunderkind into your OpenCode setup")
|
|
16
|
+
.option("--no-tui", "Run non-interactive CLI installer")
|
|
17
|
+
.option("--region <region>", "Geographic region (e.g. 'South Africa')")
|
|
18
|
+
.option("--industry <industry>", "Industry vertical (e.g. SaaS)")
|
|
19
|
+
.option("--primary-regulation <regulation>", "Primary data-protection regulation (e.g. GDPR)")
|
|
20
|
+
.option("--secondary-regulation <regulation>", "Secondary regulation (optional)")
|
|
21
|
+
.option("--skip-auth", "Skip post-install auth instructions")
|
|
22
|
+
.action(async (opts) => {
|
|
23
|
+
const args = {
|
|
24
|
+
tui: opts.tui,
|
|
25
|
+
region: opts.region,
|
|
26
|
+
industry: opts.industry,
|
|
27
|
+
primaryRegulation: opts.primaryRegulation,
|
|
28
|
+
secondaryRegulation: opts.secondaryRegulation,
|
|
29
|
+
};
|
|
30
|
+
const exitCode = opts.tui ? await runTuiInstaller() : await runCliInstaller(args);
|
|
31
|
+
process.exit(exitCode);
|
|
32
|
+
});
|
|
33
|
+
program.parse();
|
|
34
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAGpD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAwB,CAAA;AAEhE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,2DAA2D,CAAC;KACxE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;AAEvB,OAAO;KACJ,OAAO,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;KACvC,WAAW,CAAC,6CAA6C,CAAC;KAC1D,MAAM,CAAC,UAAU,EAAE,mCAAmC,CAAC;KACvD,MAAM,CAAC,mBAAmB,EAAE,yCAAyC,CAAC;KACtE,MAAM,CAAC,uBAAuB,EAAE,+BAA+B,CAAC;KAChE,MAAM,CAAC,mCAAmC,EAAE,gDAAgD,CAAC;KAC7F,MAAM,CAAC,qCAAqC,EAAE,iCAAiC,CAAC;KAChF,MAAM,CAAC,aAAa,EAAE,qCAAqC,CAAC;KAC5D,MAAM,CAAC,KAAK,EAAE,IAOd,EAAE,EAAE;IACH,MAAM,IAAI,GAAgB;QACxB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;KAC9C,CAAA;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,eAAe,EAAE,CAAC,CAAC,CAAC,MAAM,eAAe,CAAC,IAAI,CAAC,CAAA;IACjF,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;AACxB,CAAC,CAAC,CAAA;AAEJ,OAAO,CAAC,KAAK,EAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-installer.d.ts","sourceRoot":"","sources":["../../src/cli/tui-installer.ts"],"names":[],"mappings":"AAIA,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAwGvD"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
|
+
import color from "picocolors";
|
|
3
|
+
import { addPluginToOpenCodeConfig, detectCurrentConfig, writeWunderkindConfig } from "./config-manager/index.js";
|
|
4
|
+
export async function runTuiInstaller() {
|
|
5
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
6
|
+
console.error("Error: Interactive installer requires a TTY. Use --no-tui and pass flags directly.");
|
|
7
|
+
return 1;
|
|
8
|
+
}
|
|
9
|
+
const detected = detectCurrentConfig();
|
|
10
|
+
const isUpdate = detected.isInstalled;
|
|
11
|
+
p.intro(color.bgMagenta(color.white(isUpdate ? " Wunderkind... Update " : " Wunderkind... Install ")));
|
|
12
|
+
if (isUpdate) {
|
|
13
|
+
p.log.info(`Existing configuration detected: Region=${detected.region}, Industry=${detected.industry || "(not set)"}`);
|
|
14
|
+
}
|
|
15
|
+
const region = await p.text({
|
|
16
|
+
message: "What region is your product based in?",
|
|
17
|
+
placeholder: "Global",
|
|
18
|
+
initialValue: detected.region,
|
|
19
|
+
validate: (v) => (v.trim() ? undefined : "Region is required"),
|
|
20
|
+
});
|
|
21
|
+
if (p.isCancel(region)) {
|
|
22
|
+
p.cancel("Installation cancelled.");
|
|
23
|
+
return 1;
|
|
24
|
+
}
|
|
25
|
+
const industry = await p.text({
|
|
26
|
+
message: "What industry or vertical is your product in?",
|
|
27
|
+
placeholder: "SaaS",
|
|
28
|
+
initialValue: detected.industry,
|
|
29
|
+
});
|
|
30
|
+
if (p.isCancel(industry)) {
|
|
31
|
+
p.cancel("Installation cancelled.");
|
|
32
|
+
return 1;
|
|
33
|
+
}
|
|
34
|
+
const primaryRegulation = await p.text({
|
|
35
|
+
message: "What is your primary data-protection regulation?",
|
|
36
|
+
placeholder: "GDPR",
|
|
37
|
+
initialValue: detected.primaryRegulation,
|
|
38
|
+
validate: (v) => (v.trim() ? undefined : "Primary regulation is required"),
|
|
39
|
+
});
|
|
40
|
+
if (p.isCancel(primaryRegulation)) {
|
|
41
|
+
p.cancel("Installation cancelled.");
|
|
42
|
+
return 1;
|
|
43
|
+
}
|
|
44
|
+
const secondaryRegulation = await p.text({
|
|
45
|
+
message: "Secondary regulation? (optional)",
|
|
46
|
+
placeholder: "leave blank to skip",
|
|
47
|
+
initialValue: detected.secondaryRegulation,
|
|
48
|
+
});
|
|
49
|
+
if (p.isCancel(secondaryRegulation)) {
|
|
50
|
+
p.cancel("Installation cancelled.");
|
|
51
|
+
return 1;
|
|
52
|
+
}
|
|
53
|
+
const config = {
|
|
54
|
+
region: region.trim() || "Global",
|
|
55
|
+
industry: industry.trim(),
|
|
56
|
+
primaryRegulation: primaryRegulation.trim() || "GDPR",
|
|
57
|
+
secondaryRegulation: secondaryRegulation.trim(),
|
|
58
|
+
};
|
|
59
|
+
const spinner = p.spinner();
|
|
60
|
+
spinner.start("Adding wunderkind to OpenCode config");
|
|
61
|
+
const pluginResult = addPluginToOpenCodeConfig();
|
|
62
|
+
if (!pluginResult.success) {
|
|
63
|
+
spinner.stop(`Failed: ${pluginResult.error}`);
|
|
64
|
+
p.outro(color.red("Installation failed."));
|
|
65
|
+
return 1;
|
|
66
|
+
}
|
|
67
|
+
spinner.stop(`Plugin added to ${color.cyan(pluginResult.configPath)}`);
|
|
68
|
+
spinner.start("Writing wunderkind configuration");
|
|
69
|
+
const configResult = writeWunderkindConfig(config);
|
|
70
|
+
if (!configResult.success) {
|
|
71
|
+
spinner.stop(`Failed: ${configResult.error}`);
|
|
72
|
+
p.outro(color.red("Installation failed."));
|
|
73
|
+
return 1;
|
|
74
|
+
}
|
|
75
|
+
spinner.stop(`Config written to ${color.cyan(configResult.configPath)}`);
|
|
76
|
+
p.note([
|
|
77
|
+
`Region: ${color.cyan(config.region)}`,
|
|
78
|
+
`Industry: ${color.cyan(config.industry || color.dim("(not set)"))}`,
|
|
79
|
+
`Primary regulation: ${color.cyan(config.primaryRegulation)}`,
|
|
80
|
+
config.secondaryRegulation ? `Secondary: ${color.cyan(config.secondaryRegulation)}` : "",
|
|
81
|
+
]
|
|
82
|
+
.filter(Boolean)
|
|
83
|
+
.join("\n"), isUpdate ? "Updated Configuration" : "Installation Complete");
|
|
84
|
+
p.log.success(color.bold(isUpdate ? "Configuration updated!" : "Installation complete!"));
|
|
85
|
+
p.log.message(`Run ${color.cyan("opencode")} to start!`);
|
|
86
|
+
p.outro(color.green("Wunderkind... Enjoy!"));
|
|
87
|
+
return 0;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=tui-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-installer.js","sourceRoot":"","sources":["../../src/cli/tui-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export type BooleanArg = "no" | "yes";
|
|
2
|
+
export interface InstallArgs {
|
|
3
|
+
tui: boolean;
|
|
4
|
+
region?: string | undefined;
|
|
5
|
+
industry?: string | undefined;
|
|
6
|
+
primaryRegulation?: string | undefined;
|
|
7
|
+
secondaryRegulation?: string | undefined;
|
|
8
|
+
}
|
|
9
|
+
export interface InstallConfig {
|
|
10
|
+
region: string;
|
|
11
|
+
industry: string;
|
|
12
|
+
primaryRegulation: string;
|
|
13
|
+
secondaryRegulation: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ConfigMergeResult {
|
|
16
|
+
success: boolean;
|
|
17
|
+
configPath: string;
|
|
18
|
+
error?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface DetectedConfig {
|
|
21
|
+
isInstalled: boolean;
|
|
22
|
+
region: string;
|
|
23
|
+
industry: string;
|
|
24
|
+
primaryRegulation: string;
|
|
25
|
+
secondaryRegulation: string;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,KAAK,CAAA;AAErC,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,OAAO,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACtC,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACzC;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,iBAAiB,EAAE,MAAM,CAAA;IACzB,mBAAmB,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,OAAO,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,iBAAiB,EAAE,MAAM,CAAA;IACzB,mBAAmB,EAAE,MAAM,CAAA;CAC5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":""}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,QAAA,MAAM,gBAAgB,EAAE,MA8DvB,CAAC;AAEF,OAAO,EAAE,gBAAgB,IAAI,OAAO,EAAE,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
const WunderkindPlugin = async (_input) => {
|
|
2
|
+
return {
|
|
3
|
+
"experimental.chat.system.transform": async (_input, output) => {
|
|
4
|
+
output.system.push(`
|
|
5
|
+
## Wunderkind Plugin Agents (available via wunderkind:agent-name)
|
|
6
|
+
|
|
7
|
+
The following specialist agents are available. Delegate to them when their domain matches:
|
|
8
|
+
|
|
9
|
+
### Primary Agents
|
|
10
|
+
|
|
11
|
+
- \`wunderkind:marketing-wunderkind\` — Brand strategy, go-to-market, content marketing, SEO/SEM, paid media, analytics, product marketing, PR, competitor analysis
|
|
12
|
+
- \`wunderkind:creative-director\` — Brand identity, design systems, UI/UX, typography, colour palettes, accessibility, design tokens, visual language
|
|
13
|
+
- \`wunderkind:product-wunderkind\` — Product strategy, roadmaps, OKRs, user research, PRDs, sprint planning, prioritisation, task decomposition
|
|
14
|
+
- \`wunderkind:fullstack-wunderkind\` — Full-stack engineering, frontend, backend, database, infrastructure, Vercel, AI integration, code review, architecture
|
|
15
|
+
- \`wunderkind:brand-builder\` — Community building, thought leadership, product forums, networking opportunities, PR narrative, cost gating, ROI assessment
|
|
16
|
+
- \`wunderkind:qa-specialist\` — TDD, test writing, Playwright, Vitest, coverage analysis, user story review, test optimisation, security boundary testing
|
|
17
|
+
- \`wunderkind:operations-lead\` — SRE/SLO, admin tooling (build-first), runbooks, incident response, observability, supportability assessment
|
|
18
|
+
- \`wunderkind:ciso\` — Security architecture, OWASP, threat modelling, compliance (GDPR/CCPA/POPIA/LGPD), pen testing coordination, breach response
|
|
19
|
+
|
|
20
|
+
### Delegation Rules
|
|
21
|
+
|
|
22
|
+
#### Security & Compliance
|
|
23
|
+
- Use \`wunderkind:ciso\` for ANY security review, vulnerability concern, compliance question, threat modelling, pen test coordination, or incident response
|
|
24
|
+
- Use \`wunderkind:ciso\` when fullstack work touches auth, JWT, RBAC, CORS, CSP headers, or sensitive data flows
|
|
25
|
+
- Sub-route from ciso: Security Analyst for vulnerability deep-dives, Pen Tester for active testing, Compliance Officer for GDPR/CCPA/POPIA/LGPD
|
|
26
|
+
|
|
27
|
+
#### Quality & Testing
|
|
28
|
+
- Use \`wunderkind:qa-specialist\` for test strategy, TDD guidance, flaky tests, coverage gaps, user story validation, or security boundary test review
|
|
29
|
+
- Use \`wunderkind:qa-specialist\` when any user story or PRD needs testability review before implementation
|
|
30
|
+
|
|
31
|
+
#### Product & Planning
|
|
32
|
+
- Use \`wunderkind:product-wunderkind\` for roadmapping, OKRs, PRDs, feature prioritisation, go-to-market planning, or task decomposition
|
|
33
|
+
- Use \`wunderkind:product-wunderkind\` when breaking down complex features into parallel-safe agent tasks (file conflict prevention)
|
|
34
|
+
|
|
35
|
+
#### Engineering
|
|
36
|
+
- Use \`wunderkind:fullstack-wunderkind\` for any full-stack development, database work, Vercel/Next.js, architecture decisions, or code review
|
|
37
|
+
- Sub-route from fullstack: db-architect for database/Drizzle/PostgreSQL, vercel-architect for deployment/edge/ISR
|
|
38
|
+
|
|
39
|
+
#### Brand & Marketing
|
|
40
|
+
- Use \`wunderkind:marketing-wunderkind\` for campaigns, SEO audits, content calendars, competitor analysis, paid media, or go-to-market strategy
|
|
41
|
+
- Use \`wunderkind:brand-builder\` for community strategy, forum targeting, networking opportunities, thought leadership plans, PR, or spend/ROI gating
|
|
42
|
+
- Sub-route from marketing: social-media-maven for platform-specific social content and engagement strategy
|
|
43
|
+
|
|
44
|
+
#### Design & UX
|
|
45
|
+
- Use \`wunderkind:creative-director\` for brand identity, design systems, UI/UX review, colour palettes, typography, or visual consistency
|
|
46
|
+
- Sub-route from creative-director: visual-artist for design tokens, WCAG colour compliance, and asset generation
|
|
47
|
+
|
|
48
|
+
#### Operations
|
|
49
|
+
- Use \`wunderkind:operations-lead\` for SRE/SLO decisions, admin panel architecture (build-first bias), incident containment, runbooks, monitoring, or supportability assessment
|
|
50
|
+
|
|
51
|
+
### Regional Configuration
|
|
52
|
+
|
|
53
|
+
All agents read \`wunderkind.config.jsonc\` (project root, or plugin root as fallback) for:
|
|
54
|
+
- \`REGION\` — adjusts platform mix, event targeting, and regulatory focus
|
|
55
|
+
- \`INDUSTRY\` — adjusts content tone and sector-specific obligations
|
|
56
|
+
- \`PRIMARY_REGULATION\` — the main data protection regulation to apply (defaults to GDPR)
|
|
57
|
+
- \`SECONDARY_REGULATION\` — additional regulation to layer on top
|
|
58
|
+
|
|
59
|
+
If the file is absent or fields are blank, agents default to global best practices.
|
|
60
|
+
`.trim());
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
export { WunderkindPlugin as default };
|
|
65
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,MAAM,gBAAgB,GAAW,KAAK,EAAE,MAAM,EAAE,EAAE;IAChD,OAAO;QACL,oCAAoC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YAC7D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwDxB,CAAC,IAAI,EAAE,CAAC,CAAC;QACN,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAE,gBAAgB,IAAI,OAAO,EAAE,CAAC"}
|