@dawipong/opcflow 0.9.0 → 0.10.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 (41) hide show
  1. package/dist/cli.mjs +23 -4
  2. package/package.json +1 -1
  3. package/web/dist/assets/{abnfDiagram-VRR7QNED-D19VSiUB.js → abnfDiagram-VRR7QNED-CnWTNSpE.js} +1 -1
  4. package/web/dist/assets/{architectureDiagram-ZJ3FMSHR-CJIfwLFX.js → architectureDiagram-ZJ3FMSHR-VWO34lk2.js} +1 -1
  5. package/web/dist/assets/{chunk-EX3LRPZG-Dybqgi_R.js → chunk-EX3LRPZG-uvZmsCz5.js} +1 -1
  6. package/web/dist/assets/{chunk-MOJQB5TN-CaHrOT4b.js → chunk-MOJQB5TN-kgvZO8mh.js} +1 -1
  7. package/web/dist/assets/{chunk-PUDLZKDR-BmAYd1VC.js → chunk-PUDLZKDR-DpxgVMra.js} +1 -1
  8. package/web/dist/assets/{chunk-V7JOEXUC-Dnu3ng09.js → chunk-V7JOEXUC-Dapnw7q1.js} +1 -1
  9. package/web/dist/assets/{classDiagram-OUVF2IWQ-CumBxXHa.js → classDiagram-OUVF2IWQ-Dj-HxtUC.js} +1 -1
  10. package/web/dist/assets/{classDiagram-v2-EOCWNBFH-CumBxXHa.js → classDiagram-v2-EOCWNBFH-Dj-HxtUC.js} +1 -1
  11. package/web/dist/assets/{cynefinDiagram-TSTJHNR4-lP4XB4zv.js → cynefinDiagram-TSTJHNR4-DgsmI5ni.js} +1 -1
  12. package/web/dist/assets/{dagre-VKFMJZFB-Bd0-4hrw.js → dagre-VKFMJZFB-CGtYjfDT.js} +1 -1
  13. package/web/dist/assets/{diagram-G47NLZAW-Cv5bS2zU.js → diagram-G47NLZAW-Ds-W6sa0.js} +1 -1
  14. package/web/dist/assets/{diagram-NH7WQ7WH-D0t6TvWh.js → diagram-NH7WQ7WH-DOuZjIeJ.js} +1 -1
  15. package/web/dist/assets/{diagram-OA4YK3LP-4rWIlwgn.js → diagram-OA4YK3LP-DA2KLwKM.js} +1 -1
  16. package/web/dist/assets/{diagram-WEI45ONY-CwwshS2w.js → diagram-WEI45ONY-DWfXa0w_.js} +1 -1
  17. package/web/dist/assets/{ebnfDiagram-CCIWWBDH-Bh1RkpJ9.js → ebnfDiagram-CCIWWBDH-D14uZUD4.js} +1 -1
  18. package/web/dist/assets/{erDiagram-Q63AITRT-E5bP16-J.js → erDiagram-Q63AITRT-BIceg2Pk.js} +1 -1
  19. package/web/dist/assets/{flowDiagram-23GEKE2U-BAtJJjTJ.js → flowDiagram-23GEKE2U-BLms_ylv.js} +1 -1
  20. package/web/dist/assets/{ganttDiagram-NO4QXBWP-BiuqaxNH.js → ganttDiagram-NO4QXBWP-DAlK5TuK.js} +1 -1
  21. package/web/dist/assets/{index-xKffKKoc.js → index-Bqp1_f-s.js} +78 -78
  22. package/web/dist/assets/{infoDiagram-FWYZ7A6U-Co1V0oYE.js → infoDiagram-FWYZ7A6U-7mRQzInB.js} +1 -1
  23. package/web/dist/assets/{ishikawaDiagram-FXEZZL3T-BR58gOGl.js → ishikawaDiagram-FXEZZL3T-m2fCQ3C0.js} +1 -1
  24. package/web/dist/assets/{kanban-definition-HUTT4EX6-Cb1c-R71.js → kanban-definition-HUTT4EX6-XSazudN_.js} +1 -1
  25. package/web/dist/assets/{linear-DceE_QuD.js → linear-DRty47xH.js} +1 -1
  26. package/web/dist/assets/{mindmap-definition-LN4V7U3C-CqJlgVe3.js → mindmap-definition-LN4V7U3C-3Bj5A8oB.js} +1 -1
  27. package/web/dist/assets/{pegDiagram-2B236MQR-B-LFtMLT.js → pegDiagram-2B236MQR-CYPoakJr.js} +1 -1
  28. package/web/dist/assets/{pieDiagram-ENE6RG2P-ko7PN4ZC.js → pieDiagram-ENE6RG2P-BRZ4wSUu.js} +1 -1
  29. package/web/dist/assets/{quadrantDiagram-ABIIQ3AL-DtEPofEc.js → quadrantDiagram-ABIIQ3AL-CclAvLIN.js} +1 -1
  30. package/web/dist/assets/{railroadDiagram-RFXS5EU6-B-5wzc7X.js → railroadDiagram-RFXS5EU6-DPaOsVAE.js} +1 -1
  31. package/web/dist/assets/{requirementDiagram-TGXJPOKE-B3MZnN4A.js → requirementDiagram-TGXJPOKE-DUiw-EJj.js} +1 -1
  32. package/web/dist/assets/{sequenceDiagram-DBY2YBRQ-IIdjO_05.js → sequenceDiagram-DBY2YBRQ-CH9aabAW.js} +1 -1
  33. package/web/dist/assets/{stateDiagram-2N3HPSRC-BmkTfvco.js → stateDiagram-2N3HPSRC-BTw2pR1w.js} +1 -1
  34. package/web/dist/assets/{stateDiagram-v2-6OUMAXLB-DIGnr8jK.js → stateDiagram-v2-6OUMAXLB-bxEJ05w4.js} +1 -1
  35. package/web/dist/assets/{swimlanes-5IMT3BWC-Dy8N-IiF.js → swimlanes-5IMT3BWC-DYcRF_OF.js} +1 -1
  36. package/web/dist/assets/{swimlanesDiagram-G3AALYLV-7ULR3aAR.js → swimlanesDiagram-G3AALYLV-Ckz5Fq-H.js} +1 -1
  37. package/web/dist/assets/{timeline-definition-FHXFAJF6-BGFbzOm6.js → timeline-definition-FHXFAJF6-DLsyNHJW.js} +1 -1
  38. package/web/dist/assets/{vennDiagram-L72KCM5P-D81cM-yT.js → vennDiagram-L72KCM5P-BPNH_aJQ.js} +1 -1
  39. package/web/dist/assets/{wardleyDiagram-EHGQE667-DW4lo8Mc.js → wardleyDiagram-EHGQE667-DsA47KXe.js} +1 -1
  40. package/web/dist/assets/{xychartDiagram-FW5EYKEG-BBauB7MN.js → xychartDiagram-FW5EYKEG-BGk7WwLI.js} +1 -1
  41. package/web/dist/index.html +1 -1
