@dawipong/opcflow 0.1.1 → 0.2.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.
Files changed (164) hide show
  1. package/README.en.md +17 -82
  2. package/README.md +17 -81
  3. package/dist/cli.mjs +33 -8
  4. package/package.json +4 -6
  5. package/web/dist/assets/abnfDiagram-VRR7QNED-DctuL32B.js +1 -0
  6. package/web/dist/assets/arc-DPoWLLje.js +1 -0
  7. package/web/dist/assets/architecture-TIHT7OUA-Bgyz4pDY.js +1 -0
  8. package/web/dist/assets/architectureDiagram-ZJ3FMSHR--07w7V0c.js +36 -0
  9. package/web/dist/assets/array-BifhSqXX.js +1 -0
  10. package/web/dist/assets/blockDiagram-677ZJIJ3-CUYUzMZC.js +132 -0
  11. package/web/dist/assets/c4Diagram-LMCZKHZV-DhT2uxnj.js +10 -0
  12. package/web/dist/assets/channel-vHKEEV51.js +1 -0
  13. package/web/dist/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  14. package/web/dist/assets/chunk-32BRIVSS-CztnJRkA.js +1 -0
  15. package/web/dist/assets/{chunk-5VM5RSS4-BfNutGrI.js → chunk-5VM5RSS4-ZNzvKenW.js} +2 -2
  16. package/web/dist/assets/chunk-7BUUIJ7U-Bb538aSH.js +1 -0
  17. package/web/dist/assets/chunk-C7G6YPKG-jsbUGVSb.js +1 -0
  18. package/web/dist/assets/chunk-EX3LRPZG-DQGT_sG5.js +231 -0
  19. package/web/dist/assets/chunk-HOUHSVGY-DDAtZMtg.js +1 -0
  20. package/web/dist/assets/chunk-ICXQ74PX-C2h9d1ob.js +2 -0
  21. package/web/dist/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  22. package/web/dist/assets/chunk-KEIR6QF5-BfrZ3jm6.js +161 -0
  23. package/web/dist/assets/chunk-MOJQB5TN-Y0jSjq4a.js +88 -0
  24. package/web/dist/assets/chunk-OGEWGWER-B5mrusUD.js +1 -0
  25. package/web/dist/assets/chunk-PUDLZKDR-pSIk3CZr.js +156 -0
  26. package/web/dist/assets/chunk-Q4XR5HBZ-Cfw3UWMb.js +70 -0
  27. package/web/dist/assets/chunk-RYQCIY6F-CCUojmgb.js +1 -0
  28. package/web/dist/assets/chunk-V7JOEXUC-D_2vwCJz.js +206 -0
  29. package/web/dist/assets/chunk-VR4S4FIN-CUMv178C.js +1 -0
  30. package/web/dist/assets/chunk-WYO6CB5R-BaRUDpDl.js +127 -0
  31. package/web/dist/assets/chunk-XXDRQBXY-tmq33VNh.js +1 -0
  32. package/web/dist/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  33. package/web/dist/assets/chunk-ZGVPDNZ5-DK9a-Iwy.js +62 -0
  34. package/web/dist/assets/classDiagram-OUVF2IWQ-Ckf-YAkB.js +1 -0
  35. package/web/dist/assets/classDiagram-v2-EOCWNBFH-Ckf-YAkB.js +1 -0
  36. package/web/dist/assets/cose-bilkent-JH36ORCC-BV8ttTSE.js +1 -0
  37. package/web/dist/assets/cynefin-VYW2F7L2-BncvlU8s.js +1 -0
  38. package/web/dist/assets/cynefinDiagram-TSTJHNR4-CtVxnYLa.js +62 -0
  39. package/web/dist/assets/cytoscape.esm-B3I8pqwA.js +321 -0
  40. package/web/dist/assets/dagre-CXRCoUWR.js +1 -0
  41. package/web/dist/assets/dagre-VKFMJZFB-CbAaKbWe.js +4 -0
  42. package/web/dist/assets/defaultLocale-C8Fc0cco.js +1 -0
  43. package/web/dist/assets/diagram-FQU43EPY-DkeAFpQM.js +3 -0
  44. package/web/dist/assets/diagram-G47NLZAW-BdfPbsL1.js +24 -0
  45. package/web/dist/assets/diagram-NH7WQ7WH-wWIYA2VS.js +24 -0
  46. package/web/dist/assets/diagram-OA4YK3LP-Chx7_D6X.js +30 -0
  47. package/web/dist/assets/diagram-WEI45ONY-DxAoHRrP.js +41 -0
  48. package/web/dist/assets/dist-zlHGdC4Y.js +1 -0
  49. package/web/dist/assets/ebnfDiagram-CCIWWBDH-DcnWNqZc.js +1 -0
  50. package/web/dist/assets/erDiagram-Q63AITRT-BX0XqX5B.js +85 -0
  51. package/web/dist/assets/eventmodeling-45OFAUF4-CA5_fuzk.js +1 -0
  52. package/web/dist/assets/flowDiagram-23GEKE2U-DL5kTdXb.js +1 -0
  53. package/web/dist/assets/ganttDiagram-NO4QXBWP-CFmDEUpW.js +292 -0
  54. package/web/dist/assets/gitGraph-TEB2WS4Q-BiEBwxQy.js +1 -0
  55. package/web/dist/assets/gitGraphDiagram-IHSO6WYX--62v4OfD.js +106 -0
  56. package/web/dist/assets/graphlib-B8gBHxth.js +1 -0
  57. package/web/dist/assets/index-BUs4sN1r.css +1 -0
  58. package/web/dist/assets/index-DVXPy-Pj.js +414 -0
  59. package/web/dist/assets/info-DKCQHKI2-BLKxCcH7.js +1 -0
  60. package/web/dist/assets/infoDiagram-FWYZ7A6U-BnrcoE4X.js +2 -0
  61. package/web/dist/assets/init-D6jRqBbL.js +1 -0
  62. package/web/dist/assets/ishikawaDiagram-FXEZZL3T-BuUSROzL.js +70 -0
  63. package/web/dist/assets/journeyDiagram-5HDEW3XC-CsPvawEB.js +139 -0
  64. package/web/dist/assets/kanban-definition-HUTT4EX6-hCokh58u.js +89 -0
  65. package/web/dist/assets/katex-CddkPoXu.js +257 -0
  66. package/web/dist/assets/line-CE9BvxIa.js +1 -0
  67. package/web/dist/assets/linear-B8yeZliB.js +1 -0
  68. package/web/dist/assets/map-DsCK-0Cs.js +1 -0
  69. package/web/dist/assets/mermaid-parser.core-CAAH_OSq.js +7 -0
  70. package/web/dist/assets/mindmap-definition-LN4V7U3C-plfH1Ve5.js +96 -0
  71. package/web/dist/assets/ordinal-hYBb2elL.js +1 -0
  72. package/web/dist/assets/packet-7NZHBO7P-ap_XD9pB.js +1 -0
  73. package/web/dist/assets/path-BWPyau1x.js +1 -0
  74. package/web/dist/assets/pegDiagram-2B236MQR-DpbGacSD.js +1 -0
  75. package/web/dist/assets/pie-RZYD4A2V-C7RWGzoe.js +1 -0
  76. package/web/dist/assets/pieDiagram-ENE6RG2P-DsEjdRIW.js +39 -0
  77. package/web/dist/assets/quadrantDiagram-ABIIQ3AL-CotpR7ZY.js +7 -0
  78. package/web/dist/assets/radar-I7S5WNFK-D8ICPnt1.js +1 -0
  79. package/web/dist/assets/railroad-3IZDKUUU-B7ZJ3IRr.js +1 -0
  80. package/web/dist/assets/railroad-abnf-AHOZXSZD-uSXjMlP2.js +1 -0
  81. package/web/dist/assets/railroad-ebnf-EBAXGLYW-9im8bOEZ.js +1 -0
  82. package/web/dist/assets/railroad-peg-LSFZ7HO6-62Yk_rP2.js +1 -0
  83. package/web/dist/assets/railroadDiagram-RFXS5EU6-C9kLSHvN.js +1 -0
  84. package/web/dist/assets/requirementDiagram-TGXJPOKE-BslCStWL.js +84 -0
  85. package/web/dist/assets/rough.esm-CSKSodPl.js +1 -0
  86. package/web/dist/assets/sankeyDiagram-HTMAVEWB-9CV0aY5J.js +40 -0
  87. package/web/dist/assets/sequenceDiagram-DBY2YBRQ-Cg8Nc-TM.js +162 -0
  88. package/web/dist/assets/sizeCapture-X5ZJPWSS-B0uUizjq.js +1 -0
  89. package/web/dist/assets/src-W4W9ly-y.js +1 -0
  90. package/web/dist/assets/stateDiagram-2N3HPSRC-DB4TsO7Z.js +1 -0
  91. package/web/dist/assets/stateDiagram-v2-6OUMAXLB-SUHVLdPI.js +1 -0
  92. package/web/dist/assets/swimlanes-5IMT3BWC-CgeBbl6U.js +2 -0
  93. package/web/dist/assets/swimlanesDiagram-G3AALYLV-BfFfe5gc.js +8 -0
  94. package/web/dist/assets/timeline-definition-FHXFAJF6-BRSnucVn.js +120 -0
  95. package/web/dist/assets/treeView-QDETBFTQ-lUySd_Pd.js +1 -0
  96. package/web/dist/assets/treemap-6X3UGDF4-BewRw9PG.js +1 -0
  97. package/web/dist/assets/vennDiagram-L72KCM5P-gearbXh2.js +34 -0
  98. package/web/dist/assets/wardley-OPB4EBWU-BCrrgDHP.js +1 -0
  99. package/web/dist/assets/wardleyDiagram-EHGQE667-DBWn9RRb.js +78 -0
  100. package/web/dist/assets/xychartDiagram-FW5EYKEG-CUL1Ijyf.js +7 -0
  101. package/web/dist/index.html +17 -2
  102. package/web/dist/assets/abnfDiagram-VRR7QNED-CM_SmMdS.js +0 -1
  103. package/web/dist/assets/arc-a2d6VGyS.js +0 -1
  104. package/web/dist/assets/architectureDiagram-ZJ3FMSHR-CKwso5u1.js +0 -36
  105. package/web/dist/assets/blockDiagram-677ZJIJ3-DOlRPtCE.js +0 -132
  106. package/web/dist/assets/c4Diagram-LMCZKHZV-BVWP4jKU.js +0 -10
  107. package/web/dist/assets/channel-Bv2v5Ka7.js +0 -1
  108. package/web/dist/assets/chunk-2Q5K7J3B-Dg1gXqD_.js +0 -1
  109. package/web/dist/assets/chunk-32BRIVSS-DMEBIyv0.js +0 -1
  110. package/web/dist/assets/chunk-EX3LRPZG-B0LUaNef.js +0 -231
  111. package/web/dist/assets/chunk-JWPE2WC7-RWpAfnwW.js +0 -1
  112. package/web/dist/assets/chunk-MOJQB5TN-CHzjH2SN.js +0 -88
  113. package/web/dist/assets/chunk-RYQCIY6F-CB84H40n.js +0 -1
  114. package/web/dist/assets/chunk-V7JOEXUC-hDfVeloC.js +0 -206
  115. package/web/dist/assets/chunk-VR4S4FIN-C-ISU9mB.js +0 -1
  116. package/web/dist/assets/chunk-XXDRQBXY-Q-1uA8_v.js +0 -1
  117. package/web/dist/assets/classDiagram-OUVF2IWQ-C5GMtsqN.js +0 -1
  118. package/web/dist/assets/classDiagram-v2-EOCWNBFH-C5GMtsqN.js +0 -1
  119. package/web/dist/assets/cose-bilkent-JH36ORCC-D4aRsqbg.js +0 -1
  120. package/web/dist/assets/cynefin-VYW2F7L2-Bb_blZYP.js +0 -166
  121. package/web/dist/assets/cynefinDiagram-TSTJHNR4-CRX9tSwx.js +0 -62
  122. package/web/dist/assets/cytoscape.esm-D3_iZ_3b.js +0 -321
  123. package/web/dist/assets/dagre-VKFMJZFB-BHcw1uwS.js +0 -4
  124. package/web/dist/assets/defaultLocale-DX6XiGOO.js +0 -1
  125. package/web/dist/assets/diagram-FQU43EPY-BbFIcSGy.js +0 -3
  126. package/web/dist/assets/diagram-G47NLZAW-D6SEnl9Y.js +0 -24
  127. package/web/dist/assets/diagram-NH7WQ7WH-Dq4ObETB.js +0 -24
  128. package/web/dist/assets/diagram-OA4YK3LP-EF9zUKb4.js +0 -30
  129. package/web/dist/assets/diagram-WEI45ONY-9MSuI1lJ.js +0 -41
  130. package/web/dist/assets/ebnfDiagram-CCIWWBDH-BKTvNs-v.js +0 -1
  131. package/web/dist/assets/erDiagram-Q63AITRT-BRZ7eOih.js +0 -85
  132. package/web/dist/assets/flowDiagram-23GEKE2U-n6RjlBIU.js +0 -156
  133. package/web/dist/assets/ganttDiagram-NO4QXBWP-DJ8LFx2q.js +0 -292
  134. package/web/dist/assets/gitGraphDiagram-IHSO6WYX-PBNVnu__.js +0 -106
  135. package/web/dist/assets/graph-DOmOIIwC.js +0 -1
  136. package/web/dist/assets/index-BkpgTe8Q.js +0 -674
  137. package/web/dist/assets/index-CfSIxCYt.css +0 -1
  138. package/web/dist/assets/infoDiagram-FWYZ7A6U-DpF1ykim.js +0 -2
  139. package/web/dist/assets/init-Gi6I4Gst.js +0 -1
  140. package/web/dist/assets/ishikawaDiagram-FXEZZL3T-BcLaz8vn.js +0 -70
  141. package/web/dist/assets/journeyDiagram-5HDEW3XC-DhDa2tr6.js +0 -139
  142. package/web/dist/assets/kanban-definition-HUTT4EX6-Cj5MBccm.js +0 -89
  143. package/web/dist/assets/katex-HP8lGamR.js +0 -257
  144. package/web/dist/assets/layout-D-LzfAck.js +0 -1
  145. package/web/dist/assets/linear-D-RAQuF7.js +0 -1
  146. package/web/dist/assets/map-DxJ2ADlA.js +0 -1
  147. package/web/dist/assets/mindmap-definition-LN4V7U3C-CDHapI3O.js +0 -96
  148. package/web/dist/assets/ordinal-Cboi1Yqb.js +0 -1
  149. package/web/dist/assets/pegDiagram-2B236MQR-Cga1GKF6.js +0 -1
  150. package/web/dist/assets/pieDiagram-ENE6RG2P-BtzEbqHl.js +0 -39
  151. package/web/dist/assets/quadrantDiagram-ABIIQ3AL-CMHXJPd5.js +0 -7
  152. package/web/dist/assets/railroadDiagram-RFXS5EU6-C5dKOd7a.js +0 -1
  153. package/web/dist/assets/requirementDiagram-TGXJPOKE-Cjx6LPCa.js +0 -84
  154. package/web/dist/assets/sankeyDiagram-HTMAVEWB-C8kzAycX.js +0 -40
  155. package/web/dist/assets/sequenceDiagram-DBY2YBRQ-DwEDppgS.js +0 -162
  156. package/web/dist/assets/sizeCapture-X5ZJPWSS-CUgsJ-ry.js +0 -1
  157. package/web/dist/assets/stateDiagram-2N3HPSRC-B4fcb7Qa.js +0 -1
  158. package/web/dist/assets/stateDiagram-v2-6OUMAXLB-IQXX7rVH.js +0 -1
  159. package/web/dist/assets/swimlanes-5IMT3BWC-Bw27O3PP.js +0 -2
  160. package/web/dist/assets/swimlanesDiagram-G3AALYLV-DRko3G58.js +0 -8
  161. package/web/dist/assets/timeline-definition-FHXFAJF6-Cra4Bj9n.js +0 -120
  162. package/web/dist/assets/vennDiagram-L72KCM5P-B_Nmy9aH.js +0 -34
  163. package/web/dist/assets/wardleyDiagram-EHGQE667-BE1omAzb.js +0 -78
  164. package/web/dist/assets/xychartDiagram-FW5EYKEG-CsNs1p2c.js +0 -7
