@calcit/procs 0.12.47 → 0.12.49

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 (152) hide show
  1. package/.yarn/install-state.gz +0 -0
  2. package/RFCs/07-06-semantic-tree-navigation-rfc.md +569 -0
  3. package/RFCs/07-08-ffi-features-and-js-object-type-rfc.md +223 -0
  4. package/RFCs/README.md +21 -19
  5. package/editing-history/2026-06-27-0052-cli-improvements.md +41 -0
  6. package/editing-history/2026-06-27-0202-docs-indexing-improvements.md +22 -0
  7. package/editing-history/2026-06-27-0315-file-splits.md +17 -0
  8. package/editing-history/2026-06-27-0416-agent-advanced-split.md +15 -0
  9. package/editing-history/2026-07-07-0000-semantic-tree-navigation.md +49 -0
  10. package/editing-history/2026-07-08-1650-features-and-js-object-type.md +25 -0
  11. package/editing-history/202607040040-fix-format-cirru-edn-quoting.md +14 -0
  12. package/editing-history/archived/2026-06-29-0117-upgrade-doc-snapshot-migration.md +2 -0
  13. package/editing-history/archived/2026-06-29-calcit-cli.md +80 -0
  14. package/editing-history/archived/2026-06-29-typed-calcit-cli-schemas.md +23 -0
  15. package/editing-history/archived/20260630-duplication-analysis.md +116 -0
  16. package/lib/js-cirru.mjs +2 -4
  17. package/lib/package.json +1 -1
  18. package/package.json +1 -1
  19. package/ts-src/js-cirru.mts +2 -4
  20. /package/editing-history/{2026-0213-1841-trait-origin-structural-eq.md → 2026-02-13-1841-trait-origin-structural-eq.md} +0 -0
  21. /package/editing-history/{2026-0214-2050-js-codegen-recursion-tag-migration.md → 2026-02-14-2050-js-codegen-recursion-tag-migration.md} +0 -0
  22. /package/editing-history/{2026-0214-2358-emit-js-modularization-shift-left.md → 2026-02-14-2358-emit-js-modularization-shift-left.md} +0 -0
  23. /package/editing-history/{2026-0215-0000-diagnostics-consolidated.md → 2026-02-15-0000-diagnostics-consolidated.md} +0 -0
  24. /package/editing-history/{2026-0215-1941-macro-diagnostics-refinement.md → 2026-02-15-1941-macro-diagnostics-refinement.md} +0 -0
  25. /package/editing-history/{2026-0216-2043-core-api-docs-cleanup.md → 2026-02-16-2043-core-api-docs-cleanup.md} +0 -0
  26. /package/editing-history/{2026-0223-0834-migrate-to-defstruct.md → 2026-02-23-0834-migrate-to-defstruct.md} +0 -0
  27. /package/editing-history/{2026-0223-2321-ns-imports-code-fixes.md → 2026-02-23-2321-ns-imports-code-fixes.md} +0 -0
  28. /package/editing-history/{2026-0225-0002-language-behavior-eval-mode.md → 2026-02-25-0002-language-behavior-eval-mode.md} +0 -0
  29. /package/editing-history/{2026-0225-0111-guidebook-no-check-block-upgrades.md → 2026-02-25-0111-guidebook-no-check-block-upgrades.md} +0 -0
  30. /package/editing-history/{2026-0225-0113-runtime-type-validation-and-macro-quoting.md → 2026-02-25-0113-runtime-type-validation-and-macro-quoting.md} +0 -0
  31. /package/editing-history/{2026-0225-1131-check-md-eval-improvements.md → 2026-02-25-1131-check-md-eval-improvements.md} +0 -0
  32. /package/editing-history/{2026-0226-1324-check-md-inprocess-cache-and-path-labels.md → 2026-02-26-1324-check-md-inprocess-cache-and-path-labels.md} +0 -0
  33. /package/editing-history/{2026-0227-1640-unify-markdown-readers.md → 2026-02-27-1640-unify-markdown-readers.md} +0 -0
  34. /package/editing-history/{2026-0227-1958-tree-rewrite-command-and-reference-model.md → 2026-02-27-1958-tree-rewrite-command-and-reference-model.md} +0 -0
  35. /package/editing-history/{2026-0227-2200-split-def-command.md → 2026-02-27-2200-split-def-command.md} +0 -0
  36. /package/editing-history/{2026-0227-2212-tree-raise-wrap.md → 2026-02-27-2212-tree-raise-wrap.md} +0 -0
  37. /package/editing-history/{2026-0227-2223-calcit-agent-docs-optimize.md → 2026-02-27-2223-calcit-agent-docs-optimize.md} +0 -0
  38. /package/editing-history/{2026-0301-0212-query-search-entry-and-ffi-warning.md → 2026-03-01-0212-query-search-entry-and-ffi-warning.md} +0 -0
  39. /package/editing-history/{2026-0303-1934-check-types-and-core-annotations.md → 2026-03-03-1934-check-types-and-core-annotations.md} +0 -0
  40. /package/editing-history/{2026-0304-0000-generics-fn-typevar-identity.md → 2026-03-04-0000-generics-fn-typevar-identity.md} +0 -0
  41. /package/editing-history/{2026-0304-1331-tag-call-warning-and-dot-access-migration.md → 2026-03-04-1331-tag-call-warning-and-dot-access-migration.md} +0 -0
  42. /package/editing-history/{2026-0304-1548-impl-new-dot-method-input-and-doc-hints.md → 2026-03-04-1548-impl-new-dot-method-input-and-doc-hints.md} +0 -0
  43. /package/editing-history/{2026-0304-1645-calcit-eq-contract-refactor-and-macro-tests.md → 2026-03-04-1645-calcit-eq-contract-refactor-and-macro-tests.md} +0 -0
  44. /package/editing-history/{2026-0304-2200-assert-type-assert-traits-composable-runtime-checks.md → 2026-03-04-2200-assert-type-assert-traits-composable-runtime-checks.md} +0 -0
  45. /package/editing-history/{2026-0305-0042-type-inference-argtypes-and-core-hints.md → 2026-03-05-0042-type-inference-argtypes-and-core-hints.md} +0 -0
  46. /package/editing-history/{2026-0305-0115-calcit-core-generic-refinements.md → 2026-03-05-0115-calcit-core-generic-refinements.md} +0 -0
  47. /package/editing-history/{2026-0305-1930-schema-migration-cr-edit.md → 2026-03-05-1930-schema-migration-cr-edit.md} +0 -0
  48. /package/editing-history/{2026-0305-1939-query-schema-adaptation.md → 2026-03-05-1939-query-schema-adaptation.md} +0 -0
  49. /package/editing-history/{2026-0306-0120-schema-hint-migration-batch.md → 2026-03-06-0120-schema-hint-migration-batch.md} +0 -0
  50. /package/editing-history/{2026-0306-1416-core-macro-schema-migration.md → 2026-03-06-1416-core-macro-schema-migration.md} +0 -0
  51. /package/editing-history/{2026-0306-1552-core-schema-and-hintfn-migration.md → 2026-03-06-1552-core-schema-and-hintfn-migration.md} +0 -0
  52. /package/editing-history/{2026-0306-1936-schema-normalization-and-preprocess-preload.md → 2026-03-06-1936-schema-normalization-and-preprocess-preload.md} +0 -0
  53. /package/editing-history/{2026-0307-0000-migrate-hint-fn-to-schema.md → 2026-03-07-0000-migrate-hint-fn-to-schema.md} +0 -0
  54. /package/editing-history/{2026-0307-0000-remove-enum-prototype-field.md → 2026-03-07-0000-remove-enum-prototype-field.md} +0 -0
  55. /package/editing-history/{2026-0307-0000-schema-args-type-enforcement.md → 2026-03-07-0000-schema-args-type-enforcement.md} +0 -0
  56. /package/editing-history/{2026-0307-0142-unit-type-and-builtin-schemas.md → 2026-03-07-0142-unit-type-and-builtin-schemas.md} +0 -0
  57. /package/editing-history/{2026-0307-1652-decouple-snapshot-schema-to-calcit-type.md → 2026-03-07-1652-decouple-snapshot-schema-to-calcit-type.md} +0 -0
  58. /package/editing-history/{2026-0307-1821-snapshot-schema-validation.md → 2026-03-07-1821-snapshot-schema-validation.md} +0 -0
  59. /package/editing-history/{2026-0307-1959-schema-def-kind-arity-validation.md → 2026-03-07-1959-schema-def-kind-arity-validation.md} +0 -0
  60. /package/editing-history/{2026-0308-0031-schema-generics-quote-normalization.md → 2026-03-08-0031-schema-generics-quote-normalization.md} +0 -0
  61. /package/editing-history/{2026-0308-1905-schema-typeref-and-assert-migration.md → 2026-03-08-1905-schema-typeref-and-assert-migration.md} +0 -0
  62. /package/editing-history/{2026-0308-2033-schema-wrapper-migration.md → 2026-03-08-2033-schema-wrapper-migration.md} +0 -0
  63. /package/editing-history/{2026-0308-2315-late-schema-cleanup-and-warning-compat.md → 2026-03-08-2315-late-schema-cleanup-and-warning-compat.md} +0 -0
  64. /package/editing-history/{2026-0309-1753-schema-type-fail-tests.md → 2026-03-09-1753-schema-type-fail-tests.md} +0 -0
  65. /package/editing-history/{2026-0310-1040-edit-schema-primitive-tag-support.md → 2026-03-10-1040-edit-schema-primitive-tag-support.md} +0 -0
  66. /package/editing-history/{2026-0310-1754-ns-entry-snapshot-migration.md → 2026-03-10-1754-ns-entry-snapshot-migration.md} +0 -0
  67. /package/editing-history/{2026-0313-2216-validate-struct-type-arg-arity.md → 2026-03-13-2216-validate-struct-type-arg-arity.md} +0 -0
  68. /package/editing-history/{2026-0316-2353-runtime-boundary-cleanup.md → 2026-03-16-2353-runtime-boundary-cleanup.md} +0 -0
  69. /package/editing-history/{2026-0317-0150-runtime-boundary-lookup-cleanup.md → 2026-03-17-0150-runtime-boundary-lookup-cleanup.md} +0 -0
  70. /package/editing-history/{2026-0320-0116-json-builtins-and-runtime-docs.md → 2026-03-20-0116-json-builtins-and-runtime-docs.md} +0 -0
  71. /package/editing-history/{2026-0326-2013-docs-frontmatter-and-module-search.md → 2026-03-26-2013-docs-frontmatter-and-module-search.md} +0 -0
  72. /package/editing-history/{2026-0412-1524-js-codegen-map-to-record.md → 2026-04-12-1524-js-codegen-map-to-record.md} +0 -0
  73. /package/editing-history/{2026-0412-1549-map-to-record-field-validation.md → 2026-04-12-1549-map-to-record-field-validation.md} +0 -0
  74. /package/editing-history/{2026-0413-1600-tuple-to-enum-rewrite.md → 2026-04-13-1600-tuple-to-enum-rewrite.md} +0 -0
  75. /package/editing-history/{2026-0413-2309-typeslot-enum-compile-safety.md → 2026-04-13-2309-typeslot-enum-compile-safety.md} +0 -0
  76. /package/editing-history/{2026-0414-1500-loose-record-syntax.md → 2026-04-14-1500-loose-record-syntax.md} +0 -0
  77. /package/editing-history/{2026-0414-2259-bidir-type-check-refactor.md → 2026-04-14-2259-bidir-type-check-refactor.md} +0 -0
  78. /package/editing-history/{2026-0415-0120-match-syntax-exhaustiveness.md → 2026-04-15-0120-match-syntax-exhaustiveness.md} +0 -0
  79. /package/editing-history/{202604151211-record-nth-optimization.md → 2026-04-15-1211-record-nth-optimization.md} +0 -0
  80. /package/editing-history/{20260416-1936-predicate-narrowing-expansion.md → 2026-04-16-1936-predicate-narrowing-expansion.md} +0 -0
  81. /package/editing-history/{202604170132-monomorphize-map-filter.md → 2026-04-17-0132-monomorphize-map-filter.md} +0 -0
  82. /package/editing-history/{202604170135-monomorphize-includes-reverse.md → 2026-04-17-0135-monomorphize-includes-reverse.md} +0 -0
  83. /package/editing-history/{202604170140-fold-type-predicates.md → 2026-04-17-0140-fold-type-predicates.md} +0 -0
  84. /package/editing-history/{202604170154-generic-dispatch-records-tuples.md → 2026-04-17-0154-generic-dispatch-records-tuples.md} +0 -0
  85. /package/editing-history/{202604170520-simplify-generic-defns-via-method-dispatch.md → 2026-04-17-0520-simplify-generic-defns-via-method-dispatch.md} +0 -0
  86. /package/editing-history/{202605210055-tree-show-cr-config-and-edit-cleanup.md → 2026-05-21-0055-tree-show-cr-config-and-edit-cleanup.md} +0 -0
  87. /package/editing-history/{202605312052-macro-schema-roundtrip-and-weak-types.md → 2026-05-31-2052-macro-schema-roundtrip-and-weak-types.md} +0 -0
  88. /package/editing-history/{202605312105-map-generic-weak-types-followup.md → 2026-05-31-2105-map-generic-weak-types-followup.md} +0 -0
  89. /package/editing-history/{2026-0601-0003-update-callback-field-specialization.md → 2026-06-01-0003-update-callback-field-specialization.md} +0 -0
  90. /package/editing-history/{2026-0601-2317-data-definition-where-bounds.md → 2026-06-01-2317-data-definition-where-bounds.md} +0 -0
  91. /package/editing-history/{2026-0602-0114-data-definition-where-macro-followup.md → 2026-06-02-0114-data-definition-where-macro-followup.md} +0 -0
  92. /package/editing-history/{2026-0603-check-md-edn-errors.md → 2026-06-03-0000-check-md-edn-errors.md} +0 -0
  93. /package/editing-history/{2026-0603-1600-check-md-entry-modules.md → 2026-06-03-1600-check-md-entry-modules.md} +0 -0
  94. /package/editing-history/{2026-0604-check-md-app-main-init.md → 2026-06-04-0000-check-md-app-main-init.md} +0 -0
  95. /package/editing-history/{202606042218-compiled-executable-runtime-backfill.md → 2026-06-04-2218-compiled-executable-runtime-backfill.md} +0 -0
  96. /package/editing-history/{2026-0609-with-type-slot-scoped-binding.md → 2026-06-09-0000-with-type-slot-scoped-binding.md} +0 -0
  97. /package/editing-history/{2026-0609-1241-remove-bind-type.md → 2026-06-09-1241-remove-bind-type.md} +0 -0
  98. /package/editing-history/{2026-0609-1800-core-effect-tags.md → 2026-06-09-1800-core-effect-tags.md} +0 -0
  99. /package/editing-history/{2026-0610-1200-get-def-doc-schema-builtin.md → 2026-06-10-1200-get-def-doc-schema-builtin.md} +0 -0
  100. /package/editing-history/{2026-0615-1500-effects-graph-mvp.md → 2026-06-15-1500-effects-graph-mvp.md} +0 -0
  101. /package/editing-history/{202606161700-effects-graph-ste-tree.md → 2026-06-16-1700-effects-graph-ste-tree.md} +0 -0
  102. /package/editing-history/{2025-0412-1453-map-to-record-rewrite.md → archived/2025-04-12-1453-map-to-record-rewrite.md} +0 -0
  103. /package/editing-history/{202504160117-wasm-codegen-and-catalog-update.md → archived/2025-04-16-0117-wasm-codegen-and-catalog-update.md} +0 -0
  104. /package/editing-history/{202507160207-wasm-encoder-migration.md → archived/2025-07-16-0207-wasm-encoder-migration.md} +0 -0
  105. /package/editing-history/{202507161633-wasm-data-structures.md → archived/2025-07-16-1633-wasm-data-structures.md} +0 -0
  106. /package/editing-history/{2026-0213-1926-docs-tests-followup.md → archived/2026-02-13-1926-docs-tests-followup.md} +0 -0
  107. /package/editing-history/{2026-0216-2128-docs-smoke-and-trait-errors.md → archived/2026-02-16-2128-docs-smoke-and-trait-errors.md} +0 -0
  108. /package/editing-history/{2026-0225-1234-watch-mode-default-once.md → archived/2026-02-25-1234-watch-mode-default-once.md} +0 -0
  109. /package/editing-history/{2026-0307-1302-calcit-agent-docs-update.md → archived/2026-03-07-1302-calcit-agent-docs-update.md} +0 -0
  110. /package/editing-history/{2026-0309-1819-add-test-fail-script.md → archived/2026-03-09-1819-add-test-fail-script.md} +0 -0
  111. /package/editing-history/{2026-0309-1944-split-type-fail-tests.md → archived/2026-03-09-1944-split-type-fail-tests.md} +0 -0
  112. /package/editing-history/{2026-0316-1449-profiling-tools-reorg.md → archived/2026-03-16-1449-profiling-tools-reorg.md} +0 -0
  113. /package/editing-history/{2026-0317-2026-afternoon-runtime-boundary-optimization-summary.md → archived/2026-03-17-2026-afternoon-runtime-boundary-optimization-summary.md} +0 -0
  114. /package/editing-history/{2026-0318-1802-tips-level-and-overwrite-schema-preservation.md → archived/2026-03-18-1802-tips-level-and-overwrite-schema-preservation.md} +0 -0
  115. /package/editing-history/{2026-0320-1229-query-window-3-with-parent-preview.md → archived/2026-03-20-1229-query-window-3-with-parent-preview.md} +0 -0
  116. /package/editing-history/{2026-0323-1137-command-echo-tool-output-cleanup.md → archived/2026-03-23-1137-command-echo-tool-output-cleanup.md} +0 -0
  117. /package/editing-history/{2026-0410-0011-snapshot-empty-version-pipe-marker.md → archived/2026-04-10-0011-snapshot-empty-version-pipe-marker.md} +0 -0
  118. /package/editing-history/{202604160131-wasm-math-and-test-integration.md → archived/2026-04-16-0131-wasm-math-and-test-integration.md} +0 -0
  119. /package/editing-history/{202604161507-wasm-data-structures-and-rfc-rename.md → archived/2026-04-16-1507-wasm-data-structures-and-rfc-rename.md} +0 -0
  120. /package/editing-history/{202604161520-wasm-bitwise-and-match.md → archived/2026-04-16-1520-wasm-bitwise-and-match.md} +0 -0
  121. /package/editing-history/{202604161542-wasm-cross-ns-host-imports.md → archived/2026-04-16-1542-wasm-cross-ns-host-imports.md} +0 -0
  122. /package/editing-history/{20260417-0026-wasm-rest-args.md → archived/2026-04-17-0026-wasm-rest-args.md} +0 -0
  123. /package/editing-history/{202604170048-wasm-type-of.md → archived/2026-04-17-0048-wasm-type-of.md} +0 -0
  124. /package/editing-history/{202604170051-wasm-derived-predicates.md → archived/2026-04-17-0051-wasm-derived-predicates.md} +0 -0
  125. /package/editing-history/{202604172316-wasm-do-println-fixes.md → archived/2026-04-17-2316-wasm-do-println-fixes.md} +0 -0
  126. /package/editing-history/{202604181208-split-emit-wasm-and-bump-version.md → archived/2026-04-18-1208-split-emit-wasm-and-bump-version.md} +0 -0
  127. /package/editing-history/{202604181430-wasm-list-match-and-method-dispatch.md → archived/2026-04-18-1430-wasm-list-match-and-method-dispatch.md} +0 -0
  128. /package/editing-history/{202604182041-cr-wasm-split-and-runtime-stability.md → archived/2026-04-18-2041-cr-wasm-split-and-runtime-stability.md} +0 -0
  129. /package/editing-history/{202604182045-v0.12.23-ci-wasm-fix.md → archived/2026-04-18-2045-v0.12.23-ci-wasm-fix.md} +0 -0
  130. /package/editing-history/{202604211818-wasm-string-ops-v2.md → archived/2026-04-21-1818-wasm-string-ops-v2.md} +0 -0
  131. /package/editing-history/{202604212332-split-emit-wasm.md → archived/2026-04-21-2332-split-emit-wasm.md} +0 -0
  132. /package/editing-history/{2026-0422-0114-wasm-hof-intercepts-and-set-intersection.md → archived/2026-04-22-0114-wasm-hof-intercepts-and-set-intersection.md} +0 -0
  133. /package/editing-history/{2026-0422-0136-wasm-enum-tuple-bool-str-fixes.md → archived/2026-04-22-0136-wasm-enum-tuple-bool-str-fixes.md} +0 -0
  134. /package/editing-history/{202604221340-wasm-map-diff-new-and-let-intercept.md → archived/2026-04-22-1340-wasm-map-diff-new-and-let-intercept.md} +0 -0
  135. /package/editing-history/{202604231419-v0.12.26-wasm-bisection-fixes.md → archived/2026-04-23-1419-v0.12.26-wasm-bisection-fixes.md} +0 -0
  136. /package/editing-history/{202604231645-release-conventions.md → archived/2026-04-23-1645-release-conventions.md} +0 -0
  137. /package/editing-history/{202604251940-wasm-suite-multi-module-entry.md → archived/2026-04-25-1940-wasm-suite-multi-module-entry.md} +0 -0
  138. /package/editing-history/{202604252003-wasm-method-includes-string-and-set-refactor.md → archived/2026-04-25-2003-wasm-method-includes-string-and-set-refactor.md} +0 -0
  139. /package/editing-history/{202604252010-wasm-suite-add-fn-lens-edn.md → archived/2026-04-25-2010-wasm-suite-add-fn-lens-edn.md} +0 -0
  140. /package/editing-history/{202604252051-display-by.md → archived/2026-04-25-2051-display-by.md} +0 -0
  141. /package/editing-history/{202604281728-fix-gensym-stable.md → archived/2026-04-28-1728-fix-gensym-stable.md} +0 -0
  142. /package/editing-history/{202604291400-fix-bind-type-precompile.md → archived/2026-04-29-1400-fix-bind-type-precompile.md} +0 -0
  143. /package/editing-history/{2026-0526-0957-match-docs-check-md.md → archived/2026-05-26-0957-match-docs-check-md.md} +0 -0
  144. /package/editing-history/{202605312059-ci-docs-test-and-fn-helper-tightening.md → archived/2026-05-31-2059-ci-docs-test-and-fn-helper-tightening.md} +0 -0
  145. /package/editing-history/{2026-0601-0005-release-0.12.36.md → archived/2026-06-01-0005-release-0.12.36.md} +0 -0
  146. /package/editing-history/{2026-0601-2230-enum-struct-payload-docs.md → archived/2026-06-01-2230-enum-struct-payload-docs.md} +0 -0
  147. /package/editing-history/{2026-0603-1620-release-0.12.38.md → archived/2026-06-03-1620-release-0.12.38.md} +0 -0
  148. /package/editing-history/{2026-0604-release-0.12.39.md → archived/2026-06-04-0000-release-0.12.39.md} +0 -0
  149. /package/editing-history/{202606042230-release-0.12.40.md → archived/2026-06-04-2230-release-0.12.40.md} +0 -0
  150. /package/editing-history/{202606121525-weak-types-dots-format.md → archived/2026-06-12-1525-weak-types-dots-format.md} +0 -0
  151. /package/editing-history/{202606131200_primitive_schema_tags.md → archived/2026-06-13-1200-primitive_schema_tags.md} +0 -0
  152. /package/editing-history/{202606201142-ts-declaration-d-mts.md → archived/2026-06-20-1142-ts-declaration-d-mts.md} +0 -0