package/dist/cli.mjs CHANGED
@@ -887,7 +887,8 @@ var init_roles = __esm({
887
887
  init_kind();
888
888
  DEFAULT_ROLE_REGISTRY = {
889
889
  "product-manager": {
890
- produces: ["project", "roles", "glossary", "flow", "module-prd", "page-prd"]
890
+ produces: ["project", "roles", "glossary", "flow", "module-prd", "page-prd"],
891
+ completeWithoutClaim: true
891
892
  },
892
893
  architect: {
893
894
  produces: ["db-doc", "api-doc"],
@@ -1168,7 +1169,7 @@ function completeOutputRequirement(ctx, task) {
1168
1169
  function validateComplete(ctx, task, status, opts = {}) {
1169
1170
  const warnings = [];
1170
1171
  if (status !== "completed") return { warnings, inputs: [] };
1171
- if (task.role !== "product-manager" && task.assignee === null) {
1172
+ if (task.assignee === null && !getRoleRegistry(ctx.config)[task.role]?.completeWithoutClaim) {
1172
1173
  throw new Error(`\u4EFB\u52A1\u5C1A\u672A\u88AB\u9886\u53D6,\u65E0\u6CD5\u66F4\u65B0\u72B6\u6001`);
1173
1174
  }
1174
1175
  if (task.type === "legacy") return { warnings, inputs: [] };
@@ -2102,6 +2103,9 @@ function updateTask(ctx, { id, status, operator, force = false }) {
2102
2103
  if (task.assignee !== null && task.assignee !== operator) {
2103
2104
  throw new Error(`\u53EA\u6709\u6267\u884C\u4EBA\u624D\u80FD\u66F4\u65B0\u4EFB\u52A1\u72B6\u6001`);
2104
2105
  }
2106
+ if (task.assignee === null && operator !== task.role && operator !== task.creator) {
2107
+ throw new Error(`\u672A\u9886\u53D6\u7684\u4EFB\u52A1\u4EC5\u521B\u5EFA\u8005\u6216\u89D2\u8272\u672C\u4EBA\u53EF\u66F4\u65B0\u72B6\u6001`);
2108
+ }
2105
2109
  const { warnings } = validateComplete(ctx, task, status, { force });
2106
2110
  let followupQaId = null;
2107
2111
  const tx = ctx.db.transaction(() => {
@@ -2866,6 +2870,9 @@ function recordQaResult(ctx, p) {
2866
2870
  return { reworkTaskId: null };
2867
2871
  }
2868
2872
  const reworkRole = ownerRoleOf(ctx.config, "code") ?? "developer";
2873
+ if (getRoleRegistry(ctx.config)[reworkRole]?.onQaFail !== "rework") {
2874
+ return { reworkTaskId: null };
2875
+ }
2869
2876
  const tx2 = ctx.db.transaction(() => {
2870
2877
  const result = ctx.db.prepare(
2871
2878
  `INSERT INTO tasks (module, role, endpoint, page, type, status, assignee, creator, content)
@@ -3940,13 +3947,25 @@ function guardedAbsPath(ctx, artifact, rel) {
3940
3947
  async function createServer(ctx) {
3941
3948
  const app = Fastify({ logger: false });
3942
3949
  await app.register(fastifyCors, { origin: true });
3950
+ const authToken = ctx.config.server?.authToken;
3951
+ if (authToken) {
3952
+ app.addHook("preHandler", async (req, reply) => {
3953
+ if (req.method === "GET" || req.method === "HEAD" || req.method === "OPTIONS") return;
3954
+ if (req.headers["x-workbench-token"] !== authToken) {
3955
+ return reply.code(401).send({ error: "\u7F3A\u5C11\u6216\u9519\u8BEF\u7684 x-workbench-token(\u8BE5\u5DE5\u4F5C\u53F0\u5DF2\u542F\u7528\u5199\u4FDD\u62A4)" });
3956
+ }
3957
+ });
3958
+ }
3943
3959
  const webDist = join17(WORKBENCH_DIR, "web/dist");
3944
3960
  if (existsSync15(webDist)) {
3945
3961
  await app.register(fastifyStatic, { root: webDist });
3946
3962
  }
3947
- const protoRoot = join17(ctx.root, ctx.config.docs.design, "prototypes");
3963
+ const protoPattern = getKindRegistry(ctx.config).prototype.pathPatterns?.[0];
3964
+ const protoRel = (protoPattern ? expandPattern(protoPattern, ctx.config) : `${ctx.config.docs.design}/prototypes/`).replace(/\/+$/, "");
3965
+ const protoRoot = join17(ctx.root, protoRel);
3948
3966
  mkdirSync8(protoRoot, { recursive: true });
3949
3967
  await app.register(fastifyStatic, { root: protoRoot, prefix: "/proto/", decorateReply: false });
3968
+ const previewUrlOf = (a) => a.path.startsWith(protoRel + "/") ? encodeURI(`/proto/${a.path.slice(protoRel.length + 1)}`) : null;
3950
3969
  app.get("/api/meta", async () => ({
3951
3970
  root: ctx.root,
3952
3971
  language: ctx.config.language,
@@ -3986,7 +4005,7 @@ async function createServer(ctx) {
3986
4005
  } else if (statSync6(abs).size <= MAX_INLINE_SIZE) {
3987
4006
  content = readFileSync8(abs, "utf-8");
3988
4007
  }
3989
- return { artifact, content, isDirectory, missing, feedback, events };
4008
+ return { artifact, content, isDirectory, missing, feedback, events, previewUrl: previewUrlOf(artifact) };
3990
4009
  });
3991
4010
  app.get("/api/artifact/:id/files", async (req) => {
3992
4011
  const artifact = getArtifact(ctx, parseInt(req.params.id));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dawipong/opcflow",
3
- "version": "0.9.0",
3
+ "version": "0.10.0",
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",
@@ -1 +1 @@
1
- import{E as e}from"./src-Bp5IDfvJ.js";import{n as t}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import"./chunk-WYO6CB5R-C0vPAP7X.js";import"./index-xKffKKoc.js";import{m as n,t as r}from"./mermaid-parser.core-CICKlqAN.js";import{n as i,r as a,t as o}from"./chunk-MOJQB5TN-CaHrOT4b.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};
1
+ import{E as e}from"./src-Bp5IDfvJ.js";import{n as t}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import"./chunk-WYO6CB5R-C0vPAP7X.js";import"./index-Bqp1_f-s.js";import{m as n,t as r}from"./mermaid-parser.core-CICKlqAN.js";import{n as i,r as a,t as o}from"./chunk-MOJQB5TN-kgvZO8mh.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};