@dawipong/opcflow 0.2.1 → 0.3.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 (40) hide show
  1. package/README.en.md +2 -2
  2. package/README.md +2 -2
  3. package/dist/cli.mjs +15 -13
  4. package/package.json +1 -1
  5. package/web/dist/assets/{abnfDiagram-VRR7QNED-DctuL32B.js → abnfDiagram-VRR7QNED-B5Ymr02_.js} +1 -1
  6. package/web/dist/assets/{architectureDiagram-ZJ3FMSHR--07w7V0c.js → architectureDiagram-ZJ3FMSHR-DkSnVejp.js} +1 -1
  7. package/web/dist/assets/{chunk-EX3LRPZG-DQGT_sG5.js → chunk-EX3LRPZG-BH7du1zb.js} +1 -1
  8. package/web/dist/assets/{chunk-MOJQB5TN-Y0jSjq4a.js → chunk-MOJQB5TN-BJQ2jnj0.js} +1 -1
  9. package/web/dist/assets/{chunk-PUDLZKDR-pSIk3CZr.js → chunk-PUDLZKDR-C6SYgnAr.js} +1 -1
  10. package/web/dist/assets/{chunk-V7JOEXUC-D_2vwCJz.js → chunk-V7JOEXUC-CPVDLAL6.js} +1 -1
  11. package/web/dist/assets/{classDiagram-OUVF2IWQ-Ckf-YAkB.js → classDiagram-OUVF2IWQ-Bq-vpAZV.js} +1 -1
  12. package/web/dist/assets/{classDiagram-v2-EOCWNBFH-Ckf-YAkB.js → classDiagram-v2-EOCWNBFH-Bq-vpAZV.js} +1 -1
  13. package/web/dist/assets/{cynefinDiagram-TSTJHNR4-CtVxnYLa.js → cynefinDiagram-TSTJHNR4-C1e5y-Qt.js} +1 -1
  14. package/web/dist/assets/{dagre-VKFMJZFB-CbAaKbWe.js → dagre-VKFMJZFB-C9vqkLKd.js} +1 -1
  15. package/web/dist/assets/{diagram-G47NLZAW-BdfPbsL1.js → diagram-G47NLZAW-B0YXSheC.js} +1 -1
  16. package/web/dist/assets/{diagram-NH7WQ7WH-wWIYA2VS.js → diagram-NH7WQ7WH-B-0nt2Rj.js} +1 -1
  17. package/web/dist/assets/{diagram-OA4YK3LP-Chx7_D6X.js → diagram-OA4YK3LP-hTbE8qZc.js} +1 -1
  18. package/web/dist/assets/{diagram-WEI45ONY-DxAoHRrP.js → diagram-WEI45ONY-z9AYL1YS.js} +1 -1
  19. package/web/dist/assets/{ebnfDiagram-CCIWWBDH-DcnWNqZc.js → ebnfDiagram-CCIWWBDH-BhlcOI7N.js} +1 -1
  20. package/web/dist/assets/{erDiagram-Q63AITRT-BX0XqX5B.js → erDiagram-Q63AITRT-Djt4xUn4.js} +1 -1
  21. package/web/dist/assets/{flowDiagram-23GEKE2U-DL5kTdXb.js → flowDiagram-23GEKE2U-KXHFGTuX.js} +1 -1
  22. package/web/dist/assets/{index-DVXPy-Pj.js → index-D02utICb.js} +5 -5
  23. package/web/dist/assets/{infoDiagram-FWYZ7A6U-BnrcoE4X.js → infoDiagram-FWYZ7A6U-DcyiJUfy.js} +1 -1
  24. package/web/dist/assets/{ishikawaDiagram-FXEZZL3T-BuUSROzL.js → ishikawaDiagram-FXEZZL3T-C_XXRphh.js} +1 -1
  25. package/web/dist/assets/{kanban-definition-HUTT4EX6-hCokh58u.js → kanban-definition-HUTT4EX6-BxPpLtNJ.js} +1 -1
  26. package/web/dist/assets/{mindmap-definition-LN4V7U3C-plfH1Ve5.js → mindmap-definition-LN4V7U3C-DMqPdkF8.js} +1 -1
  27. package/web/dist/assets/{pegDiagram-2B236MQR-DpbGacSD.js → pegDiagram-2B236MQR-D3Uh6VmT.js} +1 -1
  28. package/web/dist/assets/{pieDiagram-ENE6RG2P-DsEjdRIW.js → pieDiagram-ENE6RG2P-Cfk6tbDs.js} +1 -1
  29. package/web/dist/assets/{railroadDiagram-RFXS5EU6-C9kLSHvN.js → railroadDiagram-RFXS5EU6-DY-MNsQI.js} +1 -1
  30. package/web/dist/assets/{requirementDiagram-TGXJPOKE-BslCStWL.js → requirementDiagram-TGXJPOKE-DkBeHVjA.js} +1 -1
  31. package/web/dist/assets/{sequenceDiagram-DBY2YBRQ-Cg8Nc-TM.js → sequenceDiagram-DBY2YBRQ-C3xWt8pk.js} +1 -1
  32. package/web/dist/assets/{stateDiagram-2N3HPSRC-DB4TsO7Z.js → stateDiagram-2N3HPSRC-awwgArtJ.js} +1 -1
  33. package/web/dist/assets/{stateDiagram-v2-6OUMAXLB-SUHVLdPI.js → stateDiagram-v2-6OUMAXLB-DCBMLj_H.js} +1 -1
  34. package/web/dist/assets/{swimlanes-5IMT3BWC-CgeBbl6U.js → swimlanes-5IMT3BWC-Diauu8OM.js} +1 -1
  35. package/web/dist/assets/{swimlanesDiagram-G3AALYLV-BfFfe5gc.js → swimlanesDiagram-G3AALYLV-CTpA1N8I.js} +1 -1
  36. package/web/dist/assets/{timeline-definition-FHXFAJF6-BRSnucVn.js → timeline-definition-FHXFAJF6-CzLt2q6q.js} +1 -1
  37. package/web/dist/assets/{vennDiagram-L72KCM5P-gearbXh2.js → vennDiagram-L72KCM5P-gYZsJaVB.js} +1 -1
  38. package/web/dist/assets/{wardleyDiagram-EHGQE667-DBWn9RRb.js → wardleyDiagram-EHGQE667-N-mJLzn_.js} +1 -1
  39. package/web/dist/assets/{xychartDiagram-FW5EYKEG-CUL1Ijyf.js → xychartDiagram-FW5EYKEG-CbPlSd84.js} +1 -1
  40. package/web/dist/index.html +1 -1