@@ -0,0 +1,116 @@
1
+ # calcit.cli 与 CLI handlers 重复代码分析与重构方案
2
+
3
+ 时间: 2026-06-30
4
+ 作者: AI Agent
5
+
6
+ ## 现状
7
+
8
+ ### 两套独立实现
9
+
10
+ | 方面 | `injection/calcit_cli*.rs` | `cli_handlers/*.rs` |
11
+ |------|---------------------------|---------------------|
12
+ | 代码量 | ~2714 行 | ~5967 行 |
13
+ | 入口 | `fn(xs: Vec<Calcit>, _: &CallStackList) -> Result<Calcit, CalcitErr>` | `fn(opts: &SpecificCommandStruct, snapshot_file: &str) -> Result<(), String>` |
14
+ | 参数解析 | `resolve_cli_args()` → `ResolvedCliArgs` (从 Calcit Map 中提取) | argh 自动解析 CLI 参数到结构体 |
15
+ | 输出 | `Calcit::Str(...)` 返回给 Calcit 运行时 | `println!()` 直接输出 |
16
+ | 快照加载 | `load_calcit_snapshot()` | `load_snapshot()` |
17
+ | 快照保存 | `save_calcit_snapshot()` | `save_snapshot()` |
18
+
19
+ ### 完全重复的辅助函数
20
+
21
+ | 函数 | injection/ 位置 | cli_handlers/ 位置 |
22
+ |------|----------------|-------------------|
23
+ | load_snapshot | calcit_cli.rs:1155 | edit.rs:101 |
24
+ | save_snapshot | calcit_cli.rs:1217 | edit.rs:109 |
25
+ | parse_path | calcit_cli.rs:933 | common.rs:182 |
26
+ | navigate_to_node | calcit_cli.rs:905 | edit.rs:1267 |
27
+ | parse_target | calcit_cli_args.rs (复用 cli_options) | edit.rs:22 |
28
+ | check_ns_editable | calcit_cli.rs:1033 | edit.rs:114 |
29
+ | apply_operation_at_path | calcit_cli_tree.rs | edit.rs:1152 |
30
+ | process_node_with_references | calcit_cli_tree.rs | edit.rs:1290 |
31
+
32
+ ## 推荐的桥接方案
33
+
34
+ ### 方案: 提取共享核心 + 让 calcit.cli 代理到 cli_handlers
35
+
36
+ 不直接让 `calcit.cli` procs 调用 `cli_handlers`(因为接口类型不同),而是:
37
+
38
+ 1. **将核心业务逻辑(load → modify → save)提取到共享函数**,放在 `snapshot.rs` 或新建 `src/snapshot_ops.rs`
39
+ 2. **`cli_handlers` 调用共享函数**
40
+ 3. **`calcit.cli` 内部转发到共享函数**,而不是自己再实现一遍
41
+
42
+ ### 关键接口对齐
43
+
44
+ calcit.cli proc 的处理流程:
45
+ ```
46
+ Vec<Calcit> → resolve_cli_args() → ResolvedCliArgs → 提取参数 → 业务逻辑 → Calcit
47
+ ```
48
+
49
+ CLI handler 的处理流程:
50
+ ```
51
+ CLI struct → 提取参数 → 业务逻辑 → println!
52
+ ```
53
+
54
+ 共同点: 都需要 `(file_path, target, path, code)` 等参数, 都调用 `load_snapshot` / `save_snapshot` / `navigate_to_path` / `apply_operation_at_path`
55
+
56
+ ### 具体步骤
57
+
58
+ 1. 把 `load_snapshot`, `save_snapshot`, `navigate_to_path`, `parse_path`, `check_ns_editable`, `apply_operation_at_path`, `process_node_with_references` 等辅助函数统一放到 `src/snapshot_ops.rs` (或 `src/bin/cli_handlers/ops.rs`)
59
+ 2. 把每个业务操作(如 tree-replace、show-def、list-defs)提取为纯函数:
60
+ ```rust
61
+ pub fn op_tree_replace(snapshot: &mut Snapshot, ns: &str, def: &str, path: &[usize], new_node: &Cirru) -> Result<(), String>
62
+ pub fn op_show_def(snapshot: &Snapshot, ns: &str, def: &str) -> Result<String, String>
63
+ ```
64
+ 3. `calcit.cli` 的每个 proc handler 变成薄薄的代理层:
65
+ ```rust
66
+ pub fn tree_replace(xs: Vec<Calcit>, _cs: &CallStackList) -> Result<Calcit, CalcitErr> {
67
+ let args = resolve_cli_args("calcit.cli/tree-replace", &xs, TREE_REPLACE)?;
68
+ let mut snapshot = load_snapshot(&args.file_path()?)?;
69
+ let (ns, def) = args.target("target")?;
70
+ let path = parse_path(&args.string("path")?, false)?;
71
+ let code = args.cirru_quote("code")?;
72
+ ops::op_tree_replace(&mut snapshot, &ns, &def, &path, &code)?;
73
+ save_snapshot(&snapshot, &args.file_path()?)?;
74
+ Ok(Calcit::Str(Arc::from("replaced")))
75
+ }
76
+ ```
77
+ 4. CLI handlers 也变成薄代理:
78
+ ```rust
79
+ fn handle_replace(opts: &TreeReplaceCommand, snapshot_file: &str) -> Result<(), String> {
80
+ let (ns, def) = parse_target(&opts.target)?;
81
+ let path = parse_path(&opts.path)?;
82
+ let code = parse_input_to_cirru(...)?;
83
+ let mut snapshot = load_snapshot(snapshot_file)?;
84
+ ops::op_tree_replace(&mut snapshot, ns, def, &path, &code)?;
85
+ save_snapshot(&snapshot, snapshot_file)?;
86
+ // print preview...
87
+ }
88
+ ```
89
+
90
+ ### 收益
91
+ - 消除 ~2000 行重复代码
92
+ - 修复 bug 只需改一处
93
+ - 新功能只需写一次共享逻辑
94
+
95
+ ### 风险
96
+ - 大规模重构需要充分测试
97
+ - 需要迁移 `calcit_cli_tree.rs` 中的复杂逻辑(rewrite with references)
98
+ - `calcit.cli` 的 `CalcitErr` 错误类型和 `cli_handlers` 的 `String` 错误类型需要对齐
99
+
100
+ ## 代码规模统计
101
+
102
+ ```
103
+ src/bin/injection/
104
+ calcit_cli.rs 1297 行 ← 需要拆解: 辅助函数 + proc handlers
105
+ calcit_cli_extra.rs 846 行 ← 同上
106
+ calcit_cli_tree.rs 232 行 ← 纯辅助函数, 可整体移出
107
+ calcit_cli_args.rs 147 行 ← 桥接层, 保留
108
+ calcit_cli_specs.rs 192 行 ← 参数规格定义, 保留
109
+ mod.rs ~60 行 ← 注册代码, 保留
110
+
111
+ src/bin/cli_handlers/
112
+ edit.rs 2026 行 ← 辅助函数 + handler 逻辑
113
+ tree.rs 1433 行 ← handler 逻辑
114
+ query.rs 2135 行 ← handler 逻辑
115
+ common.rs 373 行 ← 工具函数
116
+ ```
package/lib/js-cirru.mjs CHANGED
@@ -433,14 +433,12 @@ export let format_cirru_edn = (data, useInline = true) => {
433
433
  return "\ndo nil" + "\n";
434
434
  }