package/README.en.md CHANGED
@@ -141,94 +141,30 @@ never silently deviate.
141
141
  > `docs/design/prototypes/<endpoint>/<module>/<page>.html` — once `scan` registers it, it goes through
142
142
  > the usual 👍 release. Both paths are equivalent in the system; both must pass a user 👍.
143
143
 
144
- ## CLI Commands & Parameters
144
+ ## CLI Commands
145
145
 
146
- Every command: `opcflow <command> [args]` (after global install; or `npx -y @dawipong/opcflow <command>` without installing). Global `--project=<path>` sets the project
147
- root (otherwise it searches upward for `workbench.config.json`). File-path arguments are separated with
148
- `--` (e.g. `submit --actor=x -- <path>`).
146
+ `opcflow <command> [args]` (after a global install; or `npx -y @dawipong/opcflow <command>` without installing). Approval actions (approve/reject) are human-only; the AI uses the MCP `wb_*` typed tools.
149
147
 
150
- **Tasks**
148
+ **Each command's purpose, when to use it, and parameters are in [COMMANDS.en.md](COMMANDS.en.md).** At a glance:
151
149
 
152
- | Command | Purpose | Parameters |
153
- | --- | --- | --- |
154
- | `list` | list tasks | `--status` `--assignee` `--module` `--role` `--endpoint` `--type` `--stale=true` |
155
- | `show <id>` | task detail (events / outputs / stale) | `--json=true` |
156
- | `create` | create a task | required `--role` `--creator`; opt `--module` `--endpoint` `--page` `--type` `--assignee` `--content` |
157
- | `claim <id>` | claim (passes the gate, auto-snapshots deps) | `--assignee=<role>` |
158
- | `update <id>` | change status | `--status` `--operator`; `--force=true` bypasses the stale block (traced) |
159
- | `remove <id>` | delete a task | `--operator`; `--force=true` |
160
- | `record <id> "note"` | add a note | `--operator` |
161
- | `input <id> -- <path>` | declare a dependency read outside the gate | `--operator` |
162
-
163
- **Outputs**
164
-
165
- | Command | Purpose | Parameters |
166
- | --- | --- | --- |
167
- | `output -- <path>` | register an output (auto-links your claimed task) | required `--role` `--endpoint`; opt `--module` `--page` `--task` |
168
- | `artifacts` | list artifacts | `--module` `--endpoint` `--page` `--kind` |
169
- | `scan` | full scan & register (docs + codeRoots), derive DAG edges | `--actor` |
170
- | `move --from=<> --to=<>` | move an artifact (keeps id, keeps approval) | `--actor` |
171
-
172
- **Trust**
173
-
174
- | Command | Purpose | Parameters |
175
- | --- | --- | --- |
176
- | `submit -- <path>` | submit for review | `--actor` |
177
- | `approve -- <path>` | approve | `--actor`; `--trivial=true` for tweaks: re-bless downstream + close derived reviews |
178
- | `reject -- <path>` | reject | `--actor` `--reason` |
179
- | `feedback -- <path>` | feedback / 👍👎 (release prototype) | `--actor` `--verdict=+1\|-1`; opt `--comment` `--task` |
180
- | `dispute -- <path>` | trace an objection to approved content and stop for a ruling | `--actor` `--reason` |
181
- | `queue` | review queue (pending + invalidated) | — |
182
- | `sync` | reconcile: invalidation propagation + dispatch review | `--actor` |
183
-
184
- **Flow**
185
-
186
- | Command | Purpose | Parameters |
187
- | --- | --- | --- |
188
- | `plan` | dispatch downstream tasks once contracts are approved | `--module`; opt `--creator` |
189
- | `qa <id>` | record acceptance result (fail auto-dispatches rework) | `--result=pass\|fail` `--operator`; fail needs `--reason` |
190
- | `audit` | module contract reconciliation report (settlement status) | `--module` |
191
- | `graph` | emit a Mermaid dependency graph | `--module` |
192
- | `lint` | run protocol lints | opt `--role` `--endpoint` |
193
- | `events` | event stream | `--taskId`/`<id>` `--module` `--event` `--limit` `--json` |
194
- | `intake` | pull GitHub issues into the queue (standard lane / hotfix) | — |
195
-
196
- **Evolution / Maintenance**
197
-
198
- | Command | Purpose | Parameters |
199
- | --- | --- | --- |
200
- | `retro` | retrospective: skill candidates / Red Flags / approval throughput | opt `--module` `--json` |
201
- | `export` | export events/feedback as jsonl | — |
202
- | `init` | bootstrap a new project | `--endpoints` (required); `--platforms` `--model` `--writehooks=false` `--preset=false` `--hooks=false` |
203
- | `gen-agents` | regenerate agent definitions from templates | — |
204
- | `register-meta` | register meta artifacts (agent-def/skill/plan) | `--actor` |
205
- | `install-hooks` | install git hooks | — |
206
- | `migrate` | migrate a legacy DB | `--from=<path>` |
207
-
208
- > On the AI side, prefer the MCP `wb_*` typed tools (same source & transaction as the CLI). **approve/reject are deliberately not exposed to the AI — those are your actions.**
150
+ - **Tasks** `list` · `show` · `create` · `claim` · `update` · `remove` · `record` · `input`
151
+ - **Outputs** `output` · `artifacts` · `scan` · `move`
152
+ - **Trust** `submit` · `approve` · `reject` · `feedback` · `dispute` · `queue` · `sync`
153
+ - **Flow** `plan` · `qa` · `audit` · `graph` · `lint` · `events` · `intake`
154
+ - **Evolution / Maintenance** `retro` · `export` · `init` · `gen-agents` · `register-meta` · `install-hooks` · `migrate`
155
+ - **Service & Integration** `serve` · `mcp` · `hook` · `postcommit` (mostly auto-invoked by platform / git)
209
156
 
