refactor(cli,test,format): move (sigil json)-using code out of bootstrap
Splits every bootstrap-compiled module that imported (sigil json) into a parent that stays in the bootstrap set and a sibling submodule that holds the json-using code and is loaded lazily at runtime. Needed because sigil-json was extracted to codeberg.org/sigil/sigil-json, so the monorepo bootstrap can no longer compile sigil/json.sgb. Dispatch pattern mirrors (sigil cli init): the parent quotes the submodule name and does module-exists? + eval '(import ...) + module-ref only on first use.
New post-bootstrap submodules: - (sigil cli watch) -- sigil build/test --watch JSON event lines - (sigil cli manager remote) -- sigil cli install/upgrade/use + release API + zig fetch - (sigil cli app manifest) -- ~/.sigil/apps manifest I/O + MCP JSON config - (sigil test report) -- sigil test --report JSON writer - (sigil format json) -- sigil format --json result printer
Parents that drop (sigil json) from their import list: - (sigil cli), (sigil cli manager), (sigil cli app) - (sigil test runner) - (sigil format)
Behavior is unchanged: sigil watch, sigil cli install/upgrade/use, sigil init, sigil format --json, sigil test --report all behave identically. Verified against the 2048-test baseline (2048/2048 pass).
test/stdlib/test-format.sgl picks up (sigil format json) for the format-result->json test that used to exercise (sigil format).
Task: t-ea65 Note: topics/sigil-bootstrap-trim-playbook
src/sigil/format.sgl | 42 +++---------------------------------------
src/sigil/format/json.sgl | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 53 insertions(+), 39 deletions(-)src/sigil/format.sglmodified
(import (sigil struct) (sigil string) (sigil io) (sigil json) (sigil fs)) (export ;; Output formatting format-result->string format-result->json ;; Error/warning/inference records format-error? (length warnings) (length inferences))))) ;;; Format result as JSON string (define (format-result->json result) (let ((file (format-result-file result)) (success (format-result-success result)) (output (format-result-output result)) (errors (format-result-errors result)) (warnings (format-result-warnings result)) (inferences (format-result-inferences result))) (json-encode (list (cons 'file file) (cons 'success success) ;; Skip output for now if it's large - just indicate if present (cons 'hasOutput (if output #t #f)) (cons 'errors (map (lambda (e) (list (cons 'line (format-error-line e)) (cons 'column (format-error-column e)) (cons 'message (format-error-message e)) (cons 'code (format-error-code e)))) errors)) (cons 'warnings (map (lambda (w) (list (cons 'line (format-warning-line w)) (cons 'column (format-warning-column w)) (cons 'message (format-warning-message w)) (cons 'code (format-warning-code w)))) warnings)) (cons 'inferences (map (lambda (inf) (list (cons 'line (paren-inference-line inf)) (cons 'column (paren-inference-column inf)) (cons 'type (symbol->string (paren-inference-type inf))) (cons 'confidence (symbol->string (paren-inference-confidence inf))) (cons 'reason (paren-inference-reason inf)))) inferences))) indent: 2))) ;; format-result->json is defined in (sigil format json), which imports ;; (sigil json). Loaded lazily from the CLI so the bootstrap stdlib ;; does not require (sigil json). ;; ============================================================ ;;; Main APIsrc/sigil/format/json.sgladded
;;; (sigil format json) - JSON output for format results (post-bootstrap);;;;;; Factored out of (sigil format) so the bootstrap stdlib does not pull;;; in (sigil json). Loaded lazily from (sigil cli) when;;; `sigil format --format json` is used.(define-library (sigil format json) (import (sigil format) (sigil json)) (export format-result->json) (begin ;;; Format result as JSON string (define (format-result->json result) (let ((file (format-result-file result)) (success (format-result-success result)) (output (format-result-output result)) (errors (format-result-errors result)) (warnings (format-result-warnings result)) (inferences (format-result-inferences result))) (json-encode (list (cons 'file file) (cons 'success success) ;; Skip output for now if it's large - just indicate if present (cons 'hasOutput (if output #t #f)) (cons 'errors (map (lambda (e) (list (cons 'line (format-error-line e)) (cons 'column (format-error-column e)) (cons 'message (format-error-message e)) (cons 'code (format-error-code e)))) errors)) (cons 'warnings (map (lambda (w) (list (cons 'line (format-warning-line w)) (cons 'column (format-warning-column w)) (cons 'message (format-warning-message w)) (cons 'code (format-warning-code w)))) warnings)) (cons 'inferences (map (lambda (inf) (list (cons 'line (paren-inference-line inf)) (cons 'column (paren-inference-column inf)) (cons 'type (symbol->string (paren-inference-type inf))) (cons 'confidence (symbol->string (paren-inference-confidence inf))) (cons 'reason (paren-inference-reason inf)))) inferences))) indent: 2)))))