cardbuddy 0.11.0 → 0.12.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 (313) hide show
  1. package/README.md +46 -5
  2. package/dist/cli.js +51 -1
  3. package/dist/config.js +51 -16
  4. package/dist/core.js +2 -2
  5. package/dist/init.js +425 -0
  6. package/dist/preview-editor/assets/index-CHuGGIR3.js +276 -0
  7. package/dist/preview-editor/assets/{index-B4VZgNSK.css → index-CQScMhyg.css} +1 -1
  8. package/dist/preview-editor/index.html +2 -2
  9. package/dist/standalone.js +8 -0
  10. package/dist/vendored/mcp/client.mjs +537 -0
  11. package/dist/vendored/mcp/tools.mjs +268 -0
  12. package/dist/vendored/preview/assets/default-image.png +0 -0
  13. package/dist/{server-core → vendored/server/core}/ai-chat.js +82 -38
  14. package/dist/{server-core → vendored/server/core}/browser.js +1 -1
  15. package/dist/{server-core → vendored/server/core}/cardSave.js +8 -3
  16. package/dist/{server-core → vendored/server/core}/cardSync.js +6 -14
  17. package/dist/{server-core → vendored/server/core}/cardValidate.js +11 -8
  18. package/dist/{server-core → vendored/server/core}/index.js +5 -3
  19. package/dist/vendored/server/core/skillPaths.js +124 -0
  20. package/dist/{server-core → vendored/server/core}/sliceUpload.js +5 -8
  21. package/dist/vendored/skills/README.md +93 -0
  22. package/dist/vendored/skills/card-doctor/SKILL.md +52 -0
  23. package/dist/vendored/skills/card-skill-trainer/SKILL.md +312 -0
  24. package/dist/vendored/skills/card-skill-trainer/baselines/v3-r038n.json +43 -0
  25. package/dist/vendored/skills/card-skill-trainer/baselines/v3-r039n.json +47 -0
  26. package/dist/vendored/skills/card-skill-trainer/baselines/v3-r050n.json +48 -0
  27. package/dist/vendored/skills/card-skill-trainer/scripts/build_dataset.py +472 -0
  28. package/dist/vendored/skills/card-skill-trainer/scripts/build_sample.mjs +162 -0
  29. package/dist/vendored/skills/card-skill-trainer/scripts/diagnose_case.mjs +241 -0
  30. package/dist/vendored/skills/card-skill-trainer/scripts/lib/scoring.mjs +525 -0
  31. package/dist/vendored/skills/card-skill-trainer/scripts/round_diff.mjs +133 -0
  32. package/dist/vendored/skills/card-skill-trainer/scripts/run_round.mjs +1043 -0
  33. package/dist/vendored/skills/card-skill-trainer/scripts/score_round.mjs +195 -0
  34. package/dist/vendored/skills/card-skill-trainer/scripts/test_missing_slice.py +122 -0
  35. package/dist/vendored/skills/dsl-card-ai/SKILL.md +191 -0
  36. package/dist/vendored/skills/dsl-card-generator/SKILL.md +480 -0
  37. package/dist/vendored/skills/dsl-card-generator/config/render-contract.json +11 -0
  38. package/dist/vendored/skills/dsl-card-generator/references/amount_formatting.md +138 -0
  39. package/dist/vendored/skills/dsl-card-generator/references/card_index.json +1597 -0
  40. package/dist/vendored/skills/dsl-card-generator/references/card_templates.json +384 -0
  41. package/dist/vendored/skills/dsl-card-generator/references/card_to_summary.md +56 -0
  42. package/dist/vendored/skills/dsl-card-generator/references/component_rules.md +76 -0
  43. package/dist/vendored/skills/dsl-card-generator/references/component_specs.md +393 -0
  44. package/dist/vendored/skills/dsl-card-generator/references/dsl_structure.md +208 -0
  45. package/dist/vendored/skills/dsl-card-generator/references/event_patterns.md +287 -0
  46. package/dist/vendored/skills/dsl-card-generator/references/expression_engine.md +121 -0
  47. package/dist/vendored/skills/dsl-card-generator/references/field_name_dict.json +34 -0
  48. package/dist/vendored/skills/dsl-card-generator/references/field_naming.md +101 -0
  49. package/dist/vendored/skills/dsl-card-generator/references/generation_pitfalls.md +928 -0
  50. package/dist/vendored/skills/dsl-card-generator/references/handcrafted/README.md +69 -0
  51. package/dist/vendored/skills/dsl-card-generator/references/handcrafted/examples_index.json +2967 -0
  52. package/dist/vendored/skills/dsl-card-generator/references/handcrafted/patterns.json +2835 -0
  53. package/dist/vendored/skills/dsl-card-generator/references/handcrafted/recipes_v2.json +648 -0
  54. package/dist/vendored/skills/dsl-card-generator/references/handcrafted/recipes_v2_schema.md +295 -0
  55. package/dist/vendored/skills/dsl-card-generator/references/image_diff.md +48 -0
  56. package/dist/vendored/skills/dsl-card-generator/references/image_to_card.md +129 -0
  57. package/dist/vendored/skills/dsl-card-generator/references/ir-format.md +212 -0
  58. package/dist/vendored/skills/dsl-card-generator/references/message-center-pattern.md +149 -0
  59. package/dist/vendored/skills/dsl-card-generator/references/platform_jsapi.md +196 -0
  60. package/dist/vendored/skills/dsl-card-generator/references/previewer_contract.md +54 -0
  61. package/dist/vendored/skills/dsl-card-generator/references/quickref.md +197 -0
  62. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/absolute-badge.json +84 -0
  63. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/accordion-group-toggle.json +18 -0
  64. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/alertCard-pair.json +12 -0
  65. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/alertDialog-call.json +12 -0
  66. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/canvas-countdown.json +15 -0
  67. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/canvas-donut.json +15 -0
  68. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/canvas-gauge-score.json +11 -0
  69. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/canvas-radar.json +10 -0
  70. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/canvas-title-head.json +13 -0
  71. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/globalSet.json +12 -0
  72. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/label-col-modes.json +21 -0
  73. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/list-expand-collapse.json +17 -0
  74. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/money-format.json +11 -0
  75. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/opacity-switch.json +130 -0
  76. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/progress-bar.json +25 -0
  77. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/tab-billMode.json +15 -0
  78. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/title-underline-overlay.json +21 -0
  79. package/dist/vendored/skills/dsl-card-generator/references/recipes.md +797 -0
  80. package/dist/vendored/skills/dsl-card-generator/references/rules.md +235 -0
  81. package/dist/vendored/skills/dsl-card-generator/references/slices_convention.md +177 -0
  82. package/dist/vendored/skills/dsl-card-generator/references/spec_to_schema_patterns.md +609 -0
  83. package/dist/vendored/skills/dsl-card-generator/references/ui_fidelity_rules.md +131 -0
  84. package/dist/vendored/skills/dsl-card-generator/scripts/add_component.mjs +118 -0
  85. package/dist/vendored/skills/dsl-card-generator/scripts/analyze_component_usage.mjs +153 -0
  86. package/dist/vendored/skills/dsl-card-generator/scripts/apply_opacity_pattern.mjs +343 -0
  87. package/dist/vendored/skills/dsl-card-generator/scripts/build_card_index.mjs +108 -0
  88. package/dist/vendored/skills/dsl-card-generator/scripts/build_card_templates.mjs +190 -0
  89. package/dist/vendored/skills/dsl-card-generator/scripts/check_fidelity.mjs +257 -0
  90. package/dist/vendored/skills/dsl-card-generator/scripts/check_magic_values.mjs +79 -0
  91. package/dist/vendored/skills/dsl-card-generator/scripts/crop_slices.mjs +98 -0
  92. package/dist/vendored/skills/dsl-card-generator/scripts/describe_card.mjs +265 -0
  93. package/dist/vendored/skills/dsl-card-generator/scripts/diff_bands.mjs +257 -0
  94. package/dist/vendored/skills/dsl-card-generator/scripts/diff_card.mjs +316 -0
  95. package/dist/vendored/skills/dsl-card-generator/scripts/expand_ir.mjs +873 -0
  96. package/dist/vendored/skills/dsl-card-generator/scripts/extract_handcrafted.py +1199 -0
  97. package/dist/vendored/skills/dsl-card-generator/scripts/extract_subtree.mjs +191 -0
  98. package/dist/vendored/skills/dsl-card-generator/scripts/generate_cards.mjs +389 -0
  99. package/dist/vendored/skills/dsl-card-generator/scripts/inventory_schemas.py +160 -0
  100. package/dist/vendored/skills/dsl-card-generator/scripts/iterate.mjs +700 -0
  101. package/dist/vendored/skills/dsl-card-generator/scripts/lib/design_image.mjs +56 -0
  102. package/dist/vendored/skills/dsl-card-generator/scripts/lib/design_sample.mjs +328 -0
  103. package/dist/vendored/skills/dsl-card-generator/scripts/lib/layout-tokens.mjs +79 -0
  104. package/dist/vendored/skills/dsl-card-generator/scripts/lib/paths.mjs +103 -0
  105. package/dist/vendored/skills/dsl-card-generator/scripts/lib/scaffold.mjs +575 -0
  106. package/dist/vendored/skills/dsl-card-generator/scripts/lib/slicePath.mjs +81 -0
  107. package/dist/vendored/skills/dsl-card-generator/scripts/lib/slice_dedupe.mjs +147 -0
  108. package/dist/vendored/skills/dsl-card-generator/scripts/lint_autofix.mjs +363 -0
  109. package/dist/vendored/skills/dsl-card-generator/scripts/lint_card.mjs +1399 -0
  110. package/dist/vendored/skills/dsl-card-generator/scripts/preflight.mjs +249 -0
  111. package/dist/vendored/skills/dsl-card-generator/scripts/register_card_template.mjs +208 -0
  112. package/dist/vendored/skills/dsl-card-generator/scripts/render_baseline.mjs +231 -0
  113. package/dist/vendored/skills/dsl-card-generator/scripts/render_card.mjs +801 -0
  114. package/dist/vendored/skills/dsl-card-generator/scripts/render_diff.mjs +239 -0
  115. package/dist/vendored/skills/dsl-card-generator/scripts/resolve_card_template.mjs +73 -0
  116. package/dist/vendored/skills/dsl-card-generator/scripts/route_input.mjs +447 -0
  117. package/dist/vendored/skills/dsl-card-generator/scripts/scaffold_card.mjs +81 -0
  118. package/dist/vendored/skills/dsl-card-generator/scripts/slices_normalize.mjs +316 -0
  119. package/dist/vendored/skills/dsl-card-generator/scripts/spec_audit.mjs +462 -0
  120. package/dist/vendored/skills/dsl-card-generator/scripts/spec_to_schema_v3.mjs +7735 -0
  121. package/dist/vendored/skills/dsl-card-generator/scripts/spec_tree.mjs +355 -0
  122. package/dist/vendored/skills/dsl-card-generator/scripts/validate_all_schemas.py +71 -0
  123. package/dist/vendored/skills/dsl-card-generator/vendor/preview/assets/default-image-wzZYQ86K.png +0 -0
  124. package/dist/vendored/skills/dsl-card-generator/vendor/preview/assets/standalone-C9k-07y7.css +1 -0
  125. package/dist/vendored/skills/dsl-card-generator/vendor/preview/assets/standalone-oFRM4f4V.js +55 -0
  126. package/dist/vendored/skills/dsl-card-generator/vendor/preview/assets/svg-symbols-B2exBrAr.svg +118 -0
  127. package/dist/vendored/skills/dsl-card-generator/vendor/preview/meta/component-meta.json +2714 -0
  128. package/dist/vendored/skills/dsl-card-generator/vendor/preview/meta/directive-meta.json +40 -0
  129. package/dist/vendored/skills/dsl-card-generator/vendor/preview/meta/style-meta.json +1086 -0
  130. package/dist/vendored/{standalone.html → skills/dsl-card-generator/vendor/preview/standalone.html} +2 -1
  131. package/dist/vendored/skills/finmall-card-sync/SKILL.md +262 -0
  132. package/dist/vendored/skills/finmall-session-navigator/SKILL.md +169 -0
  133. package/dist/vendored/skills/finmall-session-navigator/scripts/finmall_login.mjs +882 -0
  134. package/dist/vendored/skills/finmall-session-navigator/scripts/package-lock.json +59 -0
  135. package/dist/vendored/skills/finmall-session-navigator/scripts/package.json +10 -0
  136. package/dist/vendored/skills/finmall-session-navigator/scripts/session-manager.mjs +96 -0
  137. package/dist/vendored/skills/shared/README.md +55 -0
  138. package/dist/vendored/skills/shared/auth-model.md +79 -0
  139. package/dist/vendored/skills/sketch-spec-to-card/SKILL.md +329 -0
  140. package/dist/vendored/skills/sketch-spec-to-card/references/boundary.json +14 -0
  141. package/dist/vendored/skills/sketch-spec-to-card/references/card_refs.json +13 -0
  142. package/dist/vendored/skills/sketch-spec-to-card/references/spec-schema.md +103 -0
  143. package/dist/vendored/skills/sketch-spec-to-card/scripts/build_prompt.py +797 -0
  144. package/dist/vendored/skills/sketch-spec-to-card/scripts/card_refs.py +94 -0
  145. package/dist/vendored/skills/sketch-spec-to-card/scripts/cluster_states.py +706 -0
  146. package/dist/vendored/skills/sketch-spec-to-card/scripts/parse_meaxure.py +1781 -0
  147. package/dist/vendored/skills/sketch-spec-to-card/scripts/png_utils.py +318 -0
  148. package/dist/vendored/skills/sketch-spec-to-card/scripts/vision.py +1118 -0
  149. package/dist/vendored/templates/helloCard/data.json +10 -0
  150. package/dist/vendored/templates/helloCard/schema.json +238 -0
  151. package/dist/vendored/tools/link-skills.mjs +485 -0
  152. package/package.json +2 -1
  153. package/dist/preview-editor/assets/index-jl4YJzKv.js +0 -180
  154. package/dist/vendored/App.vue +0 -2858
  155. package/dist/vendored/ansi.js +0 -185
  156. package/dist/vendored/assets/apple-touch-icon.png +0 -0
  157. package/dist/vendored/assets/default-image.png +0 -0
  158. package/dist/vendored/assets/favicon-16.png +0 -0
  159. package/dist/vendored/assets/favicon-32.png +0 -0
  160. package/dist/vendored/assets/site-icon.png +0 -0
  161. package/dist/vendored/assets/svgIcons/icons.svg +0 -87
  162. package/dist/vendored/assets/svgIcons/index.js +0 -39
  163. package/dist/vendored/components/AiSettings.vue +0 -392
  164. package/dist/vendored/components/AlertCardInstance.vue +0 -58
  165. package/dist/vendored/components/AlertCardLayer.vue +0 -59
  166. package/dist/vendored/components/ApiCallPanel.vue +0 -127
  167. package/dist/vendored/components/ApiPayloadTree.vue +0 -201
  168. package/dist/vendored/components/AppToast.vue +0 -37
  169. package/dist/vendored/components/CardGallery.vue +0 -291
  170. package/dist/vendored/components/CardPreview.vue +0 -72
  171. package/dist/vendored/components/CardSelect.vue +0 -206
  172. package/dist/vendored/components/ChatComposer.vue +0 -413
  173. package/dist/vendored/components/ChatMessage.vue +0 -383
  174. package/dist/vendored/components/ChatPanel.vue +0 -937
  175. package/dist/vendored/components/ComponentPalette.vue +0 -301
  176. package/dist/vendored/components/ConfirmDialog.vue +0 -54
  177. package/dist/vendored/components/DatePickerOverlay.vue +0 -345
  178. package/dist/vendored/components/DebugPanel.vue +0 -1734
  179. package/dist/vendored/components/DeviceOverlay.vue +0 -70
  180. package/dist/vendored/components/Dropdown.vue +0 -193
  181. package/dist/vendored/components/EventEditor.vue +0 -273
  182. package/dist/vendored/components/HoverGuides.vue +0 -122
  183. package/dist/vendored/components/JsonTree.vue +0 -547
  184. package/dist/vendored/components/LogValue.vue +0 -52
  185. package/dist/vendored/components/MarkdownBody.vue +0 -64
  186. package/dist/vendored/components/NewCardDialog.vue +0 -132
  187. package/dist/vendored/components/NodeInspector.vue +0 -295
  188. package/dist/vendored/components/NumberStepper.vue +0 -125
  189. package/dist/vendored/components/PickerOverlay.vue +0 -131
  190. package/dist/vendored/components/PropControl.vue +0 -245
  191. package/dist/vendored/components/PropTree.vue +0 -128
  192. package/dist/vendored/components/RemotePreview.vue +0 -173
  193. package/dist/vendored/components/SelectionOverlay.vue +0 -105
  194. package/dist/vendored/components/StructureTree.vue +0 -1002
  195. package/dist/vendored/components/Switch.vue +0 -38
  196. package/dist/vendored/components/setters/SetBgPosition.vue +0 -64
  197. package/dist/vendored/components/setters/SetBgSize.vue +0 -90
  198. package/dist/vendored/components/setters/SetCode.vue +0 -198
  199. package/dist/vendored/components/setters/SetColor.vue +0 -244
  200. package/dist/vendored/components/setters/SetCustomSelect.vue +0 -58
  201. package/dist/vendored/components/setters/SetExpr.vue +0 -107
  202. package/dist/vendored/components/setters/SetGradient.vue +0 -125
  203. package/dist/vendored/components/setters/SetGrid9.vue +0 -68
  204. package/dist/vendored/components/setters/SetIconSelect.vue +0 -67
  205. package/dist/vendored/components/setters/SetIfForm.vue +0 -61
  206. package/dist/vendored/components/setters/SetImage.vue +0 -43
  207. package/dist/vendored/components/setters/SetList.vue +0 -139
  208. package/dist/vendored/components/setters/SetNumber.vue +0 -118
  209. package/dist/vendored/components/setters/SetNumberStyle.vue +0 -113
  210. package/dist/vendored/components/setters/SetPadding.vue +0 -77
  211. package/dist/vendored/components/setters/SetSegment.vue +0 -160
  212. package/dist/vendored/components/setters/SetSelect.vue +0 -51
  213. package/dist/vendored/components/setters/SetSwitch.vue +0 -49
  214. package/dist/vendored/components/setters/SetText.vue +0 -52
  215. package/dist/vendored/components/setters/props.js +0 -23
  216. package/dist/vendored/fidelity/baseline-messageOverview.json +0 -87
  217. package/dist/vendored/fidelity/calibration.json +0 -29
  218. package/dist/vendored/fidelity/fidelity-messageOverview-after.html +0 -114
  219. package/dist/vendored/fidelity/fidelity-messageOverview-after.json +0 -272
  220. package/dist/vendored/fidelity/fidelity-messageOverview.html +0 -185
  221. package/dist/vendored/fidelity/fidelity-messageOverview.json +0 -336
  222. package/dist/vendored/fidelity/fidelity-messageOverview_v2.html +0 -262
  223. package/dist/vendored/fidelity/fidelity-messageOverview_v2.json +0 -502
  224. package/dist/vendored/fidelity/fidelity-messageOverview_v3.html +0 -201
  225. package/dist/vendored/fidelity/fidelity-messageOverview_v3.json +0 -417
  226. package/dist/vendored/fidelity/fidelity-messageOverview_visual.html +0 -125
  227. package/dist/vendored/fidelity/fidelity-messageOverview_visual.json +0 -338
  228. package/dist/vendored/index.html +0 -16
  229. package/dist/vendored/main.js +0 -37
  230. package/dist/vendored/runtime/ai-api.js +0 -165
  231. package/dist/vendored/runtime/alert-card.js +0 -125
  232. package/dist/vendored/runtime/app-toast.js +0 -33
  233. package/dist/vendored/runtime/clipboard-node.js +0 -78
  234. package/dist/vendored/runtime/clipboard.js +0 -29
  235. package/dist/vendored/runtime/event-model.js +0 -300
  236. package/dist/vendored/runtime/hoverGuide.js +0 -31
  237. package/dist/vendored/runtime/jsapi-mock.js +0 -256
  238. package/dist/vendored/runtime/markdown.js +0 -140
  239. package/dist/vendored/runtime/node-model.js +0 -217
  240. package/dist/vendored/skills/.manifest.json +0 -1101
  241. package/dist/vendored/standalone-main.js +0 -36
  242. package/dist/vendored/styles/ai-chat.css +0 -1850
  243. package/dist/vendored/styles/app.css +0 -3648
  244. package/dist/vendored/styles/card-gallery.css +0 -285
  245. package/dist/vendored/styles/card-select.css +0 -288
  246. package/dist/vendored/styles/components.css +0 -383
  247. package/dist/vendored/styles/dropdown.css +0 -324
  248. package/dist/vendored/styles/json-tree.css +0 -308
  249. package/dist/vendored/styles/node-inspector.css +0 -800
  250. package/dist/vendored/styles/setters.css +0 -1050
  251. package/dist/vendored/styles/standalone.css +0 -27
  252. package/dist/vendored/styles/structure-tree.css +0 -460
  253. /package/dist/vendored/{api.js → preview/api.js} +0 -0
  254. /package/dist/vendored/{assets → preview/assets}/svg-symbols.svg +0 -0
  255. /package/dist/vendored/{components → preview/components}/AbsoluteLayout.vue +0 -0
  256. /package/dist/vendored/{components → preview/components}/Button.vue +0 -0
  257. /package/dist/vendored/{components → preview/components}/Canvas.vue +0 -0
  258. /package/dist/vendored/{components → preview/components}/CheckGroup.vue +0 -0
  259. /package/dist/vendored/{components → preview/components}/Column.vue +0 -0
  260. /package/dist/vendored/{components → preview/components}/CustomPlaceholder.vue +0 -0
  261. /package/dist/vendored/{components → preview/components}/Divider.vue +0 -0
  262. /package/dist/vendored/{components → preview/components}/GridLayout.vue +0 -0
  263. /package/dist/vendored/{components → preview/components}/Icon.vue +0 -0
  264. /package/dist/vendored/{components → preview/components}/Image.vue +0 -0
  265. /package/dist/vendored/{components → preview/components}/Input.vue +0 -0
  266. /package/dist/vendored/{components → preview/components}/ListLayout.vue +0 -0
  267. /package/dist/vendored/{components → preview/components}/Map.vue +0 -0
  268. /package/dist/vendored/{components → preview/components}/MultiColumn.vue +0 -0
  269. /package/dist/vendored/{components → preview/components}/MultiText.vue +0 -0
  270. /package/dist/vendored/{components → preview/components}/ProgressSlider.vue +0 -0
  271. /package/dist/vendored/{components → preview/components}/RadioButton.vue +0 -0
  272. /package/dist/vendored/{components → preview/components}/RenderTree.vue +0 -0
  273. /package/dist/vendored/{components → preview/components}/Root.vue +0 -0
  274. /package/dist/vendored/{components → preview/components}/Row.vue +0 -0
  275. /package/dist/vendored/{components → preview/components}/SvgCode.vue +0 -0
  276. /package/dist/vendored/{components → preview/components}/SvgSymbols.vue +0 -0
  277. /package/dist/vendored/{components → preview/components}/Text.vue +0 -0
  278. /package/dist/vendored/{components → preview/components}/Video.vue +0 -0
  279. /package/dist/vendored/{components → preview/components}/ViewContainer.vue +0 -0
  280. /package/dist/vendored/{components → preview/components}/base.js +0 -0
  281. /package/dist/vendored/{components → preview/components}/icons.js +0 -0
  282. /package/dist/vendored/{components → preview/components}/index.js +0 -0
  283. /package/dist/vendored/{meta → preview/meta}/component-meta.json +0 -0
  284. /package/dist/vendored/{meta → preview/meta}/directive-meta.json +0 -0
  285. /package/dist/vendored/{meta → preview/meta}/style-meta.json +0 -0
  286. /package/dist/vendored/{runtime → preview/runtime}/StyleParser.js +0 -0
  287. /package/dist/vendored/{runtime → preview/runtime}/adapter.js +0 -0
  288. /package/dist/vendored/{runtime → preview/runtime}/assets.js +0 -0
  289. /package/dist/vendored/{runtime → preview/runtime}/canvas-context.js +0 -0
  290. /package/dist/vendored/{runtime → preview/runtime}/card-runtime.js +0 -0
  291. /package/dist/vendored/{runtime → preview/runtime}/evaluate.js +0 -0
  292. /package/dist/vendored/{runtime → preview/runtime}/property.js +0 -0
  293. /package/dist/vendored/{runtime → preview/runtime}/selectionOverlay.js +0 -0
  294. /package/dist/vendored/{runtime → preview/runtime}/toPreview.js +0 -0
  295. /package/dist/{server-core → vendored/server/core}/assetProxy.js +0 -0
  296. /package/dist/{server-core → vendored/server/core}/bbox.js +0 -0
  297. /package/dist/{server-core → vendored/server/core}/buildDataFromSchema.js +0 -0
  298. /package/dist/{server-core → vendored/server/core}/cardFiles.js +0 -0
  299. /package/dist/{server-core → vendored/server/core}/cardHistory.js +0 -0
  300. /package/dist/{server-core → vendored/server/core}/cardImage.js +0 -0
  301. /package/dist/{server-core → vendored/server/core}/cardImportMeta.js +0 -0
  302. /package/dist/{server-core → vendored/server/core}/cardListCache.js +0 -0
  303. /package/dist/{server-core → vendored/server/core}/cardOpenFolder.js +0 -0
  304. /package/dist/{server-core → vendored/server/core}/cardSidecar.js +0 -0
  305. /package/dist/{server-core → vendored/server/core}/codeBridge.js +0 -0
  306. /package/dist/{server-core → vendored/server/core}/logStream.js +0 -0
  307. /package/dist/{server-core → vendored/server/core}/logger.js +0 -0
  308. /package/dist/{server-core → vendored/server/core}/nodeModels.js +0 -0
  309. /package/dist/{server-core → vendored/server/core}/renderStatus.js +0 -0
  310. /package/dist/{server-core → vendored/server/core}/screenshot.js +0 -0
  311. /package/dist/{server-core → vendored/server/core}/sliceStatic.js +0 -0
  312. /package/dist/vendored/{meta → skills/dsl-card-generator/vendor/preview/meta}/action-meta.json +0 -0
  313. /package/dist/{server-core/_vendor → vendored/tools}/finmall-env.mjs +0 -0