210
157
  ## Configuration (workbench.config.json)
211
158
 
159
+ Generated by `init`, hand-edited afterwards — each project's coordinate system and discipline switches. **Every field's purpose, default, and when to tune it is in [CONFIG.en.md](CONFIG.en.md).**
160
+
212
161
  ```jsonc
213
162
  {
214
- "platforms": ["claude", "cursor"], // target platforms (picked by init), default ["claude"]
163
+ "platforms": ["claude", "cursor"], // target platforms
215
164
  "endpoints": ["service", "web"], // your endpoints
216
- "pipeline": ["product-manager", "architect", "designer", "developer", "qa"], // role pipeline (excluded roles get no tasks)
217
- "codeRoots": { // [required] code dir per endpoint, {module} placeholder
218
- "service": ["service/src/modules/{module}"],
219
- "web": ["web/src/pages/{module}"]
220
- },
221
- "moduleMapping": { "userProfile": "user" }, // merge fine modules into coarse ones
222
- "machineChecks": { "enabled": false, // run on developer complete
223
- "service": ["cd service && npx tsc --noEmit"] },
224
- "protocolLints": [ // machine-checkable conventions → lints (violations block complete)
225
- { "name": "no-page-size", "grep": "pageSize", "paths": ["service/src"] }
226
- ],
227
- "gates": {
228
- "approvalMode": "warn", // warn = unreviewed only warns / enforce = blocks
229
- "writeGate": "observe" // off / observe (log only) / enforce (block edits to approved contracts)
230
- },
231
- "git": { "taskTrailer": "off", "trailerKey": "Task" } // on = inject a Task:#id attribution trailer on commit
165
+ "pipeline": ["product-manager", "architect", "designer", "developer", "qa"],
166
+ "codeRoots": { "service": ["service/src/modules/{module}"] }, // [required] code dir per endpoint, {module} placeholder
167
+ "gates": { "approvalMode": "warn", "writeGate": "observe" } // approval / write-gate discipline levels
232
168
  }
233
169
  ```
