@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,280 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { c, header } from '../ui/colors.js';
|
|
4
|
+
import { loadLicense, configDir } from '../license/index.js';
|
|
5
|
+
import { VERSION } from '../version.js';
|
|
6
|
+
import { Vault } from '../vault/store.js';
|
|
7
|
+
export function registerDoctorCommand(program) {
|
|
8
|
+
program
|
|
9
|
+
.command('doctor')
|
|
10
|
+
.description('Check the local environment + Forge installation + vault + voice + reader deps.')
|
|
11
|
+
.option('--json', 'emit JSON instead of human-readable output')
|
|
12
|
+
.action(async (opts) => {
|
|
13
|
+
const checks = await runDoctorChecks();
|
|
14
|
+
if (opts.json) {
|
|
15
|
+
process.stdout.write(JSON.stringify({ version: VERSION, checks }, null, 2) + '\n');
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
header('Yujin Forge -- doctor');
|
|
19
|
+
console.log('');
|
|
20
|
+
console.log(' Forge CLI ' + c.dim(VERSION));
|
|
21
|
+
console.log('');
|
|
22
|
+
for (const check of checks) {
|
|
23
|
+
const mark = check.ok ? c.success('✓') : c.warn('✗');
|
|
24
|
+
console.log(' ' + mark + ' ' + check.name + c.dim(' -- ' + check.detail));
|
|
25
|
+
if (!check.ok && check.hint) {
|
|
26
|
+
console.log(' ' + c.dim('hint: ' + check.hint));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
console.log('');
|
|
30
|
+
const failing = checks.filter((ch) => !ch.ok).length;
|
|
31
|
+
if (failing === 0) {
|
|
32
|
+
console.log(c.success('All checks passed.'));
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
console.log(c.warn(failing + ' check(s) need attention.'));
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
async function runDoctorChecks() {
|
|
40
|
+
const checks = [];
|
|
41
|
+
/* 1. Node.js version. */
|
|
42
|
+
const nodeMajor = parseInt(process.versions.node.split('.')[0] ?? '0', 10);
|
|
43
|
+
checks.push({
|
|
44
|
+
name: 'Node.js >= 18.17',
|
|
45
|
+
ok: nodeMajor >= 18,
|
|
46
|
+
detail: 'detected ' + process.versions.node,
|
|
47
|
+
...(nodeMajor < 18 ? { hint: 'install Node 18.17 or newer from nodejs.org' } : {}),
|
|
48
|
+
});
|
|
49
|
+
/* 2. License state. */
|
|
50
|
+
const lic = await loadLicense();
|
|
51
|
+
checks.push({
|
|
52
|
+
name: 'License state',
|
|
53
|
+
ok: lic.status === 'paid' || lic.status === 'trial',
|
|
54
|
+
detail: 'status=' + lic.status + ' (' + lic.source + ')',
|
|
55
|
+
...(lic.status === 'expired' ? { hint: 'run `yf license activate` with your seat token' } : {}),
|
|
56
|
+
});
|
|
57
|
+
/* 3. Vault (HITO 0). The vault file may not exist if the
|
|
58
|
+
user has never opened the chat panel; that is NOT a
|
|
59
|
+
failure, just informational. */
|
|
60
|
+
try {
|
|
61
|
+
const v = await Vault.open({ configDir: configDir() });
|
|
62
|
+
const slotNames = v.list().map((s) => s.name);
|
|
63
|
+
checks.push({
|
|
64
|
+
name: 'Credentials vault',
|
|
65
|
+
ok: true,
|
|
66
|
+
detail: slotNames.length + ' slot(s) configured: ' + (slotNames.join(', ') || '(empty)'),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
/* Vault not yet initialised is the expected state for a
|
|
71
|
+
fresh install. The chat panel creates it lazily. */
|
|
72
|
+
checks.push({
|
|
73
|
+
name: 'Credentials vault',
|
|
74
|
+
ok: true,
|
|
75
|
+
detail: 'not yet initialised (will be created when you set the first slot)',
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/* 4. Voice provider keys (informational). The chat panel
|
|
79
|
+
gates STT/TTS on these; doctor surfaces which providers
|
|
80
|
+
would work today. */
|
|
81
|
+
try {
|
|
82
|
+
const v = await Vault.open({ configDir: configDir() });
|
|
83
|
+
const slotNames = v.list().map((s) => s.name);
|
|
84
|
+
const voice = {
|
|
85
|
+
anthropic: slotNames.includes('anthropic'),
|
|
86
|
+
whisper: slotNames.includes('openai'),
|
|
87
|
+
google: slotNames.includes('google_voice'),
|
|
88
|
+
elevenlabs: slotNames.includes('elevenlabs'),
|
|
89
|
+
github: slotNames.includes('github_token'),
|
|
90
|
+
};
|
|
91
|
+
const stt = [];
|
|
92
|
+
if (voice.whisper)
|
|
93
|
+
stt.push('Whisper');
|
|
94
|
+
if (voice.google)
|
|
95
|
+
stt.push('Google');
|
|
96
|
+
const tts = [];
|
|
97
|
+
if (voice.elevenlabs)
|
|
98
|
+
tts.push('ElevenLabs');
|
|
99
|
+
if (voice.google)
|
|
100
|
+
tts.push('Google');
|
|
101
|
+
checks.push({
|
|
102
|
+
name: 'Voice providers available',
|
|
103
|
+
ok: stt.length > 0 && tts.length > 0,
|
|
104
|
+
detail: 'STT: ' + (stt.length > 0 ? stt.join(' + ') : 'none')
|
|
105
|
+
+ ' / TTS: ' + (tts.length > 0 ? tts.join(' + ') : 'none'),
|
|
106
|
+
...(stt.length === 0 || tts.length === 0 ? {
|
|
107
|
+
hint: 'in `yf chat`, click Keys -> add `openai` (Whisper) or `google_voice`, plus `elevenlabs` for premium TTS',
|
|
108
|
+
} : {}),
|
|
109
|
+
});
|
|
110
|
+
checks.push({
|
|
111
|
+
name: 'Claude (chat + spec extract + plan)',
|
|
112
|
+
ok: voice.anthropic,
|
|
113
|
+
detail: voice.anthropic ? 'anthropic slot configured' : 'no anthropic slot',
|
|
114
|
+
...(!voice.anthropic ? { hint: 'in `yf chat`, click Keys -> add `anthropic` slot' } : {}),
|
|
115
|
+
});
|
|
116
|
+
checks.push({
|
|
117
|
+
name: 'GitHub token (write-class tools)',
|
|
118
|
+
ok: voice.github,
|
|
119
|
+
detail: voice.github ? 'github_token slot configured' : 'no github_token',
|
|
120
|
+
...(!voice.github ? { hint: 'optional; add `github_token` only if you need forge.create_github_repo / forge.git_push' } : {}),
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
/* If the vault cannot open, the slots cannot be enumerated.
|
|
125
|
+
The vault check above already flagged the situation. */
|
|
126
|
+
}
|
|
127
|
+
/* 5. i18n catalogs + manuals (Fase F). All 10 locales must
|
|
128
|
+
load + the 10 manual HTML files must exist on disk. */
|
|
129
|
+
try {
|
|
130
|
+
const { lintCatalogs, SUPPORTED_LANGUAGES } = await import('../i18n/index.js');
|
|
131
|
+
const lintResult = lintCatalogs();
|
|
132
|
+
checks.push({
|
|
133
|
+
name: 'i18n catalogs (10 languages)',
|
|
134
|
+
ok: lintResult.missing.length === 0,
|
|
135
|
+
detail: lintResult.missing.length === 0
|
|
136
|
+
? SUPPORTED_LANGUAGES.length + ' catalogs complete'
|
|
137
|
+
: lintResult.missing.length + ' missing key(s) -- first: '
|
|
138
|
+
+ lintResult.missing[0].lang + ':' + lintResult.missing[0].key,
|
|
139
|
+
...(lintResult.missing.length > 0 ? { hint: 'run scripts/catalog_lint to see all gaps' } : {}),
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
checks.push({
|
|
144
|
+
name: 'i18n catalogs (10 languages)',
|
|
145
|
+
ok: false,
|
|
146
|
+
detail: 'load failed: ' + (err instanceof Error ? err.message : String(err)),
|
|
147
|
+
hint: 'check src/i18n/catalogs/*.json',
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
/* 5b. Hardcoded user-facing strings -- panel + server source
|
|
151
|
+
scanned for literals that should flow through the i18n
|
|
152
|
+
catalog. Anti-debt: this catches the same class of bug
|
|
153
|
+
the 600-suite followup audit found before we accumulate
|
|
154
|
+
more. */
|
|
155
|
+
try {
|
|
156
|
+
const { execSync } = await import('node:child_process');
|
|
157
|
+
const { fileURLToPath } = await import('node:url');
|
|
158
|
+
const pathMod = await import('node:path');
|
|
159
|
+
const here = pathMod.dirname(fileURLToPath(import.meta.url));
|
|
160
|
+
/* From dist/commands/ go up two levels to repo root, then
|
|
161
|
+
into scripts/. The same path works under tsx because
|
|
162
|
+
src/commands/ is also two levels deep. */
|
|
163
|
+
const script = pathMod.resolve(here, '..', '..', 'scripts', 'lint_hardcoded_strings.mjs');
|
|
164
|
+
let scriptExists = false;
|
|
165
|
+
try {
|
|
166
|
+
const fsMod = await import('node:fs/promises');
|
|
167
|
+
await fsMod.stat(script);
|
|
168
|
+
scriptExists = true;
|
|
169
|
+
}
|
|
170
|
+
catch { /* script not packaged in the published tarball */ }
|
|
171
|
+
if (scriptExists) {
|
|
172
|
+
try {
|
|
173
|
+
const out = execSync('node ' + JSON.stringify(script), {
|
|
174
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
175
|
+
}).toString();
|
|
176
|
+
const clean = /lint_hardcoded_strings: clean\./.test(out);
|
|
177
|
+
checks.push({
|
|
178
|
+
name: 'Hardcoded user-facing strings (i18n compliance)',
|
|
179
|
+
ok: clean,
|
|
180
|
+
detail: clean ? 'panel + server source clean' : 'findings present',
|
|
181
|
+
...(clean ? {} : { hint: 'run scripts/lint_hardcoded_strings.mjs to see them' }),
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
const detail = err instanceof Error ? err.message.slice(0, 80) : String(err).slice(0, 80);
|
|
186
|
+
checks.push({
|
|
187
|
+
name: 'Hardcoded user-facing strings (i18n compliance)',
|
|
188
|
+
ok: false,
|
|
189
|
+
detail: 'lint failed: ' + detail,
|
|
190
|
+
hint: 'run scripts/lint_hardcoded_strings.mjs --strict',
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
/* node:child_process not available in this runtime; skip. */
|
|
197
|
+
}
|
|
198
|
+
try {
|
|
199
|
+
const { listAvailableManuals } = await import('../chat/tools/manual.js');
|
|
200
|
+
const present = await listAvailableManuals();
|
|
201
|
+
checks.push({
|
|
202
|
+
name: 'User manuals (HTML, 10 languages)',
|
|
203
|
+
ok: present.length === 10,
|
|
204
|
+
detail: present.length + '/10 manuals available: ' + present.join(', '),
|
|
205
|
+
...(present.length < 10 ? { hint: 'reinstall the package or check docs/manuals/' } : {}),
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
catch (err) {
|
|
209
|
+
checks.push({
|
|
210
|
+
name: 'User manuals (HTML, 10 languages)',
|
|
211
|
+
ok: false,
|
|
212
|
+
detail: 'probe failed: ' + (err instanceof Error ? err.message : String(err)),
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
/* 6. Reader parser dependencies (HITO 1). PDF + DOCX + XLSX
|
|
216
|
+
use lazy-loaded npm deps; verify they resolve. */
|
|
217
|
+
for (const [label, modPath] of [
|
|
218
|
+
['pdfjs-dist (PDF reader)', 'pdfjs-dist/legacy/build/pdf.mjs'],
|
|
219
|
+
['mammoth (DOCX reader)', 'mammoth'],
|
|
220
|
+
['xlsx (XLSX reader)', 'xlsx'],
|
|
221
|
+
]) {
|
|
222
|
+
try {
|
|
223
|
+
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
|
224
|
+
await import(modPath);
|
|
225
|
+
checks.push({
|
|
226
|
+
name: label,
|
|
227
|
+
ok: true,
|
|
228
|
+
detail: 'lazy-import resolved',
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
catch (err) {
|
|
232
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
233
|
+
checks.push({
|
|
234
|
+
name: label,
|
|
235
|
+
ok: false,
|
|
236
|
+
detail: 'import failed: ' + msg.split('\n')[0],
|
|
237
|
+
hint: 'run `npm install` from the Forge install directory',
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/* 6. Recap summary opt-in env var (informational). */
|
|
242
|
+
const recapEnabled = process.env['YF_ENABLE_CLAUDE_RECAP'] === '1';
|
|
243
|
+
checks.push({
|
|
244
|
+
name: 'Claude recap summary mode',
|
|
245
|
+
ok: true,
|
|
246
|
+
detail: recapEnabled
|
|
247
|
+
? 'enabled (YF_ENABLE_CLAUDE_RECAP=1; charges tokens per recap)'
|
|
248
|
+
: 'disabled (literal mode only; set YF_ENABLE_CLAUDE_RECAP=1 to enable; see docs/RECAP_CLAUDE_COSTS.md)',
|
|
249
|
+
});
|
|
250
|
+
/* 7. Project root sanity. */
|
|
251
|
+
try {
|
|
252
|
+
const cwd = process.cwd();
|
|
253
|
+
const stat = await fs.stat(cwd);
|
|
254
|
+
checks.push({
|
|
255
|
+
name: 'Current working directory readable',
|
|
256
|
+
ok: stat.isDirectory(),
|
|
257
|
+
detail: cwd,
|
|
258
|
+
});
|
|
259
|
+
/* Look for typical Forge project markers; absence is
|
|
260
|
+
informational, not a failure -- yf doctor runs anywhere. */
|
|
261
|
+
const hasManifest = await fs.access(path.join(cwd, 'manifest.json')).then(() => true, () => false);
|
|
262
|
+
const hasPackage = await fs.access(path.join(cwd, 'package.json')).then(() => true, () => false);
|
|
263
|
+
checks.push({
|
|
264
|
+
name: 'Project markers',
|
|
265
|
+
ok: true,
|
|
266
|
+
detail: (hasPackage ? 'package.json' : '') + (hasManifest ? (hasPackage ? ' + ' : '') + 'manifest.json' : '')
|
|
267
|
+
|| '(neither package.json nor manifest.json in cwd)',
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
catch (err) {
|
|
271
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
272
|
+
checks.push({
|
|
273
|
+
name: 'Current working directory readable',
|
|
274
|
+
ok: false,
|
|
275
|
+
detail: msg,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
return checks;
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `yf figma <file_key>` -- Figma -> NAC-3 scaffolder.
|
|
3
|
+
*
|
|
4
|
+
* Given a Figma file key + a personal access token, fetches the
|
|
5
|
+
* file via the REST API, normalises it to a flat screens-and-
|
|
6
|
+
* elements model, asks Claude to emit per-screen source code +
|
|
7
|
+
* the NAC manifest + a CSS tokens file, then writes everything to
|
|
8
|
+
* an output directory.
|
|
9
|
+
*
|
|
10
|
+
* Trial mode: --audit prints the normaliser report without calling
|
|
11
|
+
* Claude (the LLM step is the paid gate, mirroring `yf migrate
|
|
12
|
+
* --audit` vs `yf migrate --apply`).
|
|
13
|
+
*
|
|
14
|
+
* Status: alpha. Voice-tested only against Figma fixture JSON in
|
|
15
|
+
* the test suite. Real Figma files may surface heuristics we will
|
|
16
|
+
* iterate on; see docs/EVOLUTION_PLAN.md Section 4 OQ-FIG-1..4.
|
|
17
|
+
*
|
|
18
|
+
* ASCII-only.
|
|
19
|
+
*/
|
|
20
|
+
import type { Command } from 'commander';
|
|
21
|
+
export interface FigmaCommandOptions {
|
|
22
|
+
token?: string;
|
|
23
|
+
page?: string;
|
|
24
|
+
output?: string;
|
|
25
|
+
framework?: string;
|
|
26
|
+
aiModel?: string;
|
|
27
|
+
audit?: boolean;
|
|
28
|
+
dryRun?: boolean;
|
|
29
|
+
}
|
|
30
|
+
export declare function registerFigmaCommand(program: Command): void;
|
|
31
|
+
export declare function runFigmaCommand(fileKey: string, opts: FigmaCommandOptions): Promise<void>;
|
|
32
|
+
//# sourceMappingURL=figma.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"figma.d.ts","sourceRoot":"","sources":["../../src/commands/figma.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAc3D;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6G/F"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `yf figma <file_key>` -- Figma -> NAC-3 scaffolder.
|
|
3
|
+
*
|
|
4
|
+
* Given a Figma file key + a personal access token, fetches the
|
|
5
|
+
* file via the REST API, normalises it to a flat screens-and-
|
|
6
|
+
* elements model, asks Claude to emit per-screen source code +
|
|
7
|
+
* the NAC manifest + a CSS tokens file, then writes everything to
|
|
8
|
+
* an output directory.
|
|
9
|
+
*
|
|
10
|
+
* Trial mode: --audit prints the normaliser report without calling
|
|
11
|
+
* Claude (the LLM step is the paid gate, mirroring `yf migrate
|
|
12
|
+
* --audit` vs `yf migrate --apply`).
|
|
13
|
+
*
|
|
14
|
+
* Status: alpha. Voice-tested only against Figma fixture JSON in
|
|
15
|
+
* the test suite. Real Figma files may surface heuristics we will
|
|
16
|
+
* iterate on; see docs/EVOLUTION_PLAN.md Section 4 OQ-FIG-1..4.
|
|
17
|
+
*
|
|
18
|
+
* ASCII-only.
|
|
19
|
+
*/
|
|
20
|
+
import { promises as fs } from 'node:fs';
|
|
21
|
+
import path from 'node:path';
|
|
22
|
+
import { c, header } from '../ui/colors.js';
|
|
23
|
+
import { fetchFigmaFile } from '../figma/api.js';
|
|
24
|
+
import { normaliseFigmaFile } from '../figma/normalize.js';
|
|
25
|
+
import { decorateFigma, summariseDecoration } from '../figma/decorator.js';
|
|
26
|
+
import { loadLicense, isPaidSeat } from '../license/index.js';
|
|
27
|
+
export function registerFigmaCommand(program) {
|
|
28
|
+
program
|
|
29
|
+
.command('figma <file_key>')
|
|
30
|
+
.description('Scaffold a NAC-3 app from a Figma file. Requires FIGMA_PERSONAL_ACCESS_TOKEN and (for non-audit runs) ANTHROPIC_API_KEY.')
|
|
31
|
+
.option('--token <pat>', 'Figma personal access token (default: FIGMA_PERSONAL_ACCESS_TOKEN env)')
|
|
32
|
+
.option('--page <name>', 'restrict to a specific Figma page (default: all CANVASes)')
|
|
33
|
+
.option('--output <dir>', 'output directory (default: ./generated/)')
|
|
34
|
+
.option('--framework <fw>', 'output framework: react | html | vue (default: react)')
|
|
35
|
+
.option('--ai-model <id>', 'Anthropic model id (default: claude-sonnet-4-6)')
|
|
36
|
+
.option('--audit', 'normalise + report without calling Claude or writing files (free)')
|
|
37
|
+
.option('--dry-run', 'run the decorator but do not write files; print the per-screen summary instead')
|
|
38
|
+
.action(async (fileKey, opts) => {
|
|
39
|
+
await runFigmaCommand(fileKey, opts);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
export async function runFigmaCommand(fileKey, opts) {
|
|
43
|
+
header('Yujin Forge -- Figma -> NAC-3 scaffolder');
|
|
44
|
+
console.log('');
|
|
45
|
+
const framework = (opts.framework || 'react').toLowerCase();
|
|
46
|
+
if (framework !== 'react' && framework !== 'html' && framework !== 'vue') {
|
|
47
|
+
console.error(c.error('--framework must be one of: react | html | vue (got: ' + opts.framework + ')'));
|
|
48
|
+
process.exitCode = 1;
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const outDir = path.resolve(process.cwd(), opts.output || 'generated');
|
|
52
|
+
console.log(' Figma file: ' + c.dim(fileKey));
|
|
53
|
+
console.log(' Page filter: ' + c.dim(opts.page || '(all)'));
|
|
54
|
+
console.log(' Framework: ' + c.brand(framework));
|
|
55
|
+
console.log(' Output dir: ' + c.dim(outDir) + (opts.audit ? c.warn(' (audit only)') : (opts.dryRun ? c.warn(' (dry run -- nothing will be written)') : '')));
|
|
56
|
+
console.log(' Model: ' + c.dim(opts.aiModel || 'claude-sonnet-4-6'));
|
|
57
|
+
console.log('');
|
|
58
|
+
let file;
|
|
59
|
+
try {
|
|
60
|
+
file = await fetchFigmaFile({
|
|
61
|
+
fileKey,
|
|
62
|
+
...(opts.token ? { token: opts.token } : {}),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
console.error(c.error(err instanceof Error ? err.message : String(err)));
|
|
67
|
+
process.exitCode = 1;
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const normalised = normaliseFigmaFile(file, opts.page ? { pageName: opts.page } : {});
|
|
71
|
+
if (normalised.screens.length === 0) {
|
|
72
|
+
console.log(c.warn('No screens found.') + ' Check --page filter or the document layout.');
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
/* AUDIT: free path. Print the normaliser report + exit. */
|
|
76
|
+
if (opts.audit) {
|
|
77
|
+
console.log(c.success('Normalised file (audit only):'));
|
|
78
|
+
console.log(' source: ' + normalised.source.name + ' (' + normalised.source.lastModified + ')');
|
|
79
|
+
console.log(' screens: ' + normalised.screens.length);
|
|
80
|
+
for (const s of normalised.screens) {
|
|
81
|
+
console.log(' - ' + c.brand(s.slug) + c.dim(' (' + s.elements.length + ' elements)'));
|
|
82
|
+
}
|
|
83
|
+
console.log(' tokens: ' + Object.keys(normalised.tokens.colors).length + ' color, '
|
|
84
|
+
+ Object.keys(normalised.tokens.fonts).length + ' font');
|
|
85
|
+
console.log('');
|
|
86
|
+
console.log(c.dim('Re-run without --audit to call Claude + write files (paid seat).'));
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
/* Paid-only: license gate. */
|
|
90
|
+
const lic = await loadLicense();
|
|
91
|
+
if (!isPaidSeat(lic)) {
|
|
92
|
+
console.error(c.error('yf figma requires a paid seat (use --audit for the free normaliser report).'));
|
|
93
|
+
console.error(' ' + c.dim('Run ') + c.code('yf license activate --key <jwt>') + c.dim(' to install a seat.'));
|
|
94
|
+
process.exitCode = 1;
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
/* Decoration path. */
|
|
98
|
+
let result;
|
|
99
|
+
try {
|
|
100
|
+
result = await decorateFigma({
|
|
101
|
+
file: normalised,
|
|
102
|
+
framework,
|
|
103
|
+
...(opts.aiModel ? { model: opts.aiModel } : {}),
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
console.error(c.error(err instanceof Error ? err.message : String(err)));
|
|
108
|
+
process.exitCode = 1;
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
console.log(c.success('Decoration ready:'));
|
|
112
|
+
console.log(summariseDecoration(result, normalised));
|
|
113
|
+
console.log('');
|
|
114
|
+
if (opts.dryRun) {
|
|
115
|
+
console.log(c.warn('Dry run -- no files were written.'));
|
|
116
|
+
for (const s of result.screens) {
|
|
117
|
+
console.log('');
|
|
118
|
+
console.log(c.brand('--- ' + s.basename + ' (' + s.slug + ') ---'));
|
|
119
|
+
console.log(s.source.length > 2000 ? s.source.slice(0, 2000) + '\n... + ' + (s.source.length - 2000) + ' bytes' : s.source);
|
|
120
|
+
}
|
|
121
|
+
console.log('');
|
|
122
|
+
console.log(c.brand('--- tokens.css ---'));
|
|
123
|
+
console.log(result.css.length > 1000 ? result.css.slice(0, 1000) + '\n... + ' + (result.css.length - 1000) + ' bytes' : result.css);
|
|
124
|
+
console.log('');
|
|
125
|
+
console.log(c.dim('Re-run without --dry-run to write the files.'));
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
/* Write the artifacts. */
|
|
129
|
+
await fs.mkdir(outDir, { recursive: true });
|
|
130
|
+
for (const s of result.screens) {
|
|
131
|
+
await fs.writeFile(path.join(outDir, s.basename), s.source, 'utf-8');
|
|
132
|
+
}
|
|
133
|
+
await fs.writeFile(path.join(outDir, 'manifest.json'), result.manifest_json, 'utf-8');
|
|
134
|
+
await fs.writeFile(path.join(outDir, 'tokens.css'), result.css, 'utf-8');
|
|
135
|
+
console.log(c.success('Wrote ' + (result.screens.length + 2) + ' file(s) to ' + outDir));
|
|
136
|
+
console.log(' ' + c.dim('next steps:'));
|
|
137
|
+
console.log(' ' + c.dim(' - npm init -y && npm install (react / vue / vanilla per --framework)'));
|
|
138
|
+
console.log(' ' + c.dim(' - yf validate ' + outDir + ' -- structural check'));
|
|
139
|
+
console.log(' ' + c.dim(' - yf pilot install ' + outDir + ' -- embed the Pilot cockpit'));
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=figma.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"figma.js","sourceRoot":"","sources":["../../src/commands/figma.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
export interface GenFlowTestsOptions {
|
|
3
|
+
out?: string;
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
overwrite?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function registerGenFlowTestsCommand(program: Command): void;
|
|
8
|
+
//# sourceMappingURL=gen-flow-tests.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gen-flow-tests.d.ts","sourceRoot":"","sources":["../../src/commands/gen-flow-tests.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAUlE"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* yf gen-flow-tests <traces-dir> [--out <dir>] [--base-url <url>] [--overwrite]
|
|
3
|
+
*
|
|
4
|
+
* Reads captured flow traces (JSON produced by the v3 capture tool)
|
|
5
|
+
* and emits Cypress replay specs -- one per trace. Replay tests
|
|
6
|
+
* contain NO LLM call: the cost is paid once at capture time, replay
|
|
7
|
+
* is free and deterministic across runs.
|
|
8
|
+
*
|
|
9
|
+
* Distinction from `yf gen-tests`:
|
|
10
|
+
* - gen-tests: one test per (nac_id, verb) tuple, surface coverage
|
|
11
|
+
* - gen-flow-tests: one test per captured flow, multi-step depth coverage
|
|
12
|
+
*
|
|
13
|
+
* The two are orthogonal and both ship into the same Cypress suite.
|
|
14
|
+
*/
|
|
15
|
+
import { promises as fs } from 'node:fs';
|
|
16
|
+
import path from 'node:path';
|
|
17
|
+
import { c, header } from '../ui/colors.js';
|
|
18
|
+
import { generateFlowTests } from '../codegen/v3_flow_emit.js';
|
|
19
|
+
export function registerGenFlowTestsCommand(program) {
|
|
20
|
+
program
|
|
21
|
+
.command('gen-flow-tests <traces-dir>')
|
|
22
|
+
.description('Generate Cypress replay tests from captured Pilot flow traces (v3).')
|
|
23
|
+
.option('--out <dir>', 'where to write the *.cy.js specs (default: <traces-dir>/../cypress/e2e/forge-flows)')
|
|
24
|
+
.option('--base-url <url>', 'override BASE_URL injected into the specs (default: from trace.pre_state.base_url)')
|
|
25
|
+
.option('--overwrite', 'overwrite existing flow specs instead of skipping')
|
|
26
|
+
.action(async (tracesDir, opts) => {
|
|
27
|
+
await runGenFlowTests(tracesDir, opts);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
async function runGenFlowTests(tracesDir, opts) {
|
|
31
|
+
console.log(header(' Yujin Forge -- v3 flow-test emitter (capture-replay)'));
|
|
32
|
+
console.log('');
|
|
33
|
+
const tracesAbs = path.resolve(tracesDir);
|
|
34
|
+
const tracesStat = await fs.stat(tracesAbs).then((s) => s, () => null);
|
|
35
|
+
if (!tracesStat || !tracesStat.isDirectory()) {
|
|
36
|
+
console.error(c.error('Traces directory not found: ') + tracesAbs);
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
/* List captured files. Failed traces live under _failed/ and are
|
|
40
|
+
not picked up here -- by design. */
|
|
41
|
+
const entries = await fs.readdir(tracesAbs, { withFileTypes: true });
|
|
42
|
+
const traceFiles = entries.filter((e) => e.isFile() && e.name.endsWith('.json'));
|
|
43
|
+
if (traceFiles.length === 0) {
|
|
44
|
+
console.error(c.error('No *.json trace files in ') + tracesAbs);
|
|
45
|
+
console.error('Capture traces first via the v3 capture tool (see nac3-bench/bench/scripts/v3_capture_flow.mjs).');
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
const outDir = path.resolve(opts.out || path.join(tracesAbs, '..', 'cypress', 'e2e', 'forge-flows'));
|
|
49
|
+
console.log(c.dim('Traces directory: ') + tracesAbs);
|
|
50
|
+
console.log(c.dim('Output directory: ') + outDir);
|
|
51
|
+
console.log(c.dim('Found: ') + traceFiles.length + ' trace file(s)');
|
|
52
|
+
console.log('');
|
|
53
|
+
const results = await generateFlowTests({
|
|
54
|
+
tracesDir: tracesAbs,
|
|
55
|
+
outDir,
|
|
56
|
+
baseUrl: opts.baseUrl,
|
|
57
|
+
overwrite: !!opts.overwrite,
|
|
58
|
+
});
|
|
59
|
+
let written = 0;
|
|
60
|
+
let skipped = 0;
|
|
61
|
+
for (const r of results) {
|
|
62
|
+
if (r.written) {
|
|
63
|
+
console.log(c.success(' + ') + path.relative(process.cwd(), r.written));
|
|
64
|
+
written++;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
console.log(c.warn(' - ') + r.flowId + (r.reason ? ' (' + r.reason + ')' : ''));
|
|
68
|
+
skipped++;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
console.log('');
|
|
72
|
+
console.log(c.brand('Flow specs: ') + written + ' written, ' + skipped + ' skipped.');
|
|
73
|
+
console.log('');
|
|
74
|
+
console.log(c.dim('Replay these via your standard Cypress run -- they contain NO LLM call.'));
|
|
75
|
+
console.log(c.dim('Re-capture a flow when the app changes:'));
|
|
76
|
+
console.log(c.dim(' node nac3-bench/bench/scripts/v3_capture_flow.mjs --flow <flow_id>'));
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=gen-flow-tests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gen-flow-tests.js","sourceRoot":"","sources":["../../src/commands/gen-flow-tests.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAQ/D,MAAM,UAAU,2BAA2B,CAAC,OAAgB;IAC1D,OAAO;SACJ,OAAO,CAAC,6BAA6B,CAAC;SACtC,WAAW,CAAC,qEAAqE,CAAC;SAClF,MAAM,CAAC,aAAa,EAAS,qFAAqF,CAAC;SACnH,MAAM,CAAC,kBAAkB,EAAI,oFAAoF,CAAC;SAClH,MAAM,CAAC,aAAa,EAAS,mDAAmD,CAAC;SACjF,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,IAAyB,EAAE,EAAE;QAC7D,MAAM,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACP,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,SAAiB,EAAE,IAAyB;IACzE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,wDAAwD,CAAC,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACvE,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,8BAA8B,CAAC,GAAG,SAAS,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED;0CACsC;IACtC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IACjF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,2BAA2B,CAAC,GAAG,SAAS,CAAC,CAAC;QAChE,OAAO,CAAC,KAAK,CAAC,kGAAkG,CAAC,CAAC;QAClH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC;IACrG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,SAAS,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,MAAM,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,gBAAgB,CAAC,CAAC;IAChF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC;QACtC,SAAS,EAAE,SAAS;QACpB,MAAM;QACN,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS;KAC5B,CAAC,CAAC;IAEH,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACzE,OAAO,EAAE,CAAC;QACZ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACjF,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,GAAG,OAAO,GAAG,YAAY,GAAG,OAAO,GAAG,WAAW,CAAC,CAAC;IAC5F,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC,CAAC;IAC9F,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC,CAAC;AAC7F,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
export interface GenTestsOptions {
|
|
3
|
+
framework?: string;
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
overwrite?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function registerGenTestsCommand(program: Command): void;
|
|
8
|
+
export declare function runGenTests(dir: string, opts: GenTestsOptions): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=gen-tests.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gen-tests.d.ts","sourceRoot":"","sources":["../../src/commands/gen-tests.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAU9D;AAcD,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAsEnF"}
|