@grant-vine/wunderkind 0.5.0 → 0.9.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 +2 -2
- package/README.md +191 -47
- package/agents/brand-builder.md +52 -3
- package/agents/ciso.md +53 -3
- package/agents/creative-director.md +37 -2
- package/agents/data-analyst.md +208 -0
- package/agents/devrel-wunderkind.md +225 -0
- package/agents/fullstack-wunderkind.md +51 -1
- package/agents/legal-counsel.md +222 -0
- package/agents/marketing-wunderkind.md +59 -3
- package/agents/operations-lead.md +51 -1
- package/agents/product-wunderkind.md +57 -1
- package/agents/qa-specialist.md +51 -1
- package/agents/support-engineer.md +200 -0
- package/commands/docs-index.md +44 -0
- package/dist/agents/brand-builder.d.ts.map +1 -1
- package/dist/agents/brand-builder.js +53 -3
- package/dist/agents/brand-builder.js.map +1 -1
- package/dist/agents/ciso.d.ts.map +1 -1
- package/dist/agents/ciso.js +54 -3
- package/dist/agents/ciso.js.map +1 -1
- package/dist/agents/creative-director.d.ts.map +1 -1
- package/dist/agents/creative-director.js +37 -2
- package/dist/agents/creative-director.js.map +1 -1
- package/dist/agents/data-analyst.d.ts +8 -0
- package/dist/agents/data-analyst.d.ts.map +1 -0
- package/dist/agents/data-analyst.js +247 -0
- package/dist/agents/data-analyst.js.map +1 -0
- package/dist/agents/devrel-wunderkind.d.ts +8 -0
- package/dist/agents/devrel-wunderkind.d.ts.map +1 -0
- package/dist/agents/devrel-wunderkind.js +262 -0
- package/dist/agents/devrel-wunderkind.js.map +1 -0
- package/dist/agents/docs-config.d.ts +14 -0
- package/dist/agents/docs-config.d.ts.map +1 -0
- package/dist/agents/docs-config.js +82 -0
- package/dist/agents/docs-config.js.map +1 -0
- package/dist/agents/docs-index-plan.d.ts +28 -0
- package/dist/agents/docs-index-plan.d.ts.map +1 -0
- package/dist/agents/docs-index-plan.js +118 -0
- package/dist/agents/docs-index-plan.js.map +1 -0
- package/dist/agents/fullstack-wunderkind.d.ts.map +1 -1
- package/dist/agents/fullstack-wunderkind.js +52 -1
- package/dist/agents/fullstack-wunderkind.js.map +1 -1
- package/dist/agents/index.d.ts +4 -0
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +4 -0
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/legal-counsel.d.ts +8 -0
- package/dist/agents/legal-counsel.d.ts.map +1 -0
- package/dist/agents/legal-counsel.js +260 -0
- package/dist/agents/legal-counsel.js.map +1 -0
- package/dist/agents/marketing-wunderkind.d.ts.map +1 -1
- package/dist/agents/marketing-wunderkind.js +61 -3
- package/dist/agents/marketing-wunderkind.js.map +1 -1
- package/dist/agents/operations-lead.d.ts.map +1 -1
- package/dist/agents/operations-lead.js +52 -1
- package/dist/agents/operations-lead.js.map +1 -1
- package/dist/agents/product-wunderkind.d.ts.map +1 -1
- package/dist/agents/product-wunderkind.js +57 -1
- package/dist/agents/product-wunderkind.js.map +1 -1
- package/dist/agents/qa-specialist.d.ts.map +1 -1
- package/dist/agents/qa-specialist.js +52 -1
- package/dist/agents/qa-specialist.js.map +1 -1
- package/dist/agents/support-engineer.d.ts +8 -0
- package/dist/agents/support-engineer.d.ts.map +1 -0
- package/dist/agents/support-engineer.js +238 -0
- package/dist/agents/support-engineer.js.map +1 -0
- package/dist/build-agents.js +5 -1
- package/dist/build-agents.js.map +1 -1
- package/dist/cli/cli-installer.d.ts +9 -1
- package/dist/cli/cli-installer.d.ts.map +1 -1
- package/dist/cli/cli-installer.js +61 -2
- package/dist/cli/cli-installer.js.map +1 -1
- package/dist/cli/config-manager/index.d.ts +17 -1
- package/dist/cli/config-manager/index.d.ts.map +1 -1
- package/dist/cli/config-manager/index.js +423 -114
- package/dist/cli/config-manager/index.js.map +1 -1
- package/dist/cli/docs-output-helper.d.ts +11 -0
- package/dist/cli/docs-output-helper.d.ts.map +1 -0
- package/dist/cli/docs-output-helper.js +36 -0
- package/dist/cli/docs-output-helper.js.map +1 -0
- package/dist/cli/doctor.d.ts +6 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +131 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/index.js +120 -8
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.d.ts +9 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +270 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/tui-installer.d.ts.map +1 -1
- package/dist/cli/tui-installer.js +93 -292
- package/dist/cli/tui-installer.js.map +1 -1
- package/dist/cli/types.d.ts +53 -15
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/cli/uninstall.d.ts +6 -0
- package/dist/cli/uninstall.d.ts.map +1 -0
- package/dist/cli/uninstall.js +64 -0
- package/dist/cli/uninstall.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +41 -7
- package/dist/index.js.map +1 -1
- package/oh-my-opencode.jsonc +58 -13
- package/package.json +6 -3
- package/schemas/wunderkind.config.schema.json +67 -0
- package/skills/experimentation-analyst/SKILL.md +137 -0
- package/skills/oss-licensing-advisor/SKILL.md +141 -0
- package/skills/technical-writer/SKILL.md +150 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import color from "picocolors";
|
|
2
|
+
import { detectCurrentConfig, removeGlobalWunderkindConfig, removePluginFromOpenCodeConfig, } from "./config-manager/index.js";
|
|
3
|
+
function resolveScopes(scope, detectedScope) {
|
|
4
|
+
if (scope === "global")
|
|
5
|
+
return ["global"];
|
|
6
|
+
if (scope === "project")
|
|
7
|
+
return ["project"];
|
|
8
|
+
if (detectedScope === "both")
|
|
9
|
+
return ["project"];
|
|
10
|
+
if (detectedScope === "project")
|
|
11
|
+
return ["project"];
|
|
12
|
+
if (detectedScope === "global")
|
|
13
|
+
return ["global"];
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
export async function runUninstall(options) {
|
|
17
|
+
try {
|
|
18
|
+
const detected = detectCurrentConfig();
|
|
19
|
+
const targets = resolveScopes(options.scope, detected.registrationScope ?? "none");
|
|
20
|
+
if (targets.length === 0) {
|
|
21
|
+
console.log("Wunderkind plugin is not currently registered in OpenCode config.");
|
|
22
|
+
console.log("No changes made.");
|
|
23
|
+
return 0;
|
|
24
|
+
}
|
|
25
|
+
for (const target of targets) {
|
|
26
|
+
const result = removePluginFromOpenCodeConfig(target);
|
|
27
|
+
if (!result.success) {
|
|
28
|
+
console.error(`Failed to remove plugin from ${target} OpenCode config: ${result.error}`);
|
|
29
|
+
return 1;
|
|
30
|
+
}
|
|
31
|
+
if (result.changed === true) {
|
|
32
|
+
console.log(`${color.green("✓")} Removed plugin registration from ${target} config (${color.dim(result.configPath)})`);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
console.log(`${color.dim("- ")}Plugin registration already absent in ${target} config (${color.dim(result.configPath)})`);
|
|
36
|
+
}
|
|
37
|
+
if (target === "global") {
|
|
38
|
+
const globalConfigResult = removeGlobalWunderkindConfig();
|
|
39
|
+
if (!globalConfigResult.success) {
|
|
40
|
+
console.error(`Failed to remove global Wunderkind config: ${globalConfigResult.error}`);
|
|
41
|
+
return 1;
|
|
42
|
+
}
|
|
43
|
+
if (globalConfigResult.changed === true) {
|
|
44
|
+
console.log(`${color.green("✓")} Removed global Wunderkind config (${color.dim(globalConfigResult.configPath)})`);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
console.log(`${color.dim("- ")}Global Wunderkind config already absent (${color.dim(globalConfigResult.configPath)})`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
console.log();
|
|
52
|
+
console.log(color.bold("Safety note"));
|
|
53
|
+
console.log("Project-local customization files are intentionally left untouched for safety:");
|
|
54
|
+
console.log("- Project-local: .wunderkind/, AGENTS.md, .sisyphus/, docs output folders");
|
|
55
|
+
console.log("- Global config is removed only during global uninstall");
|
|
56
|
+
console.log("If you want project-local artifacts removed, delete those files manually.");
|
|
57
|
+
return 0;
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
console.error(`Error: ${String(error)}`);
|
|
61
|
+
return 1;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/cli/uninstall.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAKlD,QAAA,MAAM,gBAAgB,EAAE,MAsGvB,CAAC;AAEF,OAAO,EAAE,gBAAgB,IAAI,OAAO,EAAE,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,23 @@
|
|
|
1
|
+
import { readProjectWunderkindConfig } from "./cli/config-manager/index.js";
|
|
2
|
+
const DOCS_OUTPUT_SENTINEL = "<!-- wunderkind:docs-output-start -->";
|
|
1
3
|
const WunderkindPlugin = async (_input) => {
|
|
2
4
|
return {
|
|
3
5
|
"experimental.chat.system.transform": async (_input, output) => {
|
|
6
|
+
const wunderkindConfig = readProjectWunderkindConfig();
|
|
7
|
+
const hasDocsOutputSentinel = output.system.join("").includes(DOCS_OUTPUT_SENTINEL);
|
|
8
|
+
if (wunderkindConfig?.docsEnabled === true && !hasDocsOutputSentinel) {
|
|
9
|
+
const docsPath = wunderkindConfig.docsPath ?? "./docs";
|
|
10
|
+
const docHistoryMode = wunderkindConfig.docHistoryMode ?? "overwrite";
|
|
11
|
+
output.system.push(`
|
|
12
|
+
${DOCS_OUTPUT_SENTINEL}
|
|
13
|
+
## Documentation Output
|
|
14
|
+
|
|
15
|
+
When producing documentation artifacts, write files to the configured docs directory.
|
|
16
|
+
|
|
17
|
+
- docsPath: \`${docsPath}\`
|
|
18
|
+
- docHistoryMode: \`${docHistoryMode}\`
|
|
19
|
+
`.trim());
|
|
20
|
+
}
|
|
4
21
|
output.system.push(`
|
|
5
22
|
## Wunderkind Plugin Agents (available via wunderkind:agent-name)
|
|
6
23
|
|
|
@@ -16,6 +33,10 @@ The following specialist agents are available. Delegate to them when their domai
|
|
|
16
33
|
- \`wunderkind:qa-specialist\` — TDD, test writing, Playwright, Vitest, coverage analysis, user story review, test optimisation, security boundary testing
|
|
17
34
|
- \`wunderkind:operations-lead\` — SRE/SLO, admin tooling (build-first), runbooks, incident response, observability, supportability assessment
|
|
18
35
|
- \`wunderkind:ciso\` — Security architecture, OWASP, threat modelling, compliance (GDPR/CCPA/POPIA/LGPD), pen testing coordination, breach response
|
|
36
|
+
- \`wunderkind:devrel-wunderkind\` — Developer relations, DX audits, API documentation, tutorials, migration guides, OSS community, getting started guides
|
|
37
|
+
- \`wunderkind:legal-counsel\` — OSS licensing, TOS/Privacy Policy drafting, DPAs, CLAs, contract review, GDPR/CCPA legal obligations
|
|
38
|
+
- \`wunderkind:support-engineer\` — Bug triage, issue classification, repro steps, severity rating (P0–P3), engineering handoff, support synthesis
|
|
39
|
+
- \`wunderkind:data-analyst\` — Product analytics, event tracking, funnel analysis, cohort analysis, A/B experiment design, metric definitions
|
|
19
40
|
|
|
20
41
|
### Delegation Rules
|
|
21
42
|
|
|
@@ -49,18 +70,31 @@ The following specialist agents are available. Delegate to them when their domai
|
|
|
49
70
|
#### Operations
|
|
50
71
|
- Use \`wunderkind:operations-lead\` for SRE/SLO decisions, admin panel architecture (build-first bias), incident containment, runbooks, monitoring, or supportability assessment
|
|
51
72
|
|
|
73
|
+
#### Developer Relations
|
|
74
|
+
- Use \`wunderkind:devrel-wunderkind\` for API docs, tutorials, getting started guides, DX audits, migration guides, OSS community docs, technical writing, changelog drafts
|
|
75
|
+
|
|
76
|
+
#### Legal
|
|
77
|
+
- Use \`wunderkind:legal-counsel\` for OSS licensing, TOS/Privacy Policy, DPAs, CLAs, contract review, GDPR/CCPA legal obligations
|
|
78
|
+
- Escalate from legal-counsel to \`wunderkind:ciso\` when the question is about technical security controls or implementation
|
|
79
|
+
|
|
80
|
+
#### Support & Triage
|
|
81
|
+
- Use \`wunderkind:support-engineer\` for bug triage, issue classification, user report synthesis, severity rating, engineering handoff
|
|
82
|
+
- Escalate from support-engineer: confirmed bugs → fullstack-wunderkind, security vulnerabilities → ciso, P0/P1 → operations-lead
|
|
83
|
+
|
|
84
|
+
#### Data & Analytics
|
|
85
|
+
- Use \`wunderkind:data-analyst\` for event tracking, funnel/cohort analysis, A/B experiments, metric definitions, tracking plans
|
|
86
|
+
- Escalate from data-analyst: roadmap decisions → product-wunderkind, channel performance → marketing-wunderkind
|
|
87
|
+
|
|
52
88
|
### Project Configuration
|
|
53
89
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
- \`
|
|
57
|
-
- \`primaryRegulation\` — the main data protection regulation to apply (defaults to GDPR)
|
|
58
|
-
- \`secondaryRegulation\` — additional regulation to layer on top
|
|
90
|
+
Global config defines shared region, industry, and regulation context.
|
|
91
|
+
|
|
92
|
+
Project-local \`.wunderkind/wunderkind.config.jsonc\` defines:
|
|
59
93
|
- \`teamCulture\` — communication style baseline: \`formal-strict\` | \`pragmatic-balanced\` | \`experimental-informal\`
|
|
60
94
|
- \`orgStructure\` — \`flat\` (peer escalation) | \`hierarchical\` (CISO has hard veto on security)
|
|
61
|
-
- \`cisoPersonality\`, \`ctoPersonality\`, \`cmoPersonality\`, \`qaPersonality\`, \`productPersonality\`, \`opsPersonality\`, \`creativePersonality\`, \`brandPersonality\` — character archetypes per agent
|
|
95
|
+
- \`cisoPersonality\`, \`ctoPersonality\`, \`cmoPersonality\`, \`qaPersonality\`, \`productPersonality\`, \`opsPersonality\`, \`creativePersonality\`, \`brandPersonality\`, \`devrelPersonality\`, \`legalPersonality\`, \`supportPersonality\`, \`dataAnalystPersonality\` — character archetypes per agent
|
|
62
96
|
|
|
63
|
-
If
|
|
97
|
+
If project-local soul fields are absent, agents default to packaged sane defaults.
|
|
64
98
|
|
|
65
99
|
`.trim());
|
|
66
100
|
},
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAE5E,MAAM,oBAAoB,GAAG,uCAAuC,CAAC;AAErE,MAAM,gBAAgB,GAAW,KAAK,EAAE,MAAM,EAAE,EAAE;IAChD,OAAO;QACL,oCAAoC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YAC7D,MAAM,gBAAgB,GAAG,2BAA2B,EAAE,CAAC;YACvD,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;YAEpF,IAAI,gBAAgB,EAAE,WAAW,KAAK,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBACrE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,QAAQ,IAAI,QAAQ,CAAC;gBACvD,MAAM,cAAc,GAAG,gBAAgB,CAAC,cAAc,IAAI,WAAW,CAAC;gBAEtE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;EACzB,oBAAoB;;;;;gBAKN,QAAQ;sBACF,cAAc;CACnC,CAAC,IAAI,EAAE,CAAC,CAAC;YACJ,CAAC;YAED,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8ExB,CAAC,IAAI,EAAE,CAAC,CAAC;QACN,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAE,gBAAgB,IAAI,OAAO,EAAE,CAAC"}
|
package/oh-my-opencode.jsonc
CHANGED
|
@@ -1,21 +1,30 @@
|
|
|
1
1
|
{
|
|
2
|
-
// Wunderkind oh-my-
|
|
3
|
-
//
|
|
4
|
-
//
|
|
2
|
+
// Wunderkind oh-my-openagent configuration (technical filename retained)
|
|
3
|
+
// ──────────────────────────────────────────────────────────────────────
|
|
4
|
+
// Upstream is branded as "oh-my-openagent", but this file is intentionally
|
|
5
|
+
// named "oh-my-opencode.jsonc" to match upstream technical identifiers.
|
|
5
6
|
// Copy (or symlink) this file to your project's .opencode/oh-my-opencode.jsonc
|
|
6
7
|
// to activate the full wunderkind agent suite with recommended settings.
|
|
7
8
|
//
|
|
8
9
|
// All agent names are namespaced as "wunderkind:<agent-name>" by the plugin loader.
|
|
9
10
|
//
|
|
10
|
-
// Schema: https://raw.githubusercontent.com/code-yeongyu/oh-my-
|
|
11
|
-
"$schema": "https://raw.githubusercontent.com/code-yeongyu/oh-my-
|
|
11
|
+
// Schema: https://raw.githubusercontent.com/code-yeongyu/oh-my-openagent/dev/assets/oh-my-opencode.schema.json
|
|
12
|
+
"$schema": "https://raw.githubusercontent.com/code-yeongyu/oh-my-openagent/dev/assets/oh-my-opencode.schema.json",
|
|
13
|
+
|
|
14
|
+
"categories": {
|
|
15
|
+
"quick": { "model": "anthropic/claude-haiku-4-5" },
|
|
16
|
+
"unspecified-low": { "model": "anthropic/claude-sonnet-4-6" },
|
|
17
|
+
"unspecified-high": { "model": "openai/gpt-5.4", "variant": "high" },
|
|
18
|
+
"writing": { "model": "google/gemini-3-flash" },
|
|
19
|
+
"visual-engineering": { "model": "google/gemini-3.1-pro", "variant": "high" }
|
|
20
|
+
},
|
|
12
21
|
|
|
13
22
|
"agents": {
|
|
14
23
|
// ── Marketing ──────────────────────────────────────────────────────────────
|
|
15
24
|
// CMO-calibre: go-to-market, brand, content, SEO/SEM, paid media, analytics
|
|
16
25
|
"wunderkind:marketing-wunderkind": {
|
|
17
26
|
"mode": "primary",
|
|
18
|
-
"
|
|
27
|
+
"category": "writing",
|
|
19
28
|
"color": "#FF6B35",
|
|
20
29
|
"description": "CMO-calibre marketing strategist. Brand, GTM, content, SEO/SEM, paid media, analytics, PR."
|
|
21
30
|
},
|
|
@@ -24,7 +33,7 @@
|
|
|
24
33
|
// Creative Director: brand identity, design systems, UI/UX, accessibility
|
|
25
34
|
"wunderkind:creative-director": {
|
|
26
35
|
"mode": "primary",
|
|
27
|
-
"
|
|
36
|
+
"category": "visual-engineering",
|
|
28
37
|
"color": "#A855F7",
|
|
29
38
|
"description": "Brand identity, design systems, UI/UX, typography, colour, accessibility, design tokens."
|
|
30
39
|
},
|
|
@@ -33,7 +42,7 @@
|
|
|
33
42
|
// VP Product-calibre: roadmaps, OKRs, PRDs, sprint planning, task decomposition
|
|
34
43
|
"wunderkind:product-wunderkind": {
|
|
35
44
|
"mode": "primary",
|
|
36
|
-
"
|
|
45
|
+
"category": "writing",
|
|
37
46
|
"color": "#3B82F6",
|
|
38
47
|
"description": "VP Product: roadmaps, OKRs, PRDs, user research, sprint planning, task decomposition."
|
|
39
48
|
},
|
|
@@ -42,7 +51,7 @@
|
|
|
42
51
|
// CTO-calibre: full-stack, DB, Vercel/Next.js, architecture, code review, AI
|
|
43
52
|
"wunderkind:fullstack-wunderkind": {
|
|
44
53
|
"mode": "primary",
|
|
45
|
-
"
|
|
54
|
+
"category": "unspecified-high",
|
|
46
55
|
"color": "#10B981",
|
|
47
56
|
"description": "CTO-calibre full-stack engineer. Frontend, backend, DB, Vercel, architecture, AI integration."
|
|
48
57
|
},
|
|
@@ -51,7 +60,7 @@
|
|
|
51
60
|
// Community strategy, thought leadership, PR, spend gating
|
|
52
61
|
"wunderkind:brand-builder": {
|
|
53
62
|
"mode": "primary",
|
|
54
|
-
"
|
|
63
|
+
"category": "writing",
|
|
55
64
|
"color": "#F59E0B",
|
|
56
65
|
"description": "Community strategy, thought leadership, PR narrative, forum targeting, ROI gating."
|
|
57
66
|
},
|
|
@@ -60,7 +69,7 @@
|
|
|
60
69
|
// TDD, test writing, Playwright/Vitest, coverage analysis, story review
|
|
61
70
|
"wunderkind:qa-specialist": {
|
|
62
71
|
"mode": "primary",
|
|
63
|
-
"
|
|
72
|
+
"category": "unspecified-high",
|
|
64
73
|
"color": "#06B6D4",
|
|
65
74
|
"description": "TDD, test writing, Playwright, Vitest, coverage analysis, user story review, security boundary testing."
|
|
66
75
|
},
|
|
@@ -69,7 +78,7 @@
|
|
|
69
78
|
// SRE/SLO, admin tooling (build-first), runbooks, incident response, observability
|
|
70
79
|
"wunderkind:operations-lead": {
|
|
71
80
|
"mode": "primary",
|
|
72
|
-
"
|
|
81
|
+
"category": "unspecified-high",
|
|
73
82
|
"color": "#EF4444",
|
|
74
83
|
"description": "SRE/SLO, admin tooling (build-first), runbooks, incident response, observability."
|
|
75
84
|
},
|
|
@@ -78,9 +87,45 @@
|
|
|
78
87
|
// CISO: security architecture, OWASP, threat modelling, compliance, pen testing
|
|
79
88
|
"wunderkind:ciso": {
|
|
80
89
|
"mode": "primary",
|
|
81
|
-
"
|
|
90
|
+
"category": "unspecified-high",
|
|
82
91
|
"color": "#EF4444",
|
|
83
92
|
"description": "CISO: security architecture, OWASP, threat modelling, GDPR/CCPA/POPIA, pen testing, breach response."
|
|
93
|
+
},
|
|
94
|
+
|
|
95
|
+
// ── DevRel ──────────────────────────────────────────────────────────────────
|
|
96
|
+
// Developer relations, DX, API docs, tutorials, migration guides, OSS community
|
|
97
|
+
"wunderkind:devrel-wunderkind": {
|
|
98
|
+
"mode": "primary",
|
|
99
|
+
"category": "writing",
|
|
100
|
+
"color": "#8B5CF6",
|
|
101
|
+
"description": "Developer relations, DX, API docs, tutorials, migration guides, OSS community, getting started guides."
|
|
102
|
+
},
|
|
103
|
+
|
|
104
|
+
// ── Legal ────────────────────────────────────────────────────────────────────
|
|
105
|
+
// OSS licensing, TOS, privacy policy, DPAs, CLAs, contract review, GDPR/CCPA obligations
|
|
106
|
+
"wunderkind:legal-counsel": {
|
|
107
|
+
"mode": "primary",
|
|
108
|
+
"category": "writing",
|
|
109
|
+
"color": "#6366F1",
|
|
110
|
+
"description": "OSS licensing, TOS, privacy policy, DPAs, CLAs, contract review, GDPR/CCPA compliance obligations."
|
|
111
|
+
},
|
|
112
|
+
|
|
113
|
+
// ── Support ──────────────────────────────────────────────────────────────────
|
|
114
|
+
// Bug triage, issue classification, repro steps, severity rating, engineering handoff
|
|
115
|
+
"wunderkind:support-engineer": {
|
|
116
|
+
"mode": "primary",
|
|
117
|
+
"category": "writing",
|
|
118
|
+
"color": "#F97316",
|
|
119
|
+
"description": "Bug triage, issue classification, repro steps, severity rating, engineering handoff, support synthesis."
|
|
120
|
+
},
|
|
121
|
+
|
|
122
|
+
// ── Data Analyst ─────────────────────────────────────────────────────────────
|
|
123
|
+
// Product analytics, event tracking, funnel analysis, cohort analysis, A/B experiments
|
|
124
|
+
"wunderkind:data-analyst": {
|
|
125
|
+
"mode": "primary",
|
|
126
|
+
"category": "writing",
|
|
127
|
+
"color": "#14B8A6",
|
|
128
|
+
"description": "Product analytics, event tracking, funnel analysis, cohort analysis, A/B experiments, metric definitions."
|
|
84
129
|
}
|
|
85
130
|
}
|
|
86
131
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@grant-vine/wunderkind",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Wunderkind
|
|
3
|
+
"version": "0.9.0",
|
|
4
|
+
"description": "Wunderkind \u2014 specialist AI agent addon for oh-my-openagent with 12 professional agents for any software product team",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -17,6 +17,8 @@
|
|
|
17
17
|
"files": [
|
|
18
18
|
"dist/",
|
|
19
19
|
"agents/",
|
|
20
|
+
"commands/",
|
|
21
|
+
"schemas/",
|
|
20
22
|
"skills/",
|
|
21
23
|
".claude-plugin/",
|
|
22
24
|
"bin/",
|
|
@@ -35,7 +37,7 @@
|
|
|
35
37
|
"@opencode-ai/plugin": "^1.2.18",
|
|
36
38
|
"commander": "^13.1.0",
|
|
37
39
|
"jsonc-parser": "^3.3.1",
|
|
38
|
-
"oh-my-opencode": "^3.
|
|
40
|
+
"oh-my-opencode": "^3.11.0",
|
|
39
41
|
"picocolors": "^1.1.1"
|
|
40
42
|
},
|
|
41
43
|
"devDependencies": {
|
|
@@ -43,6 +45,7 @@
|
|
|
43
45
|
"typescript": "^5.7.3"
|
|
44
46
|
},
|
|
45
47
|
"keywords": [
|
|
48
|
+
"oh-my-openagent",
|
|
46
49
|
"oh-my-opencode",
|
|
47
50
|
"opencode",
|
|
48
51
|
"plugin",
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://raw.githubusercontent.com/grant-vine/wunderkind/main/schemas/wunderkind.config.schema.json",
|
|
4
|
+
"title": "Wunderkind Config",
|
|
5
|
+
"description": "Schema for Wunderkind global and project configuration files.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"oneOf": [
|
|
8
|
+
{
|
|
9
|
+
"title": "Global Wunderkind Config",
|
|
10
|
+
"type": "object",
|
|
11
|
+
"properties": {
|
|
12
|
+
"$schema": { "type": "string" },
|
|
13
|
+
"region": { "type": "string" },
|
|
14
|
+
"industry": { "type": "string" },
|
|
15
|
+
"primaryRegulation": { "type": "string" },
|
|
16
|
+
"secondaryRegulation": { "type": "string" }
|
|
17
|
+
},
|
|
18
|
+
"required": ["$schema", "region", "industry", "primaryRegulation", "secondaryRegulation"],
|
|
19
|
+
"additionalProperties": false
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"title": "Project Wunderkind Config",
|
|
23
|
+
"type": "object",
|
|
24
|
+
"properties": {
|
|
25
|
+
"$schema": { "type": "string" },
|
|
26
|
+
"teamCulture": { "enum": ["formal-strict", "pragmatic-balanced", "experimental-informal"] },
|
|
27
|
+
"orgStructure": { "enum": ["flat", "hierarchical"] },
|
|
28
|
+
"cisoPersonality": { "enum": ["paranoid-enforcer", "pragmatic-risk-manager", "educator-collaborator"] },
|
|
29
|
+
"ctoPersonality": { "enum": ["grizzled-sysadmin", "startup-bro", "code-archaeologist"] },
|
|
30
|
+
"cmoPersonality": { "enum": ["data-driven", "brand-storyteller", "growth-hacker"] },
|
|
31
|
+
"qaPersonality": { "enum": ["rule-enforcer", "risk-based-pragmatist", "rubber-duck"] },
|
|
32
|
+
"productPersonality": { "enum": ["user-advocate", "velocity-optimizer", "outcome-obsessed"] },
|
|
33
|
+
"opsPersonality": { "enum": ["on-call-veteran", "efficiency-maximiser", "process-purist"] },
|
|
34
|
+
"creativePersonality": { "enum": ["perfectionist-craftsperson", "bold-provocateur", "pragmatic-problem-solver"] },
|
|
35
|
+
"brandPersonality": { "enum": ["community-evangelist", "pr-spinner", "authentic-builder"] },
|
|
36
|
+
"devrelPersonality": { "enum": ["community-champion", "docs-perfectionist", "dx-engineer"] },
|
|
37
|
+
"legalPersonality": { "enum": ["cautious-gatekeeper", "pragmatic-advisor", "plain-english-counselor"] },
|
|
38
|
+
"supportPersonality": { "enum": ["empathetic-resolver", "systematic-triage", "knowledge-builder"] },
|
|
39
|
+
"dataAnalystPersonality": { "enum": ["rigorous-statistician", "insight-storyteller", "pragmatic-quant"] },
|
|
40
|
+
"docsEnabled": { "type": "boolean" },
|
|
41
|
+
"docsPath": { "type": "string" },
|
|
42
|
+
"docHistoryMode": { "enum": ["overwrite", "append-dated", "new-dated-file", "overwrite-archive"] }
|
|
43
|
+
},
|
|
44
|
+
"required": [
|
|
45
|
+
"$schema",
|
|
46
|
+
"teamCulture",
|
|
47
|
+
"orgStructure",
|
|
48
|
+
"cisoPersonality",
|
|
49
|
+
"ctoPersonality",
|
|
50
|
+
"cmoPersonality",
|
|
51
|
+
"qaPersonality",
|
|
52
|
+
"productPersonality",
|
|
53
|
+
"opsPersonality",
|
|
54
|
+
"creativePersonality",
|
|
55
|
+
"brandPersonality",
|
|
56
|
+
"devrelPersonality",
|
|
57
|
+
"legalPersonality",
|
|
58
|
+
"supportPersonality",
|
|
59
|
+
"dataAnalystPersonality",
|
|
60
|
+
"docsEnabled",
|
|
61
|
+
"docsPath",
|
|
62
|
+
"docHistoryMode"
|
|
63
|
+
],
|
|
64
|
+
"additionalProperties": false
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: experimentation-analyst
|
|
3
|
+
description: >
|
|
4
|
+
USE FOR: A/B test design, experiment design, hypothesis formulation, sample size calculation,
|
|
5
|
+
power analysis, minimum detectable effect, MDE, statistical significance, p-value,
|
|
6
|
+
confidence interval, control group, treatment group, experiment duration, experiment readout,
|
|
7
|
+
test results analysis, statistical testing, t-test, chi-square test, z-test, bootstrap,
|
|
8
|
+
Bayesian A/B testing, frequentist testing, multiple testing correction, Bonferroni,
|
|
9
|
+
false positive rate, false negative rate, Type I error, Type II error, guardrail metrics,
|
|
10
|
+
novelty effect, network effects in experiments, holdout group, switchback test,
|
|
11
|
+
multivariate test, MVT, feature flag rollout, staged rollout, experiment infrastructure.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Experimentation Analyst
|
|
16
|
+
|
|
17
|
+
You are the Experimentation Analyst — a specialist in rigorous experiment design, statistical testing, and experiment readout. You are invoked by `data-analyst` for statistical depth on A/B tests and experiments.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Regional Configuration
|
|
22
|
+
|
|
23
|
+
**Read `wunderkind.config.jsonc` at the start of any experiment task.**
|
|
24
|
+
|
|
25
|
+
Key fields:
|
|
26
|
+
|
|
27
|
+
| Field | Effect on this skill |
|
|
28
|
+
|---|---|
|
|
29
|
+
| `primaryRegulation` | GDPR/CCPA consent requirements for tracking experiment participants |
|
|
30
|
+
| `industry` | Industry-specific benchmarks for conversion rates, retention, and significance thresholds |
|
|
31
|
+
| `teamCulture` | `rigorous-statistician` mode for formal-strict; `pragmatic-quant` mode for pragmatic-balanced |
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Experiment Design Framework
|
|
36
|
+
|
|
37
|
+
### Step 1: Hypothesis
|
|
38
|
+
- **Format**: "If we [change X], then [metric Y] will [increase/decrease] by [Z%] because [mechanism]."
|
|
39
|
+
- **Null hypothesis**: the change has no effect on the primary metric.
|
|
40
|
+
- **Good hypothesis**: testable, specific, with a stated mechanism.
|
|
41
|
+
|
|
42
|
+
### Step 2: Primary Metric
|
|
43
|
+
- One metric, not a list. The experiment wins or loses on this one metric.
|
|
44
|
+
- Must be: measurable, sensitive to the change, not lagging (ideally moves within the test window)
|
|
45
|
+
|
|
46
|
+
### Step 3: Guardrail Metrics
|
|
47
|
+
- Metrics that must NOT degrade. If a guardrail is breached, the test fails regardless of the primary metric.
|
|
48
|
+
- Common guardrails: core engagement (DAU, session length), revenue, error rates, latency
|
|
49
|
+
|
|
50
|
+
### Step 4: Sample Size Calculation
|
|
51
|
+
Required inputs:
|
|
52
|
+
- **Baseline conversion rate** (current value of primary metric)
|
|
53
|
+
- **Minimum Detectable Effect (MDE)**: smallest change worth shipping
|
|
54
|
+
- **Statistical power** (1 - β): 80% standard, 90% for high-stakes decisions
|
|
55
|
+
- **Significance level** (α): 0.05 standard (two-tailed), 0.01 for very high stakes
|
|
56
|
+
|
|
57
|
+
Formula (two-proportion z-test):
|
|
58
|
+
```
|
|
59
|
+
n = (z_α/2 + z_β)² × [p1(1-p1) + p2(1-p2)] / (p1 - p2)²
|
|
60
|
+
```
|
|
61
|
+
Where p1 = baseline rate, p2 = baseline rate × (1 + MDE)
|
|
62
|
+
|
|
63
|
+
### Step 5: Test Duration
|
|
64
|
+
- Minimum: full business cycle (at least one full week to capture weekly patterns)
|
|
65
|
+
- Maximum: determined by peeking risk — commit to end date before starting
|
|
66
|
+
- Rule of thumb: run until required sample size is reached AND at least 7 days have passed
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Slash Commands
|
|
71
|
+
|
|
72
|
+
### `/experiment-design <hypothesis>`
|
|
73
|
+
Design a complete A/B test.
|
|
74
|
+
|
|
75
|
+
**Output includes:**
|
|
76
|
+
1. Refined hypothesis (if input needs sharpening)
|
|
77
|
+
2. Primary metric with definition (numerator, denominator, filters)
|
|
78
|
+
3. Guardrail metrics (≥ 3)
|
|
79
|
+
4. Sample size calculation (show work)
|
|
80
|
+
5. Recommended test duration
|
|
81
|
+
6. Randomisation unit (user, session, device)
|
|
82
|
+
7. Segmentation dimensions to track
|
|
83
|
+
8. Pre-analysis plan (what we will look at, before seeing results)
|
|
84
|
+
9. Consent/tracking compliance notes (read `primaryRegulation`)
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
### `/experiment-readout <results data>`
|
|
89
|
+
Analyse and interpret A/B test results.
|
|
90
|
+
|
|
91
|
+
**Readout structure:**
|
|
92
|
+
1. **Test summary**: hypothesis, duration, sample size achieved vs planned
|
|
93
|
+
2. **Primary metric**: observed effect, p-value, confidence interval, practical significance
|
|
94
|
+
3. **Guardrail check**: did any guardrail breach? If yes: FAIL regardless of primary metric
|
|
95
|
+
4. **Statistical significance**: p < α? If yes: reject null hypothesis
|
|
96
|
+
5. **Practical significance**: is the effect size worth the engineering cost to ship?
|
|
97
|
+
6. **Novelty effect check**: did the effect diminish over time? (plot day-by-day)
|
|
98
|
+
7. **Segmentation**: does the effect hold across key segments, or is it driven by one segment?
|
|
99
|
+
8. **Recommendation**: ship / iterate / kill — with explicit rationale
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
### `/sample-size <baseline_rate> <mde> [power] [alpha]`
|
|
104
|
+
Calculate required sample size for an experiment.
|
|
105
|
+
|
|
106
|
+
- Default power: 80% (0.80)
|
|
107
|
+
- Default alpha: 5% (0.05), two-tailed
|
|
108
|
+
- Show the calculation step-by-step
|
|
109
|
+
- Convert to test duration based on current traffic (ask for daily traffic if not provided)
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
### `/peeking-risk`
|
|
114
|
+
Explain and quantify the risk of stopping an experiment early based on interim results.
|
|
115
|
+
|
|
116
|
+
- Show how false positive rate inflates with multiple looks
|
|
117
|
+
- Recommend: pre-register end date, use sequential testing if early stopping is required
|
|
118
|
+
- Provide alpha-spending function options (O'Brien-Fleming, Pocock) for sequential tests
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Delegation Patterns
|
|
123
|
+
|
|
124
|
+
When experiment results require product decisions (ship/kill/iterate tied to roadmap), escalate to `data-analyst` to route to `product-wunderkind`.
|
|
125
|
+
|
|
126
|
+
When experiment tracking requires engineering (event schema, feature flag implementation), escalate to `data-analyst` to route to `fullstack-wunderkind`.
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## Hard Rules
|
|
131
|
+
|
|
132
|
+
1. **One primary metric per experiment** — multiple primary metrics inflate false positive rate
|
|
133
|
+
2. **Pre-register the analysis plan** — decide what to look at before seeing results
|
|
134
|
+
3. **Never stop early based on significance alone** — wait for the planned sample size
|
|
135
|
+
4. **Guardrail breach = test failure** — no exceptions, even if primary metric wins
|
|
136
|
+
5. **Practical significance ≠ statistical significance** — a p-value of 0.001 on a 0.1% lift is not worth shipping
|
|
137
|
+
6. **Novelty effect is real** — always plot day-by-day effect size; a spike on day 1-3 is not a win
|