234
170
 
@@ -242,9 +178,8 @@ here.
242
178
  ## Scripts
243
179
 
244
180
  ```bash
245
- pnpm start # start the opcflow (build frontend + start server; use for first run)
246
- pnpm run serve # server only, no frontend build (404 if web/dist is missing)
247
- pnpm run web:build # build the frontend
181
+ pnpm run web:build # build the frontend (required before first serve, else web/dist is missing → 404)
182
+ pnpm exec tsx cli.ts serve # start the workbench from source http://127.0.0.1:5620
248
183
  pnpm test # core unit tests
249
184
  pnpm run typecheck # type check
250
185
  pnpm run check:isolation # zero business-coupling check
package/README.md CHANGED
@@ -129,93 +129,30 @@ flowchart LR
129
129
  > `docs/design/prototypes/<端>/<模块>/<页面>.html`,`scan` 登记后照常走 👍 放行——两条路径产出的原型
130
130
  > 在体系里等价,都要过用户 👍。
131
131
 
132
- ## CLI 命令参数
132
+ ## CLI 命令
133
133
 
134
- 所有命令:`opcflow <命令> [参数]`(全局装后即用;或 `npx -y @dawipong/opcflow <命令>` 免装)。全局 `--project=<路径>` 指定项目根(缺省向上找
135
- `workbench.config.json`)。文件路径参数用 `--` 分隔(如 `submit --actor=x -- <路径>`)。
134
+ `opcflow <命令> [参数]`(全局装后即用;或 `npx -y @dawipong/opcflow <命令>` 免装)。审批类动作(approve/reject)只给人,AI 侧走 MCP 的 `wb_*` typed tools。
136
135
 
137
- **任务**
136
+ **每条命令的作用、使用场景与参数见 [COMMANDS.md](COMMANDS.md)。** 速览:
138
137
 
139
- | 命令 | 作用 | 参数 |
140
- | --- | --- | --- |
141
- | `list` | 列任务 | `--status` `--assignee` `--module` `--role` `--endpoint` `--type` `--stale=true` |
142
- | `show <id>` | 任务详情(含事件/产出/stale) | `--json=true` |
143
- | `create` | 建任务 | 必填 `--role` `--creator`;选 `--module` `--endpoint` `--page` `--type` `--assignee` `--content` |
144
- | `claim <id>` | 领取( gate,自动快照依赖) | `--assignee=<角色>` |
145
- | `update <id>` | 改状态 | `--status` `--operator`;`--force=true` 越过 stale 拦截(留痕) |
146
- | `remove <id>` | 删任务 | `--operator`;`--force=true` |
147
- | `record <id> "备注"` | 加备注 | `--operator` |
148
- | `input <id> -- <路径>` | 补充申报 gate 之外读过的依赖 | `--operator` |
149
-
150
- **产出**
151
-
152
- | 命令 | 作用 | 参数 |
153
- | --- | --- | --- |
154
- | `output -- <路径>` | 登记产物(自动关联你领取的任务) | 必填 `--role` `--endpoint`;选 `--module` `--page` `--task` |
155
- | `artifacts` | 列产物 | `--module` `--endpoint` `--page` `--kind` |
156
- | `scan` | 全量扫描登记(docs + codeRoots),推导 DAG 边 | `--actor` |
157
- | `move --from=<> --to=<>` | 移动产物(保 id、不断审批) | `--actor` |
158
-
159
- **信任**
160
-
161
- | 命令 | 作用 | 参数 |
162
- | --- | --- | --- |
163
- | `submit -- <路径>` | 送审 | `--actor` |
164
- | `approve -- <路径>` | 批准 | `--actor`;`--trivial=true` 微调:re-bless 下游 + 关派生 review |
165
- | `reject -- <路径>` | 打回 | `--actor` `--reason` |
166
- | `feedback -- <路径>` | 反馈 / 👍👎(原型放行) | `--actor` `--verdict=+1\|-1`;选 `--comment` `--task` |
167
- | `dispute -- <路径>` | 对 approved 内容留痕异议,停下等裁决 | `--actor` `--reason` |
168
- | `queue` | 待审队列(pending + invalidated) | — |
169
- | `sync` | 对账:失效传播 + 沿图派 review | `--actor` |
170
-
171
- **流程**
172
-
173
- | 命令 | 作用 | 参数 |
174
- | --- | --- | --- |
175
- | `plan` | 契约全批后一键派发下游任务 | `--module`;选 `--creator` |
176
- | `qa <id>` | 记验收结果(fail 自动派 rework) | `--result=pass\|fail` `--operator`;fail 需 `--reason` |
177
- | `audit` | 模块契约对账报告(清算状态) | `--module` |
178
- | `graph` | 输出 Mermaid 依赖图 | `--module` |
179
- | `lint` | 跑协议 lint | 选 `--role` `--endpoint` |
180
- | `events` | 事件流 | `--taskId`/`<id>` `--module` `--event` `--limit` `--json` |
181
- | `intake` | 拉 GitHub issue 入队(标准道 / hotfix) | — |
182
-
183
- **进化 / 维护**
184
-
185
- | 命令 | 作用 | 参数 |
186
- | --- | --- | --- |
187
- | `retro` | 复盘:skill 候选 / Red Flag / 审批吞吐 | 选 `--module` `--json` |
188
- | `export` | 导出 events/feedback 为 jsonl | — |
189
- | `init` | 新项目引导 | `--endpoints`(必填);`--platforms` `--model` `--writehooks=false` `--preset=false` `--hooks=false` |
190
- | `gen-agents` | 从模板重生成 agent 定义 | — |
191
- | `register-meta` | 注册元产物(agent-def/skill/plan) | `--actor` |
192
- | `install-hooks` | 安装 git hooks | — |
193
- | `migrate` | 迁移旧库 | `--from=<路径>` |
194
-
195
- > AI 侧优先用 MCP 的 `wb_*` typed tools(与 CLI 同源同事务);**审批 approve/reject 刻意不暴露给 AI——那是你的动作**。
138
+ - **任务** `list` · `show` · `create` · `claim` · `update` · `remove` · `record` · `input`
139
+ - **产出** `output` · `artifacts` · `scan` · `move`
140
+ - **信任** `submit` · `approve` · `reject` · `feedback` · `dispute` · `queue` · `sync`
141
+ - **流程** `plan` · `qa` · `audit` · `graph` · `lint` · `events` · `intake`
142
+ - **进化 / 维护** `retro` · `export` · `init` · `gen-agents` · `register-meta` · `install-hooks` · `migrate`
143
+ - **服务与集成** `serve` · `mcp` · `hook` · `postcommit`(多由平台 / git 自动调用)
196
144
 
197
145
  ## 配置(workbench.config.json)
198
146
 
147
+ `init` 生成、之后手工编辑,是每个项目的坐标系与纪律开关。**每个字段的作用、默认值与何时调,见 [CONFIG.md](CONFIG.md)。**
148
+
199
149
  ```jsonc