435
435
  if (typeof data === "string") {
436
- return "\ndo " + to_cirru_edn(data) + "\n";
436
+ let quoted = writeCirruCode([[to_cirru_edn(data)]], { useInline: useInline }).trim();
437
+ return "\ndo " + quoted + "\n";
437
438
  }
438
439
  if (typeof data === "boolean") {
439
440
  return "\ndo " + to_cirru_edn(data) + "\n";
440
441
  }
441
- if (typeof data === "string") {
442
- return "\ndo " + to_cirru_edn(data) + "\n";
443
- }
444
442
  if (data instanceof CalcitSymbol) {
445
443
  return "\ndo " + to_cirru_edn(data) + "\n";
446
444
  }
package/lib/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@calcit/procs",
3
- "version": "0.12.47",
3
+ "version": "0.12.49",
4
4
  "main": "./lib/calcit.procs.mjs",
5
5
  "devDependencies": {
6
6
  "@types/node": "^25.7.0",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@calcit/procs",
3
- "version": "0.12.47",
3
+ "version": "0.12.49",
4
4
  "main": "./lib/calcit.procs.mjs",
5
5
  "devDependencies": {
6
6
  "@types/node": "^25.7.0",
@@ -437,14 +437,12 @@ export let format_cirru_edn = (data: CalcitValue, useInline: boolean = true): st
437
437
  return "\ndo nil" + "\n";
438
438
  }
439
439
  if (typeof data === "string") {
440
- return "\ndo " + to_cirru_edn(data) + "\n";
440
+ let quoted = writeCirruCode([[to_cirru_edn(data)]], { useInline: useInline }).trim();
441
+ return "\ndo " + quoted + "\n";
441
442
  }
442
443
  if (typeof data === "boolean") {
443
444
  return "\ndo " + to_cirru_edn(data) + "\n";
444
445
  }
445
- if (typeof data === "string") {
446
- return "\ndo " + to_cirru_edn(data) + "\n";
447
- }
448
446
  if (data instanceof CalcitSymbol) {
449
447
  return "\ndo " + to_cirru_edn(data) + "\n";
450
448
  }