package/README.en.md CHANGED
@@ -33,7 +33,7 @@ contracts, thumbs-up/down outputs, and answer rulings**.
33
33
  - **Change propagation** — `sync` reconciles → invalidate → dispatch review along the graph (deduped)
34
34
  - **QA loop** — fail → auto rework → auto re-verify, no human in the loop
35
35
  - **Write-gate hooks** — block agents from editing an approved contract (observe mode by default)
36
- - **Feedback evolution** — 👍👎 and QA verdicts, half-life weighted → skill candidates / Red Flags
36
+ - **Feedback evolution** — 👍👎 and QA verdicts, half-life weighted → candidates (AI decides skill / rule / memory) / Red Flags
37
37
  - **Multi-platform** — one definition generates each platform's agent + MCP + hooks (see [PLATFORMS.md](PLATFORMS.md))
38
38
  - **Visual opcflow** — tree + markdown/mermaid/prototype/code rendering + review-queue diff + live SSE
39
39
 
@@ -55,7 +55,7 @@ complementary:
55
55
  | Roles | Essentially single-flow (one agent implements) | Five-role pipeline, each with its own gate and output channel |
56
56
  | Construction constraints | The spec is advisory | Gates block tasks whose upstream isn't approved; write-gate blocks edits to approved contracts; protocol lints as checkpoints |