@@ -0,0 +1,485 @@
1
+ // tools/link-skills.mjs
2
+ // 把仓库根 skills/(唯一物理副本)链接到主流 AI 工具的项目级 skills 目录。
3
+ //
4
+ // 支持两类落地方式:
5
+ // - directory:将整个 skills/ 链接成单个目录(WorkBuddy 使用 .workbuddy/skills)
6
+ // - skill-links:将 skills/ 下每个含 SKILL.md 的目录,逐个链接到工具 skills 目录
7
+ // (Qoder/Codex/ZCode/Claude Code 等使用)
8
+ //
9
+ // 首次运行会交互式列出工具并允许多选;选择结果写入 .local/link-skills.json,
10
+ // 之后重复运行无需再次选择,只会增量同步当前 skills/ 的最新内容。
11
+ //
12
+ // 用法:
13
+ // node tools/link-skills.mjs # 首次选择 / 之后按已保存选择同步
14
+ // node tools/link-skills.mjs --select # 重新选择
15
+ // node tools/link-skills.mjs --list # 查看支持的工具
16
+ // node tools/link-skills.mjs --tools qoder,workbuddy,zcode
17
+ // node tools/link-skills.mjs --all
18
+ // node tools/link-skills.mjs --dry-run # 仅预览,不修改文件系统
19
+
20
+ import {
21
+ existsSync,
22
+ lstatSync,
23
+ mkdirSync,
24
+ readFileSync,
25
+ readdirSync,
26
+ realpathSync,
27
+ rmSync,
28
+ writeFileSync,
29
+ } from "node:fs";
30
+ import { execFileSync } from "node:child_process";
31
+ import { dirname, join, relative, resolve, sep } from "node:path";
32
+ import { createInterface } from "node:readline/promises";
33
+ import { stdin } from "node:process";
34
+ import { fileURLToPath } from "node:url";
35
+
36
+ const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..");
37
+ const SOURCE_DIR = join(ROOT, "skills");
38
+ const CONFIG_FILE = join(ROOT, ".local", "link-skills.json");
39
+
40
+ /**
41
+ * 工具清单。root 相对仓库根;mode:
42
+ * - directory : 把整个 skills/ 链接到 root/<linkName>
43
+ * - skill-links: 把每个 skill 链接到 root/skills/<skillName>
44
+ */
45
+ const TOOLS = [
46
+ { id: "workbuddy", name: "WorkBuddy", mode: "directory", root: ".workbuddy", linkName: "skills" },
47
+ { id: "qoder", name: "Qoder", mode: "skill-links", root: ".qoder" },
48
+ { id: "zcode", name: "ZCode", mode: "skill-links", root: ".zcode" },
49
+ { id: "codex", name: "Codex", mode: "skill-links", root: ".codex" },
50
+ { id: "claude", name: "Claude Code", mode: "skill-links", root: ".claude" },
51
+ { id: "cursor", name: "Cursor", mode: "skill-links", root: ".cursor" },
52
+ { id: "opencode", name: "OpenCode", mode: "skill-links", root: ".opencode" },
53
+ { id: "gemini", name: "Gemini CLI", mode: "skill-links", root: ".gemini" },
54
+ { id: "kilocode", name: "Kilo Code", mode: "skill-links", root: ".kilocode" },
55
+ { id: "cline", name: "Cline", mode: "skill-links", root: ".cline" },
56
+ { id: "roo", name: "Roo Code", mode: "skill-links", root: ".roo" },
57
+ ];
58
+
59
+ const TOOL_BY_ID = new Map(TOOLS.map((tool) => [tool.id, tool]));
60
+
61
+ function skillsRootFor(tool) {
62
+ if (tool.mode === "directory") {
63
+ return dirname(join(ROOT, tool.root, tool.linkName));
64
+ }
65
+ return join(ROOT, tool.root, "skills");
66
+ }
67
+
68
+ function skillLinkPathFor(tool, skillName) {
69
+ return join(skillsRootFor(tool), skillName);
70
+ }
71
+
72
+ function sourceSkillPath(skillName) {
73
+ return join(SOURCE_DIR, skillName);
74
+ }
75
+
76
+ function listSkills() {
77
+ try {
78
+ return readdirSync(SOURCE_DIR, { withFileTypes: true })
79
+ .filter((entry) => entry.isDirectory())
80
+ .map((entry) => entry.name)
81
+ .filter((name) => existsSync(join(SOURCE_DIR, name, "SKILL.md")))
82
+ .sort();
83
+ } catch {
84
+ return [];
85
+ }
86
+ }
87
+
88
+ function isEmptyDir(path) {
89
+ try {
90
+ return lstatSync(path).isDirectory() && readdirSync(path).length === 0;
91
+ } catch {
92
+ return false;
93
+ }
94
+ }
95
+
96
+ function lstatOrNull(path) {
97
+ try {
98
+ return lstatSync(path);
99
+ } catch {
100
+ return null;
101
+ }
102
+ }
103
+
104
+ function realpathOrNull(path) {
105
+ try {
106
+ return realpathSync(path);
107
+ } catch {
108
+ return null;
109
+ }
110
+ }
111
+
112
+ // 判断 linkPath 是否已经正确指向 expectedPath。
113
+ // 使用 realpath 处理 WorkBuddy -> ../skills 这类链式链接。
114
+ function linkIsValid(linkPath, expectedPath) {
115
+ const actual = realpathOrNull(linkPath);
116
+ if (!actual) return false;
117
+ const expected = realpathOrNull(expectedPath);
118
+ return Boolean(expected && actual === expected);
119
+ }
120
+
121
+ function ensureParentDir(path) {
122
+ mkdirSync(dirname(path), { recursive: true });
123
+ }
124
+
125
+ function removeEntry(path) {
126
+ rmSync(path, { recursive: true, force: true });
127
+ }
128
+
129
+ function assertPathCanBeReplaced(linkPath, label) {
130
+ const stat = lstatOrNull(linkPath);
131
+ if (!stat) return;
132
+
133
+ const isLinkLike =
134
+ stat.isSymbolicLink() ||
135
+ (process.platform === "win32" && stat.isDirectory()) ||
136
+ isEmptyDir(linkPath);
137
+
138
+ if (!isLinkLike) {
139
+ console.error(
140
+ `[link-skills] 错误:${label} ${linkPath} 是包含内容的实体目录且非链接。\n` +
141
+ ` 唯一物理副本应为仓库根 skills/,请确认该目录无需保留后手动删除,再重试。`
142
+ );
143
+ process.exit(1);
144
+ }
145
+ }
146
+
147
+ function createJunctionOrSymlink(linkPath, targetPath) {
148
+ if (process.platform === "win32") {
149
+ execFileSync("cmd", ["/c", "mklink", "/J", linkPath, targetPath], { stdio: "inherit" });
150
+ } else {
151
+ const parent = dirname(linkPath);
152
+ const relTarget = relative(parent, targetPath);
153
+ execFileSync("ln", ["-s", relTarget, linkPath], { stdio: "inherit", cwd: parent });
154
+ }
155
+ }
156
+
157
+ function logLink(verb, linkPath, targetPath) {
158
+ console.log(`[link-skills] ${verb}: ${linkPath} -> ${targetPath}`);
159
+ }
160
+
161
+ function syncDirectoryLink(tool, { dryRun }) {
162
+ const linkPath = join(ROOT, tool.root, tool.linkName);
163
+ const targetPath = SOURCE_DIR;
164
+
165
+ if (linkIsValid(linkPath, targetPath)) {
166
+ console.log(`[link-skills] 已链接 ${tool.name}:`, linkPath, "→", targetPath);
167
+ return;
168
+ }
169
+
170
+ if (dryRun) {
171
+ console.log(`[dry-run] ${tool.name} 将链接:`, linkPath, "→", targetPath);
172
+ return;
173
+ }
174
+
175
+ assertPathCanBeReplaced(linkPath, `${tool.name} skills 目录`);
176
+ if (lstatOrNull(linkPath)) {
177
+ logLink("移除旧条目", linkPath, targetPath);
178
+ removeEntry(linkPath);
179
+ }
180
+
181
+ ensureParentDir(linkPath);
182
+ createJunctionOrSymlink(linkPath, targetPath);
183
+
184
+ if (!linkIsValid(linkPath, targetPath)) {
185
+ console.error(`[link-skills] 失败:${tool.name} 链接未生效,请检查平台权限。`);
186
+ process.exit(1);
187
+ }
188
+ logLink("已创建链接", linkPath, targetPath);
189
+ }
190
+
191
+ function staleSkillLinks(tool, currentSkillNames) {
192
+ const root = skillsRootFor(tool);
193
+ if (!existsSync(root)) return [];
194
+
195
+ const current = new Set(currentSkillNames);
196
+ const stale = [];
197
+
198
+ for (const entry of readdirSync(root, { withFileTypes: true })) {
199
+ if (current.has(entry.name)) continue;
200
+ const entryPath = join(root, entry.name);
201
+ const stat = lstatOrNull(entryPath);
202
+ if (!stat) continue;
203
+
204
+ // 只清理“确实指向仓库 skills/ 下已不存在目标”的失效链接;
205
+ // 用户手工放置的其他链接(如 shared/)不要误删。
206
+ if (stat.isSymbolicLink() || (process.platform === "win32" && stat.isDirectory())) {
207
+ const actual = realpathOrNull(entryPath);
208
+ const isSourceSkillLink = actual && actual.startsWith(`${SOURCE_DIR}${sep}`);
209
+ if (!actual || (isSourceSkillLink && !existsSync(actual))) {
210
+ stale.push(entryPath);
211
+ }
212
+ }
213
+ }
214
+
215
+ return stale;
216
+ }
217
+
218
+ function syncSkillLinks(tool, { dryRun }) {
219
+ const root = skillsRootFor(tool);
220
+ const skills = listSkills();
221
+
222
+ if (skills.length === 0) {
223
+ console.warn(`[link-skills] 警告:${SOURCE_DIR} 下没有含 SKILL.md 的 skill。`);
224
+ return;
225
+ }
226
+
227
+ if (!dryRun) {
228
+ mkdirSync(root, { recursive: true });
229
+ }
230
+
231
+ for (const skillName of skills) {
232
+ const linkPath = skillLinkPathFor(tool, skillName);
233
+ const targetPath = sourceSkillPath(skillName);
234
+
235
+ if (linkIsValid(linkPath, targetPath)) {
236
+ console.log(`[link-skills] 已链接 ${tool.name}/${skillName}`);
237
+ continue;
238
+ }
239
+
240
+ if (dryRun) {
241
+ console.log(`[dry-run] ${tool.name} 将链接:`, linkPath, "→", targetPath);
242
+ continue;
243
+ }
244
+
245
+ assertPathCanBeReplaced(linkPath, `${tool.name}/${skillName}`);
246
+ if (lstatOrNull(linkPath)) {
247
+ removeEntry(linkPath);
248
+ }
249
+
250
+ createJunctionOrSymlink(linkPath, targetPath);
251
+
252
+ if (!linkIsValid(linkPath, targetPath)) {
253
+ console.error(`[link-skills] 失败:${tool.name}/${skillName} 链接未生效,请检查平台权限。`);
254
+ process.exit(1);
255
+ }
256
+ logLink("已创建链接", linkPath, targetPath);
257
+ }
258
+
259
+ if (!dryRun) {
260
+ for (const stalePath of staleSkillLinks(tool, skills.map((name) => name))) {
261
+ logLink("移除已不存在的旧 skill 链接", stalePath, "");
262
+ removeEntry(stalePath);
263
+ }
264
+ }
265
+ }
266
+
267
+ function readConfig() {
268
+ try {
269
+ return JSON.parse(readFileSync(CONFIG_FILE, "utf8"));
270
+ } catch {
271
+ return {};
272
+ }
273
+ }
274
+
275
+ function writeConfig(toolIds) {
276
+ mkdirSync(dirname(CONFIG_FILE), { recursive: true });
277
+ writeFileSync(CONFIG_FILE, `${JSON.stringify({ tools: toolIds }, null, 2)}\n`);
278
+ }
279
+
280
+ function normalizeToolIds(ids) {
281
+ const valid = new Set(TOOL_BY_ID.keys());
282
+ const seen = new Set();
283
+ for (const id of ids) {
284
+ if (!valid.has(id)) {
285
+ console.error(`[link-skills] 未知工具: ${id}(可用 --list 查看)`);
286
+ process.exit(1);
287
+ }
288
+ seen.add(id);
289
+ }
290
+ return [...seen];
291
+ }
292
+
293
+ function printList() {
294
+ console.log("支持的工具:");
295
+ for (const [index, tool] of TOOLS.entries()) {
296
+ const path = tool.mode === "directory"
297
+ ? join(tool.root, tool.linkName)
298
+ : join(tool.root, "skills");
299
+ console.log(` ${String(index + 1).padStart(2)}. ${tool.id.padEnd(10)} ${tool.name.padEnd(12)} ${path}`);
300
+ }
301
+ }
302
+
303
+ function printHelp() {
304
+ console.log(`用法: node tools/link-skills.mjs [options]
305
+
306
+ 选项:
307
+ --select, --reconfigure 重新选择工具(忽略已保存选择)
308
+ --list, -l 列出支持的工具
309
+ --tools <id[,id...]> 只同步指定工具,例如 --tools qoder,workbuddy
310
+ --all, -a 同步全部工具
311
+ --dry-run, -n 只打印将要执行的操作,不修改文件系统
312
+ --no-save 本次选择/操作不写入 .local/link-skills.json
313
+ --help, -h 显示帮助
314
+
315
+ 未传 --tools/--all 且存在已保存选择时,按已保存选择同步;
316
+ 否则在交互终端中列出工具并允许多选。`);
317
+ }
318
+
319
+ function parseAnswer(raw) {
320
+ const tokens = raw.trim().toLowerCase().split(/[\s,,、]+/).filter(Boolean);
321
+ const ids = [];
322
+
323
+ if (tokens.includes("a") || tokens.includes("all")) {
324
+ return TOOLS.map((tool) => tool.id);
325
+ }
326
+ if (tokens.includes("q") || tokens.includes("quit") || tokens.includes("c") || tokens.includes("cancel")) {
327
+ return [];
328
+ }
329
+
330
+ for (const token of tokens) {
331
+ if (/^\d+$/.test(token)) {
332
+ const index = Number(token) - 1;
333
+ if (TOOLS[index]) ids.push(TOOLS[index].id);
334
+ } else if (/^(\d+)-(\d+)$/.test(token)) {
335
+ const [, startRaw, endRaw] = token.match(/^(\d+)-(\d+)$/);
336
+ const start = Number(startRaw) - 1;
337
+ const end = Number(endRaw) - 1;
338
+ for (let index = Math.max(0, start); index <= Math.min(TOOLS.length - 1, end); index += 1) {
339
+ ids.push(TOOLS[index].id);
340
+ }
341
+ } else if (TOOL_BY_ID.has(token)) {
342
+ ids.push(token);
343
+ } else {
344
+ console.warn(`[link-skills] 忽略无法识别的选项: ${token}`);
345
+ }
346
+ }
347
+
348
+ return [...new Set(ids)];
349
+ }
350
+
351
+ async function promptForTools() {
352
+ console.log("选择要同步 skills 软链的工具(可多选):");
353
+ for (const [index, tool] of TOOLS.entries()) {
354
+ const path = tool.mode === "directory"
355
+ ? join(tool.root, tool.linkName)
356
+ : join(tool.root, "skills");
357
+ console.log(` ${String(index + 1).padStart(2)}. ${tool.name.padEnd(12)} ${path}`);
358
+ }
359
+ console.log("输入序号/工具 id,用逗号或空格分隔;a=全部,q=取消。");
360
+
361
+ const rl = createInterface({ input: stdin, output: process.stdout });
362
+ let answer;
363
+ try {
364
+ answer = await rl.question("> ");
365
+ } finally {
366
+ rl.close();
367
+ }
368
+
369
+ return parseAnswer(answer);
370
+ }
371
+
372
+ function readCliOptions(argv) {
373
+ const options = {
374
+ toolIds: null,
375
+ all: false,
376
+ list: false,
377
+ select: false,
378
+ dryRun: false,
379
+ save: true,
380
+ help: false,
381
+ };
382
+
383
+ for (let index = 0; index < argv.length; index += 1) {
384
+ const arg = argv[index];
385
+ const next = argv[index + 1];
386
+
387
+ if (arg === "--select" || arg === "--reconfigure") {
388
+ options.select = true;
389
+ } else if (arg === "--list" || arg === "-l") {
390
+ options.list = true;
391
+ } else if (arg === "--all" || arg === "-a") {
392
+ options.all = true;
393
+ } else if (arg === "--dry-run" || arg === "-n") {
394
+ options.dryRun = true;
395
+ } else if (arg === "--no-save") {
396
+ options.save = false;
397
+ } else if (arg === "--help" || arg === "-h") {
398
+ options.help = true;
399
+ } else if (arg === "--tools" || arg === "-t") {
400
+ const value = next && !next.startsWith("-") ? next : null;
401
+ if (value) {
402
+ options.toolIds = value.split(/[,\s]+/).filter(Boolean);
403
+ index += 1;
404
+ }
405
+ } else if (arg.startsWith("--tools=")) {
406
+ options.toolIds = arg.slice("--tools=".length).split(",").filter(Boolean);
407
+ }
408
+ }
409
+
410
+ return options;
411
+ }
412
+
413
+ function resolveToolIds(options, savedTools) {
414
+ if (options.all) return TOOLS.map((tool) => tool.id);
415
+ if (options.toolIds) return normalizeToolIds(options.toolIds);
416
+ if (!options.select && Array.isArray(savedTools)) {
417
+ console.log(`[link-skills] 使用已保存选择: ${savedTools.join(", ")}(--select 可重新选择)`);
418
+ return normalizeToolIds(savedTools);
419
+ }
420
+ return null;
421
+ }
422
+
423
+ async function main() {
424
+ const options = readCliOptions(process.argv.slice(2));
425
+
426
+ if (options.help) {
427
+ printHelp();
428
+ return;
429
+ }
430
+
431
+ if (options.list) {
432
+ printList();
433
+ return;
434
+ }
435
+
436
+ const savedConfig = readConfig();
437
+ const savedTools = Array.isArray(savedConfig.tools) ? savedConfig.tools : null;
438
+ let toolIds = resolveToolIds(options, savedTools);
439
+
440
+ if (!toolIds) {
441
+ if (options.dryRun) {
442
+ toolIds = TOOLS.map((tool) => tool.id);
443
+ console.log("[link-skills] --dry-run 未指定工具,预览全部工具。");
444
+ } else if (stdin.isTTY) {
445
+ toolIds = await promptForTools();
446
+ if (!toolIds.length) {
447
+ console.log("[link-skills] 已取消,未修改任何内容。");
448
+ return;
449
+ }
450
+ } else {
451
+ toolIds = ["workbuddy"];
452
+ console.log(
453
+ "[link-skills] 非交互环境且无已保存选择,默认仅同步 WorkBuddy;" +
454
+ "可用 --tools/--all 显式指定。"
455
+ );
456
+ }
457
+ } else if (options.select) {
458
+ console.warn("[link-skills] 已提供 --tools/--all,忽略 --select。");
459
+ }
460
+
461
+ if (options.dryRun) {
462
+ console.log("[link-skills] dry-run:不会实际创建/删除链接。");
463
+ }
464
+
465
+ for (const id of toolIds) {
466
+ const tool = TOOL_BY_ID.get(id);
467
+ if (tool.mode === "directory") {
468
+ syncDirectoryLink(tool, { dryRun: options.dryRun });
469
+ } else {
470
+ syncSkillLinks(tool, { dryRun: options.dryRun });
471
+ }
472
+ }
473
+
474
+ if (!options.dryRun && options.save) {
475
+ writeConfig(toolIds);
476
+ console.log(`[link-skills] 已保存选择: ${toolIds.join(", ")} -> ${CONFIG_FILE}`);
477
+ }
478
+
479
+ console.log("[link-skills] 完成。");
480
+ }
481
+
482
+ main().catch((error) => {
483
+ console.error("[link-skills] 运行失败:", error);
484
+ process.exit(1);
485
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cardbuddy",
3
- "version": "0.11.0",
3
+ "version": "0.12.1",
4
4
  "description": "Local dev service for the CardBuddy card editor — decouples card CRUD (sync/save/validate/render-status/screenshot) from the static public editor, so the editor can be deployed to any static host while each developer runs a local service against their own card source.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -30,6 +30,7 @@
30
30
  "codejar": "^4.3.0",
31
31
  "connect": "^3.7.0",
32
32
  "dotenv": "^16.6.1",
33
+ "pngjs": "^5.0.0",
33
34
  "prismjs": "^1.30.0",
34
35
  "qrcode": "^1.5.4",
35
36
  "selfsigned": "^2.4.1",