200
150
  {
201
- "platforms": ["claude", "cursor"], // 目标平台(init 选),缺省 ["claude"]
151
+ "platforms": ["claude", "cursor"], // 目标平台
202
152
  "endpoints": ["service", "web"], // 你的端
203
- "pipeline": ["product-manager", "architect", "designer", "developer", "qa"], // 角色流水线(不含的角色不派任务)
204
- "codeRoots": { // 【必填】每端代码目录,{module} 占位
205
- "service": ["service/src/modules/{module}"],
206
- "web": ["web/src/pages/{module}"]
207
- },
208
- "moduleMapping": { "userProfile": "user" }, // 细模块归并到粗模块
209
- "machineChecks": { "enabled": false, // developer complete 时跑
210
- "service": ["cd service && npx tsc --noEmit"] },
211
- "protocolLints": [ // 能机器查的约定 → 降级为 lint(违例阻断 complete)
212
- { "name": "no-page-size", "grep": "pageSize", "paths": ["service/src"] }
213
- ],
214
- "gates": {
215
- "approvalMode": "warn", // warn=未批只警告 / enforce=阻断
216
- "writeGate": "observe" // off / observe(只记录)/ enforce(拦改 approved 契约)
217
- },
218
- "git": { "taskTrailer": "off", "trailerKey": "Task" } // on=提交注入 Task:#id 归因 trailer
153
+ "pipeline": ["product-manager", "architect", "designer", "developer", "qa"],
154
+ "codeRoots": { "service": ["service/src/modules/{module}"] }, // 【必填】每端代码目录,{module} 占位
155
+ "gates": { "approvalMode": "warn", "writeGate": "observe" } // 审批 / 写门禁纪律档位
219
156
  }