57
57
  | Acceptance | Not covered | Two-stage QA + fail→rework→re-verify auto loop |
58
- | Evolution | Not covered | 👍👎/verdict half-life weighting → skill candidates / Red Flags |
58
+ | Evolution | Not covered | 👍👎/verdict half-life weighting → candidates (skill/rule/memory) / Red Flags |
59
59
 
60
60
  In one line: **Spec Kit treats the spec as "context for the agent"; opcflow treats it as "an
61
61
  approved contract that can go stale, propagate, and block construction," and governs the entire drift
package/README.md CHANGED
@@ -31,7 +31,7 @@
31
31
  - **变更传播** —— `sync` 对账 → 失效 → 沿图派 review(去重)
32
32
  - **QA 闭环** —— fail → 自动 rework → 自动复验,不消耗人
33
33
  - **写门禁 hooks** —— agent 改到已 approved 契约时拦截(默认 observe 观察期)
34
- - **反馈进化** —— 👍👎 与 QA verdict 半衰期加权 → skill 候选 / Red Flags
34
+ - **反馈进化** —— 👍👎 与 QA verdict 半衰期加权 → 经验候选(由 AI 判断沉淀为 skill / 规则 / 记忆)/ Red Flags
35
35
  - **多平台** —— 一套定义生成四家平台各自的 agent + MCP + hooks(见 [PLATFORMS.md](PLATFORMS.md))
36
36
  - **可视化工作台** —— 树 + markdown/mermaid/原型/代码渲染 + 待审队列 diff + SSE 实时
37
37
 
@@ -51,7 +51,7 @@ opcflow 接管 **spec 之后的执行与验证**,两者是不同层次、可互
51
51
  | 角色 | 基本单流程(一个 agent 实现) | 五角色流水线,各有 gate 与产出通道 |
52
52
  | 施工约束 | spec 是建议 | gate 拦住上游未批的任务;写门禁拦改已批契约;协议 lint 卡点 |
53
53
  | 验收 | 不涉及 | 两段式 QA + fail→rework→复验自动闭环 |
54
- | 进化 | 不涉及 | 👍👎/verdict 半衰期加权 → skill 候选 / Red Flags |
54
+ | 进化 | 不涉及 | 👍👎/verdict 半衰期加权 → 经验候选(skill/规则/记忆)/ Red Flags |
55
55
 
56
56
  一句话:**Spec Kit 把 spec 当"给 agent 的上下文";opcflow 把 spec 当"会失效、会传播、卡得住施工
57
57
  的已批契约",并管住从契约到代码到验收的整条漂移。**
