@nac3/forge-cli 0.2.0-alpha.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.
- package/LICENSE +45 -0
- package/README.md +371 -0
- package/dist/bin/yf.d.ts +5 -0
- package/dist/bin/yf.d.ts.map +1 -0
- package/dist/bin/yf.js +86 -0
- package/dist/bin/yf.js.map +1 -0
- package/dist/chat/claude.d.ts +100 -0
- package/dist/chat/claude.d.ts.map +1 -0
- package/dist/chat/claude.js +228 -0
- package/dist/chat/claude.js.map +1 -0
- package/dist/chat/ingest_session.d.ts +97 -0
- package/dist/chat/ingest_session.d.ts.map +1 -0
- package/dist/chat/ingest_session.js +99 -0
- package/dist/chat/ingest_session.js.map +1 -0
- package/dist/chat/panel.d.ts +15 -0
- package/dist/chat/panel.d.ts.map +1 -0
- package/dist/chat/panel.js +1526 -0
- package/dist/chat/panel.js.map +1 -0
- package/dist/chat/persistence.d.ts +37 -0
- package/dist/chat/persistence.d.ts.map +1 -0
- package/dist/chat/persistence.js +91 -0
- package/dist/chat/persistence.js.map +1 -0
- package/dist/chat/server.d.ts +34 -0
- package/dist/chat/server.d.ts.map +1 -0
- package/dist/chat/server.js +1540 -0
- package/dist/chat/server.js.map +1 -0
- package/dist/chat/spec_extract.d.ts +35 -0
- package/dist/chat/spec_extract.d.ts.map +1 -0
- package/dist/chat/spec_extract.js +152 -0
- package/dist/chat/spec_extract.js.map +1 -0
- package/dist/chat/spec_plan.d.ts +65 -0
- package/dist/chat/spec_plan.d.ts.map +1 -0
- package/dist/chat/spec_plan.js +160 -0
- package/dist/chat/spec_plan.js.map +1 -0
- package/dist/chat/spec_scaffold.d.ts +95 -0
- package/dist/chat/spec_scaffold.d.ts.map +1 -0
- package/dist/chat/spec_scaffold.js +220 -0
- package/dist/chat/spec_scaffold.js.map +1 -0
- package/dist/chat/tools/git.d.ts +59 -0
- package/dist/chat/tools/git.d.ts.map +1 -0
- package/dist/chat/tools/git.js +313 -0
- package/dist/chat/tools/git.js.map +1 -0
- package/dist/chat/tools/github.d.ts +59 -0
- package/dist/chat/tools/github.d.ts.map +1 -0
- package/dist/chat/tools/github.js +310 -0
- package/dist/chat/tools/github.js.map +1 -0
- package/dist/chat/tools/lifecycle.d.ts +82 -0
- package/dist/chat/tools/lifecycle.d.ts.map +1 -0
- package/dist/chat/tools/lifecycle.js +295 -0
- package/dist/chat/tools/lifecycle.js.map +1 -0
- package/dist/chat/tools/manual.d.ts +26 -0
- package/dist/chat/tools/manual.d.ts.map +1 -0
- package/dist/chat/tools/manual.js +164 -0
- package/dist/chat/tools/manual.js.map +1 -0
- package/dist/chat/tools/reader.d.ts +80 -0
- package/dist/chat/tools/reader.d.ts.map +1 -0
- package/dist/chat/tools/reader.js +471 -0
- package/dist/chat/tools/reader.js.map +1 -0
- package/dist/chat/tools.d.ts +106 -0
- package/dist/chat/tools.d.ts.map +1 -0
- package/dist/chat/tools.js +587 -0
- package/dist/chat/tools.js.map +1 -0
- package/dist/codegen/e2e.d.ts +106 -0
- package/dist/codegen/e2e.d.ts.map +1 -0
- package/dist/codegen/e2e.js +931 -0
- package/dist/codegen/e2e.js.map +1 -0
- package/dist/codegen/v3_flow_emit.d.ts +70 -0
- package/dist/codegen/v3_flow_emit.d.ts.map +1 -0
- package/dist/codegen/v3_flow_emit.js +225 -0
- package/dist/codegen/v3_flow_emit.js.map +1 -0
- package/dist/commands/_stub.d.ts +2 -0
- package/dist/commands/_stub.d.ts.map +1 -0
- package/dist/commands/_stub.js +21 -0
- package/dist/commands/_stub.js.map +1 -0
- package/dist/commands/app.d.ts +31 -0
- package/dist/commands/app.d.ts.map +1 -0
- package/dist/commands/app.js +331 -0
- package/dist/commands/app.js.map +1 -0
- package/dist/commands/chat.d.ts +18 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +76 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/deploy.d.ts +21 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +121 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/doctor.d.ts +14 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +280 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/figma.d.ts +32 -0
- package/dist/commands/figma.d.ts.map +1 -0
- package/dist/commands/figma.js +141 -0
- package/dist/commands/figma.js.map +1 -0
- package/dist/commands/gen-flow-tests.d.ts +8 -0
- package/dist/commands/gen-flow-tests.d.ts.map +1 -0
- package/dist/commands/gen-flow-tests.js +78 -0
- package/dist/commands/gen-flow-tests.js.map +1 -0
- package/dist/commands/gen-tests.d.ts +9 -0
- package/dist/commands/gen-tests.d.ts.map +1 -0
- package/dist/commands/gen-tests.js +118 -0
- package/dist/commands/gen-tests.js.map +1 -0
- package/dist/commands/license.d.ts +14 -0
- package/dist/commands/license.d.ts.map +1 -0
- package/dist/commands/license.js +182 -0
- package/dist/commands/license.js.map +1 -0
- package/dist/commands/log.d.ts +19 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +101 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/migrate.d.ts +118 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +1410 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/mobile.d.ts +27 -0
- package/dist/commands/mobile.d.ts.map +1 -0
- package/dist/commands/mobile.js +90 -0
- package/dist/commands/mobile.js.map +1 -0
- package/dist/commands/new.d.ts +32 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +107 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/pilot.d.ts +8 -0
- package/dist/commands/pilot.d.ts.map +1 -0
- package/dist/commands/pilot.js +104 -0
- package/dist/commands/pilot.js.map +1 -0
- package/dist/commands/projects.d.ts +21 -0
- package/dist/commands/projects.d.ts.map +1 -0
- package/dist/commands/projects.js +238 -0
- package/dist/commands/projects.js.map +1 -0
- package/dist/commands/publish.d.ts +35 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +194 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/repo.d.ts +59 -0
- package/dist/commands/repo.d.ts.map +1 -0
- package/dist/commands/repo.js +178 -0
- package/dist/commands/repo.js.map +1 -0
- package/dist/commands/review-screens.d.ts +28 -0
- package/dist/commands/review-screens.d.ts.map +1 -0
- package/dist/commands/review-screens.js +345 -0
- package/dist/commands/review-screens.js.map +1 -0
- package/dist/commands/scenarios.d.ts +23 -0
- package/dist/commands/scenarios.d.ts.map +1 -0
- package/dist/commands/scenarios.js +304 -0
- package/dist/commands/scenarios.js.map +1 -0
- package/dist/commands/ship.d.ts +18 -0
- package/dist/commands/ship.d.ts.map +1 -0
- package/dist/commands/ship.js +41 -0
- package/dist/commands/ship.js.map +1 -0
- package/dist/commands/test.d.ts +29 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +62 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/commands/tunnel.d.ts +22 -0
- package/dist/commands/tunnel.d.ts.map +1 -0
- package/dist/commands/tunnel.js +77 -0
- package/dist/commands/tunnel.js.map +1 -0
- package/dist/commands/validate.d.ts +14 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +51 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/commands/vault.d.ts +32 -0
- package/dist/commands/vault.d.ts.map +1 -0
- package/dist/commands/vault.js +489 -0
- package/dist/commands/vault.js.map +1 -0
- package/dist/commands/voice.d.ts +16 -0
- package/dist/commands/voice.d.ts.map +1 -0
- package/dist/commands/voice.js +69 -0
- package/dist/commands/voice.js.map +1 -0
- package/dist/core/cascade_router.d.ts +90 -0
- package/dist/core/cascade_router.d.ts.map +1 -0
- package/dist/core/cascade_router.js +131 -0
- package/dist/core/cascade_router.js.map +1 -0
- package/dist/core/cf_tunnel.d.ts +52 -0
- package/dist/core/cf_tunnel.d.ts.map +1 -0
- package/dist/core/cf_tunnel.js +134 -0
- package/dist/core/cf_tunnel.js.map +1 -0
- package/dist/core/gha_dispatcher.d.ts +48 -0
- package/dist/core/gha_dispatcher.d.ts.map +1 -0
- package/dist/core/gha_dispatcher.js +198 -0
- package/dist/core/gha_dispatcher.js.map +1 -0
- package/dist/core/logger.d.ts +89 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +245 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/mode.d.ts +26 -0
- package/dist/core/mode.d.ts.map +1 -0
- package/dist/core/mode.js +122 -0
- package/dist/core/mode.js.map +1 -0
- package/dist/core/pairing.d.ts +40 -0
- package/dist/core/pairing.d.ts.map +1 -0
- package/dist/core/pairing.js +145 -0
- package/dist/core/pairing.js.map +1 -0
- package/dist/core/pilot_setup.d.ts +29 -0
- package/dist/core/pilot_setup.d.ts.map +1 -0
- package/dist/core/pilot_setup.js +119 -0
- package/dist/core/pilot_setup.js.map +1 -0
- package/dist/core/polar.d.ts +81 -0
- package/dist/core/polar.d.ts.map +1 -0
- package/dist/core/polar.js +175 -0
- package/dist/core/polar.js.map +1 -0
- package/dist/core/project_picker.d.ts +56 -0
- package/dist/core/project_picker.d.ts.map +1 -0
- package/dist/core/project_picker.js +86 -0
- package/dist/core/project_picker.js.map +1 -0
- package/dist/core/projects.d.ts +58 -0
- package/dist/core/projects.d.ts.map +1 -0
- package/dist/core/projects.js +146 -0
- package/dist/core/projects.js.map +1 -0
- package/dist/core/projects_sync.d.ts +80 -0
- package/dist/core/projects_sync.d.ts.map +1 -0
- package/dist/core/projects_sync.js +278 -0
- package/dist/core/projects_sync.js.map +1 -0
- package/dist/core/remote_runner.d.ts +70 -0
- package/dist/core/remote_runner.d.ts.map +1 -0
- package/dist/core/remote_runner.js +133 -0
- package/dist/core/remote_runner.js.map +1 -0
- package/dist/core/repo_state.d.ts +24 -0
- package/dist/core/repo_state.d.ts.map +1 -0
- package/dist/core/repo_state.js +109 -0
- package/dist/core/repo_state.js.map +1 -0
- package/dist/core/target.d.ts +31 -0
- package/dist/core/target.d.ts.map +1 -0
- package/dist/core/target.js +121 -0
- package/dist/core/target.js.map +1 -0
- package/dist/deploy/aws.d.ts +43 -0
- package/dist/deploy/aws.d.ts.map +1 -0
- package/dist/deploy/aws.js +173 -0
- package/dist/deploy/aws.js.map +1 -0
- package/dist/figma/api.d.ts +35 -0
- package/dist/figma/api.d.ts.map +1 -0
- package/dist/figma/api.js +40 -0
- package/dist/figma/api.js.map +1 -0
- package/dist/figma/decorator.d.ts +74 -0
- package/dist/figma/decorator.d.ts.map +1 -0
- package/dist/figma/decorator.js +210 -0
- package/dist/figma/decorator.js.map +1 -0
- package/dist/figma/heuristics.d.ts +29 -0
- package/dist/figma/heuristics.d.ts.map +1 -0
- package/dist/figma/heuristics.js +110 -0
- package/dist/figma/heuristics.js.map +1 -0
- package/dist/figma/normalize.d.ts +33 -0
- package/dist/figma/normalize.d.ts.map +1 -0
- package/dist/figma/normalize.js +101 -0
- package/dist/figma/normalize.js.map +1 -0
- package/dist/figma/tokens.d.ts +23 -0
- package/dist/figma/tokens.d.ts.map +1 -0
- package/dist/figma/tokens.js +111 -0
- package/dist/figma/tokens.js.map +1 -0
- package/dist/figma/types.d.ts +118 -0
- package/dist/figma/types.d.ts.map +1 -0
- package/dist/figma/types.js +12 -0
- package/dist/figma/types.js.map +1 -0
- package/dist/i18n/index.d.ts +48 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +135 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/types.d.ts +52 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n/types.js +85 -0
- package/dist/i18n/types.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/lan/mdns_packet.d.ts +74 -0
- package/dist/lan/mdns_packet.d.ts.map +1 -0
- package/dist/lan/mdns_packet.js +247 -0
- package/dist/lan/mdns_packet.js.map +1 -0
- package/dist/lan/mdns_service.d.ts +102 -0
- package/dist/lan/mdns_service.d.ts.map +1 -0
- package/dist/lan/mdns_service.js +206 -0
- package/dist/lan/mdns_service.js.map +1 -0
- package/dist/license/activate.d.ts +33 -0
- package/dist/license/activate.d.ts.map +1 -0
- package/dist/license/activate.js +135 -0
- package/dist/license/activate.js.map +1 -0
- package/dist/license/fingerprint.d.ts +2 -0
- package/dist/license/fingerprint.d.ts.map +1 -0
- package/dist/license/fingerprint.js +29 -0
- package/dist/license/fingerprint.js.map +1 -0
- package/dist/license/hito4_client.d.ts +24 -0
- package/dist/license/hito4_client.d.ts.map +1 -0
- package/dist/license/hito4_client.js +103 -0
- package/dist/license/hito4_client.js.map +1 -0
- package/dist/license/index.d.ts +22 -0
- package/dist/license/index.d.ts.map +1 -0
- package/dist/license/index.js +125 -0
- package/dist/license/index.js.map +1 -0
- package/dist/license/types.d.ts +38 -0
- package/dist/license/types.d.ts.map +1 -0
- package/dist/license/types.js +9 -0
- package/dist/license/types.js.map +1 -0
- package/dist/migrate/ai-apply.d.ts +198 -0
- package/dist/migrate/ai-apply.d.ts.map +1 -0
- package/dist/migrate/ai-apply.js +833 -0
- package/dist/migrate/ai-apply.js.map +1 -0
- package/dist/migrate/ai-decorator.d.ts +87 -0
- package/dist/migrate/ai-decorator.d.ts.map +1 -0
- package/dist/migrate/ai-decorator.js +203 -0
- package/dist/migrate/ai-decorator.js.map +1 -0
- package/dist/migrate/apply.d.ts +28 -0
- package/dist/migrate/apply.d.ts.map +1 -0
- package/dist/migrate/apply.js +119 -0
- package/dist/migrate/apply.js.map +1 -0
- package/dist/migrate/audit.d.ts +9 -0
- package/dist/migrate/audit.d.ts.map +1 -0
- package/dist/migrate/audit.js +197 -0
- package/dist/migrate/audit.js.map +1 -0
- package/dist/migrate/diff.d.ts +28 -0
- package/dist/migrate/diff.d.ts.map +1 -0
- package/dist/migrate/diff.js +154 -0
- package/dist/migrate/diff.js.map +1 -0
- package/dist/migrate/html-orchestrator.d.ts +81 -0
- package/dist/migrate/html-orchestrator.d.ts.map +1 -0
- package/dist/migrate/html-orchestrator.js +233 -0
- package/dist/migrate/html-orchestrator.js.map +1 -0
- package/dist/migrate/html-walker.d.ts +93 -0
- package/dist/migrate/html-walker.d.ts.map +1 -0
- package/dist/migrate/html-walker.js +288 -0
- package/dist/migrate/html-walker.js.map +1 -0
- package/dist/migrate/js-template-walker.d.ts +118 -0
- package/dist/migrate/js-template-walker.d.ts.map +1 -0
- package/dist/migrate/js-template-walker.js +644 -0
- package/dist/migrate/js-template-walker.js.map +1 -0
- package/dist/migrate/manifest-validator.d.ts +30 -0
- package/dist/migrate/manifest-validator.d.ts.map +1 -0
- package/dist/migrate/manifest-validator.js +261 -0
- package/dist/migrate/manifest-validator.js.map +1 -0
- package/dist/migrate/overrides.d.ts +58 -0
- package/dist/migrate/overrides.d.ts.map +1 -0
- package/dist/migrate/overrides.js +193 -0
- package/dist/migrate/overrides.js.map +1 -0
- package/dist/migrate/plugin-scope.d.ts +42 -0
- package/dist/migrate/plugin-scope.d.ts.map +1 -0
- package/dist/migrate/plugin-scope.js +94 -0
- package/dist/migrate/plugin-scope.js.map +1 -0
- package/dist/migrate/types.d.ts +45 -0
- package/dist/migrate/types.d.ts.map +1 -0
- package/dist/migrate/types.js +9 -0
- package/dist/migrate/types.js.map +1 -0
- package/dist/migrate/verb-inference.d.ts +37 -0
- package/dist/migrate/verb-inference.d.ts.map +1 -0
- package/dist/migrate/verb-inference.js +274 -0
- package/dist/migrate/verb-inference.js.map +1 -0
- package/dist/nac3/attrs.d.ts +87 -0
- package/dist/nac3/attrs.d.ts.map +1 -0
- package/dist/nac3/attrs.js +134 -0
- package/dist/nac3/attrs.js.map +1 -0
- package/dist/nac3/scenario_dsl.d.ts +71 -0
- package/dist/nac3/scenario_dsl.d.ts.map +1 -0
- package/dist/nac3/scenario_dsl.js +191 -0
- package/dist/nac3/scenario_dsl.js.map +1 -0
- package/dist/nac3/tokens.d.ts +126 -0
- package/dist/nac3/tokens.d.ts.map +1 -0
- package/dist/nac3/tokens.js +138 -0
- package/dist/nac3/tokens.js.map +1 -0
- package/dist/reader/parsers/csv.d.ts +42 -0
- package/dist/reader/parsers/csv.d.ts.map +1 -0
- package/dist/reader/parsers/csv.js +221 -0
- package/dist/reader/parsers/csv.js.map +1 -0
- package/dist/reader/parsers/docx.d.ts +31 -0
- package/dist/reader/parsers/docx.d.ts.map +1 -0
- package/dist/reader/parsers/docx.js +51 -0
- package/dist/reader/parsers/docx.js.map +1 -0
- package/dist/reader/parsers/epub.d.ts +39 -0
- package/dist/reader/parsers/epub.d.ts.map +1 -0
- package/dist/reader/parsers/epub.js +265 -0
- package/dist/reader/parsers/epub.js.map +1 -0
- package/dist/reader/parsers/html.d.ts +40 -0
- package/dist/reader/parsers/html.d.ts.map +1 -0
- package/dist/reader/parsers/html.js +386 -0
- package/dist/reader/parsers/html.js.map +1 -0
- package/dist/reader/parsers/md.d.ts +30 -0
- package/dist/reader/parsers/md.d.ts.map +1 -0
- package/dist/reader/parsers/md.js +199 -0
- package/dist/reader/parsers/md.js.map +1 -0
- package/dist/reader/parsers/pdf.d.ts +39 -0
- package/dist/reader/parsers/pdf.d.ts.map +1 -0
- package/dist/reader/parsers/pdf.js +220 -0
- package/dist/reader/parsers/pdf.js.map +1 -0
- package/dist/reader/parsers/rtf.d.ts +37 -0
- package/dist/reader/parsers/rtf.d.ts.map +1 -0
- package/dist/reader/parsers/rtf.js +347 -0
- package/dist/reader/parsers/rtf.js.map +1 -0
- package/dist/reader/parsers/source.d.ts +32 -0
- package/dist/reader/parsers/source.d.ts.map +1 -0
- package/dist/reader/parsers/source.js +122 -0
- package/dist/reader/parsers/source.js.map +1 -0
- package/dist/reader/parsers/txt.d.ts +25 -0
- package/dist/reader/parsers/txt.d.ts.map +1 -0
- package/dist/reader/parsers/txt.js +56 -0
- package/dist/reader/parsers/txt.js.map +1 -0
- package/dist/reader/parsers/xlsx.d.ts +33 -0
- package/dist/reader/parsers/xlsx.d.ts.map +1 -0
- package/dist/reader/parsers/xlsx.js +143 -0
- package/dist/reader/parsers/xlsx.js.map +1 -0
- package/dist/reader/registry.d.ts +39 -0
- package/dist/reader/registry.d.ts.map +1 -0
- package/dist/reader/registry.js +172 -0
- package/dist/reader/registry.js.map +1 -0
- package/dist/reader/search.d.ts +27 -0
- package/dist/reader/search.d.ts.map +1 -0
- package/dist/reader/search.js +77 -0
- package/dist/reader/search.js.map +1 -0
- package/dist/reader/state.d.ts +56 -0
- package/dist/reader/state.d.ts.map +1 -0
- package/dist/reader/state.js +179 -0
- package/dist/reader/state.js.map +1 -0
- package/dist/reader/types.d.ts +119 -0
- package/dist/reader/types.d.ts.map +1 -0
- package/dist/reader/types.js +23 -0
- package/dist/reader/types.js.map +1 -0
- package/dist/ship/run.d.ts +26 -0
- package/dist/ship/run.d.ts.map +1 -0
- package/dist/ship/run.js +123 -0
- package/dist/ship/run.js.map +1 -0
- package/dist/template/index.d.ts +50 -0
- package/dist/template/index.d.ts.map +1 -0
- package/dist/template/index.js +140 -0
- package/dist/template/index.js.map +1 -0
- package/dist/ui/colors.d.ts +13 -0
- package/dist/ui/colors.d.ts.map +1 -0
- package/dist/ui/colors.js +26 -0
- package/dist/ui/colors.js.map +1 -0
- package/dist/validate/index.d.ts +19 -0
- package/dist/validate/index.d.ts.map +1 -0
- package/dist/validate/index.js +181 -0
- package/dist/validate/index.js.map +1 -0
- package/dist/vault/catalog.d.ts +55 -0
- package/dist/vault/catalog.d.ts.map +1 -0
- package/dist/vault/catalog.js +424 -0
- package/dist/vault/catalog.js.map +1 -0
- package/dist/vault/crypto.d.ts +82 -0
- package/dist/vault/crypto.d.ts.map +1 -0
- package/dist/vault/crypto.js +173 -0
- package/dist/vault/crypto.js.map +1 -0
- package/dist/vault/git_askpass.d.ts +26 -0
- package/dist/vault/git_askpass.d.ts.map +1 -0
- package/dist/vault/git_askpass.js +104 -0
- package/dist/vault/git_askpass.js.map +1 -0
- package/dist/vault/migrator.d.ts +57 -0
- package/dist/vault/migrator.d.ts.map +1 -0
- package/dist/vault/migrator.js +204 -0
- package/dist/vault/migrator.js.map +1 -0
- package/dist/vault/redactor.d.ts +73 -0
- package/dist/vault/redactor.d.ts.map +1 -0
- package/dist/vault/redactor.js +182 -0
- package/dist/vault/redactor.js.map +1 -0
- package/dist/vault/store.d.ts +132 -0
- package/dist/vault/store.d.ts.map +1 -0
- package/dist/vault/store.js +335 -0
- package/dist/vault/store.js.map +1 -0
- package/dist/version.d.ts +8 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +8 -0
- package/dist/version.js.map +1 -0
- package/dist/voice/chunker.d.ts +43 -0
- package/dist/voice/chunker.d.ts.map +1 -0
- package/dist/voice/chunker.js +133 -0
- package/dist/voice/chunker.js.map +1 -0
- package/dist/voice/config.d.ts +14 -0
- package/dist/voice/config.d.ts.map +1 -0
- package/dist/voice/config.js +51 -0
- package/dist/voice/config.js.map +1 -0
- package/dist/voice/intents.d.ts +71 -0
- package/dist/voice/intents.d.ts.map +1 -0
- package/dist/voice/intents.js +0 -0
- package/dist/voice/intents.js.map +1 -0
- package/dist/voice/providers/elevenlabs.d.ts +53 -0
- package/dist/voice/providers/elevenlabs.d.ts.map +1 -0
- package/dist/voice/providers/elevenlabs.js +159 -0
- package/dist/voice/providers/elevenlabs.js.map +1 -0
- package/dist/voice/providers/google.d.ts +56 -0
- package/dist/voice/providers/google.d.ts.map +1 -0
- package/dist/voice/providers/google.js +253 -0
- package/dist/voice/providers/google.js.map +1 -0
- package/dist/voice/providers/whisper.d.ts +44 -0
- package/dist/voice/providers/whisper.d.ts.map +1 -0
- package/dist/voice/providers/whisper.js +179 -0
- package/dist/voice/providers/whisper.js.map +1 -0
- package/dist/voice/registry.d.ts +35 -0
- package/dist/voice/registry.d.ts.map +1 -0
- package/dist/voice/registry.js +48 -0
- package/dist/voice/registry.js.map +1 -0
- package/dist/voice/router.d.ts +62 -0
- package/dist/voice/router.d.ts.map +1 -0
- package/dist/voice/router.js +175 -0
- package/dist/voice/router.js.map +1 -0
- package/dist/voice/types.d.ts +116 -0
- package/dist/voice/types.d.ts.map +1 -0
- package/dist/voice/types.js +22 -0
- package/dist/voice/types.js.map +1 -0
- package/dist/voice/voiceprint/enrollment.d.ts +36 -0
- package/dist/voice/voiceprint/enrollment.d.ts.map +1 -0
- package/dist/voice/voiceprint/enrollment.js +71 -0
- package/dist/voice/voiceprint/enrollment.js.map +1 -0
- package/dist/voice/voiceprint/identify.d.ts +16 -0
- package/dist/voice/voiceprint/identify.d.ts.map +1 -0
- package/dist/voice/voiceprint/identify.js +20 -0
- package/dist/voice/voiceprint/identify.js.map +1 -0
- package/dist/voice/voiceprint/liveness.d.ts +90 -0
- package/dist/voice/voiceprint/liveness.d.ts.map +1 -0
- package/dist/voice/voiceprint/liveness.js +251 -0
- package/dist/voice/voiceprint/liveness.js.map +1 -0
- package/dist/voice/voiceprint/match.d.ts +54 -0
- package/dist/voice/voiceprint/match.d.ts.map +1 -0
- package/dist/voice/voiceprint/match.js +88 -0
- package/dist/voice/voiceprint/match.js.map +1 -0
- package/dist/voice/voiceprint/providers/local-mfcc-stub.d.ts +44 -0
- package/dist/voice/voiceprint/providers/local-mfcc-stub.d.ts.map +1 -0
- package/dist/voice/voiceprint/providers/local-mfcc-stub.js +92 -0
- package/dist/voice/voiceprint/providers/local-mfcc-stub.js.map +1 -0
- package/dist/voice/voiceprint/store.d.ts +60 -0
- package/dist/voice/voiceprint/store.d.ts.map +1 -0
- package/dist/voice/voiceprint/store.js +155 -0
- package/dist/voice/voiceprint/store.js.map +1 -0
- package/dist/voice/voiceprint/trust.d.ts +90 -0
- package/dist/voice/voiceprint/trust.d.ts.map +1 -0
- package/dist/voice/voiceprint/trust.js +150 -0
- package/dist/voice/voiceprint/trust.js.map +1 -0
- package/dist/voice/voiceprint/types.d.ts +100 -0
- package/dist/voice/voiceprint/types.d.ts.map +1 -0
- package/dist/voice/voiceprint/types.js +23 -0
- package/dist/voice/voiceprint/types.js.map +1 -0
- package/dist/voice/wake.d.ts +64 -0
- package/dist/voice/wake.d.ts.map +1 -0
- package/dist/voice/wake.js +143 -0
- package/dist/voice/wake.js.map +1 -0
- package/docs/manuals/manual.ar.html +91 -0
- package/docs/manuals/manual.de.html +100 -0
- package/docs/manuals/manual.en.html +118 -0
- package/docs/manuals/manual.es.html +120 -0
- package/docs/manuals/manual.fr.html +102 -0
- package/docs/manuals/manual.hi.html +93 -0
- package/docs/manuals/manual.it.html +93 -0
- package/docs/manuals/manual.ja.html +97 -0
- package/docs/manuals/manual.pt.html +103 -0
- package/docs/manuals/manual.zh.html +89 -0
- package/package.json +94 -0
- package/src/i18n/catalogs/ar.json +86 -0
- package/src/i18n/catalogs/de.json +86 -0
- package/src/i18n/catalogs/en.json +86 -0
- package/src/i18n/catalogs/es.json +86 -0
- package/src/i18n/catalogs/fr.json +86 -0
- package/src/i18n/catalogs/hi.json +86 -0
- package/src/i18n/catalogs/it.json +86 -0
- package/src/i18n/catalogs/ja.json +86 -0
- package/src/i18n/catalogs/pt.json +86 -0
- package/src/i18n/catalogs/zh.json +86 -0
- package/templates/react-app/README.md +43 -0
- package/templates/react-app/index.html +12 -0
- package/templates/react-app/package.json +35 -0
- package/templates/react-app/src/App.tsx +106 -0
- package/templates/react-app/src/main.tsx +21 -0
- package/templates/react-app/src/nac/manifest.ts +46 -0
- package/templates/react-app/src/styles.css +68 -0
- package/templates/react-app/tsconfig.json +19 -0
- package/templates/react-app/vite.config.ts +12 -0
- package/templates/react-app/yujin.forge.json +15 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Document reader subsystem -- type surface.
|
|
3
|
+
*
|
|
4
|
+
* The reader takes a document (txt / md / pdf / docx / html / rtf
|
|
5
|
+
* / epub / csv / xlsx / source code) and exposes a voice-driven
|
|
6
|
+
* interface to navigate, read aloud, search, recap, and bookmark.
|
|
7
|
+
*
|
|
8
|
+
* Pipeline:
|
|
9
|
+
* 1. detect format -> pick parser.
|
|
10
|
+
* 2. parser produces a NormalisedDocument (sections + paragraphs
|
|
11
|
+
* + non-text blocks like tables / code / images).
|
|
12
|
+
* 3. ReaderSession holds playback state (position, paused or
|
|
13
|
+
* reading, current bookmark) + a rolling 5-minute buffer of
|
|
14
|
+
* what was just read for recap.
|
|
15
|
+
* 4. Chat tools + voice intent routing drive the session.
|
|
16
|
+
*
|
|
17
|
+
* Pure types this slice. State machine + registry + parsers
|
|
18
|
+
* land in the following slices.
|
|
19
|
+
*
|
|
20
|
+
* ASCII-only.
|
|
21
|
+
*/
|
|
22
|
+
/** Document format identifiers. Open string union so future
|
|
23
|
+
* formats slot in without breaking existing sessions. */
|
|
24
|
+
export type DocFormat = 'txt' | 'md' | 'pdf' | 'docx' | 'html' | 'rtf' | 'epub' | 'csv' | 'xlsx' | 'source' | string;
|
|
25
|
+
/** A leaf chunk of text the reader plays one at a time. */
|
|
26
|
+
export interface TextBlock {
|
|
27
|
+
kind: 'paragraph' | 'heading' | 'list_item' | 'quote' | 'caption';
|
|
28
|
+
/** 1-based heading level when kind=heading (otherwise 0). */
|
|
29
|
+
level: number;
|
|
30
|
+
/** Plain text contents. */
|
|
31
|
+
text: string;
|
|
32
|
+
/** Stable id within the document (assigned by the parser).
|
|
33
|
+
* Used for seek + bookmarks. */
|
|
34
|
+
id: string;
|
|
35
|
+
}
|
|
36
|
+
/** A non-text block the reader announces but does not read by
|
|
37
|
+
* default. The user can ask for it explicitly. */
|
|
38
|
+
export interface NonTextBlock {
|
|
39
|
+
kind: 'table' | 'code' | 'image' | 'figure' | 'formula';
|
|
40
|
+
/** Stable id. */
|
|
41
|
+
id: string;
|
|
42
|
+
/** A human-readable summary the reader speaks when it lands on
|
|
43
|
+
* the block, e.g. "tabla con 5 columnas y 12 filas". */
|
|
44
|
+
summary: string;
|
|
45
|
+
/** When `kind`='code', the language hint when known. */
|
|
46
|
+
language?: string;
|
|
47
|
+
/** Lazy-loaded content the user can request. The parser can
|
|
48
|
+
* pre-compute or leave it null and resolve on demand. */
|
|
49
|
+
content?: string;
|
|
50
|
+
}
|
|
51
|
+
export type Block = TextBlock | NonTextBlock;
|
|
52
|
+
/** Section is a heading + the list of blocks under it. */
|
|
53
|
+
export interface Section {
|
|
54
|
+
/** Stable id. */
|
|
55
|
+
id: string;
|
|
56
|
+
/** Heading text. Empty string when the section has no heading
|
|
57
|
+
* (e.g. the top-of-document section). */
|
|
58
|
+
heading: string;
|
|
59
|
+
/** 1-based level (1 = h1). 0 when no heading. */
|
|
60
|
+
level: number;
|
|
61
|
+
/** All blocks belonging to this section, in document order. */
|
|
62
|
+
blocks: Block[];
|
|
63
|
+
}
|
|
64
|
+
/** The normalised document a parser returns. */
|
|
65
|
+
export interface NormalisedDocument {
|
|
66
|
+
/** Path-friendly identifier for the document (slugified
|
|
67
|
+
* filename). */
|
|
68
|
+
id: string;
|
|
69
|
+
/** Original filename + format. */
|
|
70
|
+
filename: string;
|
|
71
|
+
format: DocFormat;
|
|
72
|
+
/** Total byte count of the source. Informational. */
|
|
73
|
+
bytes: number;
|
|
74
|
+
/** Document title. From the format's metadata or the first
|
|
75
|
+
* heading. */
|
|
76
|
+
title: string;
|
|
77
|
+
/** Author / creator when known. */
|
|
78
|
+
author?: string;
|
|
79
|
+
/** Language hint (BCP-47). */
|
|
80
|
+
language?: string;
|
|
81
|
+
/** Tree of sections in document order. */
|
|
82
|
+
sections: Section[];
|
|
83
|
+
}
|
|
84
|
+
/** A single reader session -- one document, one playback state. */
|
|
85
|
+
export interface ReaderSession {
|
|
86
|
+
doc: NormalisedDocument;
|
|
87
|
+
/** Current block id under the cursor. The reader plays this
|
|
88
|
+
* block next when resumed. */
|
|
89
|
+
cursor_block_id: string;
|
|
90
|
+
/** State of playback. */
|
|
91
|
+
state: 'idle' | 'reading' | 'paused' | 'searching';
|
|
92
|
+
/** User-set bookmarks keyed by name. */
|
|
93
|
+
bookmarks: Record<string, string>;
|
|
94
|
+
/** Last N text blocks already spoken, kept in order. Used by
|
|
95
|
+
* the recap tool to re-narrate the recent context. The limit
|
|
96
|
+
* is enforced in the playback module. */
|
|
97
|
+
recent_spoken: string[];
|
|
98
|
+
/** Playback speed multiplier. 1.0 = normal. */
|
|
99
|
+
speed: number;
|
|
100
|
+
}
|
|
101
|
+
/** Result of seeking. */
|
|
102
|
+
export interface SeekResult {
|
|
103
|
+
ok: boolean;
|
|
104
|
+
/** New cursor block id when ok, else null. */
|
|
105
|
+
new_cursor: string | null;
|
|
106
|
+
/** Reason when !ok (voice-readable). */
|
|
107
|
+
reason?: string;
|
|
108
|
+
}
|
|
109
|
+
/** Search hit. */
|
|
110
|
+
export interface SearchHit {
|
|
111
|
+
block_id: string;
|
|
112
|
+
section_id: string;
|
|
113
|
+
section_heading: string;
|
|
114
|
+
/** Snippet of the block centered on the match. */
|
|
115
|
+
snippet: string;
|
|
116
|
+
/** Character offset of the match within the block. */
|
|
117
|
+
offset: number;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/reader/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH;0DAC0D;AAC1D,MAAM,MAAM,SAAS,GACjB,KAAK,GACL,IAAI,GACJ,KAAK,GACL,MAAM,GACN,MAAM,GACN,KAAK,GACL,MAAM,GACN,KAAK,GACL,MAAM,GACN,QAAQ,GACR,MAAM,CAAC;AAEX,2DAA2D;AAC3D,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;IAClE,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb;qCACiC;IACjC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;mDACmD;AACnD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IACxD,iBAAiB;IACjB,EAAE,EAAE,MAAM,CAAC;IACX;6DACyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;8DAC0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,KAAK,GAAG,SAAS,GAAG,YAAY,CAAC;AAE7C,0DAA0D;AAC1D,MAAM,WAAW,OAAO;IACtB,iBAAiB;IACjB,EAAE,EAAE,MAAM,CAAC;IACX;8CAC0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,gDAAgD;AAChD,MAAM,WAAW,kBAAkB;IACjC;qBACiB;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,CAAC;IAClB,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;IACd;mBACe;IACf,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,mEAAmE;AACnE,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,kBAAkB,CAAC;IACxB;mCAC+B;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,yBAAyB;IACzB,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAC;IACnD,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC;;8CAE0C;IAC1C,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,yBAAyB;AACzB,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,8CAA8C;IAC9C,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,kBAAkB;AAClB,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Document reader subsystem -- type surface.
|
|
3
|
+
*
|
|
4
|
+
* The reader takes a document (txt / md / pdf / docx / html / rtf
|
|
5
|
+
* / epub / csv / xlsx / source code) and exposes a voice-driven
|
|
6
|
+
* interface to navigate, read aloud, search, recap, and bookmark.
|
|
7
|
+
*
|
|
8
|
+
* Pipeline:
|
|
9
|
+
* 1. detect format -> pick parser.
|
|
10
|
+
* 2. parser produces a NormalisedDocument (sections + paragraphs
|
|
11
|
+
* + non-text blocks like tables / code / images).
|
|
12
|
+
* 3. ReaderSession holds playback state (position, paused or
|
|
13
|
+
* reading, current bookmark) + a rolling 5-minute buffer of
|
|
14
|
+
* what was just read for recap.
|
|
15
|
+
* 4. Chat tools + voice intent routing drive the session.
|
|
16
|
+
*
|
|
17
|
+
* Pure types this slice. State machine + registry + parsers
|
|
18
|
+
* land in the following slices.
|
|
19
|
+
*
|
|
20
|
+
* ASCII-only.
|
|
21
|
+
*/
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/reader/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export type StepName = 'validate' | 'license' | 'test' | 'build';
|
|
2
|
+
export interface ShipStep {
|
|
3
|
+
name: StepName;
|
|
4
|
+
ok: boolean;
|
|
5
|
+
skipped: boolean;
|
|
6
|
+
detail: string;
|
|
7
|
+
/** ms duration of this step. */
|
|
8
|
+
ms: number;
|
|
9
|
+
}
|
|
10
|
+
export interface ShipResult {
|
|
11
|
+
steps: ShipStep[];
|
|
12
|
+
ok: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface ShipOptions {
|
|
15
|
+
projectRoot: string;
|
|
16
|
+
skipTests: boolean;
|
|
17
|
+
/** Test injection point. Defaults to spawn-based runner. */
|
|
18
|
+
runProcess?: (cmd: string, args: string[], cwd: string) => Promise<ProcessResult>;
|
|
19
|
+
}
|
|
20
|
+
export interface ProcessResult {
|
|
21
|
+
code: number;
|
|
22
|
+
stdoutTail: string;
|
|
23
|
+
stderrTail: string;
|
|
24
|
+
}
|
|
25
|
+
export declare function runShip(opts: ShipOptions): Promise<ShipResult>;
|
|
26
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/ship/run.ts"],"names":[],"mappings":"AAwBA,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjE,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAK,QAAQ,CAAC;IAClB,EAAE,EAAO,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAG,MAAM,CAAC;IAChB,gCAAgC;IAChC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,EAAE,EAAK,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAI,OAAO,CAAC;IACrB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;CACnF;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CA8DpE"}
|
package/dist/ship/run.js
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Yujin Forge -- ship gate runner.
|
|
3
|
+
*
|
|
4
|
+
* Coordinates the pre-deploy gate:
|
|
5
|
+
* 1. validate (--strict) -- structural sanity
|
|
6
|
+
* 2. license check -- paid OR trial-active
|
|
7
|
+
* 3. npm test -- runs `npm test --silent` in the project
|
|
8
|
+
* 4. npm run build -- vite/tsc/etc as the project defines
|
|
9
|
+
*
|
|
10
|
+
* Each step yields a ShipStep result. The pipeline stops on the
|
|
11
|
+
* first failure unless --skip-tests is set (in which case step 3
|
|
12
|
+
* is skipped but still recorded). The caller (the ship command)
|
|
13
|
+
* renders results + sets process.exitCode.
|
|
14
|
+
*
|
|
15
|
+
* Process execution is delegated to a runner injected as a
|
|
16
|
+
* parameter so tests can stub child_process without spawning
|
|
17
|
+
* real processes.
|
|
18
|
+
*/
|
|
19
|
+
import { spawn } from 'node:child_process';
|
|
20
|
+
import { validateProject } from '../validate/index.js';
|
|
21
|
+
import { loadLicense, isAuthorized, isPaidSeat } from '../license/index.js';
|
|
22
|
+
export async function runShip(opts) {
|
|
23
|
+
const steps = [];
|
|
24
|
+
const exec = opts.runProcess ?? defaultRunProcess;
|
|
25
|
+
// 1. validate
|
|
26
|
+
const t1 = Date.now();
|
|
27
|
+
const v = await validateProject({ projectRoot: opts.projectRoot, strict: true });
|
|
28
|
+
steps.push({
|
|
29
|
+
name: 'validate',
|
|
30
|
+
ok: v.ok,
|
|
31
|
+
skipped: false,
|
|
32
|
+
detail: summariseValidate(v),
|
|
33
|
+
ms: Date.now() - t1,
|
|
34
|
+
});
|
|
35
|
+
if (!v.ok)
|
|
36
|
+
return { steps, ok: false };
|
|
37
|
+
// 2. license
|
|
38
|
+
const t2 = Date.now();
|
|
39
|
+
const lic = await loadLicense();
|
|
40
|
+
const licOk = isAuthorized(lic);
|
|
41
|
+
steps.push({
|
|
42
|
+
name: 'license',
|
|
43
|
+
ok: licOk,
|
|
44
|
+
skipped: false,
|
|
45
|
+
detail: summariseLicense(lic),
|
|
46
|
+
ms: Date.now() - t2,
|
|
47
|
+
});
|
|
48
|
+
if (!licOk)
|
|
49
|
+
return { steps, ok: false };
|
|
50
|
+
// 3. test
|
|
51
|
+
if (opts.skipTests) {
|
|
52
|
+
steps.push({
|
|
53
|
+
name: 'test', ok: true, skipped: true,
|
|
54
|
+
detail: 'skipped (--skip-tests)',
|
|
55
|
+
ms: 0,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
const t3 = Date.now();
|
|
60
|
+
const r = await exec('npm', ['test', '--silent'], opts.projectRoot);
|
|
61
|
+
steps.push({
|
|
62
|
+
name: 'test',
|
|
63
|
+
ok: r.code === 0,
|
|
64
|
+
skipped: false,
|
|
65
|
+
detail: r.code === 0 ? 'passed' : 'failed: ' + tailLine(r.stderrTail || r.stdoutTail),
|
|
66
|
+
ms: Date.now() - t3,
|
|
67
|
+
});
|
|
68
|
+
if (r.code !== 0)
|
|
69
|
+
return { steps, ok: false };
|
|
70
|
+
}
|
|
71
|
+
// 4. build
|
|
72
|
+
const t4 = Date.now();
|
|
73
|
+
const b = await exec('npm', ['run', 'build', '--silent'], opts.projectRoot);
|
|
74
|
+
steps.push({
|
|
75
|
+
name: 'build',
|
|
76
|
+
ok: b.code === 0,
|
|
77
|
+
skipped: false,
|
|
78
|
+
detail: b.code === 0 ? 'passed' : 'failed: ' + tailLine(b.stderrTail || b.stdoutTail),
|
|
79
|
+
ms: Date.now() - t4,
|
|
80
|
+
});
|
|
81
|
+
if (b.code !== 0)
|
|
82
|
+
return { steps, ok: false };
|
|
83
|
+
return { steps, ok: true };
|
|
84
|
+
}
|
|
85
|
+
function summariseValidate(v) {
|
|
86
|
+
if (v.ok && v.findings.length === 0)
|
|
87
|
+
return 'clean';
|
|
88
|
+
const errs = v.findings.filter((f) => f.severity === 'error').length;
|
|
89
|
+
const warns = v.findings.filter((f) => f.severity === 'warn').length;
|
|
90
|
+
return errs + ' error(s), ' + warns + ' warning(s)';
|
|
91
|
+
}
|
|
92
|
+
function summariseLicense(lic) {
|
|
93
|
+
if (isPaidSeat(lic))
|
|
94
|
+
return 'paid seat (' + (lic.seat?.email ?? 'machine-bound') + ')';
|
|
95
|
+
if (lic.status === 'trial' && lic.trial) {
|
|
96
|
+
return 'trial -- ' + lic.trial.daysLeft + ' day(s) left';
|
|
97
|
+
}
|
|
98
|
+
return 'no active license or trial';
|
|
99
|
+
}
|
|
100
|
+
function tailLine(s) {
|
|
101
|
+
const lines = s.trim().split(/\r?\n/).filter((l) => l.length > 0);
|
|
102
|
+
return lines[lines.length - 1] ?? '';
|
|
103
|
+
}
|
|
104
|
+
async function defaultRunProcess(cmd, args, cwd) {
|
|
105
|
+
return new Promise((resolve) => {
|
|
106
|
+
let stdoutBuf = '';
|
|
107
|
+
let stderrBuf = '';
|
|
108
|
+
// shell:true on Windows so 'npm' resolves to npm.cmd. Safe
|
|
109
|
+
// because cmd + args are not user-supplied here.
|
|
110
|
+
const child = spawn(cmd, args, { cwd, shell: process.platform === 'win32' });
|
|
111
|
+
child.stdout?.on('data', (chunk) => { stdoutBuf += String(chunk); if (stdoutBuf.length > 8192)
|
|
112
|
+
stdoutBuf = stdoutBuf.slice(-8192); });
|
|
113
|
+
child.stderr?.on('data', (chunk) => { stderrBuf += String(chunk); if (stderrBuf.length > 8192)
|
|
114
|
+
stderrBuf = stderrBuf.slice(-8192); });
|
|
115
|
+
child.on('close', (code) => resolve({
|
|
116
|
+
code: code ?? 1,
|
|
117
|
+
stdoutTail: stdoutBuf,
|
|
118
|
+
stderrTail: stderrBuf,
|
|
119
|
+
}));
|
|
120
|
+
child.on('error', () => resolve({ code: 1, stdoutTail: '', stderrTail: 'failed to spawn ' + cmd }));
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/ship/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAiC5E,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAiB;IAC7C,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,IAAI,iBAAiB,CAAC;IAElD,cAAc;IACd,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtB,MAAM,CAAC,GAAG,MAAM,eAAe,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACjF,KAAK,CAAC,IAAI,CAAC;QACT,IAAI,EAAK,UAAU;QACnB,EAAE,EAAO,CAAC,CAAC,EAAE;QACb,OAAO,EAAE,KAAK;QACd,MAAM,EAAG,iBAAiB,CAAC,CAAC,CAAC;QAC7B,EAAE,EAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE;KACzB,CAAC,CAAC;IACH,IAAI,CAAC,CAAC,CAAC,EAAE;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IAEvC,aAAa;IACb,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtB,MAAM,GAAG,GAAG,MAAM,WAAW,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC;QACT,IAAI,EAAK,SAAS;QAClB,EAAE,EAAO,KAAK;QACd,OAAO,EAAE,KAAK;QACd,MAAM,EAAG,gBAAgB,CAAC,GAAG,CAAC;QAC9B,EAAE,EAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE;KACzB,CAAC,CAAC;IACH,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IAExC,UAAU;IACV,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI;YACrC,MAAM,EAAE,wBAAwB;YAChC,EAAE,EAAE,CAAC;SACN,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACpE,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAK,MAAM;YACf,EAAE,EAAO,CAAC,CAAC,IAAI,KAAK,CAAC;YACrB,OAAO,EAAE,KAAK;YACd,MAAM,EAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,CAAC;YACtF,EAAE,EAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE;SACzB,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IAChD,CAAC;IAED,WAAW;IACX,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5E,KAAK,CAAC,IAAI,CAAC;QACT,IAAI,EAAK,OAAO;QAChB,EAAE,EAAO,CAAC,CAAC,IAAI,KAAK,CAAC;QACrB,OAAO,EAAE,KAAK;QACd,MAAM,EAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,CAAC;QACtF,EAAE,EAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE;KACzB,CAAC,CAAC;IACH,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IAE9C,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,iBAAiB,CAAC,CAAiB;IAC1C,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IACpD,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IACrE,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACrE,OAAO,IAAI,GAAG,aAAa,GAAG,KAAK,GAAG,aAAa,CAAC;AACtD,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAiB;IACzC,IAAI,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,aAAa,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,eAAe,CAAC,GAAG,GAAG,CAAC;IACvF,IAAI,GAAG,CAAC,MAAM,KAAK,OAAO,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QACxC,OAAO,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,cAAc,CAAC;IAC3D,CAAC;IACD,OAAO,4BAA4B,CAAC;AACtC,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS;IACzB,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAClE,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACvC,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,GAAW,EAAE,IAAc,EAAE,GAAW;IACvE,OAAO,IAAI,OAAO,CAAgB,CAAC,OAAO,EAAE,EAAE;QAC5C,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,2DAA2D;QAC3D,iDAAiD;QACjD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC,CAAC;QAC7E,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,IAAI;YAAE,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,IAAI;YAAE,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtI,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC;YAClC,IAAI,EAAE,IAAI,IAAI,CAAC;YACf,UAAU,EAAE,SAAS;YACrB,UAAU,EAAE,SAAS;SACtB,CAAC,CAAC,CAAC;QACJ,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,kBAAkB,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;IACtG,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export interface TemplateContext {
|
|
2
|
+
projectSlug: string;
|
|
3
|
+
projectName: string;
|
|
4
|
+
licenseRef: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ScaffoldOptions {
|
|
7
|
+
/** Template id under templates/ (e.g. 'react-app'). */
|
|
8
|
+
templateName: string;
|
|
9
|
+
/** Absolute path of the target directory. */
|
|
10
|
+
targetDir: string;
|
|
11
|
+
/** Substitution values. */
|
|
12
|
+
ctx: TemplateContext;
|
|
13
|
+
/**
|
|
14
|
+
* If true, refuse to write into a non-empty target dir.
|
|
15
|
+
* If false, overwrite existing files (no merge, no rename).
|
|
16
|
+
*/
|
|
17
|
+
refuseIfNonEmpty: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface ScaffoldResult {
|
|
20
|
+
files: string[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Resolve the absolute path of the bundled templates directory.
|
|
24
|
+
*
|
|
25
|
+
* Works in three runtimes:
|
|
26
|
+
* - tsx dev: src/commands/new.ts -> ../../templates/
|
|
27
|
+
* - tsc out: dist/commands/new.js -> ../../templates/
|
|
28
|
+
* - npm pkg: node_modules/.../dist/commands/new.js -> same
|
|
29
|
+
*
|
|
30
|
+
* Exported so tests can override via templatesDirForTest() when
|
|
31
|
+
* exercising the scaffolder against a controlled fixture.
|
|
32
|
+
*/
|
|
33
|
+
export declare function defaultTemplatesDir(): string;
|
|
34
|
+
export declare function scaffold(opts: ScaffoldOptions, templatesDir?: string): Promise<ScaffoldResult>;
|
|
35
|
+
export declare function applyTokens(input: string, ctx: TemplateContext): string;
|
|
36
|
+
/**
|
|
37
|
+
* Title-case a slug for the human-readable project name.
|
|
38
|
+
* "my-todos" -> "My Todos"
|
|
39
|
+
* "yujin-koe" -> "Yujin Koe"
|
|
40
|
+
*/
|
|
41
|
+
export declare function titleCaseFromSlug(slug: string): string;
|
|
42
|
+
/**
|
|
43
|
+
* Validate a project slug. NAC + npm conventions:
|
|
44
|
+
* - lowercase
|
|
45
|
+
* - alphanumeric + dash
|
|
46
|
+
* - 3..40 chars
|
|
47
|
+
* - must start with a letter
|
|
48
|
+
*/
|
|
49
|
+
export declare function isValidSlug(slug: string): boolean;
|
|
50
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/template/index.ts"],"names":[],"mappings":"AA8BA,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,uDAAuD;IACvD,YAAY,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,GAAG,EAAE,eAAe,CAAC;IACrB;;;OAGG;IACH,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAG5C;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,eAAe,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAYpG;AAoED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,MAAM,CAKvE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMtD;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Yujin Forge -- template engine.
|
|
3
|
+
*
|
|
4
|
+
* Reads a starter template from the package's templates/<name>/
|
|
5
|
+
* directory, applies token substitution, and writes the materialised
|
|
6
|
+
* project to a target directory.
|
|
7
|
+
*
|
|
8
|
+
* Tokens (case-sensitive, matched literally):
|
|
9
|
+
*
|
|
10
|
+
* %%PROJECT_SLUG%% slug passed to `yf new <slug>`
|
|
11
|
+
* %%PROJECT_NAME%% human-friendly name (default = title-cased slug)
|
|
12
|
+
* %%LICENSE_REF%% license reference (paid seat token or 'trial')
|
|
13
|
+
*
|
|
14
|
+
* Binary files (images, archives, fonts) are passed through
|
|
15
|
+
* unchanged. The text-vs-binary detection is extension-based --
|
|
16
|
+
* cheap, deterministic, and avoids partial reads that would break
|
|
17
|
+
* UTF-8 substitution.
|
|
18
|
+
*/
|
|
19
|
+
import { promises as fs } from 'node:fs';
|
|
20
|
+
import path from 'node:path';
|
|
21
|
+
import { fileURLToPath } from 'node:url';
|
|
22
|
+
/** Files we touch as UTF-8 text + substitute tokens in. */
|
|
23
|
+
const TEXT_EXTENSIONS = new Set([
|
|
24
|
+
'.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',
|
|
25
|
+
'.json', '.md', '.css', '.html', '.txt',
|
|
26
|
+
'.yml', '.yaml', '.toml', '.lock',
|
|
27
|
+
'.gitignore', '.npmrc', '.env', '.env.example',
|
|
28
|
+
]);
|
|
29
|
+
/**
|
|
30
|
+
* Resolve the absolute path of the bundled templates directory.
|
|
31
|
+
*
|
|
32
|
+
* Works in three runtimes:
|
|
33
|
+
* - tsx dev: src/commands/new.ts -> ../../templates/
|
|
34
|
+
* - tsc out: dist/commands/new.js -> ../../templates/
|
|
35
|
+
* - npm pkg: node_modules/.../dist/commands/new.js -> same
|
|
36
|
+
*
|
|
37
|
+
* Exported so tests can override via templatesDirForTest() when
|
|
38
|
+
* exercising the scaffolder against a controlled fixture.
|
|
39
|
+
*/
|
|
40
|
+
export function defaultTemplatesDir() {
|
|
41
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
42
|
+
return path.resolve(here, '..', '..', 'templates');
|
|
43
|
+
}
|
|
44
|
+
export async function scaffold(opts, templatesDir) {
|
|
45
|
+
const root = templatesDir ?? defaultTemplatesDir();
|
|
46
|
+
const src = path.join(root, opts.templateName);
|
|
47
|
+
await assertTemplateExists(src, opts.templateName);
|
|
48
|
+
await assertTargetWritable(opts.targetDir, opts.refuseIfNonEmpty);
|
|
49
|
+
await fs.mkdir(opts.targetDir, { recursive: true });
|
|
50
|
+
const written = [];
|
|
51
|
+
await walkAndCopy(src, opts.targetDir, opts.ctx, written);
|
|
52
|
+
written.sort();
|
|
53
|
+
return { files: written };
|
|
54
|
+
}
|
|
55
|
+
async function assertTemplateExists(dir, name) {
|
|
56
|
+
try {
|
|
57
|
+
const stat = await fs.stat(dir);
|
|
58
|
+
if (!stat.isDirectory()) {
|
|
59
|
+
throw new Error(`template '${name}' is not a directory at ${dir}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
if (err.code === 'ENOENT') {
|
|
64
|
+
throw new Error(`template '${name}' not found (looked in ${dir})`);
|
|
65
|
+
}
|
|
66
|
+
throw err;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async function assertTargetWritable(dir, refuseIfNonEmpty) {
|
|
70
|
+
let entries;
|
|
71
|
+
try {
|
|
72
|
+
entries = await fs.readdir(dir);
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
if (err.code === 'ENOENT')
|
|
76
|
+
return;
|
|
77
|
+
throw err;
|
|
78
|
+
}
|
|
79
|
+
if (refuseIfNonEmpty && entries.length > 0) {
|
|
80
|
+
throw new Error(`target directory ${dir} is not empty (use --force to overwrite, or pick a different --dir)`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async function walkAndCopy(srcDir, destDir, ctx, written) {
|
|
84
|
+
const entries = await fs.readdir(srcDir, { withFileTypes: true });
|
|
85
|
+
for (const entry of entries) {
|
|
86
|
+
const srcPath = path.join(srcDir, entry.name);
|
|
87
|
+
const destPath = path.join(destDir, entry.name);
|
|
88
|
+
if (entry.isDirectory()) {
|
|
89
|
+
await fs.mkdir(destPath, { recursive: true });
|
|
90
|
+
await walkAndCopy(srcPath, destPath, ctx, written);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (entry.isFile()) {
|
|
94
|
+
const ext = path.extname(entry.name);
|
|
95
|
+
const isText = TEXT_EXTENSIONS.has(ext) || isDotConfig(entry.name);
|
|
96
|
+
if (isText) {
|
|
97
|
+
const raw = await fs.readFile(srcPath, 'utf-8');
|
|
98
|
+
await fs.writeFile(destPath, applyTokens(raw, ctx), 'utf-8');
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
await fs.copyFile(srcPath, destPath);
|
|
102
|
+
}
|
|
103
|
+
written.push(destPath);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function isDotConfig(name) {
|
|
108
|
+
// Cover dotfiles without a recognised extension (.gitignore,
|
|
109
|
+
// .npmrc, .env, .env.example etc).
|
|
110
|
+
return name.startsWith('.') && !name.includes('.', 1);
|
|
111
|
+
}
|
|
112
|
+
export function applyTokens(input, ctx) {
|
|
113
|
+
return input
|
|
114
|
+
.replace(/%%PROJECT_SLUG%%/g, ctx.projectSlug)
|
|
115
|
+
.replace(/%%PROJECT_NAME%%/g, ctx.projectName)
|
|
116
|
+
.replace(/%%LICENSE_REF%%/g, ctx.licenseRef);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Title-case a slug for the human-readable project name.
|
|
120
|
+
* "my-todos" -> "My Todos"
|
|
121
|
+
* "yujin-koe" -> "Yujin Koe"
|
|
122
|
+
*/
|
|
123
|
+
export function titleCaseFromSlug(slug) {
|
|
124
|
+
return slug
|
|
125
|
+
.split(/[-_]+/)
|
|
126
|
+
.filter((part) => part.length > 0)
|
|
127
|
+
.map((part) => part[0].toUpperCase() + part.slice(1).toLowerCase())
|
|
128
|
+
.join(' ');
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Validate a project slug. NAC + npm conventions:
|
|
132
|
+
* - lowercase
|
|
133
|
+
* - alphanumeric + dash
|
|
134
|
+
* - 3..40 chars
|
|
135
|
+
* - must start with a letter
|
|
136
|
+
*/
|
|
137
|
+
export function isValidSlug(slug) {
|
|
138
|
+
return /^[a-z][a-z0-9-]{2,39}$/.test(slug);
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/template/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const c: {
|
|
2
|
+
success: (s: string) => string;
|
|
3
|
+
warn: (s: string) => string;
|
|
4
|
+
error: (s: string) => string;
|
|
5
|
+
info: (s: string) => string;
|
|
6
|
+
brand: (s: string) => string;
|
|
7
|
+
kanji: (s: string) => string;
|
|
8
|
+
dim: (s: string) => string;
|
|
9
|
+
code: (s: string) => string;
|
|
10
|
+
};
|
|
11
|
+
/** Print a header with the Forge kanji brand mark. */
|
|
12
|
+
export declare function header(line: string): void;
|
|
13
|
+
//# sourceMappingURL=colors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/ui/colors.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,CAAC;iBACC,MAAM;cACN,MAAM;eACN,MAAM;cACN,MAAM;eACN,MAAM;eACN,MAAM;aACN,MAAM;cACN,MAAM;CACpB,CAAC;AAEF,sDAAsD;AACtD,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAGzC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Yujin Forge -- color helpers for CLI output.
|
|
3
|
+
*
|
|
4
|
+
* Centralised so the entire CLI uses the same palette + the same
|
|
5
|
+
* "supports color?" detection. Wraps kleur but adds two niceties:
|
|
6
|
+
*
|
|
7
|
+
* - dim() preserves italics on terminals that support them
|
|
8
|
+
* - kanji() uses the warm-gold accent for the brand mark
|
|
9
|
+
*/
|
|
10
|
+
import kleur from 'kleur';
|
|
11
|
+
export const c = {
|
|
12
|
+
success: (s) => kleur.green(s),
|
|
13
|
+
warn: (s) => kleur.yellow(s),
|
|
14
|
+
error: (s) => kleur.red(s),
|
|
15
|
+
info: (s) => kleur.cyan(s),
|
|
16
|
+
brand: (s) => kleur.blue().bold(s),
|
|
17
|
+
kanji: (s) => kleur.yellow().bold(s),
|
|
18
|
+
dim: (s) => kleur.gray(s),
|
|
19
|
+
code: (s) => kleur.gray('`') + kleur.white(s) + kleur.gray('`'),
|
|
20
|
+
};
|
|
21
|
+
/** Print a header with the Forge kanji brand mark. */
|
|
22
|
+
export function header(line) {
|
|
23
|
+
// U+58F0 -- "voice" kanji used as the brand mark across Yujin.
|
|
24
|
+
console.log(c.kanji('声') + ' ' + c.brand(line));
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=colors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/ui/colors.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,CAAC,GAAG;IACf,OAAO,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACtC,IAAI,EAAK,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACvC,KAAK,EAAI,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,IAAI,EAAK,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACrC,KAAK,EAAI,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,KAAK,EAAI,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9C,GAAG,EAAM,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACrC,IAAI,EAAK,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;CAC3E,CAAC;AAEF,sDAAsD;AACtD,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,+DAA+D;IAC/D,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type Severity = 'error' | 'warn';
|
|
2
|
+
export interface Finding {
|
|
3
|
+
severity: Severity;
|
|
4
|
+
code: string;
|
|
5
|
+
message: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ValidateReport {
|
|
8
|
+
project_root: string;
|
|
9
|
+
findings: Finding[];
|
|
10
|
+
ok: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface ValidateOptions {
|
|
13
|
+
/** Project root to validate. */
|
|
14
|
+
projectRoot: string;
|
|
15
|
+
/** If true, treat warnings as errors. */
|
|
16
|
+
strict?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare function validateProject(opts: ValidateOptions): Promise<ValidateReport>;
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validate/index.ts"],"names":[],"mappings":"AAmBA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAExC,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,EAAE,EAAE,OAAO,CAAC;CACb;AAED,MAAM,WAAW,eAAe;IAC9B,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AASD,wBAAsB,eAAe,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAgBpF"}
|