compound-workflow 1.8.0 → 1.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +62 -68
- package/package.json +2 -8
- package/scripts/check-pack-readme.mjs +1 -16
- package/scripts/check-workflow-contracts.mjs +34 -44
- package/scripts/install-cli.mjs +273 -555
- package/src/AGENTS.md +59 -192
- package/src/{.agents/agents → agents}/research/best-practices-researcher.md +2 -2
- package/src/{.agents/commands → commands}/assess.md +4 -4
- package/src/commands/install.md +43 -0
- package/src/{.agents/commands → commands}/metrics.md +1 -1
- package/src/{.agents/commands → commands}/test-browser.md +8 -8
- package/src/commands/workflow-agents.md +101 -0
- package/src/{.agents/commands → commands}/workflow-brainstorm.md +5 -5
- package/src/{.agents/commands → commands}/workflow-compound.md +1 -1
- package/src/{.agents/commands → commands}/workflow-plan.md +62 -85
- package/src/commands/workflow-work.md +839 -0
- package/src/{.agents/references → references}/README.md +1 -1
- package/src/{.agents/skills → skills}/capture-skill/SKILL.md +1 -1
- package/src/{.agents/skills → skills}/compound-docs/SKILL.md +6 -6
- package/src/{.agents/skills → skills}/compound-docs/references/yaml-schema.md +2 -2
- package/src/skills/setup-agents/SKILL.md +247 -0
- package/src/skills/standards/SKILL.md +79 -0
- package/src/skills/standards/references/architecture.md +228 -0
- package/src/skills/standards/references/code-quality.md +192 -0
- package/src/skills/standards/references/presentation.md +515 -0
- package/src/skills/standards/references/services.md +172 -0
- package/src/skills/standards/references/state-management.md +936 -0
- package/.claude-plugin/plugin.json +0 -7
- package/.cursor-plugin/plugin.json +0 -20
- package/.cursor-plugin/registration.json +0 -5
- package/scripts/check-version-parity.mjs +0 -36
- package/scripts/generate-platform-artifacts.mjs +0 -230
- package/src/.agents/commands/install.md +0 -51
- package/src/.agents/commands/workflow-work.md +0 -690
- package/src/.agents/registry.json +0 -48
- package/src/.agents/scripts/self-check.mjs +0 -227
- package/src/.agents/scripts/sync-opencode.mjs +0 -362
- package/src/.agents/skills/presentation-composability/SKILL.md +0 -72
- package/src/.agents/skills/react-ddd-mvc-frontend/SKILL.md +0 -51
- package/src/.agents/skills/react-ddd-mvc-frontend/references/feature-structure.md +0 -25
- package/src/.agents/skills/react-ddd-mvc-frontend/references/implementation-principles.md +0 -21
- package/src/.agents/skills/react-ddd-mvc-frontend/references/responsibility-gates.md +0 -41
- package/src/.agents/skills/react-ddd-mvc-frontend/references/source-map.md +0 -11
- package/src/.agents/skills/standards/SKILL.md +0 -747
- package/src/.agents/skills/xstate-actor-orchestration/SKILL.md +0 -197
- package/src/.agents/skills/xstate-actor-orchestration/agents/openai.yaml +0 -4
- package/src/.agents/skills/xstate-actor-orchestration/assets/statecharts/.gitkeep +0 -0
- package/src/.agents/skills/xstate-actor-orchestration/references/actor-system-patterns.md +0 -71
- package/src/.agents/skills/xstate-actor-orchestration/references/event-contracts.md +0 -73
- package/src/.agents/skills/xstate-actor-orchestration/references/functional-domain-patterns.md +0 -53
- package/src/.agents/skills/xstate-actor-orchestration/references/machine-structure-and-tags.md +0 -36
- package/src/.agents/skills/xstate-actor-orchestration/references/react-container-pattern.md +0 -45
- package/src/.agents/skills/xstate-actor-orchestration/references/reliability-observability.md +0 -39
- package/src/.agents/skills/xstate-actor-orchestration/references/skill-validation.md +0 -33
- package/src/.agents/skills/xstate-actor-orchestration/references/source-map.md +0 -44
- package/src/.agents/skills/xstate-actor-orchestration/references/statechart-review-and-signoff.md +0 -59
- package/src/.agents/skills/xstate-actor-orchestration/references/testing-strategy.md +0 -35
- package/src/.agents/skills/xstate-actor-orchestration/scripts/create-statechart-artifact.sh +0 -71
- package/src/.agents/skills/xstate-actor-orchestration/scripts/validate-skill.sh +0 -138
- package/src/generated/opencode.managed.json +0 -115
- /package/src/{.agents/agents → agents}/research/framework-docs-researcher.md +0 -0
- /package/src/{.agents/agents → agents}/research/git-history-analyzer.md +0 -0
- /package/src/{.agents/agents → agents}/research/learnings-researcher.md +0 -0
- /package/src/{.agents/agents → agents}/research/repo-research-analyst.md +0 -0
- /package/src/{.agents/agents → agents}/review/agent-native-reviewer.md +0 -0
- /package/src/{.agents/agents → agents}/review/planning-technical-reviewer.md +0 -0
- /package/src/{.agents/agents → agents}/workflow/bug-reproduction-validator.md +0 -0
- /package/src/{.agents/agents → agents}/workflow/lint.md +0 -0
- /package/src/{.agents/agents → agents}/workflow/spec-flow-analyzer.md +0 -0
- /package/src/{.agents/commands → commands}/workflow-review.md +0 -0
- /package/src/{.agents/commands → commands}/workflow-tech-review.md +0 -0
- /package/src/{.agents/commands → commands}/workflow-triage.md +0 -0
- /package/src/{.agents/references → references}/standards/README.md +0 -0
- /package/src/{.agents/skills → skills}/agent-browser/SKILL.md +0 -0
- /package/src/{.agents/skills → skills}/audit-traceability/SKILL.md +0 -0
- /package/src/{.agents/skills → skills}/brainstorming/SKILL.md +0 -0
- /package/src/{.agents/skills → skills}/compound-docs/assets/critical-pattern-template.md +0 -0
- /package/src/{.agents/skills → skills}/compound-docs/assets/resolution-template.md +0 -0
- /package/src/{.agents/skills → skills}/compound-docs/schema.project.yaml +0 -0
- /package/src/{.agents/skills → skills}/compound-docs/schema.yaml +0 -0
- /package/src/{.agents/skills → skills}/data-foundations/SKILL.md +0 -0
- /package/src/{.agents/skills → skills}/document-review/SKILL.md +0 -0
- /package/src/{.agents/skills → skills}/file-todos/SKILL.md +0 -0
- /package/src/{.agents/skills → skills}/file-todos/assets/todo-template.md +0 -0
- /package/src/{.agents/skills → skills}/financial-workflow-integrity/SKILL.md +0 -0
- /package/src/{.agents/skills → skills}/git-worktree/SKILL.md +0 -0
- /package/src/{.agents/skills → skills}/pii-protection-prisma/SKILL.md +0 -0
- /package/src/{.agents/skills → skills}/process-metrics/SKILL.md +0 -0
- /package/src/{.agents/skills → skills}/process-metrics/assets/daily-template.md +0 -0
- /package/src/{.agents/skills → skills}/process-metrics/assets/monthly-template.md +0 -0
- /package/src/{.agents/skills → skills}/process-metrics/assets/weekly-template.md +0 -0
- /package/src/{.agents/skills → skills}/technical-review/SKILL.md +0 -0
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "compound-workflow",
|
|
3
|
-
"version": "1.8.0",
|
|
4
|
-
"description": "Clarify -> plan -> execute -> verify -> capture workflow for Cursor",
|
|
5
|
-
"author": {
|
|
6
|
-
"name": "Compound Workflow"
|
|
7
|
-
},
|
|
8
|
-
"keywords": [
|
|
9
|
-
"workflow",
|
|
10
|
-
"cursor",
|
|
11
|
-
"agents",
|
|
12
|
-
"commands",
|
|
13
|
-
"skills"
|
|
14
|
-
],
|
|
15
|
-
"license": "MIT",
|
|
16
|
-
"repository": "https://github.com/cjerochim/compound-workflow",
|
|
17
|
-
"commands": "./src/.agents/commands",
|
|
18
|
-
"agents": "./src/.agents/agents",
|
|
19
|
-
"skills": "./src/.agents/skills"
|
|
20
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Exit 0 if package.json version matches .cursor-plugin/plugin.json and .claude-plugin/plugin.json.
|
|
4
|
-
* Used in CI to validate release artifact sync.
|
|
5
|
-
*/
|
|
6
|
-
import fs from "node:fs";
|
|
7
|
-
import path from "node:path";
|
|
8
|
-
import { fileURLToPath } from "node:url";
|
|
9
|
-
|
|
10
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
11
|
-
const root = path.resolve(__dirname, "..");
|
|
12
|
-
|
|
13
|
-
const pkg = JSON.parse(fs.readFileSync(path.join(root, "package.json"), "utf8"));
|
|
14
|
-
const cursorPlugin = JSON.parse(
|
|
15
|
-
fs.readFileSync(path.join(root, ".cursor-plugin", "plugin.json"), "utf8")
|
|
16
|
-
);
|
|
17
|
-
const claudePlugin = JSON.parse(
|
|
18
|
-
fs.readFileSync(path.join(root, ".claude-plugin", "plugin.json"), "utf8")
|
|
19
|
-
);
|
|
20
|
-
|
|
21
|
-
const expected = pkg.version;
|
|
22
|
-
|
|
23
|
-
// Claude Code's plugin.json is intentionally minimal (see scripts/generate-platform-artifacts.mjs)
|
|
24
|
-
// and may not include a version field. When absent, treat it as not applicable.
|
|
25
|
-
const claudeVersion = claudePlugin.version;
|
|
26
|
-
const claudeOk = claudeVersion == null || claudeVersion === expected;
|
|
27
|
-
|
|
28
|
-
if (cursorPlugin.version !== expected || !claudeOk) {
|
|
29
|
-
console.error(
|
|
30
|
-
"Version mismatch: package.json=%s, .cursor-plugin/plugin.json=%s, .claude-plugin/plugin.json=%s",
|
|
31
|
-
expected,
|
|
32
|
-
cursorPlugin.version,
|
|
33
|
-
claudeVersion
|
|
34
|
-
);
|
|
35
|
-
process.exit(1);
|
|
36
|
-
}
|
|
@@ -1,230 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import fs from "node:fs";
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
import { fileURLToPath } from "node:url";
|
|
5
|
-
|
|
6
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
-
const repoRoot = path.resolve(__dirname, "..");
|
|
8
|
-
const agentsRoot = path.join(repoRoot, "src", ".agents");
|
|
9
|
-
|
|
10
|
-
function loadRegistry() {
|
|
11
|
-
const registryPath = path.join(agentsRoot, "registry.json");
|
|
12
|
-
if (!fs.existsSync(registryPath)) {
|
|
13
|
-
throw new Error(`Registry not found at ${registryPath}`);
|
|
14
|
-
}
|
|
15
|
-
return JSON.parse(fs.readFileSync(registryPath, "utf8"));
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
function walkFiles(dirAbs, predicate) {
|
|
19
|
-
const out = [];
|
|
20
|
-
const stack = [dirAbs];
|
|
21
|
-
while (stack.length) {
|
|
22
|
-
const cur = stack.pop();
|
|
23
|
-
let entries;
|
|
24
|
-
try {
|
|
25
|
-
entries = fs.readdirSync(cur, { withFileTypes: true });
|
|
26
|
-
} catch {
|
|
27
|
-
continue;
|
|
28
|
-
}
|
|
29
|
-
for (const e of entries) {
|
|
30
|
-
const p = path.join(cur, e.name);
|
|
31
|
-
if (e.isDirectory()) stack.push(p);
|
|
32
|
-
else if (e.isFile() && predicate(p)) out.push(p);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
out.sort();
|
|
36
|
-
return out;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
function parseFrontmatter(md) {
|
|
40
|
-
if (!md.startsWith("---\n") && !md.startsWith("---\r\n")) return {};
|
|
41
|
-
const end = md.indexOf("\n---", 4);
|
|
42
|
-
if (end === -1) return {};
|
|
43
|
-
const block = md.slice(4, end + 1);
|
|
44
|
-
const out = {};
|
|
45
|
-
for (const line of block.split(/\r?\n/)) {
|
|
46
|
-
const match = line.match(/^([A-Za-z0-9_-]+):\s*(.*)\s*$/);
|
|
47
|
-
if (!match) continue;
|
|
48
|
-
out[match[1]] = (match[2] ?? "").replace(/^"(.*)"$/, "$1").replace(/^'(.*)'$/, "$1");
|
|
49
|
-
}
|
|
50
|
-
return out;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Resolve id from frontmatter and config. idFrom = list of frontmatter keys; idFallback = "basename" | "dirname".
|
|
55
|
-
*/
|
|
56
|
-
function resolveId(frontmatter, fileAbs, dirAbs, config) {
|
|
57
|
-
for (const key of config.idFrom || []) {
|
|
58
|
-
if (key === "dirname") {
|
|
59
|
-
const relDir = path.relative(dirAbs, path.dirname(fileAbs));
|
|
60
|
-
return (relDir ? relDir.replaceAll(path.sep, "/") : path.basename(path.dirname(fileAbs))).trim();
|
|
61
|
-
}
|
|
62
|
-
const v = frontmatter[key];
|
|
63
|
-
if (typeof v === "string" && v.trim()) return v.trim();
|
|
64
|
-
}
|
|
65
|
-
if (config.idFallback === "basename") return path.basename(fileAbs, ".md").trim();
|
|
66
|
-
if (config.idFallback === "dirname") return path.basename(path.dirname(fileAbs)).trim();
|
|
67
|
-
return path.basename(fileAbs, ".md").trim();
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function resolveDescription(frontmatter, config, id) {
|
|
71
|
-
const key = config.descriptionFrom;
|
|
72
|
-
if (key && frontmatter[key] != null) return String(frontmatter[key]).trim();
|
|
73
|
-
if (config.descriptionFallback === "id") return id || "";
|
|
74
|
-
return id || "";
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Discover assets of one type from registry config. Returns array of { id, description, rel }.
|
|
79
|
-
*/
|
|
80
|
-
function discoverByType(agentsRootAbs, typeKey, config) {
|
|
81
|
-
const dirAbs = path.join(agentsRootAbs, config.dir);
|
|
82
|
-
if (!fs.existsSync(dirAbs)) return [];
|
|
83
|
-
|
|
84
|
-
let files = [];
|
|
85
|
-
if (config.glob === "**/*.md") {
|
|
86
|
-
files = walkFiles(dirAbs, (p) => p.endsWith(".md"));
|
|
87
|
-
} else if (config.glob === "*/SKILL.md") {
|
|
88
|
-
const entries = fs.readdirSync(dirAbs, { withFileTypes: true });
|
|
89
|
-
for (const e of entries) {
|
|
90
|
-
if (e.isDirectory()) {
|
|
91
|
-
const skillMd = path.join(dirAbs, e.name, "SKILL.md");
|
|
92
|
-
if (fs.existsSync(skillMd)) files.push(skillMd);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
files.sort();
|
|
96
|
-
} else {
|
|
97
|
-
files = walkFiles(dirAbs, (p) => p.endsWith(".md"));
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
const out = [];
|
|
101
|
-
for (const fileAbs of files) {
|
|
102
|
-
const rel = path.relative(dirAbs, fileAbs).replaceAll(path.sep, "/");
|
|
103
|
-
const raw = fs.readFileSync(fileAbs, "utf8");
|
|
104
|
-
const frontmatter = parseFrontmatter(raw);
|
|
105
|
-
const id = resolveId(frontmatter, fileAbs, dirAbs, config);
|
|
106
|
-
if (!id) continue;
|
|
107
|
-
const description = resolveDescription(frontmatter, config, id);
|
|
108
|
-
out.push({ id, description, rel });
|
|
109
|
-
}
|
|
110
|
-
return out.sort((a, b) => a.id.localeCompare(b.id));
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
function normalizeRepoUrl(repoValue) {
|
|
114
|
-
const raw = typeof repoValue === "string" ? repoValue : repoValue?.url;
|
|
115
|
-
if (typeof raw !== "string" || raw.trim().length === 0) return "";
|
|
116
|
-
return raw.replace(/^git\+/, "").replace(/\.git$/, "");
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
function writeJson(absPath, value, checkOnly, changed) {
|
|
120
|
-
const next = JSON.stringify(value, null, 2) + "\n";
|
|
121
|
-
let prev = null;
|
|
122
|
-
if (fs.existsSync(absPath)) prev = fs.readFileSync(absPath, "utf8");
|
|
123
|
-
|
|
124
|
-
if (prev !== next) {
|
|
125
|
-
changed.push(absPath);
|
|
126
|
-
if (!checkOnly) {
|
|
127
|
-
fs.mkdirSync(path.dirname(absPath), { recursive: true });
|
|
128
|
-
fs.writeFileSync(absPath, next, "utf8");
|
|
129
|
-
console.log("Wrote:", path.relative(repoRoot, absPath));
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
function main() {
|
|
135
|
-
const checkOnly = process.argv.includes("--check");
|
|
136
|
-
const registry = loadRegistry();
|
|
137
|
-
const roots = registry.roots?.consumer || {};
|
|
138
|
-
const assetTypes = registry.assetTypes || {};
|
|
139
|
-
|
|
140
|
-
const commands =
|
|
141
|
-
assetTypes.command != null
|
|
142
|
-
? discoverByType(agentsRoot, "command", assetTypes.command)
|
|
143
|
-
: [];
|
|
144
|
-
const agents =
|
|
145
|
-
assetTypes.agent != null ? discoverByType(agentsRoot, "agent", assetTypes.agent) : [];
|
|
146
|
-
|
|
147
|
-
const pkg = JSON.parse(fs.readFileSync(path.join(repoRoot, "package.json"), "utf8"));
|
|
148
|
-
const repositoryUrl = normalizeRepoUrl(pkg.repository);
|
|
149
|
-
const changed = [];
|
|
150
|
-
|
|
151
|
-
const commandRoot = roots.commands || "node_modules/compound-workflow/src/.agents/commands";
|
|
152
|
-
const agentRoot = roots.agents || "node_modules/compound-workflow/src/.agents/agents";
|
|
153
|
-
const skillsPath = roots.skills || "node_modules/compound-workflow/src/.agents/skills";
|
|
154
|
-
|
|
155
|
-
// Claude Code only accepts name, description, author in plugin.json.
|
|
156
|
-
// Agents are discovered from the adjacent agents/ directory (must be flat .md files).
|
|
157
|
-
const claudePlugin = {
|
|
158
|
-
name: pkg.name,
|
|
159
|
-
description: "Clarify -> plan -> execute -> verify -> capture workflow: commands, skills, and agents for Claude Code",
|
|
160
|
-
author: { name: "Compound Workflow" },
|
|
161
|
-
};
|
|
162
|
-
|
|
163
|
-
const cursorPlugin = {
|
|
164
|
-
name: pkg.name,
|
|
165
|
-
version: pkg.version,
|
|
166
|
-
description: "Clarify -> plan -> execute -> verify -> capture workflow for Cursor",
|
|
167
|
-
author: { name: "Compound Workflow" },
|
|
168
|
-
keywords: ["workflow", "cursor", "agents", "commands", "skills"],
|
|
169
|
-
license: pkg.license,
|
|
170
|
-
repository: repositoryUrl,
|
|
171
|
-
commands: "./src/.agents/commands",
|
|
172
|
-
agents: "./src/.agents/agents",
|
|
173
|
-
skills: "./src/.agents/skills",
|
|
174
|
-
};
|
|
175
|
-
|
|
176
|
-
const openCodeManaged = {
|
|
177
|
-
$schema: "https://opencode.ai/config.json",
|
|
178
|
-
skillsPath,
|
|
179
|
-
commandRoot,
|
|
180
|
-
agentRoot,
|
|
181
|
-
commands,
|
|
182
|
-
agents,
|
|
183
|
-
};
|
|
184
|
-
|
|
185
|
-
writeJson(path.join(repoRoot, ".claude-plugin", "plugin.json"), claudePlugin, checkOnly, changed);
|
|
186
|
-
writeJson(path.join(repoRoot, ".cursor-plugin", "plugin.json"), cursorPlugin, checkOnly, changed);
|
|
187
|
-
writeJson(path.join(repoRoot, "src", "generated", "opencode.managed.json"), openCodeManaged, checkOnly, changed);
|
|
188
|
-
|
|
189
|
-
// Generate flat agent symlinks in .claude-plugin/agents/ so Claude Code discovers them.
|
|
190
|
-
// Claude Code only scans the root of the agents/ directory (not subdirectories).
|
|
191
|
-
const claudeAgentsDir = path.join(repoRoot, ".claude-plugin", "agents");
|
|
192
|
-
const agentsDirAbs = path.join(agentsRoot, "agents");
|
|
193
|
-
if (!checkOnly) {
|
|
194
|
-
fs.mkdirSync(claudeAgentsDir, { recursive: true });
|
|
195
|
-
// Prune stale symlinks no longer in the agent list
|
|
196
|
-
const agentBasenames = new Set(agents.map((a) => path.basename(a.rel)));
|
|
197
|
-
if (fs.existsSync(claudeAgentsDir)) {
|
|
198
|
-
for (const entry of fs.readdirSync(claudeAgentsDir, { withFileTypes: true })) {
|
|
199
|
-
if (!agentBasenames.has(entry.name)) {
|
|
200
|
-
fs.rmSync(path.join(claudeAgentsDir, entry.name), { force: true });
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
for (const agent of agents) {
|
|
205
|
-
const linkPath = path.join(claudeAgentsDir, path.basename(agent.rel));
|
|
206
|
-
const targetPath = path.relative(claudeAgentsDir, path.join(agentsDirAbs, agent.rel));
|
|
207
|
-
try {
|
|
208
|
-
if (fs.existsSync(linkPath) || fs.lstatSync(linkPath).isSymbolicLink()) {
|
|
209
|
-
fs.rmSync(linkPath, { force: true });
|
|
210
|
-
}
|
|
211
|
-
} catch { /* doesn't exist */ }
|
|
212
|
-
fs.symlinkSync(targetPath, linkPath);
|
|
213
|
-
}
|
|
214
|
-
if (agents.length) {
|
|
215
|
-
console.log(`Synced ${agents.length} agent symlinks to .claude-plugin/agents/`);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
if (checkOnly && changed.length) {
|
|
220
|
-
console.error("Generated artifacts are stale:");
|
|
221
|
-
for (const abs of changed) console.error("-", path.relative(repoRoot, abs));
|
|
222
|
-
process.exit(1);
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
if (!changed.length) {
|
|
226
|
-
console.log(checkOnly ? "Generated artifacts are up-to-date." : "No artifact updates required.");
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
main();
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: install
|
|
3
|
-
invocation: install
|
|
4
|
-
description: Install compound-workflow in this project (native mode): writes opencode.json, merges AGENTS.md, and creates docs/todo dirs.
|
|
5
|
-
argument-hint: "[--dry-run] [--root <path>] [--no-config] [--no-register-cursor] [--register-cursor]"
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# /install
|
|
9
|
-
|
|
10
|
-
Install or update compound-workflow in this project with **one action**.
|
|
11
|
-
|
|
12
|
-
## When to use
|
|
13
|
-
|
|
14
|
-
- First-time setup in a repository.
|
|
15
|
-
- After updating `compound-workflow` to refresh generated OpenCode command/agent mappings and AGENTS template content.
|
|
16
|
-
|
|
17
|
-
## Prerequisites
|
|
18
|
-
|
|
19
|
-
- The project must have `compound-workflow` installed: `npm install compound-workflow`.
|
|
20
|
-
|
|
21
|
-
## Instructions for the agent
|
|
22
|
-
|
|
23
|
-
Run in the workspace root (or user-provided root):
|
|
24
|
-
|
|
25
|
-
```bash
|
|
26
|
-
npx compound-workflow install
|
|
27
|
-
npx compound-workflow install --root /path/to/project
|
|
28
|
-
npx compound-workflow install --dry-run
|
|
29
|
-
npx compound-workflow install --no-config
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
- `--dry-run`: Print planned changes only; no writes.
|
|
33
|
-
- `--root <path>`: Target project directory (default: current directory).
|
|
34
|
-
- `--no-config`: Skip Repo Config Block reminder; still writes opencode.json, AGENTS.md, and dirs.
|
|
35
|
-
- `--no-register-cursor`: Do not register the plugin with Cursor (skip writing to ~/.claude/).
|
|
36
|
-
- `--register-cursor`: Force registration with Cursor even if Cursor is not detected in the default location.
|
|
37
|
-
|
|
38
|
-
After running, suggest `opencode debug config` in the project to verify OpenCode resolution.
|
|
39
|
-
|
|
40
|
-
## Cursor
|
|
41
|
-
|
|
42
|
-
One command installs and registers the plugin with Cursor when Cursor is detected (`~/.cursor` exists). Restart Cursor after install; if skills or commands do not appear, enable "Include third-party Plugins, Skills, and other configs" in Cursor Settings > Features. Use `--no-register-cursor` to skip registration (e.g. in CI).
|
|
43
|
-
|
|
44
|
-
## What Install does
|
|
45
|
-
|
|
46
|
-
1. Ensures `compound-workflow` is installed in the project.
|
|
47
|
-
2. Writes/merges `opencode.json` so OpenCode resolves commands/agents/skills directly from `node_modules/compound-workflow/src/.agents`.
|
|
48
|
-
3. Creates/merges `AGENTS.md` using the package template while preserving an existing Repo Config Block.
|
|
49
|
-
4. Creates missing directories: `docs/brainstorms`, `docs/plans`, `docs/solutions`, `docs/metrics/daily|weekly|monthly`, `todos`.
|
|
50
|
-
|
|
51
|
-
No setup/sync compatibility paths are supported in this cutover.
|