@devcxl/opencode-cabbage 0.1.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.
Files changed (95) hide show
  1. package/README.md +88 -0
  2. package/assets/agents/dev-lifecycle.md +135 -0
  3. package/assets/agents/team/architect.md +36 -0
  4. package/assets/agents/team/backend.md +44 -0
  5. package/assets/agents/team/frontend.md +41 -0
  6. package/assets/agents/team/reviewer.md +56 -0
  7. package/assets/commands/code.md +4 -0
  8. package/assets/commands/design.md +4 -0
  9. package/assets/commands/handoff.md +4 -0
  10. package/assets/commands/release.md +4 -0
  11. package/assets/commands/requirements.md +4 -0
  12. package/assets/commands/review.md +4 -0
  13. package/assets/commands/setup.md +4 -0
  14. package/assets/commands/tasks.md +4 -0
  15. package/assets/commands/test.md +4 -0
  16. package/assets/context/CONTEXT.md +40 -0
  17. package/assets/prompts/ADR-FORMAT.md +45 -0
  18. package/assets/prompts/PRD-FORMAT.md +17 -0
  19. package/assets/prompts/bootstrap.md +19 -0
  20. package/assets/skills/flow-code/SKILL.md +93 -0
  21. package/assets/skills/flow-design/SKILL.md +70 -0
  22. package/assets/skills/flow-handoff/SKILL.md +47 -0
  23. package/assets/skills/flow-release/SKILL.md +50 -0
  24. package/assets/skills/flow-requirements/SKILL.md +48 -0
  25. package/assets/skills/flow-requirements/references/interview-guide.md +35 -0
  26. package/assets/skills/flow-review/SKILL.md +88 -0
  27. package/assets/skills/flow-review/references/smell-baseline.md +18 -0
  28. package/assets/skills/flow-setup/SKILL.md +43 -0
  29. package/assets/skills/flow-tasks/SKILL.md +104 -0
  30. package/assets/skills/flow-test/SKILL.md +44 -0
  31. package/assets/templates/gitignore +5 -0
  32. package/dist/flowrun/audit.d.ts +5 -0
  33. package/dist/flowrun/audit.js +67 -0
  34. package/dist/flowrun/audit.js.map +1 -0
  35. package/dist/flowrun/gate.d.ts +18 -0
  36. package/dist/flowrun/gate.js +130 -0
  37. package/dist/flowrun/gate.js.map +1 -0
  38. package/dist/flowrun/github.d.ts +20 -0
  39. package/dist/flowrun/github.js +134 -0
  40. package/dist/flowrun/github.js.map +1 -0
  41. package/dist/flowrun/index.d.ts +7 -0
  42. package/dist/flowrun/index.js +8 -0
  43. package/dist/flowrun/index.js.map +1 -0
  44. package/dist/flowrun/merge.d.ts +24 -0
  45. package/dist/flowrun/merge.js +116 -0
  46. package/dist/flowrun/merge.js.map +1 -0
  47. package/dist/flowrun/resilience.d.ts +18 -0
  48. package/dist/flowrun/resilience.js +80 -0
  49. package/dist/flowrun/resilience.js.map +1 -0
  50. package/dist/flowrun/types.d.ts +81 -0
  51. package/dist/flowrun/types.js +20 -0
  52. package/dist/flowrun/types.js.map +1 -0
  53. package/dist/flowrun/validator.d.ts +9 -0
  54. package/dist/flowrun/validator.js +97 -0
  55. package/dist/flowrun/validator.js.map +1 -0
  56. package/dist/index.d.ts +5 -0
  57. package/dist/index.js +6 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/plugin/agents.d.ts +15 -0
  60. package/dist/plugin/agents.js +64 -0
  61. package/dist/plugin/agents.js.map +1 -0
  62. package/dist/plugin/bootstrap.d.ts +3 -0
  63. package/dist/plugin/bootstrap.js +17 -0
  64. package/dist/plugin/bootstrap.js.map +1 -0
  65. package/dist/plugin/commands.d.ts +16 -0
  66. package/dist/plugin/commands.js +62 -0
  67. package/dist/plugin/commands.js.map +1 -0
  68. package/dist/plugin/goal.d.ts +41 -0
  69. package/dist/plugin/goal.js +194 -0
  70. package/dist/plugin/goal.js.map +1 -0
  71. package/dist/plugin/prompts.d.ts +3 -0
  72. package/dist/plugin/prompts.js +26 -0
  73. package/dist/plugin/prompts.js.map +1 -0
  74. package/dist/plugin/server.d.ts +2 -0
  75. package/dist/plugin/server.js +269 -0
  76. package/dist/plugin/server.js.map +1 -0
  77. package/dist/plugin/skills.d.ts +1 -0
  78. package/dist/plugin/skills.js +39 -0
  79. package/dist/plugin/skills.js.map +1 -0
  80. package/dist/plugin.d.ts +3 -0
  81. package/dist/plugin.js +9 -0
  82. package/dist/plugin.js.map +1 -0
  83. package/dist/util/fs.d.ts +1 -0
  84. package/dist/util/fs.js +11 -0
  85. package/dist/util/fs.js.map +1 -0
  86. package/dist/util/gh.d.ts +4 -0
  87. package/dist/util/gh.js +7 -0
  88. package/dist/util/gh.js.map +1 -0
  89. package/dist/util/paths.d.ts +17 -0
  90. package/dist/util/paths.js +78 -0
  91. package/dist/util/paths.js.map +1 -0
  92. package/dist/util/shell.d.ts +1 -0
  93. package/dist/util/shell.js +4 -0
  94. package/dist/util/shell.js.map +1 -0
  95. package/package.json +62 -0