220
157
  ```
221
158
 
@@ -228,9 +165,8 @@ iframe / 代码渲染、**待审队列 diff**(approved 版本 vs 当前)、事
228
165
  ## 脚本
229
166
 
230
167
  ```bash
231
- pnpm start # 启动工作台(build 前端 + 起 server;首次用它)
232
- pnpm run serve # 只起 server,不 build 前端(web/dist 未生成会 404)
233
- pnpm run web:build # 构建前端
168
+ pnpm run web:build # 构建前端(工作台首次运行前需先构建,否则 web/dist 未生成会 404)
169
+ pnpm exec tsx cli.ts serve # 从源码起工作台 http://127.0.0.1:5620
234
170
  pnpm test # core 单元测试
235
171
  pnpm run typecheck # 类型检查
236
172
  pnpm run check:isolation # 零业务耦合校验
package/dist/cli.mjs CHANGED
@@ -2528,7 +2528,7 @@ function deriveEdges(ctx) {
2528
2528
  return created;
2529
2529
  }
2530
2530
  function scanArtifacts(ctx, actor = "system") {
2531
- const summary = { registered: 0, refreshed: 0, edges: 0, skipped: [] };
2531
+ const summary = { registered: 0, refreshed: 0, remapped: 0, edges: 0, skipped: [] };
2532
2532
  const files = [];
2533
2533
  for (const dir of Object.values(ctx.config.docs)) {
2534
2534
  const abs = join10(ctx.root, dir);
@@ -2537,7 +2537,12 @@ function scanArtifacts(ctx, actor = "system") {
2537
2537
  for (const p of ["ARCHITECTURE.md", "TECH.md"]) {
2538
2538
  if (existsSync9(join10(ctx.root, p))) files.push(p);
2539
2539
  }
2540
- const exists = ctx.db.prepare("SELECT id, content_hash FROM artifacts WHERE path = ?");
2540
+ const exists = ctx.db.prepare(
2541
+ "SELECT id, kind, module, endpoint, page, content_hash FROM artifacts WHERE path = ?"
2542
+ );
2543
+ const remap = ctx.db.prepare(
2544
+ "UPDATE artifacts SET kind = ?, module = ?, endpoint = ?, page = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?"
2545
+ );
2541
2546
  const insert = ctx.db.prepare(
2542
2547
  "INSERT INTO artifacts (kind, module, endpoint, page, path, content_hash) VALUES (?, ?, ?, ?, ?, ?)"
2543
2548
  );
@@ -2547,6 +2552,27 @@ function scanArtifacts(ctx, actor = "system") {
2547
2552
  const before = row.content_hash;
2548
2553
  const after = refreshArtifact(ctx, { id: row.id }, actor);
2549
2554
  if (after.content_hash !== before) summary.refreshed++;
2555
+ if (row.kind !== kind || row.module !== coords.module || row.endpoint !== coords.endpoint || row.page !== coords.page) {
2556
+ const tx2 = ctx.db.transaction(() => {
2557
+ remap.run(kind, coords.module, coords.endpoint, coords.page, row.id);
2558
+ logEvent(ctx.db, {
2559
+ entityType: "artifact",
2560
+ entityId: row.id,
2561
+ event: "coords_remapped",
2562
+ actor,
2563
+ payload: {
2564
+ path: relPath,
2565
+ from: { kind: row.kind, module: row.module, endpoint: row.endpoint, page: row.page },
2566
+ to: { kind, module: coords.module, endpoint: coords.endpoint, page: coords.page }
2567
+ },
2568
+ module: coords.module,
2569
+ endpoint: coords.endpoint,
2570
+ page: coords.page
2571
+ });
2572
+ });
2573
+ tx2();
2574
+ summary.remapped++;
2575
+ }
2550
2576
  return;
2551
2577
  }
2552
2578
  const hash = hashPath(join10(ctx.root, relPath));
@@ -4411,7 +4437,7 @@ async function runCommand(ctx, command, a) {
4411
4437
  }
4412
4438
  case "scan": {
4413
4439
  const s = scanArtifacts(ctx, a.actor || "system");
4414
- console.log(chalk.green(`\u2705 \u626B\u63CF\u5B8C\u6210:\u65B0\u767B\u8BB0 ${s.registered},\u5185\u5BB9\u5237\u65B0 ${s.refreshed},\u65B0\u589E\u8FB9 ${s.edges},\u6392\u9664\u5143\u4EA7\u7269 ${s.skipped.length}`));
4440
+ console.log(chalk.green(`\u2705 \u626B\u63CF\u5B8C\u6210:\u65B0\u767B\u8BB0 ${s.registered},\u5185\u5BB9\u5237\u65B0 ${s.refreshed},\u91CD\u6302\u5750\u6807 ${s.remapped},\u65B0\u589E\u8FB9 ${s.edges},\u6392\u9664\u5143\u4EA7\u7269 ${s.skipped.length}`));
4415
4441
  break;
4416
4442
  }
4417
4443
  case "move": {
@@ -4466,9 +4492,12 @@ function fail(msg) {
4466
4492
  }
4467
4493
 
4468
4494
  // cli.ts
4469
- init_core();
4470
4495
  async function main() {
4471
4496
  const { command, a } = parseArgs(process.argv.slice(2));
4497
+ if (!command || command === "-h" || command === "--help" || command === "help") {
4498
+ console.log(HELP);
4499
+ return;
4500
+ }
4472
4501
  if (command === "init") {
4473
4502
  await runInit(a.project || process.cwd(), a);
4474
4503
  return;
@@ -4534,10 +4563,6 @@ async function main() {
4534
4563
  return;
4535
4564
  }
4536
4565
  const ctx = openWorkbench(a.project);
4537
- if (!command) {
4538
- printTasks(listTasks(ctx, {}));
4539
- return;
4540
- }
4541
4566
  try {
4542
4567
  await runCommand(ctx, command, a);
4543
4568
  } catch (err) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dawipong/opcflow",
3
- "version": "0.1.1",
3
+ "version": "0.2.1",
4
4
  "description": "Spec-anchored, drift-enforced execution layer for AI coding agents — artifact DAG, trust gates, multi-role pipeline; generates agents/MCP/hooks for Claude Code, Codex, OpenCode & Cursor.",
5
5
  "license": "MIT",
6
6
  "author": "Dawi",
@@ -44,9 +44,7 @@
44
44
  "check:isolation": "tsx scripts/check-isolation.ts",
45
45
  "web:build": "vite build",
46
46
  "build": "pnpm run web:build && node scripts/build.mjs",
47
- "prepublishOnly": "pnpm run build",
48
- "serve": "tsx cli.ts serve",
49
- "start": "pnpm run web:build && tsx cli.ts serve"
47
+ "prepublishOnly": "pnpm run build"
50
48
  },
51
49
  "dependencies": {
52
50
  "@fastify/cors": "^11",
@@ -68,7 +66,7 @@
68
66
  "@types/node": "^22",
69
67
  "@types/react": "^18",
70
68
  "@types/react-dom": "^18",
71
- "@vitejs/plugin-react": "^5",
69
+ "@vitejs/plugin-react": "^6",
72
70
  "antd": "^6",
73
71
  "esbuild": "^0.28.1",
74
72
  "mermaid": "^11",
@@ -79,6 +77,6 @@
79
77
  "semantic-release": "^25.0.5",
80
78
  "tsx": "^4",
81
79
  "typescript": "^5.5.0",
82
- "vite": "^7"
80
+ "vite": "^8"
83
81
  }
84
82
  }
@@ -0,0 +1 @@
1
+ import{m as e}from"./src-W4W9ly-y.js";import{n as t}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import"./chunk-WYO6CB5R-BaRUDpDl.js";import"./index-DVXPy-Pj.js";import{m as n,t as r}from"./mermaid-parser.core-CAAH_OSq.js";import{n as i,r as a,t as o}from"./chunk-MOJQB5TN-Y0jSjq4a.js";import{t as s}from"./chunk-JWPE2WC7-DVXcaiue.js";var c=n().RailroadAbnf.parser.LangiumParser,l=t(e=>{let t=e.alternatives.map(u);return t.length===1?t[0]:{type:`choice`,alternatives:t}},`transformAlternation`),u=t(e=>{let t=e.elements.map(f);return t.length===1?t[0]:{type:`sequence`,elements:t}},`transformConcatenation`),d=t(e=>{if(e.includes(`*`)){let[t,n]=e.split(`*`);return{min:t?parseInt(t,10):0,max:n?parseInt(n,10):1/0}}let t=parseInt(e,10);return{min:t,max:t}},`parseRepeat`),f=t(e=>{let t=p(e.primary);if(!e.repeat)return t;let{min:n,max:r}=d(e.repeat);return n===0&&r===1?{type:`optional`,element:t}:{type:`repetition`,element:t,min:n,max:r}},`transformElement`),p=t(e=>{switch(e.$type){case`AbnfStringLiteral`:return{type:`terminal`,value:e.value};case`AbnfNumVal`:return{type:`terminal`,value:e.value};case`AbnfRuleName`:return{type:`nonterminal`,name:e.name};case`AbnfGroup`:return l(e.element);case`AbnfOptionalGroup`:return{type:`optional`,element:l(e.element)};default:throw Error(`Unsupported ABNF primary node: ${e.$type}`)}},`transformPrimary`),m=t(e=>({name:e.name,definition:l(e.definition)}),`transformRule`),h=t(e=>{s(e,o),e.title&&o.setTitle(e.title),e.rules.map(e=>o.addRule(m(e)))},`populateDb`),g={parser:{parse:t(t=>{o.clear(),e.debug(`[ABNF Parser] Starting Langium parse`);let n=c.parse(t);if(n.lexerErrors.length>0||n.parserErrors.length>0)throw new r(n);let i=n.value;e.debug(`[ABNF Parser] Parsed rules:`,i.rules.length),h(i),e.debug(`[ABNF Parser] Parse complete`)},`parse`),parser:{yy:o}},db:o,renderer:a,styles:i};export{g as diagram};
@@ -0,0 +1 @@
1
+ import{n as e,t}from"./path-BWPyau1x.js";import{a as n,c as r,d as i,f as a,i as o,l as s,m as c,n as l,o as u,p as d,r as f,u as p}from"./dist-zlHGdC4Y.js";function m(e){return e.innerRadius}function h(e){return e.outerRadius}function g(e){return e.startAngle}function _(e){return e.endAngle}function v(e){return e&&e.padAngle}function y(e,t,n,r,i,a,o,s){var c=n-e,l=r-t,u=o-i,d=s-a,f=d*c-u*l;if(!(f*f<1e-12))return f=(u*(t-a)-d*(e-i))/f,[e+f*c,t+f*l]}function b(e,t,n,r,i,a,o){var c=e-n,l=t-r,u=(o?a:-a)/d(c*c+l*l),f=u*l,p=-u*c,m=e+f,h=t+p,g=n+f,_=r+p,v=(m+g)/2,y=(h+_)/2,b=g-m,x=_-h,S=b*b+x*x,C=i-a,w=m*_-g*h,T=(x<0?-1:1)*d(s(0,C*C*S-w*w)),E=(w*x-b*T)/S,D=(-w*b-x*T)/S,O=(w*x+b*T)/S,k=(-w*b+x*T)/S,A=E-v,j=D-y,M=O-v,N=k-y;return A*A+j*j>M*M+N*N&&(E=O,D=k),{cx:E,cy:D,x01:-f,y01:-p,x11:E*(i/C-1),y11:D*(i/C-1)}}function x(){var s=m,x=h,S=e(0),C=null,w=g,T=_,E=v,D=null,O=t(k);function k(){var e,t,m=+s.apply(this,arguments),h=+x.apply(this,arguments),g=w.apply(this,arguments)-r,_=T.apply(this,arguments)-r,v=l(_-g),k=_>g;if(D||=e=O(),h<m&&(t=h,h=m,m=t),!(h>1e-12))D.moveTo(0,0);else if(v>c-1e-12)D.moveTo(h*u(g),h*a(g)),D.arc(0,0,h,g,_,!k),m>1e-12&&(D.moveTo(m*u(_),m*a(_)),D.arc(0,0,m,_,g,k));else{var A=g,j=_,M=g,N=_,P=v,F=v,I=E.apply(this,arguments)/2,L=I>1e-12&&(C?+C.apply(this,arguments):d(m*m+h*h)),R=p(l(h-m)/2,+S.apply(this,arguments)),z=R,B=R,V,H;if(L>1e-12){var U=o(L/m*a(I)),W=o(L/h*a(I));(P-=U*2)>1e-12?(U*=k?1:-1,M+=U,N-=U):(P=0,M=N=(g+_)/2),(F-=W*2)>1e-12?(W*=k?1:-1,A+=W,j-=W):(F=0,A=j=(g+_)/2)}var G=h*u(A),K=h*a(A),q=m*u(N),J=m*a(N);if(R>1e-12){var Y=h*u(j),X=h*a(j),Z=m*u(M),Q=m*a(M),$;if(v<i)if($=y(G,K,Z,Q,Y,X,q,J)){var ee=G-$[0],te=K-$[1],ne=Y-$[0],re=X-$[1],ie=1/a(f((ee*ne+te*re)/(d(ee*ee+te*te)*d(ne*ne+re*re)))/2),ae=d($[0]*$[0]+$[1]*$[1]);z=p(R,(m-ae)/(ie-1)),B=p(R,(h-ae)/(ie+1))}else z=B=0}F>1e-12?B>1e-12?(V=b(Z,Q,G,K,h,B,k),H=b(Y,X,q,J,h,B,k),D.moveTo(V.cx+V.x01,V.cy+V.y01),B<R?D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,B,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,h,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),!k),D.arc(H.cx,H.cy,B,n(H.y11,H.x11),n(H.y01,H.x01),!k))):(D.moveTo(G,K),D.arc(0,0,h,A,j,!k)):D.moveTo(G,K),!(m>1e-12)||!(P>1e-12)?D.lineTo(q,J):z>1e-12?(V=b(q,J,Y,X,m,-z,k),H=b(G,K,Z,Q,m,-z,k),D.lineTo(V.cx+V.x01,V.cy+V.y01),z<R?D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(H.y01,H.x01),!k):(D.arc(V.cx,V.cy,z,n(V.y01,V.x01),n(V.y11,V.x11),!k),D.arc(0,0,m,n(V.cy+V.y11,V.cx+V.x11),n(H.cy+H.y11,H.cx+H.x11),k),D.arc(H.cx,H.cy,z,n(H.y11,H.x11),n(H.y01,H.x01),!k))):D.arc(0,0,m,N,M,k)}if(D.closePath(),e)return D=null,e+``||null}return k.centroid=function(){var e=(+s.apply(this,arguments)+ +x.apply(this,arguments))/2,t=(+w.apply(this,arguments)+ +T.apply(this,arguments))/2-i/2;return[u(t)*e,a(t)*e]},k.innerRadius=function(t){return arguments.length?(s=typeof t==`function`?t:e(+t),k):s},k.outerRadius=function(t){return arguments.length?(x=typeof t==`function`?t:e(+t),k):x},k.cornerRadius=function(t){return arguments.length?(S=typeof t==`function`?t:e(+t),k):S},k.padRadius=function(t){return arguments.length?(C=t==null?null:typeof t==`function`?t:e(+t),k):C},k.startAngle=function(t){return arguments.length?(w=typeof t==`function`?t:e(+t),k):w},k.endAngle=function(t){return arguments.length?(T=typeof t==`function`?t:e(+t),k):T},k.padAngle=function(t){return arguments.length?(E=typeof t==`function`?t:e(+t),k):E},k.context=function(e){return arguments.length?(D=e??null,k):D},k}export{x as t};
@@ -0,0 +1 @@
1
+ import"./chunk-KEIR6QF5-BfrZ3jm6.js";import{M as e}from"./mermaid-parser.core-CAAH_OSq.js";export{e as createArchitectureServices};