@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.
- package/dist/cli.mjs +23 -4
- package/package.json +1 -1
- package/web/dist/assets/{abnfDiagram-VRR7QNED-D19VSiUB.js → abnfDiagram-VRR7QNED-CnWTNSpE.js} +1 -1
- package/web/dist/assets/{architectureDiagram-ZJ3FMSHR-CJIfwLFX.js → architectureDiagram-ZJ3FMSHR-VWO34lk2.js} +1 -1
- package/web/dist/assets/{chunk-EX3LRPZG-Dybqgi_R.js → chunk-EX3LRPZG-uvZmsCz5.js} +1 -1
- package/web/dist/assets/{chunk-MOJQB5TN-CaHrOT4b.js → chunk-MOJQB5TN-kgvZO8mh.js} +1 -1
- package/web/dist/assets/{chunk-PUDLZKDR-BmAYd1VC.js → chunk-PUDLZKDR-DpxgVMra.js} +1 -1
- package/web/dist/assets/{chunk-V7JOEXUC-Dnu3ng09.js → chunk-V7JOEXUC-Dapnw7q1.js} +1 -1
- package/web/dist/assets/{classDiagram-OUVF2IWQ-CumBxXHa.js → classDiagram-OUVF2IWQ-Dj-HxtUC.js} +1 -1
- package/web/dist/assets/{classDiagram-v2-EOCWNBFH-CumBxXHa.js → classDiagram-v2-EOCWNBFH-Dj-HxtUC.js} +1 -1
- package/web/dist/assets/{cynefinDiagram-TSTJHNR4-lP4XB4zv.js → cynefinDiagram-TSTJHNR4-DgsmI5ni.js} +1 -1
- package/web/dist/assets/{dagre-VKFMJZFB-Bd0-4hrw.js → dagre-VKFMJZFB-CGtYjfDT.js} +1 -1
- package/web/dist/assets/{diagram-G47NLZAW-Cv5bS2zU.js → diagram-G47NLZAW-Ds-W6sa0.js} +1 -1
- package/web/dist/assets/{diagram-NH7WQ7WH-D0t6TvWh.js → diagram-NH7WQ7WH-DOuZjIeJ.js} +1 -1
- package/web/dist/assets/{diagram-OA4YK3LP-4rWIlwgn.js → diagram-OA4YK3LP-DA2KLwKM.js} +1 -1
- package/web/dist/assets/{diagram-WEI45ONY-CwwshS2w.js → diagram-WEI45ONY-DWfXa0w_.js} +1 -1
- package/web/dist/assets/{ebnfDiagram-CCIWWBDH-Bh1RkpJ9.js → ebnfDiagram-CCIWWBDH-D14uZUD4.js} +1 -1
- package/web/dist/assets/{erDiagram-Q63AITRT-E5bP16-J.js → erDiagram-Q63AITRT-BIceg2Pk.js} +1 -1
- package/web/dist/assets/{flowDiagram-23GEKE2U-BAtJJjTJ.js → flowDiagram-23GEKE2U-BLms_ylv.js} +1 -1
- package/web/dist/assets/{ganttDiagram-NO4QXBWP-BiuqaxNH.js → ganttDiagram-NO4QXBWP-DAlK5TuK.js} +1 -1
- package/web/dist/assets/{index-xKffKKoc.js → index-Bqp1_f-s.js} +78 -78
- package/web/dist/assets/{infoDiagram-FWYZ7A6U-Co1V0oYE.js → infoDiagram-FWYZ7A6U-7mRQzInB.js} +1 -1
- package/web/dist/assets/{ishikawaDiagram-FXEZZL3T-BR58gOGl.js → ishikawaDiagram-FXEZZL3T-m2fCQ3C0.js} +1 -1
- package/web/dist/assets/{kanban-definition-HUTT4EX6-Cb1c-R71.js → kanban-definition-HUTT4EX6-XSazudN_.js} +1 -1
- package/web/dist/assets/{linear-DceE_QuD.js → linear-DRty47xH.js} +1 -1
- package/web/dist/assets/{mindmap-definition-LN4V7U3C-CqJlgVe3.js → mindmap-definition-LN4V7U3C-3Bj5A8oB.js} +1 -1
- package/web/dist/assets/{pegDiagram-2B236MQR-B-LFtMLT.js → pegDiagram-2B236MQR-CYPoakJr.js} +1 -1
- package/web/dist/assets/{pieDiagram-ENE6RG2P-ko7PN4ZC.js → pieDiagram-ENE6RG2P-BRZ4wSUu.js} +1 -1
- package/web/dist/assets/{quadrantDiagram-ABIIQ3AL-DtEPofEc.js → quadrantDiagram-ABIIQ3AL-CclAvLIN.js} +1 -1
- package/web/dist/assets/{railroadDiagram-RFXS5EU6-B-5wzc7X.js → railroadDiagram-RFXS5EU6-DPaOsVAE.js} +1 -1
- package/web/dist/assets/{requirementDiagram-TGXJPOKE-B3MZnN4A.js → requirementDiagram-TGXJPOKE-DUiw-EJj.js} +1 -1
- package/web/dist/assets/{sequenceDiagram-DBY2YBRQ-IIdjO_05.js → sequenceDiagram-DBY2YBRQ-CH9aabAW.js} +1 -1
- package/web/dist/assets/{stateDiagram-2N3HPSRC-BmkTfvco.js → stateDiagram-2N3HPSRC-BTw2pR1w.js} +1 -1
- package/web/dist/assets/{stateDiagram-v2-6OUMAXLB-DIGnr8jK.js → stateDiagram-v2-6OUMAXLB-bxEJ05w4.js} +1 -1
- package/web/dist/assets/{swimlanes-5IMT3BWC-Dy8N-IiF.js → swimlanes-5IMT3BWC-DYcRF_OF.js} +1 -1
- package/web/dist/assets/{swimlanesDiagram-G3AALYLV-7ULR3aAR.js → swimlanesDiagram-G3AALYLV-Ckz5Fq-H.js} +1 -1
- package/web/dist/assets/{timeline-definition-FHXFAJF6-BGFbzOm6.js → timeline-definition-FHXFAJF6-DLsyNHJW.js} +1 -1
- package/web/dist/assets/{vennDiagram-L72KCM5P-D81cM-yT.js → vennDiagram-L72KCM5P-BPNH_aJQ.js} +1 -1
- package/web/dist/assets/{wardleyDiagram-EHGQE667-DW4lo8Mc.js → wardleyDiagram-EHGQE667-DsA47KXe.js} +1 -1
- package/web/dist/assets/{xychartDiagram-FW5EYKEG-BBauB7MN.js → xychartDiagram-FW5EYKEG-BGk7WwLI.js} +1 -1
- 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.
|
|
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
|
|
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.
|
|
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",
|
package/web/dist/assets/{abnfDiagram-VRR7QNED-D19VSiUB.js → abnfDiagram-VRR7QNED-CnWTNSpE.js}
RENAMED
|
@@ -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-
|
|
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};
|