@@ -0,0 +1,17 @@
1
+ export declare const PLUGIN_ID = "opencode-cabbage";
2
+ export declare function slugify(value: string): string;
3
+ export declare function toRelativePath(projectDir: string, targetPath: string): string;
4
+ export declare function prdDir(projectDir: string): string;
5
+ export declare function adrDir(projectDir: string): string;
6
+ export declare function devSpecsDir(projectDir: string): string;
7
+ export declare function devTasksDir(projectDir: string): string;
8
+ export declare function devApiDir(projectDir: string): string;
9
+ export declare function devDbDir(projectDir: string): string;
10
+ export declare function devGuidesDir(projectDir: string): string;
11
+ export declare function devHandoffDir(projectDir: string): string;
12
+ export declare function outOfScopePath(projectDir: string): string;
13
+ export declare function prdPath(projectDir: string, name: string): string;
14
+ export declare function adrPath(projectDir: string, title: string): string;
15
+ export declare function taskPath(projectDir: string, taskName: string): string;
16
+ export declare function pluginTemplateDir(projectDir: string): string;
17
+ export declare function ensureDocsStructure(projectDir: string): Promise<string[]>;
@@ -0,0 +1,78 @@
1
+ import { mkdir } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { pathExists } from "./fs.js";
4
+ export const PLUGIN_ID = "opencode-cabbage";
5
+ const MAX_SLUG_LENGTH = 60;
6
+ export function slugify(value) {
7
+ let slug = value
8
+ .trim()
9
+ .toLowerCase()
10
+ .replace(/[^a-z0-9]+/g, "-")
11
+ .replace(/^-+|-+$/g, "")
12
+ .replace(/--+/g, "-");
13
+ if (slug.length > MAX_SLUG_LENGTH) {
14
+ const sliced = slug.slice(0, MAX_SLUG_LENGTH);
15
+ const lastDash = sliced.lastIndexOf("-");
16
+ slug = lastDash > MAX_SLUG_LENGTH / 2 ? sliced.slice(0, lastDash) : sliced;
17
+ }
18
+ return slug || "doc";
19
+ }
20
+ export function toRelativePath(projectDir, targetPath) {
21
+ return path.relative(projectDir, targetPath).replace(/\\/g, "/");
22
+ }
23
+ function docsRoot(projectDir) {
24
+ return path.join(projectDir, "docs");
25
+ }
26
+ export function prdDir(projectDir) {
27
+ return path.join(docsRoot(projectDir), "prd");
28
+ }
29
+ export function adrDir(projectDir) {
30
+ return path.join(docsRoot(projectDir), "adr");
31
+ }
32
+ export function devSpecsDir(projectDir) {
33
+ return path.join(docsRoot(projectDir), "dev", "specs");
34
+ }
35
+ export function devTasksDir(projectDir) {
36
+ return path.join(docsRoot(projectDir), "dev", "tasks");
37
+ }
38
+ export function devApiDir(projectDir) {
39
+ return path.join(docsRoot(projectDir), "dev", "api");
40
+ }
41
+ export function devDbDir(projectDir) {
42
+ return path.join(docsRoot(projectDir), "dev", "db");
43
+ }
44
+ export function devGuidesDir(projectDir) {
45
+ return path.join(docsRoot(projectDir), "dev", "guides");
46
+ }
47
+ export function devHandoffDir(projectDir) {
48
+ return path.join(docsRoot(projectDir), "dev", "handoff");
49
+ }
50
+ export function outOfScopePath(projectDir) {
51
+ return path.join(docsRoot(projectDir), "dev", "out-of-scope.md");
52
+ }
53
+ export function prdPath(projectDir, name) {
54
+ return path.join(prdDir(projectDir), `${slugify(name)}.md`);
55
+ }
56
+ export function adrPath(projectDir, title) {
57
+ const date = new Date().toISOString().slice(0, 10);
58
+ return path.join(adrDir(projectDir), `${date}-${slugify(title)}.md`);
59
+ }
60
+ export function taskPath(projectDir, taskName) {
61
+ return path.join(devTasksDir(projectDir), `${slugify(taskName)}.md`);
62
+ }
63
+ export function pluginTemplateDir(projectDir) {
64
+ return path.join(projectDir, ".opencode", PLUGIN_ID, "templates");
65
+ }
66
+ const DOCS_SUBDIRS = ["prd", "adr", "dev/specs", "dev/tasks", "dev/api", "dev/db", "dev/guides", "dev/handoff"];
67
+ export async function ensureDocsStructure(projectDir) {
68
+ const created = [];
69
+ for (const sub of DOCS_SUBDIRS) {
70
+ const target = path.join(docsRoot(projectDir), sub);
71
+ if (!(await pathExists(target))) {
72
+ await mkdir(target, { recursive: true });
73
+ created.push(toRelativePath(projectDir, target));
74
+ }
75
+ }
76
+ return created;
77
+ }
78
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/util/paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function escapeShellArg(value: string): string;
@@ -0,0 +1,4 @@
1
+ export function escapeShellArg(value) {
2
+ return value.replace(/'/g, "'\\''");
3
+ }
4
+ //# sourceMappingURL=shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/util/shell.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;AACrC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "@devcxl/opencode-cabbage",
3
+ "version": "0.1.0",
4
+ "description": "OpenCode 全流程开发插件 — 需求→设计→任务→编码→测试→审查→自动合并,支持自动编排与并行 Subagent",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/devcxl/opencode-cabbage.git"
8
+ },
9
+ "homepage": "https://github.com/devcxl/opencode-cabbage",
10
+ "bugs": {
11
+ "url": "https://github.com/devcxl/opencode-cabbage/issues"
12
+ },
13
+ "keywords": [
14
+ "opencode",
15
+ "opencode-plugin"
16
+ ],
17
+ "type": "module",
18
+ "main": "./dist/index.js",
19
+ "oc-plugin": [
20
+ "server"
21
+ ],
22
+ "exports": {
23
+ ".": {
24
+ "import": "./dist/index.js"
25
+ },
26
+ "./server": {
27
+ "import": "./dist/index.js"
28
+ },
29
+ "./package.json": "./package.json"
30
+ },
31
+ "files": [
32
+ "dist",
33
+ "assets",
34
+ "README.md"
35
+ ],
36
+ "publishConfig": {
37
+ "registry": "https://registry.npmjs.org/",
38
+ "access": "public"
39
+ },
40
+ "scripts": {
41
+ "build": "tsc -p tsconfig.json",
42
+ "prepublishOnly": "npm test && npm run typecheck && npm run build",
43
+ "typecheck": "tsc -p tsconfig.json --noEmit",
44
+ "test": "vitest run",
45
+ "docs:dev": "vitepress dev docs",
46
+ "docs:build": "vitepress build docs",
47
+ "docs:preview": "vitepress preview docs"
48
+ },
49
+ "dependencies": {
50
+ "@opencode-ai/plugin": "^1.3.7",
51
+ "@opencode-ai/sdk": "^1.17.14",
52
+ "yaml": "^2.8.3"
53
+ },
54
+ "devDependencies": {
55
+ "@types/node": "^24.6.0",
56
+ "mermaid": "^11.16.0",
57
+ "typescript": "^5.9.3",
58
+ "vitepress": "^1.6.4",
59
+ "vitepress-plugin-mermaid": "^2.0.17",
60
+ "vitest": "^3.2.4"
61
+ }
62
+ }