oh-my-pm 1.0.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/LICENSE +21 -0
- package/README.md +127 -0
- package/agent-blueprints/ada-blueprint.md +69 -0
- package/agent-blueprints/davinci-blueprint.md +67 -0
- package/agent-blueprints/hammurabi-blueprint.md +69 -0
- package/agent-blueprints/jc-blueprint.md +67 -0
- package/agent-blueprints/suntzu-blueprint.md +65 -0
- package/dist/agents.d.ts +11 -0
- package/dist/agents.d.ts.map +1 -0
- package/dist/agents.js +138 -0
- package/dist/agents.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +57 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +28 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +75 -0
- package/dist/config.js.map +1 -0
- package/dist/generator.d.ts +20 -0
- package/dist/generator.d.ts.map +1 -0
- package/dist/generator.js +119 -0
- package/dist/generator.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +16 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +207 -0
- package/dist/install.js.map +1 -0
- package/dist/utils/manifest.d.ts +60 -0
- package/dist/utils/manifest.d.ts.map +1 -0
- package/dist/utils/manifest.js +65 -0
- package/dist/utils/manifest.js.map +1 -0
- package/dist/utils/validation.d.ts +14 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +137 -0
- package/dist/utils/validation.js.map +1 -0
- package/docs/architecture.md +54 -0
- package/docs/dev-harness-bridge.md +46 -0
- package/docs/examples/example-manifest.json +51 -0
- package/docs/examples/example-prd.md +47 -0
- package/docs/installation.md +75 -0
- package/docs/lifecycle.md +27 -0
- package/oh-my-pm.schema.json +32 -0
- package/package.json +55 -0
- package/pm-manifest.schema.json +96 -0
- package/src/templates/claude/CLAUDE.md +99 -0
- package/src/templates/generic/AGENTS.md +56 -0
- package/src/templates/openai/agents.py +123 -0
- package/src/templates/opencode/AGENTS.md +38 -0
- package/src/templates/opencode/oh-my-pm.json +20 -0
- package/src/templates/opencode/opencode.jsonc +30 -0
- package/src/templates/opencode/skills/ada/SKILL.md +57 -0
- package/src/templates/opencode/skills/davinci/SKILL.md +57 -0
- package/src/templates/opencode/skills/hammurabi/SKILL.md +57 -0
- package/src/templates/opencode/skills/jc/SKILL.md +57 -0
- package/src/templates/opencode/skills/oh-my-pm/SKILL.md +52 -0
- package/src/templates/opencode/skills/suntzu/SKILL.md +57 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { Command } from "commander";
|
|
4
|
+
import { generateTemplate, initProject, installProject, validateCurrentProject } from "./install.js";
|
|
5
|
+
const program = new Command();
|
|
6
|
+
function printResult(result) {
|
|
7
|
+
console.log(result.message);
|
|
8
|
+
for (const writtenPath of result.paths)
|
|
9
|
+
console.log(chalk.dim(`- ${writtenPath}`));
|
|
10
|
+
}
|
|
11
|
+
export async function runCli(argv) {
|
|
12
|
+
program
|
|
13
|
+
.name("oh-my-pm")
|
|
14
|
+
.description("Install a Product Management agent team for PRD, TRD, flows, DB design, and execution DAGs.")
|
|
15
|
+
.version("1.0.0");
|
|
16
|
+
program
|
|
17
|
+
.command("init")
|
|
18
|
+
.description("Scaffold Oh My PM state in the current project.")
|
|
19
|
+
.action(async () => {
|
|
20
|
+
printResult(await initProject(process.cwd()));
|
|
21
|
+
});
|
|
22
|
+
program
|
|
23
|
+
.command("install")
|
|
24
|
+
.description("Install the OpenCode Oh My PM plugin team into the current project.")
|
|
25
|
+
.option("--claude", "Also install CLAUDE.md instructions.")
|
|
26
|
+
.option("--openai", "Also install OpenAI Agents SDK template.")
|
|
27
|
+
.option("--generic", "Also install generic Markdown instructions.")
|
|
28
|
+
.option("--all", "Install all platform equivalents.")
|
|
29
|
+
.option("--global", "Install Oh My PM into ~/.config/opencode like oh-my-opencode-slim.")
|
|
30
|
+
.action(async (options) => {
|
|
31
|
+
printResult(await installProject(process.cwd(), options));
|
|
32
|
+
});
|
|
33
|
+
program
|
|
34
|
+
.command("generate")
|
|
35
|
+
.argument("<type>", "Template type: opencode, claude, openai, or generic.")
|
|
36
|
+
.description("Generate a platform template under .parkops/generated without installing it.")
|
|
37
|
+
.action(async (type) => {
|
|
38
|
+
printResult(await generateTemplate(process.cwd(), type));
|
|
39
|
+
});
|
|
40
|
+
program
|
|
41
|
+
.command("validate")
|
|
42
|
+
.description("Validate .parkops/pm_manifest.json in the current project.")
|
|
43
|
+
.action(async () => {
|
|
44
|
+
printResult(await validateCurrentProject(process.cwd()));
|
|
45
|
+
});
|
|
46
|
+
await program.parseAsync(argv);
|
|
47
|
+
}
|
|
48
|
+
runCli(process.argv).catch((error) => {
|
|
49
|
+
if (error instanceof Error) {
|
|
50
|
+
console.error(chalk.red(error.message));
|
|
51
|
+
process.exitCode = 1;
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
console.error(chalk.red("Unknown failure."));
|
|
55
|
+
process.exitCode = 1;
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,cAAc,EAAE,sBAAsB,EAAuB,MAAM,cAAc,CAAA;AAEzH,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,SAAS,WAAW,CAAC,MAAuE;IAC1F,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAC3B,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,KAAK;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,WAAW,EAAE,CAAC,CAAC,CAAA;AACpF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAuB;IAClD,OAAO;SACJ,IAAI,CAAC,UAAU,CAAC;SAChB,WAAW,CAAC,6FAA6F,CAAC;SAC1G,OAAO,CAAC,OAAO,CAAC,CAAA;IAEnB,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iDAAiD,CAAC;SAC9D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,WAAW,CAAC,MAAM,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEJ,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,qEAAqE,CAAC;SAClF,MAAM,CAAC,UAAU,EAAE,sCAAsC,CAAC;SAC1D,MAAM,CAAC,UAAU,EAAE,0CAA0C,CAAC;SAC9D,MAAM,CAAC,WAAW,EAAE,6CAA6C,CAAC;SAClE,MAAM,CAAC,OAAO,EAAE,mCAAmC,CAAC;SACpD,MAAM,CAAC,UAAU,EAAE,oEAAoE,CAAC;SACxF,MAAM,CAAC,KAAK,EAAE,OAAuB,EAAE,EAAE;QACxC,WAAW,CAAC,MAAM,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC,CAAA;IAC3D,CAAC,CAAC,CAAA;IAEJ,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,QAAQ,CAAC,QAAQ,EAAE,sDAAsD,CAAC;SAC1E,WAAW,CAAC,8EAA8E,CAAC;SAC3F,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC7B,WAAW,CAAC,MAAM,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAA;IAC1D,CAAC,CAAC,CAAA;IAEJ,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,4DAA4D,CAAC;SACzE,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,WAAW,CAAC,MAAM,sBAAsB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;IAC1D,CAAC,CAAC,CAAA;IAEJ,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;AAChC,CAAC;AAED,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC5C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAA;QACvC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QACpB,OAAM;IACR,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAA;IAC5C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;AACtB,CAAC,CAAC,CAAA"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const PRESET_NAMES: readonly ["openai", "opencode"];
|
|
3
|
+
export type PresetName = (typeof PRESET_NAMES)[number];
|
|
4
|
+
declare const AgentPresetSchema: z.ZodObject<{
|
|
5
|
+
model: z.ZodString;
|
|
6
|
+
variant: z.ZodOptional<z.ZodString>;
|
|
7
|
+
}, z.core.$strict>;
|
|
8
|
+
export type AgentPreset = z.infer<typeof AgentPresetSchema>;
|
|
9
|
+
export declare const OhMyPmConfigSchema: z.ZodObject<{
|
|
10
|
+
$schema: z.ZodOptional<z.ZodString>;
|
|
11
|
+
preset: z.ZodString;
|
|
12
|
+
presets: z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
13
|
+
model: z.ZodString;
|
|
14
|
+
variant: z.ZodOptional<z.ZodString>;
|
|
15
|
+
}, z.core.$strict>>>;
|
|
16
|
+
}, z.core.$strict>;
|
|
17
|
+
export type OhMyPmConfig = z.infer<typeof OhMyPmConfigSchema>;
|
|
18
|
+
export declare const OH_MY_PM_CONFIG_FILENAME = "oh-my-pm.json";
|
|
19
|
+
export declare function buildDefaultConfig(): OhMyPmConfig;
|
|
20
|
+
export type AgentModelOverride = {
|
|
21
|
+
readonly model: string;
|
|
22
|
+
readonly variant?: string;
|
|
23
|
+
};
|
|
24
|
+
export declare function resolveActivePreset(config: OhMyPmConfig): Record<string, AgentModelOverride>;
|
|
25
|
+
export declare function parseOhMyPmConfig(data: unknown): OhMyPmConfig;
|
|
26
|
+
export declare function loadOhMyPmConfig(directory: string): Promise<OhMyPmConfig>;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAMvB,eAAO,MAAM,YAAY,iCAAkC,CAAA;AAC3D,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAA;AAEtD,QAAA,MAAM,iBAAiB;;;kBAKZ,CAAA;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAI3D,eAAO,MAAM,kBAAkB;;;;;;;kBAMpB,CAAA;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAE7D,eAAO,MAAM,wBAAwB,kBAAkB,CAAA;AAEvD,wBAAgB,kBAAkB,IAAI,YAAY,CAqBjD;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAC1B,CAAA;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAW5F;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,CAE7D;AASD,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAQ/E"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import fs from "fs-extra";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { PM_AGENT_NAMES } from "./agents.js";
|
|
6
|
+
export const PRESET_NAMES = ["openai", "opencode"];
|
|
7
|
+
const AgentPresetSchema = z
|
|
8
|
+
.object({
|
|
9
|
+
model: z.string().min(1),
|
|
10
|
+
variant: z.string().min(1).optional(),
|
|
11
|
+
})
|
|
12
|
+
.strict();
|
|
13
|
+
const PresetSchema = z.record(z.string(), AgentPresetSchema);
|
|
14
|
+
export const OhMyPmConfigSchema = z
|
|
15
|
+
.object({
|
|
16
|
+
$schema: z.string().optional(),
|
|
17
|
+
preset: z.string().min(1),
|
|
18
|
+
presets: z.record(z.string(), PresetSchema),
|
|
19
|
+
})
|
|
20
|
+
.strict();
|
|
21
|
+
export const OH_MY_PM_CONFIG_FILENAME = "oh-my-pm.json";
|
|
22
|
+
export function buildDefaultConfig() {
|
|
23
|
+
return {
|
|
24
|
+
$schema: "https://unpkg.com/oh-my-pm@latest/oh-my-pm.schema.json",
|
|
25
|
+
preset: "openai",
|
|
26
|
+
presets: {
|
|
27
|
+
openai: {
|
|
28
|
+
jc: { model: "openai/gpt-5.4-ultra" },
|
|
29
|
+
hammurabi: { model: "openai/gpt-4.1" },
|
|
30
|
+
davinci: { model: "openai/gpt-4.1" },
|
|
31
|
+
ada: { model: "openai/gpt-4.1" },
|
|
32
|
+
suntzu: { model: "openai/gpt-5.4-ultra" },
|
|
33
|
+
},
|
|
34
|
+
opencode: {
|
|
35
|
+
jc: { model: "opencode/big-pickle" },
|
|
36
|
+
hammurabi: { model: "opencode/mimo-v2.5-free" },
|
|
37
|
+
davinci: { model: "opencode/mimo-v2.5-free" },
|
|
38
|
+
ada: { model: "opencode/mimo-v2.5-free" },
|
|
39
|
+
suntzu: { model: "opencode/big-pickle" },
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export function resolveActivePreset(config) {
|
|
45
|
+
const active = config.presets[config.preset];
|
|
46
|
+
if (active === undefined)
|
|
47
|
+
return {};
|
|
48
|
+
const overrides = {};
|
|
49
|
+
for (const name of PM_AGENT_NAMES) {
|
|
50
|
+
const entry = active[name];
|
|
51
|
+
if (entry !== undefined) {
|
|
52
|
+
overrides[name] = entry.variant === undefined ? { model: entry.model } : { model: entry.model, variant: entry.variant };
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return overrides;
|
|
56
|
+
}
|
|
57
|
+
export function parseOhMyPmConfig(data) {
|
|
58
|
+
return OhMyPmConfigSchema.parse(data);
|
|
59
|
+
}
|
|
60
|
+
function candidateConfigPaths(directory) {
|
|
61
|
+
return [
|
|
62
|
+
path.join(directory, OH_MY_PM_CONFIG_FILENAME),
|
|
63
|
+
path.join(os.homedir(), ".config", "opencode", OH_MY_PM_CONFIG_FILENAME),
|
|
64
|
+
];
|
|
65
|
+
}
|
|
66
|
+
export async function loadOhMyPmConfig(directory) {
|
|
67
|
+
for (const candidate of candidateConfigPaths(directory)) {
|
|
68
|
+
if (await fs.pathExists(candidate)) {
|
|
69
|
+
const raw = await fs.readJson(candidate);
|
|
70
|
+
return parseOhMyPmConfig(raw);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return buildDefaultConfig();
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,MAAM,UAAU,CAAA;AACzB,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAU,CAAA;AAG3D,MAAM,iBAAiB,GAAG,CAAC;KACxB,MAAM,CAAC;IACN,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACtC,CAAC;KACD,MAAM,EAAE,CAAA;AAIX,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAA;AAE5D,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC;KAChC,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC;CAC5C,CAAC;KACD,MAAM,EAAE,CAAA;AAIX,MAAM,CAAC,MAAM,wBAAwB,GAAG,eAAe,CAAA;AAEvD,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,OAAO,EAAE,wDAAwD;QACjE,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE;YACP,MAAM,EAAE;gBACN,EAAE,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE;gBACrC,SAAS,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE;gBACtC,OAAO,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE;gBACpC,GAAG,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE;gBAChC,MAAM,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE;aAC1C;YACD,QAAQ,EAAE;gBACR,EAAE,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE;gBACpC,SAAS,EAAE,EAAE,KAAK,EAAE,yBAAyB,EAAE;gBAC/C,OAAO,EAAE,EAAE,KAAK,EAAE,yBAAyB,EAAE;gBAC7C,GAAG,EAAE,EAAE,KAAK,EAAE,yBAAyB,EAAE;gBACzC,MAAM,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE;aACzC;SACF;KACF,CAAA;AACH,CAAC;AAOD,MAAM,UAAU,mBAAmB,CAAC,MAAoB;IACtD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC5C,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,CAAA;IACnC,MAAM,SAAS,GAAuC,EAAE,CAAA;IACxD,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;QAC1B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAA;QACzH,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAa;IAC7C,OAAO,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;AACvC,CAAC;AAED,SAAS,oBAAoB,CAAC,SAAiB;IAC7C,OAAO;QACL,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,wBAAwB,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,wBAAwB,CAAC;KACzE,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,SAAiB;IACtD,KAAK,MAAM,SAAS,IAAI,oBAAoB,CAAC,SAAS,CAAC,EAAE,CAAC;QACxD,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACnC,MAAM,GAAG,GAAY,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;YACjD,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAA;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,kBAAkB,EAAE,CAAA;AAC7B,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare const PLATFORMS: readonly ["opencode", "claude", "openai", "generic"];
|
|
2
|
+
export type Platform = (typeof PLATFORMS)[number];
|
|
3
|
+
export type GeneratedArtifact = {
|
|
4
|
+
readonly path: string;
|
|
5
|
+
readonly title: string;
|
|
6
|
+
};
|
|
7
|
+
export type GenerationInput = {
|
|
8
|
+
readonly projectRoot: string;
|
|
9
|
+
readonly projectName: string;
|
|
10
|
+
readonly conversation: string;
|
|
11
|
+
readonly generatedAt: string;
|
|
12
|
+
};
|
|
13
|
+
export declare class UnsupportedPlatformError extends Error {
|
|
14
|
+
readonly platform: string;
|
|
15
|
+
readonly name = "UnsupportedPlatformError";
|
|
16
|
+
constructor(platform: string);
|
|
17
|
+
}
|
|
18
|
+
export declare function parsePlatform(value: string): Platform;
|
|
19
|
+
export declare function generateProductArtifacts(input: GenerationInput): Promise<readonly GeneratedArtifact[]>;
|
|
20
|
+
//# sourceMappingURL=generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,SAAS,sDAAuD,CAAA;AAC7E,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAA;AAEjD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B,CAAA;AAED,qBAAa,wBAAyB,SAAQ,KAAK;IAErC,QAAQ,CAAC,QAAQ,EAAE,MAAM;IADrC,QAAQ,CAAC,IAAI,8BAA6B;gBACrB,QAAQ,EAAE,MAAM;CAGtC;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAarD;AA+ED,wBAAsB,wBAAwB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC,CAkB5G"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import fs from "fs-extra";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { buildInitialManifest, writeManifest } from "./utils/manifest.js";
|
|
4
|
+
export const PLATFORMS = ["opencode", "claude", "openai", "generic"];
|
|
5
|
+
export class UnsupportedPlatformError extends Error {
|
|
6
|
+
platform;
|
|
7
|
+
name = "UnsupportedPlatformError";
|
|
8
|
+
constructor(platform) {
|
|
9
|
+
super(`Unsupported platform: ${platform}`);
|
|
10
|
+
this.platform = platform;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export function parsePlatform(value) {
|
|
14
|
+
switch (value) {
|
|
15
|
+
case "opencode":
|
|
16
|
+
return "opencode";
|
|
17
|
+
case "claude":
|
|
18
|
+
return "claude";
|
|
19
|
+
case "openai":
|
|
20
|
+
return "openai";
|
|
21
|
+
case "generic":
|
|
22
|
+
return "generic";
|
|
23
|
+
default:
|
|
24
|
+
throw new UnsupportedPlatformError(value);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function normalizeIdea(conversation) {
|
|
28
|
+
const trimmed = conversation.trim();
|
|
29
|
+
return trimmed.length > 0 ? trimmed : "Product concept pending discovery.";
|
|
30
|
+
}
|
|
31
|
+
function productTasks() {
|
|
32
|
+
return [
|
|
33
|
+
{
|
|
34
|
+
id: "task_01_setup_project",
|
|
35
|
+
depends_on: [],
|
|
36
|
+
spec_reference: "PRD §3.1",
|
|
37
|
+
description: "Create the project foundation and configuration required by the product blueprint.",
|
|
38
|
+
status: "pending",
|
|
39
|
+
verification_criteria: ["test -f package.json"],
|
|
40
|
+
assigned_to: "dev-harness",
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
id: "task_02_build_core_flow",
|
|
44
|
+
depends_on: ["task_01_setup_project"],
|
|
45
|
+
spec_reference: "Flows §2.1",
|
|
46
|
+
description: "Implement the primary user journey from entry point to successful completion.",
|
|
47
|
+
status: "pending",
|
|
48
|
+
verification_criteria: ["npm test"],
|
|
49
|
+
assigned_to: "dev-harness",
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
id: "task_03_verify_release",
|
|
53
|
+
depends_on: ["task_02_build_core_flow"],
|
|
54
|
+
spec_reference: "TRD §6.1",
|
|
55
|
+
description: "Run build, tests, and user-surface verification before marking the delivery complete.",
|
|
56
|
+
status: "pending",
|
|
57
|
+
verification_criteria: ["npm run build"],
|
|
58
|
+
assigned_to: "dev-harness",
|
|
59
|
+
},
|
|
60
|
+
];
|
|
61
|
+
}
|
|
62
|
+
function buildManifest(input) {
|
|
63
|
+
const base = buildInitialManifest(input.projectName, input.generatedAt);
|
|
64
|
+
return {
|
|
65
|
+
$schema: base.$schema,
|
|
66
|
+
project_metadata: {
|
|
67
|
+
name: base.project_metadata.name,
|
|
68
|
+
blueprint_version: base.project_metadata.blueprint_version,
|
|
69
|
+
status: "designed",
|
|
70
|
+
generated_by: base.project_metadata.generated_by,
|
|
71
|
+
generated_at: base.project_metadata.generated_at,
|
|
72
|
+
},
|
|
73
|
+
product_blueprints: base.product_blueprints,
|
|
74
|
+
execution_dag: { version: "1.0.0", tasks: productTasks() },
|
|
75
|
+
feedback_channel: {
|
|
76
|
+
blockers: [],
|
|
77
|
+
decisions: [
|
|
78
|
+
{
|
|
79
|
+
id: "decision_01",
|
|
80
|
+
description: "The manifest is the PM and Dev contract.",
|
|
81
|
+
rationale: "A file-based contract keeps orchestration auditable and asynchronous.",
|
|
82
|
+
alternatives_considered: ["Chat-only handoff", "Issue tracker handoff"],
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function artifactContent(title, idea) {
|
|
89
|
+
return `# ${title}
|
|
90
|
+
|
|
91
|
+
## Source idea
|
|
92
|
+
|
|
93
|
+
${idea}
|
|
94
|
+
|
|
95
|
+
## Oh My PM contract
|
|
96
|
+
|
|
97
|
+
This artifact is generated from discovery context and must be cross-referenced from .parkops/pm_manifest.json. Any ambiguity must be moved into feedback_channel.blockers before Dev-Harness starts implementation.
|
|
98
|
+
`;
|
|
99
|
+
}
|
|
100
|
+
export async function generateProductArtifacts(input) {
|
|
101
|
+
const idea = normalizeIdea(input.conversation);
|
|
102
|
+
const docsRoot = path.join(input.projectRoot, "docs");
|
|
103
|
+
const flowsRoot = path.join(docsRoot, "flows");
|
|
104
|
+
await fs.ensureDir(flowsRoot);
|
|
105
|
+
const artifacts = [
|
|
106
|
+
{ path: "docs/prd.md", title: "Product Requirements Document" },
|
|
107
|
+
{ path: "docs/trd.md", title: "Technical Requirements Document" },
|
|
108
|
+
{ path: "docs/db-schema.md", title: "Database Schema" },
|
|
109
|
+
{ path: "docs/flows/main-flow.md", title: "Main UX Flow" },
|
|
110
|
+
{ path: "docs/execution-plan.md", title: "Execution Plan" },
|
|
111
|
+
];
|
|
112
|
+
for (const artifact of artifacts) {
|
|
113
|
+
const target = path.join(input.projectRoot, artifact.path);
|
|
114
|
+
await fs.outputFile(target, artifactContent(artifact.title, idea), "utf8");
|
|
115
|
+
}
|
|
116
|
+
await writeManifest(input.projectRoot, buildManifest(input));
|
|
117
|
+
return artifacts;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Hooks, Plugin } from "@opencode-ai/plugin";
|
|
2
|
+
export { PM_AGENT_CONFIGS, PM_AGENT_NAMES, mergePMAgents } from "./agents.js";
|
|
3
|
+
export type { PMAgentName } from "./agents.js";
|
|
4
|
+
export { buildDefaultConfig, loadOhMyPmConfig, parseOhMyPmConfig, resolveActivePreset } from "./config.js";
|
|
5
|
+
export type { OhMyPmConfig } from "./config.js";
|
|
6
|
+
export declare const OH_MY_PM_PLUGIN_NAME = "oh-my-pm";
|
|
7
|
+
export declare function createOhMyPmHooks(directory: string): Hooks;
|
|
8
|
+
export declare const ohMyPmPlugin: Plugin;
|
|
9
|
+
export declare function getRuntimeAgentNames(): readonly string[];
|
|
10
|
+
export default ohMyPmPlugin;
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAIhE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC7E,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAC1G,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C,eAAO,MAAM,oBAAoB,aAAa,CAAA;AAE9C,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAQ1D;AAED,eAAO,MAAM,YAAY,EAAE,MAA4D,CAAA;AAEvF,wBAAgB,oBAAoB,IAAI,SAAS,MAAM,EAAE,CAExD;AAED,eAAe,YAAY,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { applyModelOverrides, mergePMAgents, PM_AGENT_CONFIGS } from "./agents.js";
|
|
2
|
+
import { loadOhMyPmConfig, resolveActivePreset } from "./config.js";
|
|
3
|
+
export { PM_AGENT_CONFIGS, PM_AGENT_NAMES, mergePMAgents } from "./agents.js";
|
|
4
|
+
export { buildDefaultConfig, loadOhMyPmConfig, parseOhMyPmConfig, resolveActivePreset } from "./config.js";
|
|
5
|
+
export const OH_MY_PM_PLUGIN_NAME = "oh-my-pm";
|
|
6
|
+
export function createOhMyPmHooks(directory) {
|
|
7
|
+
return {
|
|
8
|
+
config: async (opencodeConfig) => {
|
|
9
|
+
const ohMyPmConfig = await loadOhMyPmConfig(directory);
|
|
10
|
+
const mergedAgents = mergePMAgents(opencodeConfig.agent);
|
|
11
|
+
opencodeConfig.agent = applyModelOverrides(mergedAgents, resolveActivePreset(ohMyPmConfig));
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export const ohMyPmPlugin = async (input) => createOhMyPmHooks(input.directory);
|
|
16
|
+
export function getRuntimeAgentNames() {
|
|
17
|
+
return Object.keys(PM_AGENT_CONFIGS);
|
|
18
|
+
}
|
|
19
|
+
export default ohMyPmPlugin;
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAClF,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEnE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE7E,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAG1G,MAAM,CAAC,MAAM,oBAAoB,GAAG,UAAU,CAAA;AAE9C,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,OAAO;QACL,MAAM,EAAE,KAAK,EAAE,cAAsB,EAAE,EAAE;YACvC,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,SAAS,CAAC,CAAA;YACtD,MAAM,YAAY,GAAG,aAAa,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;YACxD,cAAc,CAAC,KAAK,GAAG,mBAAmB,CAAC,YAAY,EAAE,mBAAmB,CAAC,YAAY,CAAC,CAAC,CAAA;QAC7F,CAAC;KACF,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAW,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;AAEvF,MAAM,UAAU,oBAAoB;IAClC,OAAO,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;AACtC,CAAC;AAED,eAAe,YAAY,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type InstallOptions = {
|
|
2
|
+
readonly claude?: boolean;
|
|
3
|
+
readonly openai?: boolean;
|
|
4
|
+
readonly generic?: boolean;
|
|
5
|
+
readonly all?: boolean;
|
|
6
|
+
readonly global?: boolean;
|
|
7
|
+
};
|
|
8
|
+
export type CommandResult = {
|
|
9
|
+
readonly message: string;
|
|
10
|
+
readonly paths: readonly string[];
|
|
11
|
+
};
|
|
12
|
+
export declare function initProject(projectRoot: string): Promise<CommandResult>;
|
|
13
|
+
export declare function installProject(projectRoot: string, options: InstallOptions): Promise<CommandResult>;
|
|
14
|
+
export declare function generateTemplate(projectRoot: string, platformInput: string): Promise<CommandResult>;
|
|
15
|
+
export declare function validateCurrentProject(projectRoot: string): Promise<CommandResult>;
|
|
16
|
+
//# sourceMappingURL=install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;CAClC,CAAA;AA2ED,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAY7E;AAkFD,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAczG;AAED,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAOzG;AAED,wBAAsB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAQxF"}
|
package/dist/install.js
ADDED
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import fs from "fs-extra";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { parsePlatform } from "./generator.js";
|
|
7
|
+
import { buildInitialManifest, MANIFEST_SCHEMA_RELATIVE_PATH, manifestExists, writeManifest } from "./utils/manifest.js";
|
|
8
|
+
import { validateManifestFile } from "./utils/validation.js";
|
|
9
|
+
const AGENTS = ["jc", "hammurabi", "davinci", "ada", "suntzu", "oh-my-pm"];
|
|
10
|
+
const OPENCODE_PLUGIN_ENTRY = "oh-my-pm@latest";
|
|
11
|
+
const OPENCODE_CONFIG_TEMPLATE = `{
|
|
12
|
+
"$schema": "https://opencode.ai/config.json",
|
|
13
|
+
"plugin": [
|
|
14
|
+
"${OPENCODE_PLUGIN_ENTRY}"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
17
|
+
`;
|
|
18
|
+
async function packageRoot() {
|
|
19
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
20
|
+
const candidates = [path.join(here, ".."), path.join(here, "..", "..")];
|
|
21
|
+
for (const candidate of candidates) {
|
|
22
|
+
if (await fs.pathExists(path.join(candidate, "package.json")))
|
|
23
|
+
return candidate;
|
|
24
|
+
}
|
|
25
|
+
return process.cwd();
|
|
26
|
+
}
|
|
27
|
+
async function templateRoot() {
|
|
28
|
+
return path.join(await packageRoot(), "src", "templates");
|
|
29
|
+
}
|
|
30
|
+
async function copySchema(projectRoot) {
|
|
31
|
+
const source = path.join(await packageRoot(), "pm-manifest.schema.json");
|
|
32
|
+
const target = path.join(projectRoot, MANIFEST_SCHEMA_RELATIVE_PATH);
|
|
33
|
+
await fs.ensureDir(path.dirname(target));
|
|
34
|
+
await fs.copyFile(source, target);
|
|
35
|
+
return target;
|
|
36
|
+
}
|
|
37
|
+
async function backupIfExists(target) {
|
|
38
|
+
if (await fs.pathExists(target)) {
|
|
39
|
+
await fs.copyFile(target, `${target}.oh-my-pm.backup`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function addPluginEntryToConfig(source) {
|
|
43
|
+
if (source.includes(`"${OPENCODE_PLUGIN_ENTRY}"`) || source.includes("\"oh-my-pm\""))
|
|
44
|
+
return source;
|
|
45
|
+
const pluginKeyIndex = source.indexOf("\"plugin\"");
|
|
46
|
+
if (pluginKeyIndex === -1) {
|
|
47
|
+
const openingBrace = source.indexOf("{");
|
|
48
|
+
if (openingBrace === -1)
|
|
49
|
+
return OPENCODE_CONFIG_TEMPLATE;
|
|
50
|
+
return `${source.slice(0, openingBrace + 1)}\n "plugin": [\n "${OPENCODE_PLUGIN_ENTRY}"\n ],${source.slice(openingBrace + 1)}`;
|
|
51
|
+
}
|
|
52
|
+
const arrayStart = source.indexOf("[", pluginKeyIndex);
|
|
53
|
+
if (arrayStart === -1)
|
|
54
|
+
return source;
|
|
55
|
+
return `${source.slice(0, arrayStart + 1)}\n "${OPENCODE_PLUGIN_ENTRY}",${source.slice(arrayStart + 1)}`;
|
|
56
|
+
}
|
|
57
|
+
async function writeOpenCodeConfig(target) {
|
|
58
|
+
await fs.ensureDir(path.dirname(target));
|
|
59
|
+
if (await fs.pathExists(target)) {
|
|
60
|
+
await backupIfExists(target);
|
|
61
|
+
const current = await fs.readFile(target, "utf8");
|
|
62
|
+
await fs.writeFile(target, addPluginEntryToConfig(current), "utf8");
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
await fs.writeFile(target, OPENCODE_CONFIG_TEMPLATE, "utf8");
|
|
66
|
+
}
|
|
67
|
+
async function copyPluginConfig(targetRoot) {
|
|
68
|
+
const source = path.join(await templateRoot(), "opencode", "oh-my-pm.json");
|
|
69
|
+
const target = path.join(targetRoot, "oh-my-pm.json");
|
|
70
|
+
await backupIfExists(target);
|
|
71
|
+
await fs.copyFile(source, target);
|
|
72
|
+
return target;
|
|
73
|
+
}
|
|
74
|
+
function openCodeConfigRoot() {
|
|
75
|
+
return process.env["OH_MY_PM_OPENCODE_CONFIG_DIR"] ?? path.join(os.homedir(), ".config", "opencode");
|
|
76
|
+
}
|
|
77
|
+
export async function initProject(projectRoot) {
|
|
78
|
+
const packageJsonPath = path.join(projectRoot, "package.json");
|
|
79
|
+
const packageJson = (await fs.pathExists(packageJsonPath)) ? await fs.readJson(packageJsonPath) : null;
|
|
80
|
+
const name = typeof packageJson?.name === "string" ? packageJson.name : path.basename(projectRoot);
|
|
81
|
+
const paths = [];
|
|
82
|
+
paths.push(await copySchema(projectRoot));
|
|
83
|
+
if (!(await manifestExists(projectRoot))) {
|
|
84
|
+
paths.push(await writeManifest(projectRoot, buildInitialManifest(name, new Date().toISOString())));
|
|
85
|
+
}
|
|
86
|
+
await fs.ensureDir(path.join(projectRoot, ".parkops", "feedback"));
|
|
87
|
+
await fs.ensureDir(path.join(projectRoot, ".parkops", "artifacts"));
|
|
88
|
+
return { message: chalk.green("Oh My PM project initialized."), paths };
|
|
89
|
+
}
|
|
90
|
+
async function installOpenCode(projectRoot) {
|
|
91
|
+
const root = await templateRoot();
|
|
92
|
+
const written = [];
|
|
93
|
+
for (const agent of AGENTS) {
|
|
94
|
+
const source = path.join(root, "opencode", "skills", agent, "SKILL.md");
|
|
95
|
+
const target = path.join(projectRoot, ".opencode", "skills", agent, "SKILL.md");
|
|
96
|
+
await fs.ensureDir(path.dirname(target));
|
|
97
|
+
await fs.copyFile(source, target);
|
|
98
|
+
written.push(target);
|
|
99
|
+
}
|
|
100
|
+
const opencodeConfig = path.join(projectRoot, "opencode.jsonc");
|
|
101
|
+
if (await fs.pathExists(opencodeConfig)) {
|
|
102
|
+
await writeOpenCodeConfig(opencodeConfig);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
await fs.copyFile(path.join(root, "opencode", "opencode.jsonc"), opencodeConfig);
|
|
106
|
+
}
|
|
107
|
+
written.push(opencodeConfig);
|
|
108
|
+
written.push(await copyPluginConfig(projectRoot));
|
|
109
|
+
const agentsFile = path.join(projectRoot, "AGENTS.md");
|
|
110
|
+
await backupIfExists(agentsFile);
|
|
111
|
+
await fs.copyFile(path.join(root, "opencode", "AGENTS.md"), agentsFile);
|
|
112
|
+
written.push(agentsFile);
|
|
113
|
+
return written;
|
|
114
|
+
}
|
|
115
|
+
async function installGlobalOpenCode() {
|
|
116
|
+
const root = await templateRoot();
|
|
117
|
+
const configRoot = openCodeConfigRoot();
|
|
118
|
+
const written = [];
|
|
119
|
+
for (const agent of AGENTS) {
|
|
120
|
+
const source = path.join(root, "opencode", "skills", agent, "SKILL.md");
|
|
121
|
+
const target = path.join(configRoot, "skills", agent, "SKILL.md");
|
|
122
|
+
await fs.ensureDir(path.dirname(target));
|
|
123
|
+
await fs.copyFile(source, target);
|
|
124
|
+
written.push(target);
|
|
125
|
+
}
|
|
126
|
+
const opencodeConfig = path.join(configRoot, "opencode.jsonc");
|
|
127
|
+
await writeOpenCodeConfig(opencodeConfig);
|
|
128
|
+
written.push(opencodeConfig);
|
|
129
|
+
written.push(await copyPluginConfig(configRoot));
|
|
130
|
+
return written;
|
|
131
|
+
}
|
|
132
|
+
async function installSinglePlatform(projectRoot, platform) {
|
|
133
|
+
const root = await templateRoot();
|
|
134
|
+
switch (platform) {
|
|
135
|
+
case "opencode":
|
|
136
|
+
return installOpenCode(projectRoot);
|
|
137
|
+
case "claude": {
|
|
138
|
+
const target = path.join(projectRoot, "CLAUDE.md");
|
|
139
|
+
await backupIfExists(target);
|
|
140
|
+
await fs.copyFile(path.join(root, "claude", "CLAUDE.md"), target);
|
|
141
|
+
return [target];
|
|
142
|
+
}
|
|
143
|
+
case "openai": {
|
|
144
|
+
const target = path.join(projectRoot, "agents.py");
|
|
145
|
+
await backupIfExists(target);
|
|
146
|
+
await fs.copyFile(path.join(root, "openai", "agents.py"), target);
|
|
147
|
+
return [target];
|
|
148
|
+
}
|
|
149
|
+
case "generic": {
|
|
150
|
+
const target = path.join(projectRoot, "OH_MY_PM_AGENTS.md");
|
|
151
|
+
await backupIfExists(target);
|
|
152
|
+
await fs.copyFile(path.join(root, "generic", "AGENTS.md"), target);
|
|
153
|
+
return [target];
|
|
154
|
+
}
|
|
155
|
+
default:
|
|
156
|
+
return platform;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
function selectedOptionalPlatforms(options) {
|
|
160
|
+
if (options.all === true)
|
|
161
|
+
return ["claude", "openai", "generic"];
|
|
162
|
+
const selected = [];
|
|
163
|
+
if (options.claude === true)
|
|
164
|
+
selected.push("claude");
|
|
165
|
+
if (options.openai === true)
|
|
166
|
+
selected.push("openai");
|
|
167
|
+
if (options.generic === true)
|
|
168
|
+
selected.push("generic");
|
|
169
|
+
return selected;
|
|
170
|
+
}
|
|
171
|
+
export async function installProject(projectRoot, options) {
|
|
172
|
+
if (options.global === true) {
|
|
173
|
+
const paths = [];
|
|
174
|
+
for (const installedPath of await installGlobalOpenCode())
|
|
175
|
+
paths.push(installedPath);
|
|
176
|
+
return { message: chalk.green("Oh My PM global OpenCode configuration installed."), paths };
|
|
177
|
+
}
|
|
178
|
+
const initialized = await initProject(projectRoot);
|
|
179
|
+
const paths = [];
|
|
180
|
+
for (const initializedPath of initialized.paths)
|
|
181
|
+
paths.push(initializedPath);
|
|
182
|
+
for (const installedPath of await installSinglePlatform(projectRoot, "opencode"))
|
|
183
|
+
paths.push(installedPath);
|
|
184
|
+
for (const platform of selectedOptionalPlatforms(options)) {
|
|
185
|
+
for (const installedPath of await installSinglePlatform(projectRoot, platform))
|
|
186
|
+
paths.push(installedPath);
|
|
187
|
+
}
|
|
188
|
+
return { message: chalk.green("Oh My PM agent team installed."), paths };
|
|
189
|
+
}
|
|
190
|
+
export async function generateTemplate(projectRoot, platformInput) {
|
|
191
|
+
const platform = parsePlatform(platformInput);
|
|
192
|
+
const source = path.join(await templateRoot(), platform);
|
|
193
|
+
const target = path.join(projectRoot, ".parkops", "generated", platform);
|
|
194
|
+
await fs.remove(target);
|
|
195
|
+
await fs.copy(source, target);
|
|
196
|
+
return { message: chalk.green(`Generated ${platform} template.`), paths: [target] };
|
|
197
|
+
}
|
|
198
|
+
export async function validateCurrentProject(projectRoot) {
|
|
199
|
+
const manifestPath = path.join(projectRoot, ".parkops", "pm_manifest.json");
|
|
200
|
+
const report = await validateManifestFile(manifestPath);
|
|
201
|
+
if (!report.ok) {
|
|
202
|
+
const details = report.issues.map((item) => `${item.path}: ${item.message}`).join("\n");
|
|
203
|
+
throw new Error(`Manifest validation failed:\n${details}`);
|
|
204
|
+
}
|
|
205
|
+
return { message: chalk.green("Manifest is valid."), paths: [manifestPath] };
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|