cowork-flow 0.0.30 → 0.0.32
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 +116 -284
- package/package.json +2 -2
- package/src/cli.js +6 -0
- package/src/commands/install-zcode-plugin.js +125 -0
- package/src/lib/copy-template.js +54 -2
- package/src/lib/platforms.js +27 -2
- package/template/.claude/agents/cowork-check.md +4 -3
- package/template/.claude/agents/cowork-implement.md +2 -1
- package/template/.codex/agents/cowork-check.toml +11 -3
- package/template/.codex/agents/cowork-implement.toml +8 -1
- package/template/.codex/hooks/inject-workflow-state.py +0 -0
- package/template/.codex/hooks.json +1 -1
- package/template/.cowork-flow/.version +1 -1
- package/template/.cowork-flow/run +3 -3
- package/template/.cowork-flow/run.cmd +88 -88
- package/template/.cowork-flow/scripts/commands/doctor.py +5 -42
- package/template/.cowork-flow/scripts/common/gates/validate_coding_standards.py +254 -132
- package/template/.cowork-flow/scripts/common/gates/validate_rules.py +13 -5
- package/template/.cowork-flow/spec/contracts/workflow-state-templates.md +2 -2
- package/template/.opencode/agents/cowork-check.md +1 -1
- package/template/.opencode/agents/cowork-implement.md +9 -7
- package/template/.zcode/.zcode-plugin/plugin.json +10 -0
- package/template/.zcode/hooks/hooks.json +27 -0
- package/template/.zcode/hooks/inject-context.js +397 -0
- package/template/.zcode/hooks/inject-context.selfcheck.mjs +191 -0
- package/template/.zcode/hooks/runtime/run +58 -0
- package/template/.zcode/hooks/runtime/run.cmd +37 -0
- package/template/.zcode/hooks/runtime/scripts/commands/__init__.py +1 -0
- package/template/.zcode/hooks/runtime/scripts/commands/_bootstrap.py +10 -0
- package/template/.zcode/hooks/runtime/scripts/commands/add_session.py +452 -0
- package/template/.zcode/hooks/runtime/scripts/commands/change.py +412 -0
- package/template/.zcode/hooks/runtime/scripts/commands/doctor.py +471 -0
- package/template/.zcode/hooks/runtime/scripts/commands/get_context.py +20 -0
- package/template/.zcode/hooks/runtime/scripts/commands/get_developer.py +30 -0
- package/template/.zcode/hooks/runtime/scripts/commands/init_developer.py +55 -0
- package/template/.zcode/hooks/runtime/scripts/commands/party_mode_v2.py +1166 -0
- package/template/.zcode/hooks/runtime/scripts/commands/resume.py +62 -0
- package/template/.zcode/hooks/runtime/scripts/commands/subagent.py +321 -0
- package/template/.zcode/hooks/runtime/scripts/commands/task.py +2040 -0
- package/template/.zcode/hooks/runtime/scripts/common/__init__.py +79 -0
- package/template/.zcode/hooks/runtime/scripts/common/core/__init__.py +1 -0
- package/template/.zcode/hooks/runtime/scripts/common/core/config.py +242 -0
- package/template/.zcode/hooks/runtime/scripts/common/core/developer.py +205 -0
- package/template/.zcode/hooks/runtime/scripts/common/core/execution_context.py +385 -0
- package/template/.zcode/hooks/runtime/scripts/common/core/files.py +37 -0
- package/template/.zcode/hooks/runtime/scripts/common/core/paths.py +239 -0
- package/template/.zcode/hooks/runtime/scripts/common/gates/__init__.py +1 -0
- package/template/.zcode/hooks/runtime/scripts/common/gates/coding_standards.py +210 -0
- package/template/.zcode/hooks/runtime/scripts/common/gates/gates.py +66 -0
- package/template/.zcode/hooks/runtime/scripts/common/gates/tdd_evidence.py +367 -0
- package/template/.zcode/hooks/runtime/scripts/common/gates/test_intent.py +266 -0
- package/template/.zcode/hooks/runtime/scripts/common/gates/validate_coding_standards.py +181 -0
- package/template/.zcode/hooks/runtime/scripts/common/gates/validate_coding_standaries.py +316 -0
- package/template/.zcode/hooks/runtime/scripts/common/gates/validate_implementation.py +243 -0
- package/template/.zcode/hooks/runtime/scripts/common/gates/validate_rules.py +473 -0
- package/template/.zcode/hooks/runtime/scripts/common/git/__init__.py +1 -0
- package/template/.zcode/hooks/runtime/scripts/common/git/git_context.py +765 -0
- package/template/.zcode/hooks/runtime/scripts/common/git/git_snapshot.py +83 -0
- package/template/.zcode/hooks/runtime/scripts/common/task/__init__.py +1 -0
- package/template/.zcode/hooks/runtime/scripts/common/task/active_task.py +403 -0
- package/template/.zcode/hooks/runtime/scripts/common/task/archive_utils.py +72 -0
- package/template/.zcode/hooks/runtime/scripts/common/task/readiness.py +249 -0
- package/template/.zcode/hooks/runtime/scripts/common/task/state_machine.py +56 -0
- package/template/.zcode/hooks/runtime/scripts/common/task/task_utils.py +187 -0
- package/template/.zcode/hooks/runtime/scripts/run.py +138 -0
- package/template/.zcode/scaffold/.cowork-flow/.version +1 -0
- package/template/.zcode/scaffold/.cowork-flow/config.yaml +65 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/backend/database-guidelines.md +23 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/backend/directory-structure.md +27 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/backend/encoding-guidelines.md +27 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/backend/error-handling.md +20 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/backend/index.md +40 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/backend/logging-guidelines.md +20 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/backend/quality-guidelines.md +25 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/contracts/capabilities.md +34 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/contracts/index.md +11 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/contracts/party-mode-v2-board.md +68 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/contracts/subagent-dispatch.md +85 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/contracts/workflow-state-templates.md +72 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/frontend/component-guidelines.md +19 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/frontend/directory-structure.md +18 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/frontend/hook-guidelines.md +17 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/frontend/index.md +39 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/frontend/quality-guidelines.md +25 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/frontend/state-management.md +18 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/frontend/type-safety.md +18 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/game/asset-pipeline.md +53 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/game/engine-guidelines.md +43 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/game/index.md +23 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/game/multiplayer-guidelines.md +44 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/game/performance-guidelines.md +58 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/guides/code-reuse-thinking-guide.md +26 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/guides/cross-layer-thinking-guide.md +21 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/guides/index.md +31 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/guides/pre-implementation-checklist.md +15 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/index.md +15 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/runtime/contract-registry.json +68 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/runtime/index.md +10 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/runtime/rules.json +173 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/schemas/adapter.schema.json +128 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/schemas/index.md +10 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/schemas/party-mode-v2-actions.schema.json +90 -0
- package/template/.zcode/scaffold/.cowork-flow/spec/schemas/rules.schema.json +80 -0
- package/template/.zcode/scaffold/.cowork-flow/workflow.md +247 -0
- package/template/.zcode/scaffold/AGENTS.md +126 -0
- package/template/.zcode/scaffold/CLAUDE.md +5 -0
- package/template/AGENTS.md +22 -14
- package/template/{.agents/skills → skills}/before-dev/SKILL.md +6 -5
- package/template/{.claude/skills → skills}/writing-plans/SKILL.md +23 -1
- package/template/.agents/skills/writing-plans/SKILL.md +0 -71
- package/template/.claude/skills/before-dev/SKILL.md +0 -144
- package/template/.claude/skills/brainstorming/SKILL.md +0 -32
- package/template/.claude/skills/break-loop/SKILL.md +0 -26
- package/template/.claude/skills/check/SKILL.md +0 -35
- package/template/.claude/skills/continue/SKILL.md +0 -29
- package/template/.claude/skills/finish-work/SKILL.md +0 -32
- package/template/.claude/skills/game-design/SKILL.md +0 -39
- package/template/.claude/skills/meta/SKILL.md +0 -30
- package/template/.claude/skills/party-mode/SKILL.md +0 -151
- package/template/.claude/skills/party-mode-v2/SKILL.md +0 -75
- package/template/.claude/skills/python-design/SKILL.md +0 -27
- package/template/.claude/skills/start/SKILL.md +0 -78
- package/template/.claude/skills/tdd/SKILL.md +0 -61
- package/template/.claude/skills/update-spec/SKILL.md +0 -39
- /package/template/{.agents/skills → skills}/brainstorming/SKILL.md +0 -0
- /package/template/{.agents/skills → skills}/break-loop/SKILL.md +0 -0
- /package/template/{.agents/skills → skills}/check/SKILL.md +0 -0
- /package/template/{.agents/skills → skills}/continue/SKILL.md +0 -0
- /package/template/{.agents/skills → skills}/finish-work/SKILL.md +0 -0
- /package/template/{.agents/skills → skills}/game-design/SKILL.md +0 -0
- /package/template/{.agents/skills → skills}/meta/SKILL.md +0 -0
- /package/template/{.agents/skills → skills}/party-mode/SKILL.md +0 -0
- /package/template/{.agents/skills → skills}/party-mode-v2/SKILL.md +0 -0
- /package/template/{.agents/skills → skills}/python-design/SKILL.md +0 -0
- /package/template/{.agents/skills → skills}/start/SKILL.md +0 -0
- /package/template/{.agents/skills → skills}/tdd/SKILL.md +0 -0
- /package/template/{.agents/skills → skills}/update-spec/SKILL.md +0 -0
package/README.md
CHANGED
|
@@ -1,350 +1,182 @@
|
|
|
1
|
-
|
|
1
|
+
# cowork-flow
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> 项目协作流程模板 — 把需求、计划、实现、验证串成闭环。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## 一句话
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
**cowork-flow 不写代码,它帮你建流程。** 把 `template/` 复制到目标项目,立刻获得任务流、规格治理、开发计划和会话记录骨架。
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
- 已有项目希望补上一套轻量的协作流程,但不想引入完整工程脚手架。
|
|
11
|
-
- 团队希望把需求澄清、规格变更、实现计划、验证和会话记录串成闭环。
|
|
9
|
+
## 适用 / 不适用
|
|
12
10
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
## 仓库结构
|
|
20
|
-
|
|
21
|
-
```text
|
|
22
|
-
.
|
|
23
|
-
├── README.md
|
|
24
|
-
└── template/
|
|
25
|
-
├── AGENTS.md
|
|
26
|
-
├── CLAUDE.md
|
|
27
|
-
├── .codex/
|
|
28
|
-
│ └── agents/
|
|
29
|
-
├── .claude/
|
|
30
|
-
│ ├── settings.json
|
|
31
|
-
│ ├── agents/
|
|
32
|
-
│ ├── skills/
|
|
33
|
-
│ ├── commands/
|
|
34
|
-
│ └── hooks/
|
|
35
|
-
├── .opencode/
|
|
36
|
-
│ ├── agents/
|
|
37
|
-
│ ├── commands/
|
|
38
|
-
│ └── plugins/
|
|
39
|
-
├── .agents/
|
|
40
|
-
│ └── skills/
|
|
41
|
-
└── .cowork-flow/
|
|
42
|
-
├── config.yaml
|
|
43
|
-
├── workflow.md
|
|
44
|
-
├── scripts/
|
|
45
|
-
├── spec/
|
|
46
|
-
│ ├── contracts/
|
|
47
|
-
│ ├── runtime/
|
|
48
|
-
│ ├── schemas/
|
|
49
|
-
│ ├── backend/
|
|
50
|
-
│ ├── frontend/
|
|
51
|
-
│ └── guides/
|
|
52
|
-
├── changes/
|
|
53
|
-
├── plans/
|
|
54
|
-
├── tasks/
|
|
55
|
-
└── workspace/
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
## 模板内容
|
|
59
|
-
|
|
60
|
-
`template/AGENTS.md`
|
|
61
|
-
项目级协作入口,包含编码前思考、简单优先、外科手术式改动、验证优先等基础原则。接入项目后,应把项目名称、技术栈、运行命令、测试命令和提交策略补齐。
|
|
62
|
-
|
|
63
|
-
`template/.agents/skills/`
|
|
64
|
-
本地技能入口,覆盖 start、before-dev、brainstorming、party-mode、party-mode-v2、writing-plans、check、finish-work、continue、meta、python-design、update-spec 和 break-loop 等协作动作。这里的 skill 应保持通用,不承载某个业务项目的一次性细节。
|
|
65
|
-
|
|
66
|
-
`party-mode` 是用户手动调用的 advisory roundtable。它通过当前 Host Adapter 协调真实子代理讨论,而不是模拟人设;默认 `max_agents=3`、`max_rounds=5`,配置优先级为本次调用、task/change、本地配置、skill 默认值。Party Mode 只产出建议、证据、分歧和验收信号,不能推进任务状态,也不能替代 `cowork-implement` 或 `cowork-check`。
|
|
67
|
-
|
|
68
|
-
`party-mode-v2` 是 runtime board controlled advisory workflow。Python runtime 管理看板、当前轮视图、schema 校验、轮次上限和最终报告;子代理通过 board API 交流,主持人只监控和纠偏,不转发或综合观点。
|
|
69
|
-
|
|
70
|
-
`template/.codex/agents/`
|
|
71
|
-
固定角色 agent 定义,包含 `cowork-research`、`cowork-implement` 和 `cowork-check`,以及对 Codex 默认 `worker`、`default`、`explorer` 的项目级防漂移约束。主会话负责计划与收口,并通过 host adapter 派发固定 agent;正式派发必须先创建 runtime context,再把 `cowork_runtime_context_id` 和 `cowork_host_context_key` 传给子代理。
|
|
72
|
-
|
|
73
|
-
`template/.codex/config.toml`、`template/.codex/hooks.json`、`template/.codex/hooks/`
|
|
74
|
-
Codex 项目级配置与每轮上下文注入入口。hook 会先解析 runtime context,再读取当前 session task、`.cowork-flow/spec/contracts/workflow-state-templates.md` 中的 `workflow-state` 片段和 `codex.dispatch_mode`,把流程状态注入到当前轮对话。注入的 `codex-dispatch-mode` 只是主会话调度提示,不代表当前线程身份。
|
|
75
|
-
|
|
76
|
-
`template/CLAUDE.md`、`template/.claude/settings.json`、`template/.claude/agents/`、`template/.claude/skills/`、`template/.claude/commands/`、`template/.claude/hooks/`
|
|
77
|
-
Claude Code 项目级记忆、hook、固定 agent、skills 和 slash command。`CLAUDE.md` 显式导入 `AGENTS.md`。`.claude/settings.json` 注册 `UserPromptSubmit` 和 `SessionStart` hook,注入当前 workflow state 与 contract digest。固定 agent 通过 `.cowork-flow/run subagent init` 生成 runtime context,并在 prompt、env 或 metadata transport 中传递 `cowork_runtime_context_id`;hook 绑定成功后才进入叶子执行,绑定失败则 fail closed,避免被项目 bootstrap 或无任务首屏上下文拉偏。Claude Code 不自动加载 `.agents/skills/`,所以项目技能要放进 `.claude/skills/`。
|
|
78
|
-
|
|
79
|
-
`template/.opencode/agents/`、`template/.opencode/commands/`、`template/.opencode/plugins/`
|
|
80
|
-
OpenCode 项目级固定 agent、slash command 和系统上下文注入插件。插件会读取 `.cowork-flow/spec/runtime/contract-registry.json`,注入短 contract digest。
|
|
81
|
-
|
|
82
|
-
`template/.cowork-flow/`
|
|
83
|
-
工作流目录,包含流程说明、任务状态、开发者工作区、项目规范、行为变更规格、实现计划和辅助脚本。`.cowork-flow/config.yaml` 只承载真实接线的 session/journal, Codex hint, and task lifecycle hook settings。
|
|
84
|
-
|
|
85
|
-
`template/.cowork-flow/spec/`
|
|
86
|
-
项目规范目录。`contracts/` 存人读 workflow/host/agent 合同,`runtime/` 存运行时读取的规则和 contract registry,`schemas/` 存 JSON Schema,`backend/`、`frontend/`、`guides/` 存工程规范和思考指引。接入时应按项目事实保留、改写或删除对应规范。
|
|
87
|
-
|
|
88
|
-
`template/.cowork-flow/changes/`
|
|
89
|
-
由 `change.py` 管理 proposal、design、behavior specs 和归档,不维护实现 checklist。
|
|
90
|
-
|
|
91
|
-
`template/.cowork-flow/plans/`
|
|
92
|
-
保存可执行步骤、验证方式和执行状态。
|
|
11
|
+
| ✅ 适用 | ❌ 不适用 |
|
|
12
|
+
|---|---|
|
|
13
|
+
| 新项目需要 `AGENTS.md` + 任务流 + 规格文档 | 只需要 React / Spring Boot / Rust 脚手架 |
|
|
14
|
+
| 已有项目想补轻量协作流程 | 已有成熟任务/规格/协作系统 |
|
|
15
|
+
| 需要需求澄清 → 计划 → 实现 → 验证闭环 | 只想复制某一段提示词 |
|
|
93
16
|
|
|
94
17
|
## 快速开始
|
|
95
18
|
|
|
96
|
-
使用 CLI 把模板内容安装到目标项目根目录:
|
|
97
|
-
|
|
98
|
-
```bash
|
|
99
|
-
npx cowork-flow init ./my-project --platform codex
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
`init` 会显式要求平台和开发者身份。平台可选 `codex`、`opencode`、`claude-code`、`all`。交互式终端会提示输入;脚本或 CI 请传入:
|
|
103
|
-
|
|
104
19
|
```bash
|
|
20
|
+
# 初始化到新项目
|
|
105
21
|
npx cowork-flow init ./my-project --platform codex --developer <your-name>
|
|
106
|
-
```
|
|
107
22
|
|
|
108
|
-
|
|
23
|
+
# 安装 ZCode 插件
|
|
24
|
+
cowork-flow install-zcode-plugin
|
|
109
25
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
cowork-flow init ./my-project --platform codex --developer <your-name>
|
|
26
|
+
# 同步已初始化项目
|
|
27
|
+
cowork-flow sync .
|
|
113
28
|
```
|
|
114
29
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
1. 更新 `AGENTS.md` 中的项目名称、技术栈、命令和提交策略。
|
|
118
|
-
2. 按需调整 `.cowork-flow/config.yaml` 中的 session/journal, Codex hint, and task lifecycle hook settings。
|
|
119
|
-
3. 更新 `.cowork-flow/workflow.md` 中与项目流程不一致的门禁、分级和完成定义。
|
|
120
|
-
4. 按项目实际情况调整 `.cowork-flow/spec/`,删除不存在的 frontend、backend 或行为变更场景。
|
|
121
|
-
5. 按团队实践使用 `.cowork-flow/changes/` 管理规格变更,使用 `.cowork-flow/plans/` 管理实现计划和验证状态。
|
|
122
|
-
|
|
123
|
-
## CLI 使用
|
|
30
|
+
平台选项:`codex` / `opencode` / `claude-code` / `all`(逗号分隔)
|
|
124
31
|
|
|
125
|
-
|
|
32
|
+
## 仓库结构
|
|
126
33
|
|
|
127
|
-
```bash
|
|
128
|
-
npx cowork-flow --help
|
|
129
34
|
```
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
35
|
+
template/
|
|
36
|
+
├── AGENTS.md # 协作入口(编码原则、流程约定)
|
|
37
|
+
├── CLAUDE.md # Claude Code 入口
|
|
38
|
+
├── skills/ # ⭐ 唯一源码,init 时按平台分发
|
|
39
|
+
├── .codex/ # Codex agents / hooks / config
|
|
40
|
+
├── .claude/ # Claude Code settings / agents / hooks
|
|
41
|
+
├── .opencode/ # OpenCode agents / commands / plugins
|
|
42
|
+
├── .zcode/ # ⭐ ZCode 插件(hooks + runtime + scaffold)
|
|
43
|
+
└── .cowork-flow/
|
|
44
|
+
├── config.yaml # 项目配置
|
|
45
|
+
├── workflow.md # 主流程定义
|
|
46
|
+
├── scripts/ # Python 运行时
|
|
47
|
+
├── spec/ # 规范文档(contracts / schemas / guides)
|
|
48
|
+
├── changes/ # 行为变更管理
|
|
49
|
+
├── plans/ # 实现计划
|
|
50
|
+
├── tasks/ # 任务目录
|
|
51
|
+
└── workspace/ # 开发者工作区
|
|
135
52
|
```
|
|
136
53
|
|
|
137
|
-
|
|
54
|
+
## Skills 分发机制
|
|
138
55
|
|
|
139
|
-
|
|
56
|
+
Skills 维护在 `template/skills/` 唯一源码,`init` 时按平台分发到对应目录:
|
|
140
57
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
58
|
+
| 平台 | 目标目录 |
|
|
59
|
+
|---|---|
|
|
60
|
+
| `codex` / `opencode` | `.agents/skills/` |
|
|
61
|
+
| `claude-code` | `.claude/skills/` |
|
|
144
62
|
|
|
145
|
-
|
|
63
|
+
分发动作:`before-dev`、`brainstorming`、`break-loop`、`check`、`continue`、`finish-work`、`game-design`、`meta`、`party-mode`、`party-mode-v2`、`python-design`、`start`、`tdd`、`update-spec`、`writing-plans`
|
|
146
64
|
|
|
147
|
-
|
|
148
|
-
cowork-flow init ./my-project --platform all --dry-run
|
|
149
|
-
```
|
|
65
|
+
## CLI 命令
|
|
150
66
|
|
|
151
|
-
|
|
67
|
+
| 命令 | 说明 |
|
|
68
|
+
|---|---|
|
|
69
|
+
| `init <path>` | 初始化项目模板 |
|
|
70
|
+
| `sync <path>` | 同步已初始化项目的模板和技能 |
|
|
71
|
+
| `install-zcode-plugin` | 安装 ZCode 插件到全局缓存 |
|
|
72
|
+
| `update` | 升级 CLI 本身 |
|
|
152
73
|
|
|
153
|
-
|
|
154
|
-
cowork-flow init ./my-project --platform codex --force --developer <your-name>
|
|
155
|
-
```
|
|
74
|
+
### init 选项
|
|
156
75
|
|
|
157
|
-
|
|
76
|
+
| 选项 | 说明 |
|
|
77
|
+
|---|---|
|
|
78
|
+
| `--platform <p>` | 平台:`codex` / `opencode` / `claude-code` / `all` |
|
|
79
|
+
| `--developer <n>` | 开发者名称 |
|
|
80
|
+
| `--force` | 覆盖已有文件 |
|
|
81
|
+
| `--dry-run` | 预览不写入 |
|
|
158
82
|
|
|
159
|
-
|
|
83
|
+
### sync 行为
|
|
160
84
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
85
|
+
- **自动识别**已安装 host 目录,只同步对应平台资产
|
|
86
|
+
- **Skills** 从 `template/skills/` 按平台分发
|
|
87
|
+
- **保护文件**:`config.yaml`、`workflow.md`、`spec/`(除 `workflow-state-templates.md`)、任务、计划、变更、workspace
|
|
88
|
+
- `--force` 整文件覆盖保护文件
|
|
164
89
|
|
|
165
|
-
|
|
90
|
+
## ZCode 插件
|
|
166
91
|
|
|
167
92
|
```bash
|
|
168
|
-
cowork-flow
|
|
169
|
-
cowork-flow
|
|
93
|
+
cowork-flow install-zcode-plugin # 安装
|
|
94
|
+
cowork-flow install-zcode-plugin --force # 覆盖已安装
|
|
170
95
|
```
|
|
171
96
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
## 常用入口
|
|
97
|
+
安装到 `~/.zcode/cli/plugins/cache/zcode-plugins-official/cowork-flow/<version>/`
|
|
175
98
|
|
|
176
|
-
|
|
99
|
+
**Hook 注入内容:**
|
|
100
|
+
- `workflow-state` — 当前任务状态
|
|
101
|
+
- `contract-digest` — 合同摘要(SHA256 fingerprint)
|
|
102
|
+
- `delegated_subtask` — 子代理运行时上下文
|
|
177
103
|
|
|
178
|
-
|
|
179
|
-
- Windows cmd / PowerShell:`.\.cowork-flow\run.cmd`
|
|
104
|
+
## 任务流程
|
|
180
105
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
命令不一致的问题。
|
|
184
|
-
|
|
185
|
-
下面示例使用 macOS / Linux 写法;Windows 原生命令行中把
|
|
186
|
-
`./.cowork-flow/run` 替换为 `.\.cowork-flow\run.cmd`。
|
|
187
|
-
|
|
188
|
-
当前主流程以 `.cowork-flow/workflow.md` 为准。默认路径是:
|
|
189
|
-
|
|
190
|
-
```text
|
|
191
|
-
changes -> brainstorming -> read spec -> plan -> tasks -> implement -> check -> complete
|
|
106
|
+
```
|
|
107
|
+
changes → brainstorming → read spec → plan → tasks → implement → check → complete
|
|
192
108
|
```
|
|
193
109
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
`
|
|
110
|
+
| 阶段 | 命令 | status |
|
|
111
|
+
|---|---|---|
|
|
112
|
+
| 创建/计划 | `task create` | `planning` |
|
|
113
|
+
| 开始执行 | `task start <dir>` | `in_progress` |
|
|
114
|
+
| 进入检查 | `task review [dir]` | `review` |
|
|
115
|
+
| 检查完成 | `task complete [dir]` | `completed` |
|
|
116
|
+
| 归档 | `task archive <name>` | `completed`(归档副本) |
|
|
117
|
+
| 清会话指针 | `task finish` | 不变 |
|
|
197
118
|
|
|
198
|
-
|
|
119
|
+
## 常用命令
|
|
199
120
|
|
|
200
121
|
```bash
|
|
122
|
+
# 身份
|
|
201
123
|
./.cowork-flow/run get-developer
|
|
202
|
-
./.cowork-flow/run init-developer <
|
|
203
|
-
```
|
|
124
|
+
./.cowork-flow/run init-developer <name>
|
|
204
125
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
```bash
|
|
126
|
+
# 上下文
|
|
208
127
|
./.cowork-flow/run get-context
|
|
209
128
|
./.cowork-flow/run task list
|
|
210
129
|
./.cowork-flow/run task next
|
|
211
|
-
```
|
|
212
130
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
```bash
|
|
131
|
+
# 变更
|
|
216
132
|
./.cowork-flow/run change create <slug>
|
|
217
133
|
./.cowork-flow/run change validate <slug>
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
创建并启动任务:
|
|
221
|
-
|
|
222
|
-
```bash
|
|
223
|
-
./.cowork-flow/run task create "<title>" --slug <task-name>
|
|
224
|
-
./.cowork-flow/run task next
|
|
225
|
-
./.cowork-flow/run task start <task-dir>
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
`task next` 只读,不推进状态。它根据当前会话任务和 `task.json.status`
|
|
229
|
-
报告当前任务、阻塞项和下一条安全命令;主会话在启动工作、派发固定代理、
|
|
230
|
-
进入检查、归档或记录 session 前都应先看它。
|
|
231
|
-
|
|
232
|
-
L2 任务的 readiness gate 会在 `task start` 前阻塞缺失的 proposal/spec/design、
|
|
233
|
-
计划、任务链接、边界、假设、验收标准或 verification commands;同一 blocker
|
|
234
|
-
会出现在 `task next` 输出中。
|
|
235
|
-
|
|
236
|
-
任务状态流转:
|
|
237
|
-
|
|
238
|
-
```mermaid
|
|
239
|
-
stateDiagram-v2
|
|
240
|
-
[*] --> NoTask
|
|
241
|
-
state "无当前任务" as NoTask
|
|
242
|
-
state "planning" as Planning
|
|
243
|
-
state "in_progress" as InProgress
|
|
244
|
-
state "review" as Review
|
|
245
|
-
state "completed" as Completed
|
|
246
|
-
state "已归档" as Archived
|
|
247
|
-
|
|
248
|
-
NoTask --> Planning: task create
|
|
249
|
-
Planning --> InProgress: task start
|
|
250
|
-
InProgress --> Review: task review
|
|
251
|
-
Review --> Completed: task complete
|
|
252
|
-
Completed --> Archived: task archive
|
|
253
|
-
Completed --> NoTask: task finish
|
|
254
|
-
Archived --> [*]
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
任务状态由阶段命令推进,`task next` 只读取状态:
|
|
258
|
-
|
|
259
|
-
| 阶段 | 命令 | `task.json.status` |
|
|
260
|
-
| --- | --- | --- |
|
|
261
|
-
| 创建/计划 | `task create` | `planning` |
|
|
262
|
-
| 开始执行 | `task start <task-dir>` | `in_progress` |
|
|
263
|
-
| 进入检查 | `task review [task-dir]` | `review` |
|
|
264
|
-
| 检查完成 | `task complete [task-dir]` | `completed` |
|
|
265
|
-
| 归档任务 | `task archive <task-name>` | 归档副本保持 `completed` |
|
|
266
|
-
| 清会话指针 | `task finish` | 不改变状态 |
|
|
267
134
|
|
|
268
|
-
|
|
135
|
+
# 任务
|
|
136
|
+
./.cowork-flow/run task create "<title>" --slug <name>
|
|
137
|
+
./.cowork-flow/run task start <dir>
|
|
269
138
|
|
|
270
|
-
|
|
271
|
-
|
|
139
|
+
# 子代理
|
|
140
|
+
./.cowork-flow/run subagent init --role implement --agent-type cowork-implement --execution-task-dir <dir> --title "<title>"
|
|
141
|
+
./.cowork-flow/run subagent bind <runtime_context_id> <host_context_key>
|
|
272
142
|
|
|
273
|
-
|
|
274
|
-
./.cowork-flow/run subagent init --role implement --agent-type cowork-implement --execution-task-dir <task-dir> --title "<title>"
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
将命令返回的 prompt transport 放入子代理 prompt:
|
|
278
|
-
|
|
279
|
-
```text
|
|
280
|
-
cowork_runtime_context_id: <runtime_context_id>
|
|
281
|
-
cowork_host_context_key: <host_context_key>
|
|
282
|
-
```
|
|
283
|
-
|
|
284
|
-
子代理首步执行 `./.cowork-flow/run subagent bind <runtime_context_id> <host_context_key>`;主会话验收前必须确认 runtime context 中 `status=bound` 且 `bound_context_key` 匹配。默认角色为 `cowork-research`、`cowork-implement`、`cowork-check`,任务上下文来自已绑定 runtime context,而不是 prompt 形状。
|
|
285
|
-
|
|
286
|
-
Host hook/plugin 启用后,每轮会自动注入 workflow state,其中包含入口分类、当前任务、状态来源和下一步流程提示。状态文本来自 `.cowork-flow/spec/contracts/workflow-state-templates.md`;`workflow.md` 只描述流程,不内联状态片段。hook 不替代主会话验收;它只负责把 task 状态和 workflow gate 放进上下文。
|
|
287
|
-
|
|
288
|
-
记录 session:
|
|
289
|
-
|
|
290
|
-
```bash
|
|
143
|
+
# Session
|
|
291
144
|
./.cowork-flow/run get-context --mode record
|
|
292
|
-
./.cowork-flow/run add-session
|
|
293
|
-
--title "<session-title>" \
|
|
294
|
-
--commit "<commit-or-handoff-ref>" \
|
|
295
|
-
--summary "<summary>"
|
|
145
|
+
./.cowork-flow/run add-session --title "<title>" --commit "<ref>" --summary "<summary>"
|
|
296
146
|
```
|
|
297
147
|
|
|
298
|
-
##
|
|
299
|
-
|
|
300
|
-
- 以目标项目事实为准,不把模板内容当成项目事实。
|
|
301
|
-
- 保留有价值的流程骨架,删除目标项目不存在的场景。
|
|
302
|
-
- 项目差异写入 `AGENTS.md`、`.cowork-flow/workflow.md`、`.cowork-flow/config.yaml` 和 `.cowork-flow/spec/`。
|
|
303
|
-
- 不为了替换项目命令或一次性任务而改写通用 skill。
|
|
304
|
-
- README 只说明项目定位和使用方式;具体协作规则应沉淀在模板内对应文件中。
|
|
148
|
+
## Party Mode
|
|
305
149
|
|
|
306
|
-
|
|
150
|
+
| | v1 | v2 |
|
|
151
|
+
|---|---|---|
|
|
152
|
+
| 机制 | 真实子代理 roundtable | Runtime board controlled |
|
|
153
|
+
| 默认 | `max_agents=3`、`max_rounds=5` | 由 runtime 管理 |
|
|
154
|
+
| 交互 | Host Adapter 协调 | Board API |
|
|
155
|
+
| 产出 | 建议、证据、分歧、验收信号 | 同上 |
|
|
307
156
|
|
|
308
|
-
|
|
157
|
+
party-mode、party-mode-v2 是两种 advisory roundtable 模式。默认 `max_agents=3`、`max_rounds=5`(v1)。`party-mode-v2` 是 runtime board controlled advisory workflow,子代理通过 board API 交流,主持人只监控和纠偏。
|
|
309
158
|
|
|
310
|
-
|
|
311
|
-
- 新增流程规则有明确承载位置,不散落在多个文件里互相冲突。
|
|
312
|
-
- 脚本入口和文档中的命令保持一致。
|
|
313
|
-
- 通用 skill 保持可复用,项目专用规则不混入 starter 模板。
|
|
314
|
-
- 示例命令尽量保持最小可用,避免把模板写成某个具体项目的实现方案。
|
|
159
|
+
> Party Mode 只产出建议,不能推进任务状态,也不能替代 `cowork-implement` / `cowork-check`。
|
|
315
160
|
|
|
316
|
-
##
|
|
317
|
-
|
|
318
|
-
发布前先确认本地或 CI 具备 npm 发布凭据,例如已执行 `npm login`,或在 CI 中配置了 `NPM_TOKEN`。
|
|
319
|
-
|
|
320
|
-
推荐使用 release 脚本发布:
|
|
161
|
+
## 发布
|
|
321
162
|
|
|
322
163
|
```bash
|
|
323
|
-
npm run release
|
|
164
|
+
npm run release # patch
|
|
165
|
+
npm run release -- minor # minor
|
|
324
166
|
```
|
|
325
167
|
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
5. `git commit -m "chore(release): <version>"`
|
|
333
|
-
6. `git tag v<version>`
|
|
334
|
-
7. `npm publish`
|
|
335
|
-
|
|
336
|
-
需要发布其他版本类型时,把 npm 支持的版本类型传给脚本:
|
|
337
|
-
|
|
338
|
-
```bash
|
|
339
|
-
npm run release -- minor
|
|
340
|
-
npm run release -- major
|
|
341
|
-
npm run release -- prerelease
|
|
342
|
-
```
|
|
168
|
+
**发布流程:**
|
|
169
|
+
1. `npm run test:all`(Node + Python + pack check)
|
|
170
|
+
2. `npm version` 升级版本
|
|
171
|
+
3. 同步版本到 `template/.cowork-flow/.version` 和 `template/.zcode/.zcode-plugin/plugin.json`
|
|
172
|
+
4. `git commit` + `git tag`
|
|
173
|
+
5. `npm publish`
|
|
343
174
|
|
|
344
|
-
|
|
175
|
+
CI 需要 `NPM_TOKEN` secret。
|
|
345
176
|
|
|
346
|
-
|
|
177
|
+
## 接入原则
|
|
347
178
|
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
179
|
+
- 以目标项目事实为准,不把模板内容当成项目事实
|
|
180
|
+
- 保留有价值的流程骨架,删除不存在的场景
|
|
181
|
+
- 项目差异写入 `AGENTS.md`、`workflow.md`、`config.yaml`、`spec/`
|
|
182
|
+
- 不为了替换项目命令而改写通用 skill
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cowork-flow",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.32",
|
|
4
4
|
"description": "CLI for installing and maintaining cowork-flow collaboration templates.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
"bin",
|
|
11
11
|
"src",
|
|
12
12
|
"template",
|
|
13
|
+
"template/.zcode",
|
|
13
14
|
"README.md",
|
|
14
15
|
"!template/**/__pycache__/**",
|
|
15
16
|
"!template/**/*.pyc"
|
|
@@ -17,7 +18,6 @@
|
|
|
17
18
|
"scripts": {
|
|
18
19
|
"test": "node --test",
|
|
19
20
|
"test:template": "node scripts/run-template-tests.js",
|
|
20
|
-
"test:integration": "node scripts/run-integration-tests.js",
|
|
21
21
|
"pack:check": "node scripts/pack-check.js",
|
|
22
22
|
"test:all": "npm test && npm run test:template && npm run pack:check",
|
|
23
23
|
"release": "sh scripts/release.sh"
|
package/src/cli.js
CHANGED
|
@@ -3,6 +3,7 @@ import { emitKeypressEvents } from 'node:readline';
|
|
|
3
3
|
import { createInterface } from 'node:readline/promises';
|
|
4
4
|
|
|
5
5
|
import { runInit } from './commands/init.js';
|
|
6
|
+
import { runInstallZCodePlugin } from './commands/install-zcode-plugin.js';
|
|
6
7
|
import { runSync } from './commands/sync.js';
|
|
7
8
|
import { runUpdate } from './commands/update.js';
|
|
8
9
|
import { readPackageInfo } from './lib/package-info.js';
|
|
@@ -11,6 +12,7 @@ const HELP = `cowork-flow
|
|
|
11
12
|
|
|
12
13
|
Usage:
|
|
13
14
|
cowork-flow init [target] --platform <codex|opencode|claude-code|all> [--developer <name>] [--dry-run] [--force]
|
|
15
|
+
cowork-flow install-zcode-plugin [--force]
|
|
14
16
|
cowork-flow update
|
|
15
17
|
cowork-flow sync [target] [--dry-run] [--force]
|
|
16
18
|
cowork-flow --version
|
|
@@ -175,6 +177,10 @@ export async function main(argv = process.argv.slice(2), options = {}) {
|
|
|
175
177
|
return await runUpdate(args, { io });
|
|
176
178
|
}
|
|
177
179
|
|
|
180
|
+
if (command === 'install-zcode-plugin') {
|
|
181
|
+
return await runInstallZCodePlugin(args);
|
|
182
|
+
}
|
|
183
|
+
|
|
178
184
|
io.writeErr(`Unknown command: ${command}\n`);
|
|
179
185
|
return 1;
|
|
180
186
|
} catch (error) {
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { cp, mkdir, readFile, writeFile, access, rm } from 'node:fs/promises';
|
|
2
|
+
import { join, resolve } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
|
|
5
|
+
import { readPackageInfo } from '../lib/package-info.js';
|
|
6
|
+
import { templateRoot } from '../lib/paths.js';
|
|
7
|
+
|
|
8
|
+
const ZCODE_MARKETPLACE = 'zcode-plugins-official';
|
|
9
|
+
const PLUGIN_NAME = 'cowork-flow';
|
|
10
|
+
|
|
11
|
+
function parseArgs(args) {
|
|
12
|
+
return {
|
|
13
|
+
dryRun: args.includes('--dry-run'),
|
|
14
|
+
force: args.includes('--force')
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
async function pathExists(target) {
|
|
19
|
+
try {
|
|
20
|
+
await access(target);
|
|
21
|
+
return true;
|
|
22
|
+
} catch {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async function getZCodeCacheDir() {
|
|
28
|
+
const base = process.env.ZCODE_HOME || join(homedir(), '.zcode');
|
|
29
|
+
return join(base, 'cli', 'plugins', 'cache', ZCODE_MARKETPLACE, PLUGIN_NAME);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async function readJsonSafe(path) {
|
|
33
|
+
try {
|
|
34
|
+
return JSON.parse(await readFile(path, 'utf8'));
|
|
35
|
+
} catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
async function writeJsonAtomic(path, data) {
|
|
41
|
+
await writeFile(path, JSON.stringify(data, null, 2) + '\n', 'utf8');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function dirname(path) {
|
|
45
|
+
const idx = path.replace(/\\/g, '/').lastIndexOf('/');
|
|
46
|
+
return idx >= 0 ? path.slice(0, idx) : path;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async function updateMarketplace(cacheRoot, version) {
|
|
50
|
+
const marketPath = resolve(cacheRoot, '..', '..', '..', 'marketplaces', ZCODE_MARKETPLACE, 'marketplace.json');
|
|
51
|
+
const market = (await readJsonSafe(marketPath)) || { name: ZCODE_MARKETPLACE, plugins: [], version: 1 };
|
|
52
|
+
|
|
53
|
+
const entry = {
|
|
54
|
+
cachePath: join(cacheRoot, version).split('\\').join('/'),
|
|
55
|
+
name: PLUGIN_NAME,
|
|
56
|
+
source: 'filesystem',
|
|
57
|
+
version
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const existingIdx = market.plugins.findIndex((p) => p.name === PLUGIN_NAME);
|
|
61
|
+
if (existingIdx >= 0) {
|
|
62
|
+
market.plugins[existingIdx] = entry;
|
|
63
|
+
} else {
|
|
64
|
+
market.plugins.push(entry);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
await mkdir(dirname(marketPath), { recursive: true });
|
|
68
|
+
await writeJsonAtomic(marketPath, market);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export async function runInstallZCodePlugin(args = []) {
|
|
72
|
+
const { dryRun, force } = parseArgs(args);
|
|
73
|
+
const pluginSrc = join(templateRoot, ".zcode");
|
|
74
|
+
const skillsSrc = join(templateRoot, "skills");
|
|
75
|
+
const { version } = await readPackageInfo();
|
|
76
|
+
|
|
77
|
+
if (!(await pathExists(pluginSrc))) {
|
|
78
|
+
throw new Error(`ZCode plugin source missing at ${pluginSrc}. Reinstall cowork-flow.`);
|
|
79
|
+
}
|
|
80
|
+
if (!(await pathExists(skillsSrc))) {
|
|
81
|
+
throw new Error(`Skills source missing at ${skillsSrc}. Reinstall cowork-flow.`);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const cacheRoot = await getZCodeCacheDir();
|
|
85
|
+
const destDir = join(cacheRoot, version);
|
|
86
|
+
|
|
87
|
+
if (!force && (await pathExists(destDir))) {
|
|
88
|
+
console.log(`cowork-flow ZCode plugin already installed at ${destDir}`);
|
|
89
|
+
console.log('Use --force to overwrite.');
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (dryRun) {
|
|
94
|
+
console.log(`[dry-run] Would install ZCode plugin:`);
|
|
95
|
+
console.log(` Plugin: ${pluginSrc} -> ${destDir}`);
|
|
96
|
+
console.log(` Skills: ${skillsSrc} -> ${join(destDir, 'skills')}`);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
await mkdir(cacheRoot, { recursive: true });
|
|
101
|
+
if (await pathExists(destDir)) {
|
|
102
|
+
await rm(destDir, { recursive: true, force: true });
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Copy plugin runtime (.zcode-plugin/, hooks/, runtime/, scaffold/) from .zcode/
|
|
106
|
+
await cp(pluginSrc, destDir, { recursive: true });
|
|
107
|
+
|
|
108
|
+
// Copy canonical skills into the plugin cache so plugin.json "skills" resolves.
|
|
109
|
+
await cp(skillsSrc, join(destDir, "skills"), { recursive: true, force: true });
|
|
110
|
+
|
|
111
|
+
await updateMarketplace(cacheRoot, version);
|
|
112
|
+
|
|
113
|
+
// Write seed file for install tracking
|
|
114
|
+
await writeJsonAtomic(join(destDir, ".zcode-plugin-seed.json"), {
|
|
115
|
+
hash: "placeholder-replace-on-publish",
|
|
116
|
+
marketplace: ZCODE_MARKETPLACE,
|
|
117
|
+
plugin: PLUGIN_NAME,
|
|
118
|
+
pluginVersion: version,
|
|
119
|
+
source: "cli-install",
|
|
120
|
+
version: 1
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
console.log(`✓ cowork-flow ZCode plugin installed to ${destDir}`);
|
|
124
|
+
console.log(' Restart ZCode to load the plugin.');
|
|
125
|
+
}
|