package/dist/cli.mjs CHANGED
@@ -2681,8 +2681,8 @@ var init_qa_command = __esm({
2681
2681
  var retro_command_exports = {};
2682
2682
  __export(retro_command_exports, {
2683
2683
  AUTO_ACTOR_WEIGHT: () => AUTO_ACTOR_WEIGHT,
2684
+ CANDIDATE_THRESHOLD: () => CANDIDATE_THRESHOLD,
2684
2685
  RED_FLAG_THRESHOLD: () => RED_FLAG_THRESHOLD,
2685
- SKILL_CANDIDATE_THRESHOLD: () => SKILL_CANDIDATE_THRESHOLD,
2686
2686
  approvalStats: () => approvalStats,
2687
2687
  distillFeedback: () => distillFeedback,
2688
2688
  exportEventLog: () => exportEventLog,
@@ -2696,6 +2696,8 @@ function parseDbTime(s) {
2696
2696
  function distillFeedback(ctx, opts = {}) {
2697
2697
  const now = (opts.now ?? /* @__PURE__ */ new Date()).getTime();
2698
2698
  const halfLifeMs = ctx.config.feedbackHalfLifeDays * 24 * 60 * 60 * 1e3;
2699
+ const candidateThreshold = ctx.config.candidateThreshold ?? CANDIDATE_THRESHOLD;
2700
+ const redFlagThreshold = ctx.config.redFlagThreshold ?? RED_FLAG_THRESHOLD;
2699
2701
  let query = `
2700
2702
  SELECT f.artifact_id, f.verdict, f.comment, f.actor, f.created_at,
2701
2703
  a.kind, a.module, a.endpoint, a.path
@@ -2736,13 +2738,13 @@ function distillFeedback(ctx, opts = {}) {
2736
2738
  for (const g of result) {
2737
2739
  g.posScore = Math.round(g.posScore * 100) / 100;
2738
2740
  g.negScore = Math.round(g.negScore * 100) / 100;
2739
- const pos = g.posScore >= SKILL_CANDIDATE_THRESHOLD;
2740
- const neg = g.negScore >= RED_FLAG_THRESHOLD;
2741
+ const pos = g.posScore >= candidateThreshold;
2742
+ const neg = g.negScore >= redFlagThreshold;
2741
2743
  if (pos && neg) {
2742
2744
  g.bucket = "observation";
2743
2745
  g.reason = "mixed";
2744
2746
  } else if (pos) {
2745
- g.bucket = "skill-candidate";
2747
+ g.bucket = "candidate";
2746
2748
  } else if (neg) {
2747
2749
  g.bucket = "red-flag";
2748
2750
  } else {
@@ -2750,7 +2752,7 @@ function distillFeedback(ctx, opts = {}) {
2750
2752
  g.reason = "insufficient";
2751
2753
  }
2752
2754
  }
2753
- const order = { "skill-candidate": 0, "red-flag": 1, observation: 2 };
2755
+ const order = { candidate: 0, "red-flag": 1, observation: 2 };
2754
2756
  return result.sort((a, b) => order[a.bucket] - order[b.bucket] || `${a.endpoint}/${a.kind}`.localeCompare(`${b.endpoint}/${b.kind}`));
2755
2757
  }
2756
2758
  function approvalStats(ctx) {
@@ -2805,18 +2807,18 @@ function approvalStats(ctx) {
2805
2807
  }
2806
2808
  function runRetrospective(ctx, opts = {}) {
2807
2809
  const groups = distillFeedback(ctx, opts);
2808
- const candidates = groups.filter((g) => g.bucket === "skill-candidate").length;
2810
+ const candidates = groups.filter((g) => g.bucket === "candidate").length;
2809
2811
  const redFlags = groups.filter((g) => g.bucket === "red-flag").length;
2810
2812
  const cli = ctx.config.cli;
2811
2813
  const guidance = [];
2812
2814
  if (candidates > 0) {
2813
2815
  guidance.push(
2814
- `\u53D1\u73B0 ${candidates} \u4E2A skill \u5019\u9009\u7EC4:\u4F9D\u636E\u5176 evidence(\u8DEF\u5F84+comment)\u8D77\u8349 .claude/skills/<\u540D\u79F0>/SKILL.md,\u7136\u540E \`${cli} register-meta\` \u6CE8\u518C + \`${cli} submit --actor=<\u89D2\u8272> -- .claude/skills/<\u540D\u79F0>/SKILL.md\` \u9001\u4EBA\u5BA1;approved \u540E\u624D\u4F5C\u4E3A\u7ECF\u9A8C\u751F\u6548`
2816
+ `\u53D1\u73B0 ${candidates} \u4E2A\u7ECF\u9A8C\u5019\u9009\u7EC4:\u5BF9\u6BCF\u7EC4\u4F9D\u636E evidence(\u8DEF\u5F84+comment)\u5224\u65AD\u8BE5\u6C89\u6DC0\u4E3A\u54EA\u4E00\u79CD,\u518D\u6309\u5BF9\u5E94\u8DEF\u5F84\u4EA7\u51FA\u2014\u2014\u8DE8\u4F1A\u8BDD\u53EF\u590D\u7528\u7684\u505A\u6CD5/\u6D41\u7A0B \u2192 skill(.claude/skills/<\u540D\u79F0>/SKILL.md;\`${cli} register-meta\` \u6CE8\u518C + \`${cli} submit --actor=<\u89D2\u8272> -- <\u8DEF\u5F84>\` \u9001\u4EBA\u5BA1,approved \u624D\u751F\u6548);\u5FC5\u987B\u59CB\u7EC8\u6210\u7ACB\u3001\u53EF grep \u7684\u786C\u7EA6\u675F \u2192 \u89C4\u5219(workbench.config.json \u7684 protocolLints \u5361\u70B9,\u6216\u5199\u5165 TECH.md / \u57FA\u7EBF\u7EA6\u5B9A);\u53EA\u5BF9\u7279\u5B9A\u89D2\u8272/\u9879\u76EE\u6709\u7528\u3001\u4E0D\u503C\u5F97\u5355\u72EC\u6210\u7BC7\u7684\u6559\u8BAD\u6216\u504F\u597D \u2192 \u8BB0\u5FC6(.claude/agent-memory/<\u89D2\u8272>/,\u66F4\u65B0 MEMORY.md \u7D22\u5F15)`
2815
2817
  );
2816
2818
  }
2817
2819
  if (redFlags > 0) {
2818
2820
  guidance.push(
2819
- `\u53D1\u73B0 ${redFlags} \u4E2A Red Flags \u7EC4:\u8D1F\u4F8B comment \u5373\u7D20\u6750,\u5199\u5165\u5BF9\u5E94 skill \u8349\u7A3F\u7684 Red Flags \u7AE0\u8282;\u80FD\u673A\u5668\u67E5\u7684\u7EA6\u5B9A\u5E94\u964D\u7EA7\u4E3A protocolLints \u5361\u70B9(workbench.config.json)`
2821
+ `\u53D1\u73B0 ${redFlags} \u4E2A Red Flags \u7EC4:\u8D1F\u4F8B comment \u5373\u300C\u522B\u518D\u72AF\u300D\u7684\u7D20\u6750,\u540C\u6837\u4E09\u9009\u4E00\u2014\u2014\u80FD\u673A\u5668\u67E5 \u2192 protocolLints \u5361\u70B9;\u8DE8\u4F1A\u8BDD\u901A\u7528\u5751 \u2192 \u5199\u8FDB\u5BF9\u5E94 skill \u7684 Red Flags \u7AE0\u8282;\u89D2\u8272\u4E13\u5C5E\u5751 \u2192 \u8BB0\u5FC6`
2820
2822
  );
2821
2823
  }
2822
2824
  if (guidance.length === 0) {
@@ -2847,11 +2849,11 @@ function exportEventLog(ctx) {
2847
2849
  files: [`${ctx.config.dataDir}/events.jsonl`, `${ctx.config.dataDir}/feedback.jsonl`]
2848
2850
  };
2849
2851
  }
2850
- var SKILL_CANDIDATE_THRESHOLD, RED_FLAG_THRESHOLD, AUTO_ACTOR_WEIGHT;
2852
+ var CANDIDATE_THRESHOLD, RED_FLAG_THRESHOLD, AUTO_ACTOR_WEIGHT;
2851
2853
  var init_retro_command = __esm({
2852
2854
  "core/commands/retro.command.ts"() {
2853
2855
  "use strict";
2854
- SKILL_CANDIDATE_THRESHOLD = 3;
2856
+ CANDIDATE_THRESHOLD = 3;
2855
2857
  RED_FLAG_THRESHOLD = 2;
2856
2858
  AUTO_ACTOR_WEIGHT = 0.5;
2857
2859
  }
@@ -3403,6 +3405,7 @@ var init_init_command = __esm({
3403
3405
  var core_exports = {};
3404
3406
  __export(core_exports, {
3405
3407
  AUTO_ACTOR_WEIGHT: () => AUTO_ACTOR_WEIGHT,
3408
+ CANDIDATE_THRESHOLD: () => CANDIDATE_THRESHOLD,
3406
3409
  CONFIG_FILENAME: () => CONFIG_FILENAME,
3407
3410
  CURRENT_SCHEMA_VERSION: () => CURRENT_SCHEMA_VERSION,
3408
3411
  DEFAULT_KIND_REGISTRY: () => DEFAULT_KIND_REGISTRY,
@@ -3414,7 +3417,6 @@ __export(core_exports, {
3414
3417
  PM_KINDS: () => PM_KINDS,
3415
3418
  RED_FLAG_THRESHOLD: () => RED_FLAG_THRESHOLD,
3416
3419
  SCHEMA_V1: () => SCHEMA_V1,
3417
- SKILL_CANDIDATE_THRESHOLD: () => SKILL_CANDIDATE_THRESHOLD,
3418
3420
  WORKBENCH_BIN: () => WORKBENCH_BIN,
3419
3421
  WORKBENCH_DIR: () => WORKBENCH_DIR,
3420
3422
  addTaskInput: () => addTaskInput,
@@ -3641,7 +3643,7 @@ function buildMcpServer(ctx) {
3641
3643
  server.registerTool(
3642
3644
  "wb_retro",
3643
3645
  {
3644
- description: "retrospective \u8BC1\u636E\u5305:\u53CD\u9988\u534A\u8870\u671F\u52A0\u6743\u63D0\u70BC(skill \u5019\u9009/Red Flags/\u89C2\u5BDF)+ \u5BA1\u6279\u541E\u5410\u62A5\u8868\u3002\u4F9D\u636E evidence \u8D77\u8349 .claude/skills/<\u540D\u79F0>/SKILL.md \u540E register-meta + submit \u9001\u4EBA\u5BA1,approved \u624D\u751F\u6548",
3646
+ description: "retrospective \u8BC1\u636E\u5305:\u53CD\u9988\u534A\u8870\u671F\u52A0\u6743\u63D0\u70BC(\u7ECF\u9A8C\u5019\u9009/Red Flags/\u89C2\u5BDF)+ \u5BA1\u6279\u541E\u5410\u62A5\u8868\u3002\u4F9D\u636E evidence \u5224\u65AD\u6BCF\u7EC4\u8BE5\u6C89\u6DC0\u4E3A\u54EA\u4E00\u79CD\u518D\u4EA7\u51FA:\u53EF\u590D\u7528\u505A\u6CD5\u2192skill(.claude/skills/<\u540D\u79F0>/SKILL.md,register-meta+submit \u9001\u4EBA\u5BA1,approved \u624D\u751F\u6548);\u80FD\u673A\u5668\u67E5\u7684\u786C\u7EA6\u675F\u2192\u89C4\u5219(workbench.config.json \u7684 protocolLints);\u89D2\u8272\u4E13\u5C5E\u6559\u8BAD\u2192\u8BB0\u5FC6(.claude/agent-memory/<\u89D2\u8272>/)\u3002\u89C1 report.guidance",
3645
3647
  inputSchema: { module: z.string().optional() }
3646
3648
  },
3647
3649
  async (args) => json(runRetrospective(ctx, args))
@@ -3825,7 +3827,7 @@ data: {"cursor":${cursor2}}
3825
3827
  app.get("/api/skill-candidates", async () => {
3826
3828
  const report = runRetrospective(ctx);
3827
3829
  return {
3828
- groups: report.groups.filter((g) => g.bucket === "skill-candidate" || g.bucket === "red-flag"),
3830
+ groups: report.groups.filter((g) => g.bucket === "candidate" || g.bucket === "red-flag"),
3829
3831
  candidates: report.candidates,
3830
3832
  redFlags: report.redFlags,
3831
3833
  halfLifeDays: report.halfLifeDays,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dawipong/opcflow",
3
- "version": "0.2.1",
3
+ "version": "0.3.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{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};
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-D02utICb.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-BJQ2jnj0.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};