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/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "oh-my-pm",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "OpenCode Product Management agent team for PRD, TRD, flows, DB design, and execution DAG manifests.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Isma",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"bin": {
|
|
11
|
+
"oh-my-pm": "./dist/cli.js"
|
|
12
|
+
},
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"test": "vitest run",
|
|
16
|
+
"prepublish": "npm run build"
|
|
17
|
+
},
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@opencode-ai/plugin": "^1.17.11",
|
|
20
|
+
"@opencode-ai/sdk": "^1.17.11",
|
|
21
|
+
"chalk": "^5.4.1",
|
|
22
|
+
"commander": "^12.1.0",
|
|
23
|
+
"fs-extra": "^11.2.0",
|
|
24
|
+
"zod": "^4.3.6"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@types/fs-extra": "^11.0.4",
|
|
28
|
+
"@types/node": "^22.20.0",
|
|
29
|
+
"typescript": "^5.9.3",
|
|
30
|
+
"vitest": "^3.0.0"
|
|
31
|
+
},
|
|
32
|
+
"files": [
|
|
33
|
+
"dist",
|
|
34
|
+
"src/templates",
|
|
35
|
+
"docs",
|
|
36
|
+
"agent-blueprints",
|
|
37
|
+
"oh-my-pm.schema.json",
|
|
38
|
+
"pm-manifest.schema.json",
|
|
39
|
+
"README.md",
|
|
40
|
+
"LICENSE"
|
|
41
|
+
],
|
|
42
|
+
"engines": {
|
|
43
|
+
"node": ">=20.0.0"
|
|
44
|
+
},
|
|
45
|
+
"exports": {
|
|
46
|
+
".": {
|
|
47
|
+
"import": "./dist/index.js",
|
|
48
|
+
"types": "./dist/index.d.ts"
|
|
49
|
+
},
|
|
50
|
+
"./cli": {
|
|
51
|
+
"import": "./dist/cli.js",
|
|
52
|
+
"types": "./dist/cli.d.ts"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://oh-my-pm.local/schemas/pm-manifest-schema.json",
|
|
4
|
+
"title": "Oh My PM Interoperability Manifest",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": ["$schema", "project_metadata", "product_blueprints", "execution_dag", "feedback_channel"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"$schema": { "type": "string" },
|
|
10
|
+
"project_metadata": {
|
|
11
|
+
"type": "object",
|
|
12
|
+
"additionalProperties": false,
|
|
13
|
+
"required": ["name", "blueprint_version", "status", "generated_by", "generated_at"],
|
|
14
|
+
"properties": {
|
|
15
|
+
"name": { "type": "string", "minLength": 1 },
|
|
16
|
+
"blueprint_version": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$" },
|
|
17
|
+
"status": { "enum": ["discovery", "designed", "approved", "in_development", "blocked", "completed"] },
|
|
18
|
+
"generated_by": { "type": "string", "minLength": 1 },
|
|
19
|
+
"generated_at": { "type": "string", "format": "date-time" }
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"product_blueprints": {
|
|
23
|
+
"type": "object",
|
|
24
|
+
"additionalProperties": false,
|
|
25
|
+
"required": ["prd", "trd", "db_schema", "ui_flows", "execution_plan"],
|
|
26
|
+
"properties": {
|
|
27
|
+
"prd": { "type": "string", "minLength": 1 },
|
|
28
|
+
"trd": { "type": "string", "minLength": 1 },
|
|
29
|
+
"db_schema": { "type": "string", "minLength": 1 },
|
|
30
|
+
"ui_flows": { "type": "array", "items": { "type": "string", "minLength": 1 }, "minItems": 1 },
|
|
31
|
+
"execution_plan": { "type": "string", "minLength": 1 }
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"execution_dag": {
|
|
35
|
+
"type": "object",
|
|
36
|
+
"additionalProperties": false,
|
|
37
|
+
"required": ["version", "tasks"],
|
|
38
|
+
"properties": {
|
|
39
|
+
"version": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$" },
|
|
40
|
+
"tasks": {
|
|
41
|
+
"type": "array",
|
|
42
|
+
"items": { "$ref": "#/$defs/task" }
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"feedback_channel": {
|
|
47
|
+
"type": "object",
|
|
48
|
+
"additionalProperties": false,
|
|
49
|
+
"required": ["blockers", "decisions"],
|
|
50
|
+
"properties": {
|
|
51
|
+
"blockers": { "type": "array", "items": { "$ref": "#/$defs/blocker" } },
|
|
52
|
+
"decisions": { "type": "array", "items": { "$ref": "#/$defs/decision" } }
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"$defs": {
|
|
57
|
+
"task": {
|
|
58
|
+
"type": "object",
|
|
59
|
+
"additionalProperties": false,
|
|
60
|
+
"required": ["id", "depends_on", "spec_reference", "description", "status", "verification_criteria", "assigned_to"],
|
|
61
|
+
"properties": {
|
|
62
|
+
"id": { "type": "string", "pattern": "^task_[0-9]{2}_[a-z0-9_]+$" },
|
|
63
|
+
"depends_on": { "type": "array", "items": { "type": "string" } },
|
|
64
|
+
"spec_reference": { "type": "string", "minLength": 1 },
|
|
65
|
+
"description": { "type": "string", "minLength": 1 },
|
|
66
|
+
"status": { "enum": ["pending", "in_progress", "blocked", "completed"] },
|
|
67
|
+
"verification_criteria": { "type": "array", "items": { "type": "string", "minLength": 1 }, "minItems": 1 },
|
|
68
|
+
"assigned_to": { "type": "string", "minLength": 1 }
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
"blocker": {
|
|
72
|
+
"type": "object",
|
|
73
|
+
"additionalProperties": false,
|
|
74
|
+
"required": ["id", "raised_by", "description", "proposed_solutions", "status", "resolution"],
|
|
75
|
+
"properties": {
|
|
76
|
+
"id": { "type": "string", "pattern": "^blocker_[0-9]{2}$" },
|
|
77
|
+
"raised_by": { "enum": ["dev-harness", "oh-my-pm"] },
|
|
78
|
+
"description": { "type": "string", "minLength": 1 },
|
|
79
|
+
"proposed_solutions": { "type": "array", "items": { "type": "string", "minLength": 1 } },
|
|
80
|
+
"status": { "enum": ["open", "resolved"] },
|
|
81
|
+
"resolution": { "type": "string" }
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
"decision": {
|
|
85
|
+
"type": "object",
|
|
86
|
+
"additionalProperties": false,
|
|
87
|
+
"required": ["id", "description", "rationale", "alternatives_considered"],
|
|
88
|
+
"properties": {
|
|
89
|
+
"id": { "type": "string", "pattern": "^decision_[0-9]{2}$" },
|
|
90
|
+
"description": { "type": "string", "minLength": 1 },
|
|
91
|
+
"rationale": { "type": "string", "minLength": 1 },
|
|
92
|
+
"alternatives_considered": { "type": "array", "items": { "type": "string" } }
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Oh My PM for Claude Code
|
|
2
|
+
|
|
3
|
+
Use this file as project instructions for a Product Management agent team. The team writes product artifacts and synchronizes with implementation through `.parkops/pm_manifest.json` only.
|
|
4
|
+
|
|
5
|
+
## Global protocol
|
|
6
|
+
|
|
7
|
+
- JC is the orchestrator and owns discovery, delegation, manifest validation, and user approval.
|
|
8
|
+
- Specialists own strict lanes: Hammurabi for PRD, DaVinci for UX flows, Ada for TRD and schemas, SunTzu for execution DAG.
|
|
9
|
+
- Do not duplicate delegated work across lanes.
|
|
10
|
+
- Every delegation must include file paths, prior decisions, constraints, output format, and verification gates.
|
|
11
|
+
- If input is contradictory or underspecified, write a blocker under `feedback_channel.blockers` instead of guessing.
|
|
12
|
+
- Completion requires concrete evidence: artifact exists, validation passed, references linked.
|
|
13
|
+
|
|
14
|
+
## Tool mapping
|
|
15
|
+
|
|
16
|
+
Claude Code should use the Task tool for lane delegation when available. Use these tool names in prompts and handoffs:
|
|
17
|
+
|
|
18
|
+
| Tool name | Agent | Use when |
|
|
19
|
+
| --- | --- | --- |
|
|
20
|
+
| pm_jc | JC | Discovery, orchestration, approval, manifest validation |
|
|
21
|
+
| pm_hammurabi | Hammurabi | PRD, business rules, scope, acceptance criteria |
|
|
22
|
+
| pm_davinci | DaVinci | UX, UI flows, Mermaid diagrams, journey maps |
|
|
23
|
+
| pm_ada | Ada | TRD, API, database schema, integrations |
|
|
24
|
+
| pm_suntzu | SunTzu | Execution DAG, sequencing, Dev-Harness handoff |
|
|
25
|
+
|
|
26
|
+
## Agent definitions
|
|
27
|
+
|
|
28
|
+
### pm_jc
|
|
29
|
+
|
|
30
|
+
Role: discovery orchestrator. Produces `.parkops/pm_manifest.json` and delegates complete context to specialists.
|
|
31
|
+
|
|
32
|
+
Triggers: discovery, idea, roadmap, approval, product planning, alcance, producto, aprobación.
|
|
33
|
+
|
|
34
|
+
Verification:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
test -f .parkops/pm_manifest.json
|
|
38
|
+
node -e "JSON.parse(require('fs').readFileSync('.parkops/pm_manifest.json','utf8')); console.log('VALID')"
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### pm_hammurabi
|
|
42
|
+
|
|
43
|
+
Role: PRD specialist. Produces `docs/prd.md` with problem, audience, scope, user stories, requirements, and acceptance criteria.
|
|
44
|
+
|
|
45
|
+
Triggers: PRD, requirements, user stories, business rules, requisitos, historias, criterios de aceptación.
|
|
46
|
+
|
|
47
|
+
Verification:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
test -f docs/prd.md
|
|
51
|
+
grep -q "## Acceptance Criteria" docs/prd.md
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### pm_davinci
|
|
55
|
+
|
|
56
|
+
Role: UX flow specialist. Produces `docs/flows/*.md` with Mermaid diagrams, screen states, and journeys.
|
|
57
|
+
|
|
58
|
+
Triggers: UX, UI, flows, Mermaid, screens, journey, pantallas, flujo, experiencia.
|
|
59
|
+
|
|
60
|
+
Verification:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
test -f docs/flows/main-flow.md
|
|
64
|
+
grep -Eq "^(flowchart|graph|sequenceDiagram|stateDiagram|erDiagram)" docs/flows/main-flow.md
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### pm_ada
|
|
68
|
+
|
|
69
|
+
Role: technical design specialist. Produces `docs/trd.md` and `docs/db-schema.md` with architecture, API, data model, security, and constraints.
|
|
70
|
+
|
|
71
|
+
Triggers: TRD, API, database, schema, architecture, arquitectura, base de datos, integraciones.
|
|
72
|
+
|
|
73
|
+
Verification:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
test -f docs/trd.md
|
|
77
|
+
test -f docs/db-schema.md
|
|
78
|
+
grep -q "## API" docs/trd.md
|
|
79
|
+
grep -q "## Data Model" docs/db-schema.md
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### pm_suntzu
|
|
83
|
+
|
|
84
|
+
Role: execution strategist. Produces `docs/execution-plan.md` and updates `execution_dag.tasks` in `.parkops/pm_manifest.json`.
|
|
85
|
+
|
|
86
|
+
Triggers: DAG, execution plan, dependencies, blockers, Dev-Harness, plan de ejecución, dependencias.
|
|
87
|
+
|
|
88
|
+
Verification:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
test -f docs/execution-plan.md
|
|
92
|
+
node -e "const m=JSON.parse(require('fs').readFileSync('.parkops/pm_manifest.json','utf8')); if(!Array.isArray(m.execution_dag.tasks)) process.exit(1); console.log('VALID')"
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Manifest lifecycle
|
|
96
|
+
|
|
97
|
+
Statuses: `discovery`, `designed`, `approved`, `in_development`, `blocked`, `completed`.
|
|
98
|
+
|
|
99
|
+
Claude Code must never move to `approved` without explicit user approval. Dev-Harness may move the manifest to `in_development`, `blocked`, or `completed` according to implementation evidence.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Oh My PM Generic Agent Instructions
|
|
2
|
+
|
|
3
|
+
Use this document as system prompt context for any LLM that can write files. Oh My PM is a Product Management agent team that produces PRD, TRD, UX flows, DB design, execution DAG, and `.parkops/pm_manifest.json`.
|
|
4
|
+
|
|
5
|
+
## Operating principles
|
|
6
|
+
|
|
7
|
+
1. Lane specialization: each agent has one strict domain.
|
|
8
|
+
2. Verification before completion: every claim of completion needs concrete evidence.
|
|
9
|
+
3. Contract-based communication: Oh My PM and Dev-Harness communicate only through `.parkops/pm_manifest.json`.
|
|
10
|
+
4. Full context on delegation: every handoff includes file paths, prior decisions, constraints, and validation commands.
|
|
11
|
+
5. Technical honesty: ambiguity and contradiction become blockers instead of assumptions.
|
|
12
|
+
|
|
13
|
+
## Pipeline
|
|
14
|
+
|
|
15
|
+
User → JC → discovery conversation → Hammurabi PRD → DaVinci flows → Ada TRD and DB → SunTzu DAG → JC manifest validation → user approval.
|
|
16
|
+
|
|
17
|
+
Blockers halt the pipeline and must be written to `feedback_channel.blockers`.
|
|
18
|
+
|
|
19
|
+
## Agents
|
|
20
|
+
|
|
21
|
+
### JC
|
|
22
|
+
|
|
23
|
+
Orchestrator. Owns discovery, work decomposition, context-rich delegation, manifest validation, and approval flow.
|
|
24
|
+
|
|
25
|
+
Outputs: `.parkops/pm_manifest.json` and final approval notes.
|
|
26
|
+
|
|
27
|
+
### Hammurabi
|
|
28
|
+
|
|
29
|
+
PRD specialist. Owns `docs/prd.md` with problem statement, users, scope, user stories, functional requirements, non-functional requirements, and acceptance criteria.
|
|
30
|
+
|
|
31
|
+
### DaVinci
|
|
32
|
+
|
|
33
|
+
UX flow specialist. Owns `docs/flows/*.md` with Mermaid diagrams, screen states, user journeys, and edge flows.
|
|
34
|
+
|
|
35
|
+
### Ada
|
|
36
|
+
|
|
37
|
+
Technical design specialist. Owns `docs/trd.md` and `docs/db-schema.md` with architecture, API, services, data model, constraints, security, and observability.
|
|
38
|
+
|
|
39
|
+
### SunTzu
|
|
40
|
+
|
|
41
|
+
Execution strategist. Owns `docs/execution-plan.md` and `execution_dag.tasks` in `.parkops/pm_manifest.json`.
|
|
42
|
+
|
|
43
|
+
## Manifest protocol
|
|
44
|
+
|
|
45
|
+
The manifest must include project metadata, product blueprint paths, execution DAG tasks, blockers, and decisions. Do not move status to `approved` without explicit user approval. Dev-Harness reads pending tasks and writes blockers to the same manifest.
|
|
46
|
+
|
|
47
|
+
## Required verification
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
test -f .parkops/pm_manifest.json
|
|
51
|
+
node -e "JSON.parse(require('fs').readFileSync('.parkops/pm_manifest.json','utf8')); console.log('VALID')"
|
|
52
|
+
test -f docs/prd.md
|
|
53
|
+
test -f docs/trd.md
|
|
54
|
+
test -f docs/db-schema.md
|
|
55
|
+
test -f docs/execution-plan.md
|
|
56
|
+
```
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from typing import Literal
|
|
6
|
+
import json
|
|
7
|
+
|
|
8
|
+
from agents import Agent, function_tool, handoff
|
|
9
|
+
|
|
10
|
+
ManifestStatus = Literal["discovery", "designed", "approved", "in_development", "blocked", "completed"]
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass(frozen=True)
|
|
14
|
+
class PMContext:
|
|
15
|
+
project_root: Path
|
|
16
|
+
manifest_path: Path
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
AGENT_PRINCIPLES = """
|
|
20
|
+
Principles: lane specialization, verification before completion, manifest-only communication,
|
|
21
|
+
full context on delegation, and technical honesty through blockers instead of guesses.
|
|
22
|
+
""".strip()
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@function_tool
|
|
26
|
+
def read_pm_manifest(project_root: str) -> str:
|
|
27
|
+
"""Read .parkops/pm_manifest.json for Oh My PM and Dev-Harness coordination."""
|
|
28
|
+
manifest_path = Path(project_root) / ".parkops" / "pm_manifest.json"
|
|
29
|
+
return manifest_path.read_text(encoding="utf-8")
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@function_tool
|
|
33
|
+
def write_pm_manifest(project_root: str, manifest_json: str) -> str:
|
|
34
|
+
"""Write a validated Oh My PM manifest JSON payload to .parkops/pm_manifest.json."""
|
|
35
|
+
parsed = json.loads(manifest_json)
|
|
36
|
+
manifest_path = Path(project_root) / ".parkops" / "pm_manifest.json"
|
|
37
|
+
manifest_path.parent.mkdir(parents=True, exist_ok=True)
|
|
38
|
+
manifest_path.write_text(json.dumps(parsed, indent=2) + "
|
|
39
|
+
", encoding="utf-8")
|
|
40
|
+
return str(manifest_path)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@function_tool
|
|
44
|
+
def write_pm_artifact(project_root: str, relative_path: str, content: str) -> str:
|
|
45
|
+
"""Write a Oh My PM artifact such as docs/prd.md, docs/trd.md, or docs/flows/main-flow.md."""
|
|
46
|
+
target = Path(project_root) / relative_path
|
|
47
|
+
target.parent.mkdir(parents=True, exist_ok=True)
|
|
48
|
+
target.write_text(content, encoding="utf-8")
|
|
49
|
+
return str(target)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
hammurabi = Agent(
|
|
53
|
+
name="pm_hammurabi",
|
|
54
|
+
model="gpt-4.1",
|
|
55
|
+
handoff_description="PRD specialist for requirements, business rules, and acceptance criteria.",
|
|
56
|
+
instructions=(
|
|
57
|
+
"You are Hammurabi, the Oh My PM PRD specialist. Write docs/prd.md with problem, "
|
|
58
|
+
"audience, scope, user stories, requirements, and acceptance criteria. "
|
|
59
|
+
f"{AGENT_PRINCIPLES}"
|
|
60
|
+
),
|
|
61
|
+
tools=[read_pm_manifest, write_pm_artifact, write_pm_manifest],
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
davinci = Agent(
|
|
65
|
+
name="pm_davinci",
|
|
66
|
+
model="gpt-4.1",
|
|
67
|
+
handoff_description="UX flow specialist for journeys, screens, and Mermaid diagrams.",
|
|
68
|
+
instructions=(
|
|
69
|
+
"You are DaVinci, the Oh My PM UX flow specialist. Write docs/flows/main-flow.md "
|
|
70
|
+
"with Mermaid diagrams, screen states, and journey notes. "
|
|
71
|
+
f"{AGENT_PRINCIPLES}"
|
|
72
|
+
),
|
|
73
|
+
tools=[read_pm_manifest, write_pm_artifact, write_pm_manifest],
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
ada = Agent(
|
|
77
|
+
name="pm_ada",
|
|
78
|
+
model="gpt-4.1",
|
|
79
|
+
handoff_description="Technical design specialist for TRD, API, database, and schemas.",
|
|
80
|
+
instructions=(
|
|
81
|
+
"You are Ada, the Oh My PM technical design specialist. Write docs/trd.md and "
|
|
82
|
+
"docs/db-schema.md with architecture, APIs, data model, security, and constraints. "
|
|
83
|
+
f"{AGENT_PRINCIPLES}"
|
|
84
|
+
),
|
|
85
|
+
tools=[read_pm_manifest, write_pm_artifact, write_pm_manifest],
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
suntzu = Agent(
|
|
89
|
+
name="pm_suntzu",
|
|
90
|
+
model="gpt-5.4-ultra",
|
|
91
|
+
handoff_description="Execution strategist for DAG, dependencies, and Dev-Harness handoff.",
|
|
92
|
+
instructions=(
|
|
93
|
+
"You are SunTzu, the Oh My PM execution strategist. Write docs/execution-plan.md "
|
|
94
|
+
"and update execution_dag.tasks in the manifest. "
|
|
95
|
+
f"{AGENT_PRINCIPLES}"
|
|
96
|
+
),
|
|
97
|
+
tools=[read_pm_manifest, write_pm_artifact, write_pm_manifest],
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
jc = Agent(
|
|
101
|
+
name="pm_jc",
|
|
102
|
+
model="gpt-5.4-ultra",
|
|
103
|
+
instructions=(
|
|
104
|
+
"You are JC, the Oh My PM orchestrator. Run discovery, delegate complete context, "
|
|
105
|
+
"validate all artifacts, and ask for explicit user approval before status approved. "
|
|
106
|
+
f"{AGENT_PRINCIPLES}"
|
|
107
|
+
),
|
|
108
|
+
tools=[read_pm_manifest, write_pm_manifest],
|
|
109
|
+
handoffs=[
|
|
110
|
+
handoff(hammurabi),
|
|
111
|
+
handoff(davinci),
|
|
112
|
+
handoff(ada),
|
|
113
|
+
handoff(suntzu),
|
|
114
|
+
],
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
OH_MY_PM_AGENTS = {
|
|
118
|
+
"jc": jc,
|
|
119
|
+
"hammurabi": hammurabi,
|
|
120
|
+
"davinci": davinci,
|
|
121
|
+
"ada": ada,
|
|
122
|
+
"suntzu": suntzu,
|
|
123
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Oh My PM OpenCode Routing
|
|
2
|
+
|
|
3
|
+
This project uses Oh My PM as a Product Management agent team for PRD, TRD, UX flows, database design, execution DAGs, and Dev-Harness handoff.
|
|
4
|
+
|
|
5
|
+
## Routing table
|
|
6
|
+
|
|
7
|
+
| Trigger | Agent | Output |
|
|
8
|
+
| --- | --- | --- |
|
|
9
|
+
| idea, discovery, scope, goals, approval | JC | Orchestration and `.parkops/pm_manifest.json` |
|
|
10
|
+
| PRD, requirements, product rules, user stories, acceptance criteria | Hammurabi | `docs/prd.md` |
|
|
11
|
+
| UX, UI, flows, screens, Mermaid, journey | DaVinci | `docs/flows/*.md` |
|
|
12
|
+
| TRD, architecture, API, database, schema | Ada | `docs/trd.md`, `docs/db-schema.md` |
|
|
13
|
+
| DAG, execution plan, Dev-Harness, blockers | SunTzu | `docs/execution-plan.md`, final manifest |
|
|
14
|
+
|
|
15
|
+
## Protocol
|
|
16
|
+
|
|
17
|
+
1. JC receives the product intent and runs discovery.
|
|
18
|
+
2. JC delegates with complete context when a specialist lane is needed.
|
|
19
|
+
3. Each specialist writes its artifact and validates it.
|
|
20
|
+
4. Blockers are written to `_workspace/{agent}/feedback/latest.md` and `.parkops/pm_manifest.json`.
|
|
21
|
+
5. SunTzu consolidates the execution DAG.
|
|
22
|
+
6. JC validates JSON, cross-references, and lifecycle status before asking for approval.
|
|
23
|
+
|
|
24
|
+
## Contract rules
|
|
25
|
+
|
|
26
|
+
- `.parkops/pm_manifest.json` is the only contract with Dev-Harness.
|
|
27
|
+
- No agent duplicates work delegated to another lane.
|
|
28
|
+
- Every handoff includes file paths, prior decisions, constraints, expected artifacts, and verification commands.
|
|
29
|
+
- If there is contradiction, do not invent an answer. Write an open blocker.
|
|
30
|
+
- Completion requires evidence: existing artifact, passed validation, and linked references.
|
|
31
|
+
|
|
32
|
+
## Workspace conventions
|
|
33
|
+
|
|
34
|
+
- Durable artifacts: `_workspace/{agent}/artifacts/`
|
|
35
|
+
- Working memory: `_workspace/{agent}/working/`
|
|
36
|
+
- Feedback: `_workspace/{agent}/feedback/`
|
|
37
|
+
- Product docs: `docs/`
|
|
38
|
+
- Contract: `.parkops/pm_manifest.json`
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://unpkg.com/oh-my-pm@latest/oh-my-pm.schema.json",
|
|
3
|
+
"preset": "openai",
|
|
4
|
+
"presets": {
|
|
5
|
+
"openai": {
|
|
6
|
+
"jc": { "model": "openai/gpt-5.4-ultra" },
|
|
7
|
+
"hammurabi": { "model": "openai/gpt-4.1" },
|
|
8
|
+
"davinci": { "model": "openai/gpt-4.1" },
|
|
9
|
+
"ada": { "model": "openai/gpt-4.1" },
|
|
10
|
+
"suntzu": { "model": "openai/gpt-5.4-ultra" }
|
|
11
|
+
},
|
|
12
|
+
"opencode": {
|
|
13
|
+
"jc": { "model": "opencode/big-pickle" },
|
|
14
|
+
"hammurabi": { "model": "opencode/mimo-v2.5-free" },
|
|
15
|
+
"davinci": { "model": "opencode/mimo-v2.5-free" },
|
|
16
|
+
"ada": { "model": "opencode/mimo-v2.5-free" },
|
|
17
|
+
"suntzu": { "model": "opencode/big-pickle" }
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
// Oh My PM project-level OpenCode configuration.
|
|
3
|
+
// OpenCode loads the runtime plugin from the published npm package.
|
|
4
|
+
"$schema": "https://opencode.ai/config.json",
|
|
5
|
+
"plugin": [
|
|
6
|
+
"oh-my-pm@latest"
|
|
7
|
+
],
|
|
8
|
+
"agent": {
|
|
9
|
+
"jc": {
|
|
10
|
+
"model": "openai/gpt-5.4-ultra",
|
|
11
|
+
"mode": "all"
|
|
12
|
+
},
|
|
13
|
+
"hammurabi": {
|
|
14
|
+
"model": "openai/gpt-4.1",
|
|
15
|
+
"mode": "subagent"
|
|
16
|
+
},
|
|
17
|
+
"davinci": {
|
|
18
|
+
"model": "openai/gpt-4.1",
|
|
19
|
+
"mode": "subagent"
|
|
20
|
+
},
|
|
21
|
+
"ada": {
|
|
22
|
+
"model": "openai/gpt-4.1",
|
|
23
|
+
"mode": "subagent"
|
|
24
|
+
},
|
|
25
|
+
"suntzu": {
|
|
26
|
+
"model": "openai/gpt-5.4-ultra",
|
|
27
|
+
"mode": "subagent"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ada
|
|
3
|
+
description: "Technical design specialist — activates for TRD, APIs, database schema, integrations, and constraints"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Ada — Technical Architecture, API, and Data Designer
|
|
7
|
+
|
|
8
|
+
## Runtime Defaults
|
|
9
|
+
- **Model**: `openai/gpt-4.1`
|
|
10
|
+
- **Tools**: bash, read, write, edit, glob, grep
|
|
11
|
+
- **OpenCode mode**: `subagent`
|
|
12
|
+
|
|
13
|
+
## Core Responsibilities
|
|
14
|
+
1. Write `docs/trd.md` with architecture, services, APIs, security, and observability.
|
|
15
|
+
2. Write `docs/db-schema.md` with entities, relationships, constraints, and indexes.
|
|
16
|
+
3. Validate that schemas satisfy the PRD and support DaVinci flows.
|
|
17
|
+
|
|
18
|
+
## Triggers
|
|
19
|
+
Activate when user input contains:
|
|
20
|
+
- TRD, API, database, schema
|
|
21
|
+
- "design the technical architecture"
|
|
22
|
+
- architecture, integrations, data model
|
|
23
|
+
|
|
24
|
+
## Working Principles
|
|
25
|
+
- Lane specialization: operate only inside your domain and return complete context to JC.
|
|
26
|
+
- Verification before completion: never report "done" without reproducible evidence.
|
|
27
|
+
- Contract-based communication: update `.parkops/pm_manifest.json`; do not rely on side-channel agreements.
|
|
28
|
+
- Full context on delegation: if you invoke another agent, pass paths, decisions, constraints, and exit criteria.
|
|
29
|
+
- Technical honesty: document `AMBIGUITY` or `BLOCKER` when input is contradictory or underspecified.
|
|
30
|
+
|
|
31
|
+
## Verification Gates
|
|
32
|
+
- **Artifact exists**: `[ -f "docs/trd.md" ] && echo "EXISTS" || echo "MISSING"`
|
|
33
|
+
- **Validation**: `grep -q "## API" docs/trd.md && grep -q "## Data Model" docs/db-schema.md && echo "VALID"`
|
|
34
|
+
- **Integrity**: `grep -q "docs/trd.md" .parkops/pm_manifest.json && grep -q "docs/db-schema.md" .parkops/pm_manifest.json && echo "LINKED"`
|
|
35
|
+
|
|
36
|
+
## QA Scenarios
|
|
37
|
+
### Happy Path
|
|
38
|
+
**Input**: "I want to plan a analytics app with onboarding, roles, and payments"
|
|
39
|
+
**Expected**: Agent produces its specific artifact.
|
|
40
|
+
**Verify**: `[ -f "docs/trd.md" ] && echo "PASS"`
|
|
41
|
+
**Evidence**: Path to generated file.
|
|
42
|
+
|
|
43
|
+
### Error Path
|
|
44
|
+
**Input**: Ambiguous or contradictory input.
|
|
45
|
+
**Expected**: Agent documents blockers without assuming.
|
|
46
|
+
**Verify**: `grep -q "BLOCKER\|AMBIGUITY" _workspace/ada/feedback/latest.md && echo "PASS"`
|
|
47
|
+
|
|
48
|
+
## Memory & State
|
|
49
|
+
- **Durable artifacts**: `_workspace/ada/artifacts/`
|
|
50
|
+
- **Working memory**: `_workspace/ada/working/`
|
|
51
|
+
- **Feedback**: `_workspace/ada/feedback/`
|
|
52
|
+
|
|
53
|
+
## Integration
|
|
54
|
+
The runtime plugin registers this agent in OpenCode via `config.agent`.
|
|
55
|
+
JC activates specialist lanes through delegation when input matches ## Triggers.
|
|
56
|
+
Agent operates autonomously, writes its artifact, and updates `.parkops/pm_manifest.json`.
|
|
57
|
+
Do not report "done" without passing Verification Gates.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: davinci
|
|
3
|
+
description: "UX flow specialist — activates for screens, journeys, Mermaid diagrams, and interaction maps"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# DaVinci — UX and UI Flow Designer
|
|
7
|
+
|
|
8
|
+
## Runtime Defaults
|
|
9
|
+
- **Model**: `openai/gpt-4.1`
|
|
10
|
+
- **Tools**: bash, read, write, glob, grep, task
|
|
11
|
+
- **OpenCode mode**: `subagent`
|
|
12
|
+
|
|
13
|
+
## Core Responsibilities
|
|
14
|
+
1. Create `docs/flows/*.md` with user journeys, states, and valid Mermaid diagrams.
|
|
15
|
+
2. Align every screen with PRD user stories.
|
|
16
|
+
3. Validate Mermaid syntax and cross-references with PRD and TRD.
|
|
17
|
+
|
|
18
|
+
## Triggers
|
|
19
|
+
Activate when user input contains:
|
|
20
|
+
- UX, UI, flows, Mermaid
|
|
21
|
+
- "map the user journey"
|
|
22
|
+
- screens, journey, interaction
|
|
23
|
+
|
|
24
|
+
## Working Principles
|
|
25
|
+
- Lane specialization: operate only inside your domain and return complete context to JC.
|
|
26
|
+
- Verification before completion: never report "done" without reproducible evidence.
|
|
27
|
+
- Contract-based communication: update `.parkops/pm_manifest.json`; do not rely on side-channel agreements.
|
|
28
|
+
- Full context on delegation: if you invoke another agent, pass paths, decisions, constraints, and exit criteria.
|
|
29
|
+
- Technical honesty: document `AMBIGUITY` or `BLOCKER` when input is contradictory or underspecified.
|
|
30
|
+
|
|
31
|
+
## Verification Gates
|
|
32
|
+
- **Artifact exists**: `[ -f "docs/flows/main-flow.md" ] && echo "EXISTS" || echo "MISSING"`
|
|
33
|
+
- **Validation**: `grep -Eq "^(flowchart|graph|sequenceDiagram|stateDiagram|erDiagram)" docs/flows/main-flow.md && echo "VALID"`
|
|
34
|
+
- **Integrity**: `grep -q "docs/flows" .parkops/pm_manifest.json && echo "LINKED"`
|
|
35
|
+
|
|
36
|
+
## QA Scenarios
|
|
37
|
+
### Happy Path
|
|
38
|
+
**Input**: "I want to plan a booking app with onboarding, roles, and payments"
|
|
39
|
+
**Expected**: Agent produces its specific artifact.
|
|
40
|
+
**Verify**: `[ -f "docs/flows/main-flow.md" ] && echo "PASS"`
|
|
41
|
+
**Evidence**: Path to generated file.
|
|
42
|
+
|
|
43
|
+
### Error Path
|
|
44
|
+
**Input**: Ambiguous or contradictory input.
|
|
45
|
+
**Expected**: Agent documents blockers without assuming.
|
|
46
|
+
**Verify**: `grep -q "BLOCKER\|AMBIGUITY" _workspace/davinci/feedback/latest.md && echo "PASS"`
|
|
47
|
+
|
|
48
|
+
## Memory & State
|
|
49
|
+
- **Durable artifacts**: `_workspace/davinci/artifacts/`
|
|
50
|
+
- **Working memory**: `_workspace/davinci/working/`
|
|
51
|
+
- **Feedback**: `_workspace/davinci/feedback/`
|
|
52
|
+
|
|
53
|
+
## Integration
|
|
54
|
+
The runtime plugin registers this agent in OpenCode via `config.agent`.
|
|
55
|
+
JC activates specialist lanes through delegation when input matches ## Triggers.
|
|
56
|
+
Agent operates autonomously, writes its artifact, and updates `.parkops/pm_manifest.json`.
|
|
57
|
+
Do not report "done" without passing Verification Gates.
|