@amaster.ai/pi-lark 0.1.2-beta.44 → 0.1.2-beta.45
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/package.json +2 -2
- package/skills/lark-apps/SKILL.md +23 -12
- package/skills/lark-apps/creative-design/agents/assets/vision-probe.png +0 -0
- package/skills/lark-apps/creative-design/agents/fork-verifier-agent.md +71 -0
- package/skills/lark-apps/creative-design/agents/vision-probe-agent.md +41 -0
- package/skills/lark-apps/creative-design/assets/index.html +27 -0
- package/skills/lark-apps/creative-design/creative-design.md +239 -0
- package/skills/lark-apps/creative-design/references/aily.md +39 -0
- package/skills/lark-apps/creative-design/references/animated-video.md +34 -0
- package/skills/lark-apps/creative-design/references/charts.md +165 -0
- package/skills/lark-apps/creative-design/references/claude.md +36 -0
- package/skills/lark-apps/creative-design/references/codex.md +32 -0
- package/skills/lark-apps/creative-design/references/data-report.md +108 -0
- package/skills/lark-apps/creative-design/references/frontend-design.md +71 -0
- package/skills/lark-apps/creative-design/references/hi-fi-design.md +32 -0
- package/skills/lark-apps/creative-design/references/interactive-prototype.md +24 -0
- package/skills/lark-apps/creative-design/references/make-a-deck.md +133 -0
- package/skills/lark-apps/creative-design/references/visual-exposure.md +82 -0
- package/skills/lark-apps/creative-design/references/wireframe.md +14 -0
- package/skills/lark-apps/creative-design/starter-components/android-frame.jsx +188 -0
- package/skills/lark-apps/creative-design/starter-components/animations.jsx +773 -0
- package/skills/lark-apps/creative-design/starter-components/browser-window.jsx +122 -0
- package/skills/lark-apps/creative-design/starter-components/deck-stage.js +2483 -0
- package/skills/lark-apps/creative-design/starter-components/design-canvas.jsx +1432 -0
- package/skills/lark-apps/creative-design/starter-components/ios-frame.jsx +270 -0
- package/skills/lark-apps/creative-design/starter-components/macos-window.jsx +197 -0
- package/skills/lark-apps/creative-design/starter-components/tweaks-panel.jsx +752 -0
- package/skills/lark-apps/references/lark-apps-automation.md +80 -2
- package/skills/lark-apps/references/lark-apps-cloud-dev.md +0 -1
- package/skills/lark-apps/references/lark-apps-create.md +1 -2
- package/skills/lark-apps/references/lark-apps-db.md +1 -1
- package/skills/lark-apps/references/lark-apps-env-pull.md +1 -1
- package/skills/lark-apps/references/lark-apps-file.md +1 -1
- package/skills/lark-apps/references/lark-apps-git-credential.md +1 -1
- package/skills/lark-apps/references/lark-apps-html-publish.md +4 -8
- package/skills/lark-apps/references/lark-apps-init.md +1 -1
- package/skills/lark-apps/references/lark-apps-list.md +1 -1
- package/skills/lark-apps/references/lark-apps-local-dev.md +54 -11
- package/skills/lark-apps/references/lark-apps-openapi-key.md +1 -1
- package/skills/lark-apps/references/lark-apps-release-create.md +2 -2
- package/skills/lark-apps/references/lark-apps-release-get.md +3 -3
- package/skills/lark-base/SKILL.md +1 -2
- package/skills/lark-base/references/lark-base-cell-value.md +3 -3
- package/skills/lark-base/references/lark-base-field-create.md +4 -0
- package/skills/lark-base/references/lark-base-field-json.md +4 -4
- package/skills/lark-base/references/lark-base-field-update.md +17 -1
- package/skills/lark-base/references/lark-base-record-batch-create.md +12 -10
- package/skills/lark-base/references/lark-base-record-batch-update.md +11 -9
- package/skills/lark-base/references/lark-base-record-upsert.md +1 -1
- package/skills/lark-calendar/references/lark-calendar-create.md +1 -0
- package/skills/lark-calendar/references/lark-calendar-update.md +3 -0
- package/skills/lark-doc/references/lark-doc-fetch.md +10 -2
- package/skills/lark-doc/references/lark-doc-whiteboard.md +9 -8
- package/skills/lark-doc/references/lark-doc-xml-extended-blocks.md +41 -0
- package/skills/lark-doc/references/lark-doc-xml.md +3 -2
- package/skills/lark-drive/SKILL.md +4 -1
- package/skills/lark-drive/references/lark-drive-comment-location.md +2 -2
- package/skills/lark-drive/references/lark-drive-upload.md +1 -0
- package/skills/lark-drive/references/lark-drive-workflow-topic-move-collector-execute.md +273 -0
- package/skills/lark-drive/references/lark-drive-workflow-topic-move-collector-recall.md +202 -0
- package/skills/lark-drive/references/lark-drive-workflow-topic-move-collector-resolve-verify.md +231 -0
- package/skills/lark-drive/references/lark-drive-workflow-topic-move-collector-review-plan.md +248 -0
- package/skills/lark-drive/references/lark-drive-workflow-topic-move-collector-setup.md +174 -0
- package/skills/lark-drive/references/lark-drive-workflow-topic-move-collector.md +202 -0
- package/skills/lark-drive/references/lark-drive-workflow.md +5 -4
- package/skills/lark-event/SKILL.md +1 -0
- package/skills/lark-event/references/lark-event-application.md +38 -0
- package/skills/lark-im/SKILL.md +1 -1
- package/skills/lark-im/references/lark-im-flag-list.md +8 -7
- package/skills/lark-okr/SKILL.md +71 -26
- package/skills/lark-okr/references/lark-okr-batch-create.md +19 -18
- package/skills/lark-okr/references/lark-okr-create.md +173 -0
- package/skills/lark-okr/references/lark-okr-cycle-list.md +17 -7
- package/skills/lark-okr/references/lark-okr-entities.md +1 -0
- package/skills/lark-okr/references/lark-okr-indicator-update.md +3 -1
- package/skills/lark-okr/references/lark-okr-indicators.md +61 -12
- package/skills/lark-okr/references/lark-okr-progress-list.md +21 -9
- package/skills/lark-slides/SKILL.md +103 -46
- package/skills/lark-slides/references/asset-planning.md +6 -4
- package/skills/lark-slides/references/iconpark.md +2 -2
- package/skills/lark-slides/references/lark-slides-create.md +2 -3
- package/skills/lark-slides/references/lark-slides-history.md +132 -0
- package/skills/lark-slides/references/lark-slides-media-upload.md +1 -2
- package/skills/lark-slides/references/lark-slides-pptx-template-workflows.md +7 -11
- package/skills/lark-slides/references/lark-slides-replace-slide.md +0 -3
- package/skills/lark-slides/references/lark-slides-screenshot.md +1 -1
- package/skills/lark-slides/references/lark-slides-xml-presentation-slide-create.md +219 -0
- package/skills/lark-slides/references/lark-slides-xml-presentation-slide-delete.md +6 -5
- package/skills/lark-slides/references/lark-slides-xml-presentation-slide-get.md +2 -2
- package/skills/lark-slides/references/lark-slides-xml-presentation-slide-replace.md +2 -3
- package/skills/lark-slides/references/lark-slides-xml-presentations-get.md +65 -30
- package/skills/lark-slides/references/planning-layer.md +11 -10
- package/skills/lark-slides/references/slides_chart_demo.xml +1416 -1
- package/skills/lark-slides/references/slides_xml_schema_definition.xml +1 -45
- package/skills/lark-slides/references/troubleshooting.md +25 -7
- package/skills/lark-slides/references/validation-checklist.md +33 -13
- package/skills/lark-slides/references/visual-planning.md +25 -22
- package/skills/lark-slides/references/xml-schema-quick-ref.md +225 -46
- package/skills/lark-slides/scripts/xml_text_overlap_lint.py +223 -22
- package/skills/lark-slides/scripts/xml_text_overlap_lint_test.py +183 -124
- package/skills/lark-whiteboard/SKILL.md +13 -12
- package/skills/lark-whiteboard/elements/layout.md +1 -1
- package/skills/lark-whiteboard/elements/schema.md +2 -2
- package/skills/lark-whiteboard/references/{lark-whiteboard-query.md → lark-whiteboard-export.md} +15 -15
- package/skills/lark-whiteboard/references/lark-whiteboard-update.md +3 -3
- package/skills/lark-whiteboard/references/lark-whiteboard-workflow.md +7 -17
- package/skills/lark-whiteboard/routes/dsl.md +3 -3
- package/skills/lark-whiteboard/routes/mermaid.md +2 -2
- package/skills/lark-whiteboard/routes/svg-edit.md +4 -4
- package/skills/lark-whiteboard/routes/svg.md +11 -6
- package/skills/lark-whiteboard/scenes/bar-chart.md +1 -1
- package/skills/lark-whiteboard/scenes/fishbone.md +1 -1
- package/skills/lark-whiteboard/scenes/flywheel.md +1 -1
- package/skills/lark-whiteboard/scenes/line-chart.md +1 -1
- package/skills/lark-whiteboard/scenes/treemap.md +1 -1
- package/skills/lark-wiki/SKILL.md +1 -0
- package/skills/lark-slides/references/examples.md +0 -91
- package/skills/lark-slides/references/lark-slides-whiteboard.md +0 -331
- package/skills/lark-slides/references/lark-slides-xml-get.md +0 -100
- package/skills/lark-slides/references/slide-templates.md +0 -201
- package/skills/lark-slides/references/slides_demo.xml +0 -226
- package/skills/lark-slides/references/xml-format-guide.md +0 -433
|
@@ -34,6 +34,24 @@ class XmlTextOverlapLintTest(unittest.TestCase):
|
|
|
34
34
|
f"{sample_name} has XML text overlap lint warnings:\n" + "\n".join(issue_summaries),
|
|
35
35
|
)
|
|
36
36
|
|
|
37
|
+
def test_cli_suggests_input_flag_for_positional_argument(self) -> None:
|
|
38
|
+
script_path = Path(xml_text_overlap_lint.__file__).resolve()
|
|
39
|
+
input_path = "/sandboxdata/workspace/file/full_presentation.xml"
|
|
40
|
+
|
|
41
|
+
completed = subprocess.run(
|
|
42
|
+
[sys.executable, str(script_path), input_path],
|
|
43
|
+
capture_output=True,
|
|
44
|
+
check=False,
|
|
45
|
+
text=True,
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
self.assertEqual(completed.returncode, 1)
|
|
49
|
+
self.assertEqual(completed.stdout, "")
|
|
50
|
+
self.assertEqual(
|
|
51
|
+
completed.stderr,
|
|
52
|
+
f"xml-text-overlap-lint error: unexpected argument: {input_path},need --input\n",
|
|
53
|
+
)
|
|
54
|
+
|
|
37
55
|
def test_xml_text_overlap_lint_accepts_inline_fixture_xml_samples(self) -> None:
|
|
38
56
|
samples = {
|
|
39
57
|
"image-led-cover": """
|
|
@@ -311,6 +329,42 @@ class XmlTextOverlapLintTest(unittest.TestCase):
|
|
|
311
329
|
self.assertEqual(issue["tag"], "fill")
|
|
312
330
|
self.assertEqual(issue["attr"], "unexpected")
|
|
313
331
|
|
|
332
|
+
def test_lint_xml_ignores_chart_roundtrip_attrs(self) -> None:
|
|
333
|
+
result = xml_text_overlap_lint.lint_xml(
|
|
334
|
+
"""
|
|
335
|
+
<slide xmlns="http://www.larkoffice.com/sml/2.0">
|
|
336
|
+
<data>
|
|
337
|
+
<chart updated="true" topLeftX="80" topLeftY="80" width="300" height="160">
|
|
338
|
+
<chartData isStaticData="true"/>
|
|
339
|
+
</chart>
|
|
340
|
+
</data>
|
|
341
|
+
</slide>
|
|
342
|
+
"""
|
|
343
|
+
)
|
|
344
|
+
|
|
345
|
+
self.assertEqual(result["summary"]["error_count"], 0)
|
|
346
|
+
self.assertNotIn("issues", result)
|
|
347
|
+
|
|
348
|
+
def test_lint_xml_limits_chart_roundtrip_attrs_to_matching_tags(self) -> None:
|
|
349
|
+
result = xml_text_overlap_lint.lint_xml(
|
|
350
|
+
"""
|
|
351
|
+
<slide xmlns="http://www.larkoffice.com/sml/2.0">
|
|
352
|
+
<data>
|
|
353
|
+
<chart isStaticData="true" topLeftX="80" topLeftY="80" width="300" height="160">
|
|
354
|
+
<chartData updated="true"/>
|
|
355
|
+
</chart>
|
|
356
|
+
</data>
|
|
357
|
+
</slide>
|
|
358
|
+
"""
|
|
359
|
+
)
|
|
360
|
+
|
|
361
|
+
self.assertEqual(result["summary"]["error_count"], 2)
|
|
362
|
+
self.assertEqual(
|
|
363
|
+
{(issue["tag"], issue["attr"]) for issue in result["issues"]},
|
|
364
|
+
{("chart", "isStaticData"), ("chartData", "updated")},
|
|
365
|
+
)
|
|
366
|
+
self.assertTrue(all(issue["code"] == "sxsd_unsupported_attr" for issue in result["issues"]))
|
|
367
|
+
|
|
314
368
|
def test_lint_xml_reports_gradient_shorthand_attrs_on_fill_color(self) -> None:
|
|
315
369
|
result = xml_text_overlap_lint.lint_xml(
|
|
316
370
|
"""
|
|
@@ -468,43 +522,6 @@ class XmlTextOverlapLintTest(unittest.TestCase):
|
|
|
468
522
|
self.assertIn("iconpark-index.json", issue["hint"])
|
|
469
523
|
self.assertIn("iconpark/Base/setting.svg", issue["hint"])
|
|
470
524
|
|
|
471
|
-
def test_lint_xml_allows_namespaced_svg_inside_whiteboard(self) -> None:
|
|
472
|
-
result = xml_text_overlap_lint.lint_xml(
|
|
473
|
-
"""
|
|
474
|
-
<slide xmlns="http://www.larkoffice.com/sml/2.0">
|
|
475
|
-
<data>
|
|
476
|
-
<whiteboard id="wb" topLeftX="80" topLeftY="80" width="300" height="180">
|
|
477
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 180">
|
|
478
|
-
<rect x="10" y="10" width="120" height="60"/>
|
|
479
|
-
</svg>
|
|
480
|
-
</whiteboard>
|
|
481
|
-
</data>
|
|
482
|
-
</slide>
|
|
483
|
-
"""
|
|
484
|
-
)
|
|
485
|
-
self.assertEqual(result["summary"]["error_count"], 0)
|
|
486
|
-
self.assertNotIn("issues", result)
|
|
487
|
-
|
|
488
|
-
def test_lint_xml_reports_unqualified_svg_inside_whiteboard_with_namespace_hint(self) -> None:
|
|
489
|
-
result = xml_text_overlap_lint.lint_xml(
|
|
490
|
-
"""
|
|
491
|
-
<slide xmlns="http://www.larkoffice.com/sml/2.0">
|
|
492
|
-
<data>
|
|
493
|
-
<whiteboard id="wb" topLeftX="80" topLeftY="80" width="300" height="180">
|
|
494
|
-
<svg viewBox="0 0 300 180">
|
|
495
|
-
<rect x="10" y="10" width="120" height="60"/>
|
|
496
|
-
</svg>
|
|
497
|
-
</whiteboard>
|
|
498
|
-
</data>
|
|
499
|
-
</slide>
|
|
500
|
-
"""
|
|
501
|
-
)
|
|
502
|
-
issue = result["issues"][0]
|
|
503
|
-
self.assertEqual(result["summary"]["error_count"], 1)
|
|
504
|
-
self.assertEqual(issue["code"], "sxsd_unsupported_tag")
|
|
505
|
-
self.assertEqual(issue["tag"], "svg")
|
|
506
|
-
self.assertIn('xmlns="http://www.w3.org/2000/svg"', issue["hint"])
|
|
507
|
-
|
|
508
525
|
def test_lint_xml_detects_overlapping_text_boxes(self) -> None:
|
|
509
526
|
result = xml_text_overlap_lint.lint_xml(
|
|
510
527
|
"""
|
|
@@ -523,6 +540,7 @@ class XmlTextOverlapLintTest(unittest.TestCase):
|
|
|
523
540
|
"""
|
|
524
541
|
)
|
|
525
542
|
self.assertEqual(result["summary"]["error_count"], 1)
|
|
543
|
+
self.assertEqual(result["summary"]["warning_count"], 0)
|
|
526
544
|
self.assertEqual(result["slides"][0]["issues"][0]["code"], "bbox_overlap")
|
|
527
545
|
|
|
528
546
|
def test_lint_xml_detects_current_itinerary_cjk_caption_occlusion(self) -> None:
|
|
@@ -589,7 +607,7 @@ class XmlTextOverlapLintTest(unittest.TestCase):
|
|
|
589
607
|
<slide xmlns="http://www.larkoffice.com/sml/2.0">
|
|
590
608
|
<data>
|
|
591
609
|
<shape id="source" type="text" topLeftX="80" topLeftY="100" width="160" height="40">
|
|
592
|
-
<content fontSize="18"><p>这是一个足够长的中文文本用于检测跨越间隙的横向溢出</p></content>
|
|
610
|
+
<content fontSize="18" wrap="false"><p>这是一个足够长的中文文本用于检测跨越间隙的横向溢出</p></content>
|
|
593
611
|
</shape>
|
|
594
612
|
<shape id="target" type="text" topLeftX="260" topLeftY="100" width="160" height="40">
|
|
595
613
|
<content fontSize="18"><p>目标</p></content>
|
|
@@ -599,10 +617,31 @@ class XmlTextOverlapLintTest(unittest.TestCase):
|
|
|
599
617
|
"""
|
|
600
618
|
)
|
|
601
619
|
self.assertEqual(result["summary"]["error_count"], 1)
|
|
620
|
+
self.assertEqual(result["summary"]["warning_count"], 0)
|
|
602
621
|
self.assertEqual(result["slides"][0]["issues"][0]["code"], "bbox_overlap")
|
|
603
622
|
self.assertEqual(result["slides"][0]["issues"][0]["elements"], ["source", "target"])
|
|
604
623
|
|
|
605
|
-
def
|
|
624
|
+
def test_lint_xml_allows_horizontal_text_with_default_wrap(self) -> None:
|
|
625
|
+
result = xml_text_overlap_lint.lint_xml(
|
|
626
|
+
"""
|
|
627
|
+
<slide xmlns="http://www.larkoffice.com/sml/2.0">
|
|
628
|
+
<data>
|
|
629
|
+
<shape id="source" type="text" topLeftX="80" topLeftY="100" width="160" height="40">
|
|
630
|
+
<content fontSize="18"><p>这是一个足够长的中文文本用于检测默认自动换行</p></content>
|
|
631
|
+
</shape>
|
|
632
|
+
<shape id="target" type="text" topLeftX="260" topLeftY="100" width="160" height="40">
|
|
633
|
+
<content fontSize="18"><p>目标</p></content>
|
|
634
|
+
</shape>
|
|
635
|
+
</data>
|
|
636
|
+
</slide>
|
|
637
|
+
"""
|
|
638
|
+
)
|
|
639
|
+
self.assertEqual(result["summary"]["error_count"], 0)
|
|
640
|
+
self.assertEqual(result["summary"]["warning_count"], 1)
|
|
641
|
+
self.assertEqual(result["slides"][0]["issues"][0]["code"], "text_may_overflow_shape")
|
|
642
|
+
self.assertEqual(result["slides"][0]["issues"][0]["elements"], ["source"])
|
|
643
|
+
|
|
644
|
+
def test_lint_xml_reports_text_out_of_canvas_and_warns_for_text_height(self) -> None:
|
|
606
645
|
result = xml_text_overlap_lint.lint_xml(
|
|
607
646
|
"""
|
|
608
647
|
<presentation xmlns="http://www.larkoffice.com/sml/2.0" width="960" height="540">
|
|
@@ -621,10 +660,98 @@ class XmlTextOverlapLintTest(unittest.TestCase):
|
|
|
621
660
|
)
|
|
622
661
|
issue = result["slides"][0]["issues"][0]
|
|
623
662
|
self.assertEqual(result["summary"]["error_count"], 1)
|
|
624
|
-
self.assertEqual(result["summary"]["warning_count"],
|
|
663
|
+
self.assertEqual(result["summary"]["warning_count"], 1)
|
|
625
664
|
self.assertEqual(issue["code"], "shape_out_of_canvas")
|
|
626
665
|
self.assertEqual(issue["overflow"], {"left": 0, "top": 0, "right": 160, "bottom": 40})
|
|
627
666
|
|
|
667
|
+
def test_lint_xml_warns_when_text_may_overflow_its_own_shape(self) -> None:
|
|
668
|
+
result = xml_text_overlap_lint.lint_xml(
|
|
669
|
+
"""
|
|
670
|
+
<slide xmlns="http://www.larkoffice.com/sml/2.0">
|
|
671
|
+
<data>
|
|
672
|
+
<shape id="overflowing" type="text" topLeftX="80" topLeftY="80" width="360" height="80">
|
|
673
|
+
<content fontSize="20" lineSpacing="multiple:1.5">
|
|
674
|
+
<p>第一段</p><p>第二段</p><p>第三段</p><p>第四段</p>
|
|
675
|
+
</content>
|
|
676
|
+
</shape>
|
|
677
|
+
<shape id="fitting" type="text" topLeftX="480" topLeftY="80" width="360" height="120">
|
|
678
|
+
<content fontSize="20" lineSpacing="multiple:1.5">
|
|
679
|
+
<p>第一段</p><p>第二段</p><p>第三段</p><p>第四段</p>
|
|
680
|
+
</content>
|
|
681
|
+
</shape>
|
|
682
|
+
<shape id="auto-fit" type="text" topLeftX="80" topLeftY="240" width="360" height="80">
|
|
683
|
+
<content fontSize="20" lineSpacing="multiple:1.5" autoFit="normal-auto-fit">
|
|
684
|
+
<p>第一段</p><p>第二段</p><p>第三段</p><p>第四段</p>
|
|
685
|
+
</content>
|
|
686
|
+
</shape>
|
|
687
|
+
</data>
|
|
688
|
+
</slide>
|
|
689
|
+
"""
|
|
690
|
+
)
|
|
691
|
+
issues = result["slides"][0]["issues"]
|
|
692
|
+
self.assertEqual(result["summary"]["error_count"], 0)
|
|
693
|
+
self.assertEqual(result["summary"]["warning_count"], 1)
|
|
694
|
+
self.assertEqual(issues[0]["code"], "text_may_overflow_shape")
|
|
695
|
+
self.assertEqual(issues[0]["elements"], ["overflowing"])
|
|
696
|
+
self.assertEqual(issues[0]["line_count"], 4)
|
|
697
|
+
self.assertEqual(issues[0]["estimated_height"], 110)
|
|
698
|
+
self.assertEqual(issues[0]["available_height"], 80)
|
|
699
|
+
self.assertEqual(issues[0]["overflow"], 30)
|
|
700
|
+
self.assertIn('wrap="true" autoFit="normal-auto-fit"', issues[0]["message"])
|
|
701
|
+
|
|
702
|
+
def test_lint_xml_uses_fixed_line_spacing_for_text_height_warning(self) -> None:
|
|
703
|
+
result = xml_text_overlap_lint.lint_xml(
|
|
704
|
+
"""
|
|
705
|
+
<slide xmlns="http://www.larkoffice.com/sml/2.0">
|
|
706
|
+
<data>
|
|
707
|
+
<shape id="fixed-overflow" type="text" topLeftX="80" topLeftY="80" width="360" height="50">
|
|
708
|
+
<content fontSize="20" lineSpacing="fixed:20">
|
|
709
|
+
<p>第一段</p><p>第二段</p><p>第三段</p>
|
|
710
|
+
</content>
|
|
711
|
+
</shape>
|
|
712
|
+
</data>
|
|
713
|
+
</slide>
|
|
714
|
+
"""
|
|
715
|
+
)
|
|
716
|
+
issue = result["slides"][0]["issues"][0]
|
|
717
|
+
self.assertEqual(result["summary"]["warning_count"], 1)
|
|
718
|
+
self.assertEqual(issue["line_height"], 20)
|
|
719
|
+
self.assertEqual(issue["estimated_height"], 60)
|
|
720
|
+
self.assertEqual(issue["overflow"], 10)
|
|
721
|
+
|
|
722
|
+
def test_lint_xml_uses_paragraph_spacing_overrides_for_text_height_warning(self) -> None:
|
|
723
|
+
result = xml_text_overlap_lint.lint_xml(
|
|
724
|
+
"""
|
|
725
|
+
<slide xmlns="http://www.larkoffice.com/sml/2.0">
|
|
726
|
+
<data>
|
|
727
|
+
<shape id="paragraph-overflow" type="text" topLeftX="80" topLeftY="80" width="360" height="35">
|
|
728
|
+
<content fontSize="20" lineSpacing="multiple:1.5">
|
|
729
|
+
<p lineSpacing="fixed:10" beforeLineSpacing="fixed:5" afterLineSpacing="fixed:5">第一行<br/>第二行</p>
|
|
730
|
+
</content>
|
|
731
|
+
</shape>
|
|
732
|
+
<shape id="paragraph-fitting" type="text" topLeftX="480" topLeftY="80" width="360" height="40">
|
|
733
|
+
<content fontSize="20" lineSpacing="multiple:1.5">
|
|
734
|
+
<p lineSpacing="fixed:10">第一行<br/>第二行<br/>第三行</p>
|
|
735
|
+
</content>
|
|
736
|
+
</shape>
|
|
737
|
+
</data>
|
|
738
|
+
</slide>
|
|
739
|
+
"""
|
|
740
|
+
)
|
|
741
|
+
issues = result["slides"][0]["issues"]
|
|
742
|
+
self.assertEqual(result["summary"]["warning_count"], 1)
|
|
743
|
+
self.assertEqual(issues[0]["elements"], ["paragraph-overflow"])
|
|
744
|
+
self.assertEqual(issues[0]["line_count"], 2)
|
|
745
|
+
self.assertEqual(issues[0]["line_height"], 10)
|
|
746
|
+
self.assertEqual(issues[0]["estimated_height"], 40)
|
|
747
|
+
self.assertEqual(issues[0]["overflow"], 5)
|
|
748
|
+
|
|
749
|
+
def test_strip_xml_paragraphs_preserves_br_as_hard_line_break(self) -> None:
|
|
750
|
+
self.assertEqual(
|
|
751
|
+
xml_text_overlap_lint.strip_xml_paragraphs("<p>第一行<br/>第二行<br />第三行</p>"),
|
|
752
|
+
"第一行\n第二行\n第三行",
|
|
753
|
+
)
|
|
754
|
+
|
|
628
755
|
def test_lint_xml_allows_template_style_bleed_and_text_over_images(self) -> None:
|
|
629
756
|
result = xml_text_overlap_lint.lint_xml(
|
|
630
757
|
"""
|
|
@@ -730,7 +857,6 @@ class XmlTextOverlapLintTest(unittest.TestCase):
|
|
|
730
857
|
<shape id="outside-shape" type="text" topLeftX="-10" topLeftY="40" width="50" height="50"/>
|
|
731
858
|
<img id="outside-img" src="token" topLeftX="120" topLeftY="-20" width="50" height="50"/>
|
|
732
859
|
<chart id="outside-chart" topLeftX="900" topLeftY="100" width="100" height="100"/>
|
|
733
|
-
<whiteboard id="outside-whiteboard" topLeftX="100" topLeftY="500" width="100" height="100"/>
|
|
734
860
|
</data>
|
|
735
861
|
</slide>
|
|
736
862
|
</presentation>
|
|
@@ -1054,89 +1180,6 @@ class XmlTextOverlapLintTest(unittest.TestCase):
|
|
|
1054
1180
|
result["slides"][0]["issues"],
|
|
1055
1181
|
)
|
|
1056
1182
|
|
|
1057
|
-
def test_lint_xml_warns_for_whiteboard_external_boundary_overlap(self) -> None:
|
|
1058
|
-
result = xml_text_overlap_lint.lint_xml(
|
|
1059
|
-
"""
|
|
1060
|
-
<presentation xmlns="http://www.larkoffice.com/sml/2.0" width="960" height="540">
|
|
1061
|
-
<slide xmlns="http://www.larkoffice.com/sml/2.0">
|
|
1062
|
-
<data>
|
|
1063
|
-
<whiteboard id="wb" topLeftX="50" topLeftY="140" width="860" height="360"/>
|
|
1064
|
-
<shape id="card" type="rect" topLeftX="50" topLeftY="450" width="200" height="60">
|
|
1065
|
-
<fill><fillColor color="rgba(232, 186, 176, 0.2)"/></fill>
|
|
1066
|
-
<content/>
|
|
1067
|
-
</shape>
|
|
1068
|
-
<shape id="label" type="text" topLeftX="65" topLeftY="460" width="170" height="20">
|
|
1069
|
-
<content fontSize="12"><p>基础保障</p></content>
|
|
1070
|
-
</shape>
|
|
1071
|
-
</data>
|
|
1072
|
-
</slide>
|
|
1073
|
-
</presentation>
|
|
1074
|
-
"""
|
|
1075
|
-
)
|
|
1076
|
-
issues = result["slides"][0]["issues"]
|
|
1077
|
-
self.assertEqual(result["summary"]["error_count"], 0)
|
|
1078
|
-
self.assertEqual(result["summary"]["warning_count"], 1)
|
|
1079
|
-
self.assertEqual(issues[0]["code"], "whiteboard_external_overlap")
|
|
1080
|
-
self.assertIn("static whiteboard container-bbox risk", issues[0]["hint"])
|
|
1081
|
-
self.assertIn("screenshot QA", issues[0]["hint"])
|
|
1082
|
-
self.assertEqual(issues[0]["elements"], ["wb", "card"])
|
|
1083
|
-
self.assertEqual(issues[0]["overlaps"][0]["overlap_height"], 50)
|
|
1084
|
-
|
|
1085
|
-
def test_lint_xml_allows_whiteboard_internal_labels(self) -> None:
|
|
1086
|
-
result = xml_text_overlap_lint.lint_xml(
|
|
1087
|
-
"""
|
|
1088
|
-
<presentation xmlns="http://www.larkoffice.com/sml/2.0" width="960" height="540">
|
|
1089
|
-
<slide xmlns="http://www.larkoffice.com/sml/2.0">
|
|
1090
|
-
<data>
|
|
1091
|
-
<whiteboard id="wb" topLeftX="100" topLeftY="120" width="420" height="260"/>
|
|
1092
|
-
<shape id="label" type="text" topLeftX="150" topLeftY="180" width="180" height="40">
|
|
1093
|
-
<content fontSize="14"><p>内部标注</p></content>
|
|
1094
|
-
</shape>
|
|
1095
|
-
</data>
|
|
1096
|
-
</slide>
|
|
1097
|
-
</presentation>
|
|
1098
|
-
"""
|
|
1099
|
-
)
|
|
1100
|
-
self.assertEqual(result["summary"]["error_count"], 0)
|
|
1101
|
-
self.assertEqual(result["summary"]["warning_count"], 0)
|
|
1102
|
-
|
|
1103
|
-
def test_lint_xml_allows_bottom_layer_full_slide_whiteboard_background(self) -> None:
|
|
1104
|
-
result = xml_text_overlap_lint.lint_xml(
|
|
1105
|
-
"""
|
|
1106
|
-
<presentation xmlns="http://www.larkoffice.com/sml/2.0" width="960" height="540">
|
|
1107
|
-
<slide xmlns="http://www.larkoffice.com/sml/2.0">
|
|
1108
|
-
<data>
|
|
1109
|
-
<whiteboard id="background" topLeftX="0" topLeftY="0" width="960" height="540"/>
|
|
1110
|
-
<shape id="title" type="text" topLeftX="80" topLeftY="80" width="420" height="80">
|
|
1111
|
-
<content textType="title" fontSize="36"><p>Title</p></content>
|
|
1112
|
-
</shape>
|
|
1113
|
-
</data>
|
|
1114
|
-
</slide>
|
|
1115
|
-
</presentation>
|
|
1116
|
-
"""
|
|
1117
|
-
)
|
|
1118
|
-
self.assertEqual(result["summary"]["error_count"], 0)
|
|
1119
|
-
self.assertEqual(result["summary"]["warning_count"], 0)
|
|
1120
|
-
|
|
1121
|
-
def test_lint_xml_allows_whiteboard_inside_background_panel(self) -> None:
|
|
1122
|
-
result = xml_text_overlap_lint.lint_xml(
|
|
1123
|
-
"""
|
|
1124
|
-
<presentation xmlns="http://www.larkoffice.com/sml/2.0" width="960" height="540">
|
|
1125
|
-
<slide xmlns="http://www.larkoffice.com/sml/2.0">
|
|
1126
|
-
<data>
|
|
1127
|
-
<shape id="panel" type="rect" topLeftX="40" topLeftY="100" width="880" height="340">
|
|
1128
|
-
<fill><fillColor color="rgba(232, 186, 176, 0.2)"/></fill>
|
|
1129
|
-
<content/>
|
|
1130
|
-
</shape>
|
|
1131
|
-
<whiteboard id="wb" topLeftX="60" topLeftY="120" width="840" height="300"/>
|
|
1132
|
-
</data>
|
|
1133
|
-
</slide>
|
|
1134
|
-
</presentation>
|
|
1135
|
-
"""
|
|
1136
|
-
)
|
|
1137
|
-
self.assertEqual(result["summary"]["error_count"], 0)
|
|
1138
|
-
self.assertEqual(result["summary"]["warning_count"], 0)
|
|
1139
|
-
|
|
1140
1183
|
def test_lint_xml_detects_invalid_template_text_stack_overlap(self) -> None:
|
|
1141
1184
|
cases = [
|
|
1142
1185
|
(
|
|
@@ -1166,5 +1209,21 @@ class XmlTextOverlapLintTest(unittest.TestCase):
|
|
|
1166
1209
|
self.assertEqual(result["slides"][0]["issues"][0]["code"], "bbox_overlap")
|
|
1167
1210
|
|
|
1168
1211
|
|
|
1212
|
+
def test_lint_xml_reports_vertical_text_image_overlap_as_info(self) -> None:
|
|
1213
|
+
result = xml_text_overlap_lint.lint_xml(
|
|
1214
|
+
"""
|
|
1215
|
+
<slide xmlns="http://www.larkoffice.com/sml/2.0"><data>
|
|
1216
|
+
<shape id="text" type="text" vert="vert" topLeftX="100" topLeftY="100" width="100" height="100">
|
|
1217
|
+
<content><p>Vertical</p></content>
|
|
1218
|
+
</shape>
|
|
1219
|
+
<img id="image" src="token" topLeftX="120" topLeftY="120" width="20" height="20"/>
|
|
1220
|
+
</data></slide>
|
|
1221
|
+
"""
|
|
1222
|
+
)
|
|
1223
|
+
issue = next(issue for issue in result["slides"][0]["issues"] if issue["code"] == "image_may_cover_vertical_text")
|
|
1224
|
+
self.assertEqual(issue["level"], "info")
|
|
1225
|
+
self.assertEqual(result["summary"]["error_count"], 0)
|
|
1226
|
+
|
|
1227
|
+
|
|
1169
1228
|
if __name__ == "__main__":
|
|
1170
1229
|
unittest.main()
|
|
@@ -12,7 +12,7 @@ metadata:
|
|
|
12
12
|
|
|
13
13
|
> [!IMPORTANT]
|
|
14
14
|
> - 运行 `lark-cli --version`,确认可用,无需询问用户。
|
|
15
|
-
> - 运行 `npx -y @larksuite/whiteboard-cli@^0.2.
|
|
15
|
+
> - 运行 `npx -y @larksuite/whiteboard-cli@^0.2.13 -v`,确认可用,无需询问用户。
|
|
16
16
|
|
|
17
17
|
**CRITICAL — 开始前 MUST 先用 Read 工具读取 [`../lark-shared/SKILL.md`](../lark-shared/SKILL.md),其中包含认证、权限处理**
|
|
18
18
|
|
|
@@ -22,21 +22,22 @@ metadata:
|
|
|
22
22
|
|
|
23
23
|
**身份**:画板操作默认使用 `--as user`。仅当需要以应用身份上传时使用 `--as bot`。
|
|
24
24
|
|
|
25
|
-
| 用户需求 | 行动
|
|
26
|
-
|
|
27
|
-
| 查看画板内容 / 导出图片
|
|
28
|
-
|
|
|
29
|
-
|
|
|
30
|
-
|
|
|
25
|
+
| 用户需求 | 行动 |
|
|
26
|
+
|-----------------------------------------|---------------------------------------------------------------------------------------------------|
|
|
27
|
+
| 查看画板内容 / 导出图片 | [`+export --output-type preview`](references/lark-whiteboard-export.md) |
|
|
28
|
+
| 导出 SVG 矢量图 | [`+export --output-type svg`](references/lark-whiteboard-export.md) |
|
|
29
|
+
| 获取画板的 Mermaid/PlantUML 代码 | [`+export --output-type source`](references/lark-whiteboard-export.md) |
|
|
30
|
+
| 检查画板是否由代码绘制 | [`+export --output-type source`](references/lark-whiteboard-export.md) |
|
|
31
|
+
| 仅微调节点文字/颜色 | `+export --output-type raw` → 手动改 JSON → `+update --input_format raw` |
|
|
31
32
|
| 用户**已提供** Mermaid/PlantUML/SVG 代码,或明确指定用该格式 | 自己生成/使用代码 → [`+update --input_format mermaid/plantuml/svg`](references/lark-whiteboard-update.md) |
|
|
32
|
-
| 新建/创作复杂图表(架构/流程/组织等) | → **[§ 创作 Workflow](references/lark-whiteboard-workflow.md#创作-workflow)**
|
|
33
|
-
| 修改/重绘已有画板 | → **[§ 修改 Workflow](references/lark-whiteboard-workflow.md#修改-workflow)**
|
|
33
|
+
| 新建/创作复杂图表(架构/流程/组织等) | → **[§ 创作 Workflow](references/lark-whiteboard-workflow.md#创作-workflow)** |
|
|
34
|
+
| 修改/重绘已有画板 | → **[§ 修改 Workflow](references/lark-whiteboard-workflow.md#修改-workflow)** |
|
|
34
35
|
|
|
35
36
|
## Shortcuts
|
|
36
37
|
|
|
37
|
-
| Shortcut
|
|
38
|
-
|
|
39
|
-
| [`+
|
|
38
|
+
| Shortcut | 说明 |
|
|
39
|
+
|---------------------------------------------------|---|
|
|
40
|
+
| [`+export`](references/lark-whiteboard-export.md) | 导出画板为预览图片、SVG 矢量图、代码或原始节点结构。 |
|
|
40
41
|
| [`+update`](references/lark-whiteboard-update.md) | 更新画板,支持 PlantUML、Mermaid、SVG 或 OpenAPI 原生格式 |
|
|
41
42
|
|
|
42
43
|
---
|
|
@@ -336,7 +336,7 @@ DSL 的语法是严格白名单,不能写原生 CSS 属性(不支持 `alignS
|
|
|
336
336
|
先出骨架图导出坐标,再基于坐标补充连线和注解:
|
|
337
337
|
|
|
338
338
|
```bash
|
|
339
|
-
npx -y @larksuite/whiteboard-cli@^0.2.
|
|
339
|
+
npx -y @larksuite/whiteboard-cli@^0.2.13 -i skeleton.json -o step1.png -l coords.json
|
|
340
340
|
```
|
|
341
341
|
|
|
342
342
|
`coords.json` 包含每个带 id 节点的精确坐标(absX, absY, width, height)。
|
|
@@ -272,14 +272,14 @@ SVG 通过 `image/svg+xml` Blob 加载到画布,**不在 HTML DOM 中**,因
|
|
|
272
272
|
x?: number; y?: number;
|
|
273
273
|
width?: WBSizeValue; // 默认 48
|
|
274
274
|
height?: WBSizeValue; // 默认 48,保持正方形
|
|
275
|
-
name: string; // 图标名称,从 npx -y @larksuite/whiteboard-cli@^0.2.
|
|
275
|
+
name: string; // 图标名称,从 npx -y @larksuite/whiteboard-cli@^0.2.13 --icons 输出中选取
|
|
276
276
|
color?: string; // 可选颜色覆盖,hex 格式如 '#FF6600'
|
|
277
277
|
}
|
|
278
278
|
```
|
|
279
279
|
|
|
280
280
|
**获取可用图标**:规划好内容和布局后,运行以下命令查看所有可用图标名,从中选取:
|
|
281
281
|
```bash
|
|
282
|
-
npx -y @larksuite/whiteboard-cli@^0.2.
|
|
282
|
+
npx -y @larksuite/whiteboard-cli@^0.2.13 --icons
|
|
283
283
|
```
|
|
284
284
|
|
|
285
285
|
用法:
|
package/skills/lark-whiteboard/references/{lark-whiteboard-query.md → lark-whiteboard-export.md}
RENAMED
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
# whiteboard +
|
|
1
|
+
# whiteboard +export(导出画板)
|
|
2
2
|
|
|
3
3
|
> **前置条件:** 先阅读 [`../../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) 了解认证、全局参数和安全规则。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
导出画板内容,支持导出为预览图片、SVG 矢量图、提取 PlantUML/Mermaid 代码,或获取飞书 OpenAPI 原生画板节点格式。
|
|
6
6
|
|
|
7
7
|
## 参数
|
|
8
8
|
|
|
9
9
|
| 参数 | 必填 | 说明 |
|
|
10
10
|
|----------------------|----|------------------------------------------------------------------------|
|
|
11
11
|
| `--whiteboard-token` | 是 | 画板 token,需要拥有画板的读权限 |
|
|
12
|
-
| `--
|
|
13
|
-
| `--output` | 否 | 输出路径。当 `--
|
|
12
|
+
| `--output-type` | 是 | 输出格式:`preview`(预览图片)、`svg`(SVG 矢量图)、`source`(PlantUML/Mermaid 代码)、`raw`(OpenAPI 原生画板节点格式) |
|
|
13
|
+
| `--output` | 否 | 输出路径。当 `--output-type preview` 时必填,推荐传入无后缀文件路径(如 `./preview`);当 `--output-type svg/source/raw` 时可选,不填则直接输出到终端 |
|
|
14
14
|
| `--overwrite` | 否 | 覆盖已存在的文件,默认为 false |
|
|
15
15
|
|
|
16
16
|
## 输出格式
|
|
17
17
|
|
|
18
|
-
- `
|
|
18
|
+
- `preview`:预览图片。推荐 `--output ./preview` 这类无后缀文件路径,CLI 会按实际图片类型保存为 `./preview.png` 或 `./preview.jpg`。如果 `--output` 是目录,会保存为该目录下的 `whiteboard_<whiteboard-token>.png/.jpg`;如果显式写了后缀,需要和实际图片类型匹配。`--overwrite` 检查的是补齐后缀后的最终路径,例如返回 PNG 时 `--output ./preview` 对应覆盖 `./preview.png`。
|
|
19
19
|
- `svg`:导出画板为标准 SVG 矢量图。可用于 SVG 编辑后回写画板(见 [`routes/svg-edit.md`](../routes/svg-edit.md))。注意:导出为纯视觉快照,思维导图层级、表格结构、连接器绑定等语义信息会丢失。
|
|
20
|
-
- `
|
|
20
|
+
- `source`:PlantUML/Mermaid 代码。仅限画板内有且仅有一个 PlantUML/Mermaid 图时,才可导出代码,否则会在返回值中告知不存在/有多个节点。
|
|
21
21
|
- `raw`:飞书 OpenAPI 原生画板节点格式。这一 json 格式不适合直接编辑复杂布局或内容,建议仅限于需要修改简单的文本内容/颜色等细节时使用。需要进行更复杂的设计/修改时,建议参考 [§ 渲染 & 写入画板](../SKILL.md#渲染--写入画板)。
|
|
22
22
|
|
|
23
23
|
## 示例
|
|
@@ -25,26 +25,26 @@
|
|
|
25
25
|
### 示例 1:导出画板为预览图片
|
|
26
26
|
|
|
27
27
|
```bash
|
|
28
|
-
lark-cli whiteboard +
|
|
28
|
+
lark-cli whiteboard +export \
|
|
29
29
|
--whiteboard-token "wbcnxxxxxxxx" \
|
|
30
|
-
--
|
|
31
|
-
--output ./preview
|
|
30
|
+
--output-type preview \
|
|
31
|
+
--output ./preview
|
|
32
32
|
```
|
|
33
33
|
|
|
34
34
|
### 示例 2:提取画板中的代码并直接输出
|
|
35
35
|
|
|
36
36
|
```bash
|
|
37
|
-
lark-cli whiteboard +
|
|
37
|
+
lark-cli whiteboard +export \
|
|
38
38
|
--whiteboard-token "wbcnxxxxxxxx" \
|
|
39
|
-
--
|
|
39
|
+
--output-type source
|
|
40
40
|
```
|
|
41
41
|
|
|
42
42
|
### 示例 3:导出画板为 SVG 矢量图
|
|
43
43
|
|
|
44
44
|
```bash
|
|
45
|
-
lark-cli whiteboard +
|
|
45
|
+
lark-cli whiteboard +export \
|
|
46
46
|
--whiteboard-token "wbcnxxxxxxxx" \
|
|
47
|
-
--
|
|
47
|
+
--output-type svg \
|
|
48
48
|
--output ./whiteboard.svg \
|
|
49
49
|
--as user
|
|
50
50
|
```
|
|
@@ -52,9 +52,9 @@ lark-cli whiteboard +query \
|
|
|
52
52
|
### 示例 4:导出画板原始节点结构到文件
|
|
53
53
|
|
|
54
54
|
```bash
|
|
55
|
-
lark-cli whiteboard +
|
|
55
|
+
lark-cli whiteboard +export \
|
|
56
56
|
--whiteboard-token "wbcnxxxxxxxx" \
|
|
57
|
-
--
|
|
57
|
+
--output-type raw \
|
|
58
58
|
--output ./nodes.json \
|
|
59
59
|
--overwrite
|
|
60
60
|
```
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
| 参数 | 必填 | 说明 |
|
|
17
17
|
|----------------------|----|--------------------------------------------|
|
|
18
18
|
| `--whiteboard-token` | 是 | 画板 token,需要拥有画板的编辑权限 |
|
|
19
|
-
| `--idempotent-token` | 否 | 幂等 token
|
|
19
|
+
| `--idempotent-token` | 否 | 幂等 token,确保更新操作幂等;最少 10 个字符,建议使用时间戳 + 场景标识拼接(如 `1744800000-board-1`)。同一次逻辑更新只生成一次该 token,重试时须原样复用;切勿在每次重试时重新生成时间戳或幂等 key,否则会重复写入 |
|
|
20
20
|
| `--overwrite` | 否 | 覆盖更新,在更新前删除所有现有内容,默认为 false |
|
|
21
21
|
| `--source` | 是 | 输入画板内容,支持使用 `@path` 从文件读取,或 `-` 从 stdin 读取 |
|
|
22
22
|
| `--input_format` | 否 | 输入格式:`raw`、`plantuml`、`mermaid`、`svg`,默认为 `raw` |
|
|
@@ -75,7 +75,7 @@ whiteboard-cli 工具的具体用法请参考 [§ 渲染 & 写入画板](../SKIL
|
|
|
75
75
|
|
|
76
76
|
```bash
|
|
77
77
|
# 使用 whiteboard-cli 生成 OpenAPI 格式并通过管道传递
|
|
78
|
-
npx -y @larksuite/whiteboard-cli@^0.2.
|
|
78
|
+
npx -y @larksuite/whiteboard-cli@^0.2.13 -i <产物文件> --to openapi --format json \
|
|
79
79
|
| lark-cli whiteboard +update \
|
|
80
80
|
--whiteboard-token <画板Token> \
|
|
81
81
|
--source - --input_format raw \
|
|
@@ -89,7 +89,7 @@ whiteboard-cli 工具的具体用法请参考 [§ 渲染 & 写入画板](../SKIL
|
|
|
89
89
|
|
|
90
90
|
```bash
|
|
91
91
|
# 生成 OpenAPI 格式到文件
|
|
92
|
-
npx -y @larksuite/whiteboard-cli@^0.2.
|
|
92
|
+
npx -y @larksuite/whiteboard-cli@^0.2.13 -i <DSL 文件> --to openapi --format json -o ./temp.json
|
|
93
93
|
|
|
94
94
|
# 从文件读取并更新
|
|
95
95
|
lark-cli whiteboard +update \
|
|
@@ -26,12 +26,12 @@
|
|
|
26
26
|
**Step 2:判断修改策略**
|
|
27
27
|
|
|
28
28
|
```
|
|
29
|
-
+
|
|
29
|
+
+export --output-type source
|
|
30
30
|
├─ 返回 Mermaid/PlantUML 代码
|
|
31
31
|
│ → 在原代码上修改 → +update --input_format mermaid/plantuml
|
|
32
32
|
├─ 无代码(SVG/DSL 或其他方式绘制的画板)
|
|
33
33
|
│ ├─ 需纯新增(思维导图、流程图、时序图、类图、饼图、甘特图)图表节点
|
|
34
|
-
│ │ → +
|
|
34
|
+
│ │ → +export --output-type preview → 看图 → +export --output-type raw → 确定新节点坐标和层级 → [§ 渲染 & 写入画板]
|
|
35
35
|
│ └─ 其他改动(几何变动/增删元素/结构调整/混合编辑等)
|
|
36
36
|
│ → [`../routes/svg-edit.md`](../routes/svg-edit.md)(视觉高保真还原,大部分场景适用)
|
|
37
37
|
└─ 用户有明确要求 → 以用户要求优先
|
|
@@ -79,19 +79,9 @@ diagram.png ← 渲染结果
|
|
|
79
79
|
|
|
80
80
|
### 写入画板
|
|
81
81
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
```bash
|
|
87
|
-
npx -y @larksuite/whiteboard-cli@^0.2.12 -i <产物文件> --to openapi --format json \
|
|
88
|
-
| lark-cli whiteboard +update \
|
|
89
|
-
--whiteboard-token <Token> \
|
|
90
|
-
--source - --input_format raw \
|
|
91
|
-
--idempotent-token <10+字符唯一串> \
|
|
92
|
-
--as user \
|
|
93
|
-
--overwrite
|
|
94
|
-
```
|
|
82
|
+
写入画板时按最终产物类型选择 `+update --input_format`:
|
|
83
|
+
|
|
84
|
+
- Mermaid / PlantUML / SVG 产物直接用对应的 `mermaid` / `plantuml` / `svg` 写入。
|
|
85
|
+
- 只有 DSL 产物或已明确需要 OpenAPI 原生节点格式时,才先用 `npx -y @larksuite/whiteboard-cli@^0.2.13 --to openapi --format json` 转换,再用 `raw` 写入。
|
|
95
86
|
|
|
96
|
-
|
|
97
|
-
> 如需应用身份上传,将 `--as user` 替换为 `--as bot`。
|
|
87
|
+
具体命令示例、`--overwrite`、`--idempotent-token` 和 `--as user/bot` 的使用方式,统一参考 [`whiteboard +update`](./lark-whiteboard-update.md)。
|
|
@@ -13,7 +13,7 @@ Step 1: 路由 & 读取知识
|
|
|
13
13
|
Step 2: 生成完整 DSL(含颜色)
|
|
14
14
|
- 按 content.md 规划信息量和分组
|
|
15
15
|
- 按 layout.md 选择布局模式和间距
|
|
16
|
-
- 推荐使用图标让图表更直观,运行 `npx -y @larksuite/whiteboard-cli@^0.2.
|
|
16
|
+
- 推荐使用图标让图表更直观,运行 `npx -y @larksuite/whiteboard-cli@^0.2.13 --icons` 查看可用图标
|
|
17
17
|
- 按 style.md 上色(用户没指定时用默认经典色板)
|
|
18
18
|
- 按 schema.md 语法输出完整 JSON
|
|
19
19
|
- 连线参考 connectors.md,排版参考 typography.md
|
|
@@ -25,12 +25,12 @@ Step 2: 生成完整 DSL(含颜色)
|
|
|
25
25
|
|
|
26
26
|
Step 3: 渲染 & 审查 → 交付
|
|
27
27
|
- 渲染前自查(见下方检查清单)
|
|
28
|
-
- 渲染 PNG(仅用于预览验证,不是最终产物):npx -y @larksuite/whiteboard-cli@^0.2.
|
|
28
|
+
- 渲染 PNG(仅用于预览验证,不是最终产物):npx -y @larksuite/whiteboard-cli@^0.2.13 -i diagram.json -o diagram.png
|
|
29
29
|
- 检查:信息完整?布局合理?配色协调?文字无截断?连线无交叉?
|
|
30
30
|
- 有问题 → 按症状表修复 → 重新渲染(最多 2 轮)
|
|
31
31
|
- 2 轮后仍有严重问题 → 考虑走 Mermaid 路径兜底
|
|
32
32
|
- 写入画板:用 whiteboard-cli 将 diagram.json 转换为 OpenAPI 格式并 pipe 给 +update:
|
|
33
|
-
npx -y @larksuite/whiteboard-cli@^0.2.
|
|
33
|
+
npx -y @larksuite/whiteboard-cli@^0.2.13 -i diagram.json --to openapi --format json \
|
|
34
34
|
| lark-cli whiteboard +update --whiteboard-token <board_token> \
|
|
35
35
|
--source - --input_format raw --idempotent-token <时间戳+标识> --as user
|
|
36
36
|
→ 完整 dry-run / 确认流程见 SKILL.md [§ 写入画板](../SKILL.md#写入画板)
|
|
@@ -16,10 +16,10 @@ Step 3: 渲染验证 & 写入画板 & 交付
|
|
|
16
16
|
1. 创建产物目录 ./diagrams/YYYY-MM-DDTHHMMSS/
|
|
17
17
|
2. 保存为 diagram.mmd
|
|
18
18
|
3. 渲染(仅用于预览验证,PNG 不是最终产物):
|
|
19
|
-
npx -y @larksuite/whiteboard-cli@^0.2.
|
|
19
|
+
npx -y @larksuite/whiteboard-cli@^0.2.13 -i diagram.mmd -o diagram.png
|
|
20
20
|
4. 审查 PNG,有问题修改后重新渲染(最多 2 轮)
|
|
21
21
|
5. 写入画板:用 whiteboard-cli 将 diagram.mmd 转换为 OpenAPI 格式并 pipe 给 +update:
|
|
22
|
-
npx -y @larksuite/whiteboard-cli@^0.2.
|
|
22
|
+
npx -y @larksuite/whiteboard-cli@^0.2.13 -i diagram.mmd --to openapi --format json \
|
|
23
23
|
| lark-cli whiteboard +update --whiteboard-token <board_token> \
|
|
24
24
|
--source - --input_format raw --idempotent-token <时间戳+标识> --as user
|
|
25
25
|
→ 完整 dry-run / 确认流程见 SKILL.md [§ 写入画板](../SKILL.md#写入画板)
|