@sun-asterisk/sungen 3.2.2-beta.9 → 3.2.3-beta.3
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/dist/capabilities/discover.d.ts.map +1 -1
- package/dist/capabilities/discover.js +26 -3
- package/dist/capabilities/discover.js.map +1 -1
- package/dist/cli/commands/add-flow.d.ts.map +1 -1
- package/dist/cli/commands/add-flow.js +2 -0
- package/dist/cli/commands/add-flow.js.map +1 -1
- package/dist/cli/commands/add.d.ts.map +1 -1
- package/dist/cli/commands/add.js +4 -0
- package/dist/cli/commands/add.js.map +1 -1
- package/dist/cli/commands/capability.d.ts.map +1 -1
- package/dist/cli/commands/capability.js +61 -0
- package/dist/cli/commands/capability.js.map +1 -1
- package/dist/cli/commands/delivery.d.ts.map +1 -1
- package/dist/cli/commands/delivery.js +89 -2
- package/dist/cli/commands/delivery.js.map +1 -1
- package/dist/cli/commands/eval.js +3 -3
- package/dist/cli/commands/eval.js.map +1 -1
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +2 -1
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +32 -2
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/journey.d.ts.map +1 -1
- package/dist/cli/commands/journey.js +24 -2
- package/dist/cli/commands/journey.js.map +1 -1
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +10 -3
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/dashboard/snapshot-builder.d.ts.map +1 -1
- package/dist/dashboard/snapshot-builder.js +10 -1
- package/dist/dashboard/snapshot-builder.js.map +1 -1
- package/dist/exporters/csv-exporter.d.ts.map +1 -1
- package/dist/exporters/csv-exporter.js +3 -1
- package/dist/exporters/csv-exporter.js.map +1 -1
- package/dist/exporters/json-exporter.js +3 -1
- package/dist/exporters/json-exporter.js.map +1 -1
- package/dist/exporters/mobile-app-id.d.ts +22 -0
- package/dist/exporters/mobile-app-id.d.ts.map +1 -0
- package/dist/exporters/mobile-app-id.js +37 -0
- package/dist/exporters/mobile-app-id.js.map +1 -0
- package/dist/exporters/spec-parser.d.ts.map +1 -1
- package/dist/exporters/spec-parser.js +6 -2
- package/dist/exporters/spec-parser.js.map +1 -1
- package/dist/generators/test-generator/adapters/adapter-interface.d.ts +3 -0
- package/dist/generators/test-generator/adapters/adapter-interface.d.ts.map +1 -1
- package/dist/generators/test-generator/adapters/appium/templates/steps/actions/scroll-action.hbs +7 -4
- package/dist/generators/test-generator/adapters/appium/templates/steps/actions/toggle-action.hbs +20 -3
- package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/checked-assertion.hbs +4 -1
- package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/not-checked-assertion.hbs +4 -1
- package/dist/generators/test-generator/adapters/appium/templates/test-file.hbs +3 -0
- package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
- package/dist/generators/test-generator/code-generator.js +48 -9
- package/dist/generators/test-generator/code-generator.js.map +1 -1
- package/dist/generators/test-generator/template-engine.d.ts +3 -0
- package/dist/generators/test-generator/template-engine.d.ts.map +1 -1
- package/dist/generators/test-generator/template-engine.js +11 -1
- package/dist/generators/test-generator/template-engine.js.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.d.ts +11 -1
- package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.js +33 -0
- package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
- package/dist/harness/audit.d.ts.map +1 -1
- package/dist/harness/audit.js +8 -1
- package/dist/harness/audit.js.map +1 -1
- package/dist/harness/catalog/universal-viewpoints.yaml +15 -0
- package/dist/harness/eval/skill-lint.d.ts +3 -3
- package/dist/harness/eval/skill-lint.d.ts.map +1 -1
- package/dist/harness/eval/skill-lint.js +88 -68
- package/dist/harness/eval/skill-lint.js.map +1 -1
- package/dist/harness/journey.d.ts +37 -1
- package/dist/harness/journey.d.ts.map +1 -1
- package/dist/harness/journey.js +146 -19
- package/dist/harness/journey.js.map +1 -1
- package/dist/harness/quality-gates.d.ts +13 -0
- package/dist/harness/quality-gates.d.ts.map +1 -1
- package/dist/harness/quality-gates.js +23 -0
- package/dist/harness/quality-gates.js.map +1 -1
- package/dist/harness/sensors.d.ts +1 -1
- package/dist/harness/sensors.d.ts.map +1 -1
- package/dist/harness/sensors.js +32 -9
- package/dist/harness/sensors.js.map +1 -1
- package/dist/orchestrator/ai-rules-updater.d.ts +11 -3
- package/dist/orchestrator/ai-rules-updater.d.ts.map +1 -1
- package/dist/orchestrator/ai-rules-updater.js +44 -180
- package/dist/orchestrator/ai-rules-updater.js.map +1 -1
- package/dist/orchestrator/ai-skills/adapters.d.ts +28 -0
- package/dist/orchestrator/ai-skills/adapters.d.ts.map +1 -0
- package/dist/orchestrator/ai-skills/adapters.js +34 -0
- package/dist/orchestrator/ai-skills/adapters.js.map +1 -0
- package/dist/orchestrator/ai-skills/build.d.ts +10 -0
- package/dist/orchestrator/ai-skills/build.d.ts.map +1 -0
- package/dist/orchestrator/ai-skills/build.js +128 -0
- package/dist/orchestrator/ai-skills/build.js.map +1 -0
- package/dist/orchestrator/ai-skills/cap-stripper.d.ts +27 -0
- package/dist/orchestrator/ai-skills/cap-stripper.d.ts.map +1 -0
- package/dist/orchestrator/ai-skills/cap-stripper.js +78 -0
- package/dist/orchestrator/ai-skills/cap-stripper.js.map +1 -0
- package/dist/orchestrator/ai-skills/commands.d.ts +22 -0
- package/dist/orchestrator/ai-skills/commands.d.ts.map +1 -0
- package/dist/orchestrator/ai-skills/commands.js +109 -0
- package/dist/orchestrator/ai-skills/commands.js.map +1 -0
- package/dist/orchestrator/ai-skills/generator.d.ts +23 -0
- package/dist/orchestrator/ai-skills/generator.d.ts.map +1 -0
- package/dist/orchestrator/ai-skills/generator.js +79 -0
- package/dist/orchestrator/ai-skills/generator.js.map +1 -0
- package/dist/orchestrator/ai-skills/golden-skills.test.d.ts +2 -0
- package/dist/orchestrator/ai-skills/golden-skills.test.d.ts.map +1 -0
- package/dist/orchestrator/ai-skills/golden-skills.test.js +183 -0
- package/dist/orchestrator/ai-skills/golden-skills.test.js.map +1 -0
- package/dist/orchestrator/ai-skills/resolve-assistants.d.ts +8 -0
- package/dist/orchestrator/ai-skills/resolve-assistants.d.ts.map +1 -0
- package/dist/orchestrator/ai-skills/resolve-assistants.js +28 -0
- package/dist/orchestrator/ai-skills/resolve-assistants.js.map +1 -0
- package/dist/orchestrator/ai-skills/writer.d.ts +15 -0
- package/dist/orchestrator/ai-skills/writer.d.ts.map +1 -0
- package/dist/orchestrator/ai-skills/writer.js +129 -0
- package/dist/orchestrator/ai-skills/writer.js.map +1 -0
- package/dist/orchestrator/flow-manager.d.ts +11 -0
- package/dist/orchestrator/flow-manager.d.ts.map +1 -1
- package/dist/orchestrator/flow-manager.js +147 -29
- package/dist/orchestrator/flow-manager.js.map +1 -1
- package/dist/orchestrator/mobile-runtime-scaffolder.d.ts +59 -0
- package/dist/orchestrator/mobile-runtime-scaffolder.d.ts.map +1 -0
- package/dist/orchestrator/mobile-runtime-scaffolder.js +298 -0
- package/dist/orchestrator/mobile-runtime-scaffolder.js.map +1 -0
- package/dist/orchestrator/project-initializer.d.ts +44 -7
- package/dist/orchestrator/project-initializer.d.ts.map +1 -1
- package/dist/orchestrator/project-initializer.js +147 -79
- package/dist/orchestrator/project-initializer.js.map +1 -1
- package/dist/orchestrator/screen-manager.d.ts +30 -0
- package/dist/orchestrator/screen-manager.d.ts.map +1 -1
- package/dist/orchestrator/screen-manager.js +205 -22
- package/dist/orchestrator/screen-manager.js.map +1 -1
- package/dist/orchestrator/templates/ai-src/README.md +58 -0
- package/dist/orchestrator/templates/{ai-instructions/claude-cmd-add-flow.md → ai-src/commands/add-flow.md} +63 -2
- package/dist/orchestrator/templates/{ai-instructions/claude-cmd-add-screen.md → ai-src/commands/add-screen.md} +171 -6
- package/dist/orchestrator/templates/{ai-instructions/claude-cmd-create-test.md → ai-src/commands/create-test.md} +118 -5
- package/{src/orchestrator/templates/ai-instructions/claude-cmd-dashboard.md → dist/orchestrator/templates/ai-src/commands/dashboard.md} +25 -3
- package/{src/orchestrator/templates/ai-instructions/claude-cmd-delivery.md → dist/orchestrator/templates/ai-src/commands/delivery.md} +67 -3
- package/dist/orchestrator/templates/ai-src/commands/design.md +29 -0
- package/{src/orchestrator/templates/ai-instructions/claude-cmd-feedback.md → dist/orchestrator/templates/ai-src/commands/feedback.md} +34 -3
- package/dist/orchestrator/templates/{ai-instructions/claude-cmd-locale.md → ai-src/commands/locale.md} +56 -4
- package/{src/orchestrator/templates/ai-instructions/claude-cmd-review.md → dist/orchestrator/templates/ai-src/commands/review.md} +57 -2
- package/dist/orchestrator/templates/{ai-instructions/claude-cmd-run-test.md → ai-src/commands/run-test.md} +116 -8
- package/dist/orchestrator/templates/ai-src/config/codex.md +8 -0
- package/{src/orchestrator/templates/ai-instructions/claude-skill-capture-mobile.md → dist/orchestrator/templates/ai-src/skills/sungen-capture-mobile/SKILL.md} +11 -0
- package/dist/orchestrator/templates/{ai-instructions/github-skill-sungen-error-mapping.md → ai-src/skills/sungen-error-mapping/SKILL.md} +31 -10
- package/{src/orchestrator/templates/ai-instructions/claude-skill-harness-audit.md → dist/orchestrator/templates/ai-src/skills/sungen-harness-audit/SKILL.md} +5 -5
- package/{src/orchestrator/templates/ai-instructions/claude-skill-locale.md → dist/orchestrator/templates/ai-src/skills/sungen-locale/SKILL.md} +275 -3
- package/{src/orchestrator/templates/ai-instructions/github-skill-sungen-selector-fix.md → dist/orchestrator/templates/ai-src/skills/sungen-selector-fix/SKILL.md} +17 -0
- package/{src/orchestrator/templates/ai-instructions/claude-skill-selector-fix-mobile.md → dist/orchestrator/templates/ai-src/skills/sungen-selector-fix-mobile/SKILL.md} +5 -0
- package/dist/orchestrator/templates/{ai-instructions/claude-skill-tc-generation.md → ai-src/skills/sungen-tc-generation/SKILL.md} +5 -0
- package/dist/orchestrator/templates/playwright.config.ts +7 -4
- package/package.json +3 -3
- package/src/capabilities/discover.ts +29 -3
- package/src/cli/commands/add-flow.ts +2 -0
- package/src/cli/commands/add.ts +4 -0
- package/src/cli/commands/capability.ts +64 -1
- package/src/cli/commands/delivery.ts +89 -2
- package/src/cli/commands/eval.ts +3 -3
- package/src/cli/commands/generate.ts +2 -1
- package/src/cli/commands/init.ts +50 -3
- package/src/cli/commands/journey.ts +20 -3
- package/src/cli/commands/update.ts +14 -4
- package/src/dashboard/snapshot-builder.ts +10 -1
- package/src/exporters/csv-exporter.ts +3 -1
- package/src/exporters/json-exporter.ts +3 -1
- package/src/exporters/mobile-app-id.ts +34 -0
- package/src/exporters/spec-parser.ts +6 -2
- package/src/generators/test-generator/adapters/adapter-interface.ts +3 -0
- package/src/generators/test-generator/adapters/appium/templates/steps/actions/scroll-action.hbs +7 -4
- package/src/generators/test-generator/adapters/appium/templates/steps/actions/toggle-action.hbs +20 -3
- package/src/generators/test-generator/adapters/appium/templates/steps/assertions/checked-assertion.hbs +4 -1
- package/src/generators/test-generator/adapters/appium/templates/steps/assertions/not-checked-assertion.hbs +4 -1
- package/src/generators/test-generator/adapters/appium/templates/test-file.hbs +3 -0
- package/src/generators/test-generator/code-generator.ts +49 -9
- package/src/generators/test-generator/template-engine.ts +14 -1
- package/src/generators/test-generator/utils/selector-resolver.ts +51 -1
- package/src/harness/audit.ts +9 -2
- package/src/harness/catalog/universal-viewpoints.yaml +15 -0
- package/src/harness/eval/skill-lint.ts +71 -60
- package/src/harness/journey.ts +167 -19
- package/src/harness/quality-gates.ts +20 -0
- package/src/harness/sensors.ts +25 -8
- package/src/orchestrator/ai-rules-updater.ts +35 -197
- package/src/orchestrator/ai-skills/adapters.ts +52 -0
- package/src/orchestrator/ai-skills/build.ts +103 -0
- package/src/orchestrator/ai-skills/cap-stripper.ts +85 -0
- package/src/orchestrator/ai-skills/commands.ts +112 -0
- package/src/orchestrator/ai-skills/generator.ts +47 -0
- package/src/orchestrator/ai-skills/golden-skills.test.ts +124 -0
- package/src/orchestrator/ai-skills/resolve-assistants.ts +18 -0
- package/src/orchestrator/ai-skills/writer.ts +92 -0
- package/src/orchestrator/flow-manager.ts +165 -29
- package/src/orchestrator/mobile-runtime-scaffolder.ts +277 -0
- package/src/orchestrator/project-initializer.ts +159 -86
- package/src/orchestrator/screen-manager.ts +237 -22
- package/src/orchestrator/templates/ai-src/README.md +58 -0
- package/src/orchestrator/templates/{ai-instructions/claude-cmd-add-flow.md → ai-src/commands/add-flow.md} +63 -2
- package/src/orchestrator/templates/{ai-instructions/claude-cmd-add-screen.md → ai-src/commands/add-screen.md} +171 -6
- package/src/orchestrator/templates/{ai-instructions/claude-cmd-create-test.md → ai-src/commands/create-test.md} +118 -5
- package/{dist/orchestrator/templates/ai-instructions/claude-cmd-dashboard.md → src/orchestrator/templates/ai-src/commands/dashboard.md} +25 -3
- package/{dist/orchestrator/templates/ai-instructions/claude-cmd-delivery.md → src/orchestrator/templates/ai-src/commands/delivery.md} +67 -3
- package/src/orchestrator/templates/ai-src/commands/design.md +29 -0
- package/{dist/orchestrator/templates/ai-instructions/claude-cmd-feedback.md → src/orchestrator/templates/ai-src/commands/feedback.md} +34 -3
- package/src/orchestrator/templates/{ai-instructions/claude-cmd-locale.md → ai-src/commands/locale.md} +56 -4
- package/{dist/orchestrator/templates/ai-instructions/claude-cmd-review.md → src/orchestrator/templates/ai-src/commands/review.md} +57 -2
- package/src/orchestrator/templates/{ai-instructions/claude-cmd-run-test.md → ai-src/commands/run-test.md} +116 -8
- package/src/orchestrator/templates/ai-src/config/codex.md +8 -0
- package/{dist/orchestrator/templates/ai-instructions/claude-skill-capture-mobile.md → src/orchestrator/templates/ai-src/skills/sungen-capture-mobile/SKILL.md} +11 -0
- package/{dist/orchestrator/templates/ai-instructions/claude-skill-error-mapping.md → src/orchestrator/templates/ai-src/skills/sungen-error-mapping/SKILL.md} +31 -10
- package/{dist/orchestrator/templates/ai-instructions/claude-skill-harness-audit.md → src/orchestrator/templates/ai-src/skills/sungen-harness-audit/SKILL.md} +5 -5
- package/{dist/orchestrator/templates/ai-instructions/claude-skill-locale.md → src/orchestrator/templates/ai-src/skills/sungen-locale/SKILL.md} +275 -3
- package/{dist/orchestrator/templates/ai-instructions/github-skill-sungen-selector-fix.md → src/orchestrator/templates/ai-src/skills/sungen-selector-fix/SKILL.md} +17 -0
- package/{dist/orchestrator/templates/ai-instructions/claude-skill-selector-fix-mobile.md → src/orchestrator/templates/ai-src/skills/sungen-selector-fix-mobile/SKILL.md} +5 -0
- package/src/orchestrator/templates/{ai-instructions/claude-skill-tc-generation.md → ai-src/skills/sungen-tc-generation/SKILL.md} +5 -0
- package/src/orchestrator/templates/playwright.config.ts +7 -4
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-design.md +0 -12
- package/dist/orchestrator/templates/ai-instructions/claude-skill-selector-fix.md +0 -347
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-add-flow.md +0 -86
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-add-screen.md +0 -131
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-create-test.md +0 -94
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-dashboard.md +0 -65
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-delivery.md +0 -83
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-design.md +0 -13
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-feedback.md +0 -24
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-locale.md +0 -70
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-review.md +0 -38
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-run-test.md +0 -158
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture-mobile.md +0 -184
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-harness-audit.md +0 -85
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-locale.md +0 -291
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-selector-fix-mobile.md +0 -316
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-selector-keys.md +0 -221
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +0 -617
- package/src/orchestrator/templates/ai-instructions/claude-cmd-design.md +0 -12
- package/src/orchestrator/templates/ai-instructions/claude-skill-api-design.md +0 -62
- package/src/orchestrator/templates/ai-instructions/claude-skill-capture-mode-figma-mcp.md +0 -82
- package/src/orchestrator/templates/ai-instructions/claude-skill-capture-mode-figma-pat.md +0 -117
- package/src/orchestrator/templates/ai-instructions/claude-skill-capture-mode-live.md +0 -60
- package/src/orchestrator/templates/ai-instructions/claude-skill-capture-mode-local.md +0 -38
- package/src/orchestrator/templates/ai-instructions/claude-skill-capture.md +0 -35
- package/src/orchestrator/templates/ai-instructions/claude-skill-dashboard.md +0 -121
- package/src/orchestrator/templates/ai-instructions/claude-skill-delivery.md +0 -141
- package/src/orchestrator/templates/ai-instructions/claude-skill-error-mapping.md +0 -176
- package/src/orchestrator/templates/ai-instructions/claude-skill-gherkin-syntax.md +0 -446
- package/src/orchestrator/templates/ai-instructions/claude-skill-ingest-legacy.md +0 -79
- package/src/orchestrator/templates/ai-instructions/claude-skill-mobile-gestures.md +0 -109
- package/src/orchestrator/templates/ai-instructions/claude-skill-selector-fix.md +0 -347
- package/src/orchestrator/templates/ai-instructions/claude-skill-tc-review.md +0 -320
- package/src/orchestrator/templates/ai-instructions/claude-skill-test-design-techniques.md +0 -118
- package/src/orchestrator/templates/ai-instructions/claude-skill-viewpoint-group-a-data-entry.md +0 -203
- package/src/orchestrator/templates/ai-instructions/claude-skill-viewpoint-group-b-data-ops.md +0 -179
- package/src/orchestrator/templates/ai-instructions/claude-skill-viewpoint-group-c-data-explore.md +0 -233
- package/src/orchestrator/templates/ai-instructions/claude-skill-viewpoint-group-d-display.md +0 -226
- package/src/orchestrator/templates/ai-instructions/claude-skill-viewpoint-group-e-identity.md +0 -177
- package/src/orchestrator/templates/ai-instructions/claude-skill-viewpoint.md +0 -118
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-add-flow.md +0 -86
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-add-screen.md +0 -131
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-create-test.md +0 -94
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-dashboard.md +0 -65
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-delivery.md +0 -83
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-design.md +0 -13
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-feedback.md +0 -24
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-locale.md +0 -70
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-review.md +0 -38
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-run-test.md +0 -158
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-api-design.md +0 -62
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-capture-mobile.md +0 -184
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-capture-mode-figma-mcp.md +0 -82
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-capture-mode-figma-pat.md +0 -117
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-capture-mode-live.md +0 -60
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-capture-mode-local.md +0 -38
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-capture.md +0 -35
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-dashboard.md +0 -121
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-delivery.md +0 -141
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-error-mapping.md +0 -176
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-gherkin-syntax.md +0 -446
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-harness-audit.md +0 -85
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-ingest-legacy.md +0 -79
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-locale.md +0 -291
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-mobile-gestures.md +0 -109
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-selector-fix-mobile.md +0 -316
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-selector-keys.md +0 -221
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +0 -617
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-tc-review.md +0 -320
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-test-design-techniques.md +0 -118
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-viewpoint-group-a-data-entry.md +0 -203
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-viewpoint-group-b-data-ops.md +0 -179
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-viewpoint-group-c-data-explore.md +0 -233
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-viewpoint-group-d-display.md +0 -226
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-viewpoint-group-e-identity.md +0 -177
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-viewpoint.md +0 -118
- /package/dist/orchestrator/templates/{ai-instructions/claude-agent-challenge.md → ai-src/agents/challenge.md} +0 -0
- /package/dist/orchestrator/templates/{ai-instructions/claude-agent-discovery.md → ai-src/agents/discovery.md} +0 -0
- /package/dist/orchestrator/templates/{ai-instructions/claude-agent-generator.md → ai-src/agents/generator.md} +0 -0
- /package/dist/orchestrator/templates/{ai-instructions/claude-agent-reviewer.md → ai-src/agents/reviewer.md} +0 -0
- /package/dist/orchestrator/templates/{ai-instructions/claude-config.md → ai-src/config/claude.md} +0 -0
- /package/dist/orchestrator/templates/{ai-instructions/copilot-config.md → ai-src/config/copilot.md} +0 -0
- /package/dist/orchestrator/templates/{ai-instructions/claude-skill-api-design.md → ai-src/skills/sungen-api-design/SKILL.md} +0 -0
- /package/dist/orchestrator/templates/{ai-instructions/claude-skill-capture.md → ai-src/skills/sungen-capture/SKILL.md} +0 -0
- /package/dist/orchestrator/templates/{ai-instructions/claude-skill-capture-mode-figma-mcp.md → ai-src/skills/sungen-capture/mode-figma-mcp.md} +0 -0
- /package/dist/orchestrator/templates/{ai-instructions/claude-skill-capture-mode-figma-pat.md → ai-src/skills/sungen-capture/mode-figma-pat.md} +0 -0
- /package/dist/orchestrator/templates/{ai-instructions/claude-skill-capture-mode-live.md → ai-src/skills/sungen-capture/mode-live.md} +0 -0
- /package/dist/orchestrator/templates/{ai-instructions/claude-skill-capture-mode-local.md → ai-src/skills/sungen-capture/mode-local.md} +0 -0
- /package/dist/orchestrator/templates/{ai-instructions/claude-skill-dashboard.md → ai-src/skills/sungen-dashboard/SKILL.md} +0 -0
- /package/dist/orchestrator/templates/{ai-instructions/claude-skill-delivery.md → ai-src/skills/sungen-delivery/SKILL.md} +0 -0
- /package/dist/orchestrator/templates/{ai-instructions/claude-skill-gherkin-syntax.md → ai-src/skills/sungen-gherkin-syntax/SKILL.md} +0 -0
- /package/dist/orchestrator/templates/{ai-instructions/claude-skill-ingest-legacy.md → ai-src/skills/sungen-ingest-legacy/SKILL.md} +0 -0
- /package/dist/orchestrator/templates/{ai-instructions/claude-skill-mobile-gestures.md → ai-src/skills/sungen-mobile-gestures/SKILL.md} +0 -0
- /package/dist/orchestrator/templates/{ai-instructions/claude-skill-selector-keys.md → ai-src/skills/sungen-selector-keys/SKILL.md} +0 -0
- /package/dist/orchestrator/templates/{ai-instructions/claude-skill-tc-review.md → ai-src/skills/sungen-tc-review/SKILL.md} +0 -0
- /package/dist/orchestrator/templates/{ai-instructions/claude-skill-test-design-techniques.md → ai-src/skills/sungen-test-design-techniques/SKILL.md} +0 -0
- /package/dist/orchestrator/templates/{ai-instructions/claude-skill-viewpoint.md → ai-src/skills/sungen-viewpoint/SKILL.md} +0 -0
- /package/dist/orchestrator/templates/{ai-instructions/claude-skill-viewpoint-group-a-data-entry.md → ai-src/skills/sungen-viewpoint/group-a-data-entry.md} +0 -0
- /package/dist/orchestrator/templates/{ai-instructions/claude-skill-viewpoint-group-b-data-ops.md → ai-src/skills/sungen-viewpoint/group-b-data-ops.md} +0 -0
- /package/dist/orchestrator/templates/{ai-instructions/claude-skill-viewpoint-group-c-data-explore.md → ai-src/skills/sungen-viewpoint/group-c-data-explore.md} +0 -0
- /package/dist/orchestrator/templates/{ai-instructions/claude-skill-viewpoint-group-d-display.md → ai-src/skills/sungen-viewpoint/group-d-display.md} +0 -0
- /package/dist/orchestrator/templates/{ai-instructions/claude-skill-viewpoint-group-e-identity.md → ai-src/skills/sungen-viewpoint/group-e-identity.md} +0 -0
- /package/src/orchestrator/templates/{ai-instructions/claude-agent-challenge.md → ai-src/agents/challenge.md} +0 -0
- /package/src/orchestrator/templates/{ai-instructions/claude-agent-discovery.md → ai-src/agents/discovery.md} +0 -0
- /package/src/orchestrator/templates/{ai-instructions/claude-agent-generator.md → ai-src/agents/generator.md} +0 -0
- /package/src/orchestrator/templates/{ai-instructions/claude-agent-reviewer.md → ai-src/agents/reviewer.md} +0 -0
- /package/src/orchestrator/templates/{ai-instructions/claude-config.md → ai-src/config/claude.md} +0 -0
- /package/src/orchestrator/templates/{ai-instructions/copilot-config.md → ai-src/config/copilot.md} +0 -0
- /package/{dist/orchestrator/templates/ai-instructions/github-skill-sungen-api-design.md → src/orchestrator/templates/ai-src/skills/sungen-api-design/SKILL.md} +0 -0
- /package/{dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture.md → src/orchestrator/templates/ai-src/skills/sungen-capture/SKILL.md} +0 -0
- /package/{dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture-mode-figma-mcp.md → src/orchestrator/templates/ai-src/skills/sungen-capture/mode-figma-mcp.md} +0 -0
- /package/{dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture-mode-figma-pat.md → src/orchestrator/templates/ai-src/skills/sungen-capture/mode-figma-pat.md} +0 -0
- /package/{dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture-mode-live.md → src/orchestrator/templates/ai-src/skills/sungen-capture/mode-live.md} +0 -0
- /package/{dist/orchestrator/templates/ai-instructions/github-skill-sungen-capture-mode-local.md → src/orchestrator/templates/ai-src/skills/sungen-capture/mode-local.md} +0 -0
- /package/{dist/orchestrator/templates/ai-instructions/github-skill-sungen-dashboard.md → src/orchestrator/templates/ai-src/skills/sungen-dashboard/SKILL.md} +0 -0
- /package/{dist/orchestrator/templates/ai-instructions/github-skill-sungen-delivery.md → src/orchestrator/templates/ai-src/skills/sungen-delivery/SKILL.md} +0 -0
- /package/{dist/orchestrator/templates/ai-instructions/github-skill-sungen-gherkin-syntax.md → src/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md} +0 -0
- /package/{dist/orchestrator/templates/ai-instructions/github-skill-sungen-ingest-legacy.md → src/orchestrator/templates/ai-src/skills/sungen-ingest-legacy/SKILL.md} +0 -0
- /package/{dist/orchestrator/templates/ai-instructions/github-skill-sungen-mobile-gestures.md → src/orchestrator/templates/ai-src/skills/sungen-mobile-gestures/SKILL.md} +0 -0
- /package/src/orchestrator/templates/{ai-instructions/claude-skill-selector-keys.md → ai-src/skills/sungen-selector-keys/SKILL.md} +0 -0
- /package/{dist/orchestrator/templates/ai-instructions/github-skill-sungen-tc-review.md → src/orchestrator/templates/ai-src/skills/sungen-tc-review/SKILL.md} +0 -0
- /package/{dist/orchestrator/templates/ai-instructions/github-skill-sungen-test-design-techniques.md → src/orchestrator/templates/ai-src/skills/sungen-test-design-techniques/SKILL.md} +0 -0
- /package/{dist/orchestrator/templates/ai-instructions/github-skill-sungen-viewpoint.md → src/orchestrator/templates/ai-src/skills/sungen-viewpoint/SKILL.md} +0 -0
- /package/{dist/orchestrator/templates/ai-instructions/github-skill-sungen-viewpoint-group-a-data-entry.md → src/orchestrator/templates/ai-src/skills/sungen-viewpoint/group-a-data-entry.md} +0 -0
- /package/{dist/orchestrator/templates/ai-instructions/github-skill-sungen-viewpoint-group-b-data-ops.md → src/orchestrator/templates/ai-src/skills/sungen-viewpoint/group-b-data-ops.md} +0 -0
- /package/{dist/orchestrator/templates/ai-instructions/github-skill-sungen-viewpoint-group-c-data-explore.md → src/orchestrator/templates/ai-src/skills/sungen-viewpoint/group-c-data-explore.md} +0 -0
- /package/{dist/orchestrator/templates/ai-instructions/github-skill-sungen-viewpoint-group-d-display.md → src/orchestrator/templates/ai-src/skills/sungen-viewpoint/group-d-display.md} +0 -0
- /package/{dist/orchestrator/templates/ai-instructions/github-skill-sungen-viewpoint-group-e-identity.md → src/orchestrator/templates/ai-src/skills/sungen-viewpoint/group-e-identity.md} +0 -0
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: sungen-api-design
|
|
3
|
-
description: The API-first design loop for an api unit (qa/api/<area> or qa/api/flows/<flow>) — discover the catalog, lay out the API viewpoints, generate @api/@cases/flow/@concurrent scenarios, then drive the sungen audit --area gate + reviewer + repair to a high businessDepth (≥0.7). Use when create-test/run-test detects an api unit (no selectors, no visual capture).
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# API design loop (driver-api · Orchestration + Harness)
|
|
7
|
-
|
|
8
|
-
Use this when the unit is **api-first** — `qa/api/<area>/` or `qa/api/flows/<flow>/`. There are **no selectors and no visual capture**: the contract is the **named-endpoint catalog** (`api/apis.yaml`), referenced by `@api:<name>`. QA writes **no HTTP code**. Full annotation reference: the **API Steps** guide (`@api` / `@cases` / flows / `@concurrent` / `@hybrid`).
|
|
9
|
-
|
|
10
|
-
## The loop (mirror of /sungen:design, API-native)
|
|
11
|
-
|
|
12
|
-
### 1. Discover (no capture)
|
|
13
|
-
Run `sungen context --area <name>` — it reads the catalog and prints the **endpoints** + the **generation units** (one `matrix` unit per endpoint, an `async` unit per mutating endpoint, a `flow` unit for an api flow). Read `qa/api/<name>/requirements/spec.md` if present. No `apis.yaml` yet? → `sungen api import <openapi|csv>` or `sungen api add --area <name>` first.
|
|
14
|
-
|
|
15
|
-
### 2. API viewpoint overview (by method-profile)
|
|
16
|
-
For each endpoint, cover its viewpoints — severity-weighted by method:
|
|
17
|
-
|
|
18
|
-
| Profile | Endpoints | Must cover | Then |
|
|
19
|
-
|---|---|---|---|
|
|
20
|
-
| read | GET, HEAD | `contract` (status + body shape) | `pagination`/`filter` (list), `not-found` (by-id) |
|
|
21
|
-
| mutating | POST/PUT/PATCH/DELETE | `contract`, `error` (validation/4xx/auth) | `idempotency` (`@concurrent`), `side-effect` (`@query`) |
|
|
22
|
-
|
|
23
|
-
Bands: **~70%** success+failure matrix · **~20%** flows (auth/CRUD chains) · **~10%** async/idempotency.
|
|
24
|
-
|
|
25
|
-
### 3. Generate (incremental — never the whole suite in one Write)
|
|
26
|
-
- **Contract**: `@api:<name>` + `expect {{name.status}} is …` **and a body assertion** (`{{name.body.<path>}}`).
|
|
27
|
-
- **Error matrix**: `@api:<name>(p={{p}}) @cases:<dataset>` — one scenario, a dataset of `input → expected status`.
|
|
28
|
-
- **Flow**: ordered `@api` tags threading a prior response (`token={{login.body.token}}` → the catalog `Bearer :token` header; `id={{create.body.id}}` → a path param). Self-clean (delete what you create).
|
|
29
|
-
- **Idempotency**: `@api:<name> @concurrent:N` + `expect {{name.ok_count}} is 1`, cross-checked with `@query` (the DB is the oracle).
|
|
30
|
-
|
|
31
|
-
### 4. Gate + repair (always — businessDepth ≥ 0.7 is the bar)
|
|
32
|
-
Run `sungen audit --area <name>`; read `gateStatus` + `findings`. Then the **semantic reviewer** (sungen-reviewer sub-agent, API criteria). Repair **both** (budget 3 rounds), re-audit until PASS:
|
|
33
|
-
|
|
34
|
-
| Finding | Repair |
|
|
35
|
-
|---|---|
|
|
36
|
-
| `VIEWPOINT-API-CONTRACT` | the endpoint is invoked but its response is never asserted → add `expect {{name.status}}` + a `{{name.body.…}}` check |
|
|
37
|
-
| `VIEWPOINT-API-ERROR` | a mutating endpoint has no failure scenario → add a `@cases` error matrix (or an explicit 4xx) |
|
|
38
|
-
| `VIEWPOINT-API-IDEMPOTENCY` | a mutating endpoint has no race check → add `@concurrent:N` + a `@query` DB cross-check |
|
|
39
|
-
| `VIEWPOINT-API-MANUAL-AUTOMATABLE` | a `@manual` scenario whose endpoint resolves is automatable → drop `@manual`, use `@api` (+ `@cases`); reserve `@manual` for genuine judgment cases |
|
|
40
|
-
| **`DEPTH-FAIL`** (businessDepth < 0.7) | a **mutating success** scenario asserts only `status` → make it **prove the effect**: assert a response **body** field, a **`@query`** side-effect, or a **`@concurrent` `ok_count`** invariant. (An error/`@cases` scenario proving the status is correct — it is *not* depth-required.) |
|
|
41
|
-
|
|
42
|
-
Stop when the gate PASSes + businessDepth ≥ 0.7, or the budget is exhausted → report residual gaps honestly (mark genuinely-unautomatable cases `@manual` with an oracle). Never fake a pass.
|
|
43
|
-
|
|
44
|
-
### 5. Record + converge
|
|
45
|
-
`sungen manifest --area <name>` (reuse) and ledger each phase; show the trace + the HUMAN-LOOP FOCUS. (Integrity `script-check`/`trace` for api: see run-test.)
|
|
46
|
-
|
|
47
|
-
## Taxonomy (label scenarios correctly)
|
|
48
|
-
|
|
49
|
-
| Class | What | Examples |
|
|
50
|
-
|---|---|---|
|
|
51
|
-
| **Functional** | single-endpoint behaviour | happy contract · error/validation (`@cases`) · boundary/edge |
|
|
52
|
-
| **Functional — flow/integration** | multi-endpoint journeys | auth/CRUD lifecycle (`create → login → get → delete`), cross-endpoint invariants |
|
|
53
|
-
| **Non-Functional** | performance · reliability · **security** · concurrency/idempotency | `@concurrent` race/idempotency |
|
|
54
|
-
|
|
55
|
-
A flow (`create → login → delete`) is a **Functional integration** test, **not** non-functional — don't file it under "Non-Functional". Reserve non-functional for perf/security/concurrency.
|
|
56
|
-
|
|
57
|
-
## Rules
|
|
58
|
-
- **No HTTP, no selectors** — only `.feature` + the reviewed `apis.yaml` + `test-data`.
|
|
59
|
-
- **Non-prod default** — a `production` datasource is refused unless `SUNGEN_ALLOW_PROD=1`.
|
|
60
|
-
- **The DB is the oracle** for idempotency/side-effects — HTTP status alone can lie; pair `@api` with `@query`.
|
|
61
|
-
- **`@parallel` + mutating endpoints** — give each scenario **isolated data** (a `{{$uuid}}` email, a `@cases` row, or its own created resource) and **self-clean** (delete what it created); shared inputs race under parallel execution.
|
|
62
|
-
- **No dead data** — every `test-data` key must be bound into a scenario (`{{key}}`, a `@cases` dataset, or an override). `sungen audit`/the generate lint flag unreferenced keys.
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
# Capture mode: figma-mcp
|
|
2
|
-
|
|
3
|
-
Pull **structured design data** (layout, typography, colors, component tree, design tokens) and a **PNG screenshot** from a Figma frame URL via the **Figma Dev Mode MCP**, so `sungen-tc-generation` can author Gherkin + test-data before a live domain exists. Use when the project is pre-launch or Figma is the source of truth and the live build lags the design.
|
|
4
|
-
|
|
5
|
-
## Prerequisites
|
|
6
|
-
|
|
7
|
-
- **Figma MCP server** (`https://mcp.figma.com/mcp`, HTTP transport) connected in `.mcp.json` — `sungen init` scaffolds this. On first use, Claude Code opens a browser for Figma OAuth. Official tools: `get_design_context`, `get_variable_defs`, `get_screenshot`.
|
|
8
|
-
- Figma account signed in with access to the file. **Dev/Full seats** get per-minute rate limits; **Starter/View seats** get monthly tool-call limits.
|
|
9
|
-
- A Figma URL with both **fileKey** and **nodeId**.
|
|
10
|
-
|
|
11
|
-
If the MCP is not connected, **do not fail silently** — tell the user:
|
|
12
|
-
> "Figma MCP not detected. Run `sungen init` to scaffold the config, or manually add `figma` with `url: https://mcp.figma.com/mcp` to `.mcp.json`. Then sign in when Claude Code prompts."
|
|
13
|
-
|
|
14
|
-
Then stop.
|
|
15
|
-
|
|
16
|
-
## Steps
|
|
17
|
-
|
|
18
|
-
### 1. Resolve Figma URL
|
|
19
|
-
|
|
20
|
-
Prefer in this order:
|
|
21
|
-
1. `Figma URL` field in `requirements/spec.md` (Overview section)
|
|
22
|
-
2. If empty/missing → `AskUserQuestion`: *"Paste the Figma frame URL"* (free text)
|
|
23
|
-
|
|
24
|
-
Accept any of these shapes:
|
|
25
|
-
```
|
|
26
|
-
https://www.figma.com/file/<fileKey>/<title>?node-id=<nodeId>
|
|
27
|
-
https://www.figma.com/design/<fileKey>/<title>?node-id=<nodeId>
|
|
28
|
-
https://www.figma.com/proto/<fileKey>/<title>?node-id=<nodeId>
|
|
29
|
-
```
|
|
30
|
-
Parse: `fileKey` = segment after `/file/`, `/design/`, or `/proto/`; `nodeId` = the `node-id` query param (pass `-` or `:` through as-is). If `node-id` is missing, ask the user to select a frame in Figma and copy the **frame URL** (not the file root).
|
|
31
|
-
|
|
32
|
-
### 2. Fetch design context
|
|
33
|
-
|
|
34
|
-
Call **both** in parallel:
|
|
35
|
-
```
|
|
36
|
-
get_design_context({ fileKey, nodeId })
|
|
37
|
-
get_variable_defs({ fileKey, nodeId })
|
|
38
|
-
```
|
|
39
|
-
`get_design_context` → layout, typography, colors, component structure, spacing. `get_variable_defs` → named design tokens.
|
|
40
|
-
|
|
41
|
-
### 3. Fetch screenshot
|
|
42
|
-
|
|
43
|
-
```
|
|
44
|
-
get_screenshot({ fileKey, nodeId })
|
|
45
|
-
```
|
|
46
|
-
Save the PNG to `requirements/ui/figma-<sanitized-nodeId>.png` (replace `:` and `-` with `_`, e.g. `42-15` → `figma-42_15.png`).
|
|
47
|
-
|
|
48
|
-
### 4. Write metadata dump
|
|
49
|
-
|
|
50
|
-
Combine design context + variables into `requirements/ui/figma-meta.md`:
|
|
51
|
-
```markdown
|
|
52
|
-
# Figma Capture — <nodeId>
|
|
53
|
-
**Source:** <full Figma URL>
|
|
54
|
-
**Captured:** <ISO date>
|
|
55
|
-
## Components
|
|
56
|
-
<component names + variants>
|
|
57
|
-
## Typography
|
|
58
|
-
<font families, sizes, weights, line heights>
|
|
59
|
-
## Colors
|
|
60
|
-
<color tokens + raw hex>
|
|
61
|
-
## Spacing & Layout
|
|
62
|
-
<spacing tokens, auto-layout specs>
|
|
63
|
-
## Text Content
|
|
64
|
-
<visible text strings — used by tc-generation to populate test-data>
|
|
65
|
-
```
|
|
66
|
-
Consumed by `sungen-tc-generation` as a secondary source alongside `spec.md`.
|
|
67
|
-
|
|
68
|
-
### 5. Report back
|
|
69
|
-
|
|
70
|
-
> Captured Figma frame `<nodeId>`: Components N · Text strings M · Design tokens K · Screenshot `requirements/ui/figma-<nodeId>.png` · Metadata `requirements/ui/figma-meta.md`
|
|
71
|
-
|
|
72
|
-
Then hand back to the calling command.
|
|
73
|
-
|
|
74
|
-
## Error handling
|
|
75
|
-
|
|
76
|
-
| Error | Action |
|
|
77
|
-
|---|---|
|
|
78
|
-
| MCP tool not available | Print setup instructions, stop, do not fall back silently |
|
|
79
|
-
| `fileKey` missing from URL | Ask user to paste a valid frame URL |
|
|
80
|
-
| `nodeId` missing from URL | Ask user to right-click a frame in Figma → *Copy link to selection* |
|
|
81
|
-
| `get_design_context` 403 | Ask user to check Dev Mode seat on that file |
|
|
82
|
-
| `get_screenshot` returns no image | Continue with metadata only; warn no PNG was captured |
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
# Capture mode: figma-pat
|
|
2
|
-
|
|
3
|
-
Figma URL → `spec_figma.md` envelope + LLM-synthesized narrative from cached raw node JSON. This mode is the active one when any of these is true: a sungen command was invoked with `--figma`, `requirements/spec_figma.md` exists, or the user says "generate from Figma".
|
|
4
|
-
|
|
5
|
-
## Prerequisites
|
|
6
|
-
|
|
7
|
-
- [ ] `sungen figma auth check` succeeds — PAT is stored and valid
|
|
8
|
-
- [ ] Figma file URL is available (shared file or frame link)
|
|
9
|
-
- [ ] If auth missing → run `sungen figma auth set` and follow the walkthrough
|
|
10
|
-
|
|
11
|
-
**Never paste the PAT into any transcript, spec file, or commit.**
|
|
12
|
-
|
|
13
|
-
## Two-Layer Architecture
|
|
14
|
-
|
|
15
|
-
`spec_figma.md` has two layers separated by the `<!-- SYNTHESIS-BELOW -->` marker:
|
|
16
|
-
|
|
17
|
-
| Layer | Producer | Overwrite Rule |
|
|
18
|
-
|---|---|---|
|
|
19
|
-
| **Envelope** (above marker) | sungen CLI | Regenerated each `sungen figma` run — deterministic |
|
|
20
|
-
| **Narrative** (below marker) | This mode (LLM) | Replaced on re-synthesis — everything from marker to EOF |
|
|
21
|
-
|
|
22
|
-
The envelope contains: YAML frontmatter, Frame metadata, Screenshots. The narrative is synthesized by YOU from the cached raw Figma node JSON.
|
|
23
|
-
|
|
24
|
-
## Inputs You Read
|
|
25
|
-
|
|
26
|
-
The scaffolder persists a raw (unfiltered) Figma node tree to:
|
|
27
|
-
```
|
|
28
|
-
.sungen/figma-cache/<fileKey>/<versionId>/<nodeId>-raw.json
|
|
29
|
-
```
|
|
30
|
-
Read this file + the envelope frontmatter of `requirements/spec_figma.md` + any PNGs under `requirements/ui/`. You MUST NOT call the Figma REST API directly — the PAT is not available to you.
|
|
31
|
-
|
|
32
|
-
## Synthesis Task
|
|
33
|
-
|
|
34
|
-
Append 7 narrative sections below `<!-- SYNTHESIS-BELOW -->`. Each is inferred from the raw node tree (names, types, `characters`, layout bounds, auto-layout direction, componentProperties):
|
|
35
|
-
|
|
36
|
-
### 1. Purpose
|
|
37
|
-
One paragraph. What screen is this? Primary user goal? Infer from frame name + top-level text + dominant CTA.
|
|
38
|
-
|
|
39
|
-
### 2. ASCII Layout
|
|
40
|
-
Rough spatial sketch using box characters. Reflect top-bottom / left-right ordering from absoluteBoundingBox. Keep under ~20 lines:
|
|
41
|
-
```
|
|
42
|
-
┌──────────────────────────────────────┐
|
|
43
|
-
│ [Logo] [Sign In] │
|
|
44
|
-
├──────────────────────────────────────┤
|
|
45
|
-
│ Welcome back │
|
|
46
|
-
│ ┌────────────────────────────────┐ │
|
|
47
|
-
│ │ email@example.com │ │
|
|
48
|
-
│ └────────────────────────────────┘ │
|
|
49
|
-
│ [ Continue ] │
|
|
50
|
-
└──────────────────────────────────────┘
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
### 3. Regions
|
|
54
|
-
Bulleted list of major layout regions (header, sidebar, main, footer, modal…) with a one-line purpose each. Use auto-layout frames as region hints.
|
|
55
|
-
|
|
56
|
-
### 4. Actions
|
|
57
|
-
Every interactive element the user can trigger (button, link, icon-button, menu-item, toggle…):
|
|
58
|
-
```
|
|
59
|
-
- **<Action name>** — <what it does> (source: <node name>)
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
### 5. Form Fields
|
|
63
|
-
Every input. Include label, type (text/email/password/select/checkbox/radio/textarea/date), required hint if inferable, placeholder:
|
|
64
|
-
```
|
|
65
|
-
| Label | Type | Required | Placeholder |
|
|
66
|
-
|---|---|---|---|
|
|
67
|
-
```
|
|
68
|
-
Omit (write `_none_`) if no inputs exist.
|
|
69
|
-
|
|
70
|
-
### 6. Data Columns
|
|
71
|
-
If the screen shows a table/list/card grid — enumerate the columns/fields per row. Otherwise `_none_`.
|
|
72
|
-
|
|
73
|
-
### 7. Navigation
|
|
74
|
-
Outgoing links, tab bars, breadcrumbs, back buttons — anything that moves to another screen. Include explicit nav components and implicit CTAs that navigate.
|
|
75
|
-
|
|
76
|
-
## Synthesis Workflow
|
|
77
|
-
|
|
78
|
-
1. Read `requirements/spec_figma.md` — note `file_key`, `node_id`, `figma_version_id` from frontmatter
|
|
79
|
-
2. Read `.sungen/figma-cache/<file_key>/<figma_version_id>/<safe_node_id>-raw.json` (colons in node_id become underscores)
|
|
80
|
-
3. Traverse the tree. Collect names, types, `characters`, `componentProperties`, `absoluteBoundingBox`
|
|
81
|
-
4. Produce the 7 sections above
|
|
82
|
-
5. **Locate the insertion point** in `spec_figma.md`:
|
|
83
|
-
- **If `<!-- SYNTHESIS-BELOW -->` is present** → replace everything from the marker (inclusive) to EOF with: the marker line, a blank line, then the 7 sections.
|
|
84
|
-
- **If the marker is NOT present** (older file or hand-edited) → locate the last non-empty line of the envelope (usually the end of `## Screenshots`), append a blank line, then the marker, another blank line, then the 7 sections. Do NOT delete any envelope content.
|
|
85
|
-
- **If the file is missing entirely** → advise the user to re-run `sungen add --screen <screen> --figma <url> --refresh` to regenerate the envelope first. Do not fabricate one.
|
|
86
|
-
6. Preserve the envelope (frontmatter + Frame + Screenshots) byte-for-byte. Never touch content above the marker.
|
|
87
|
-
|
|
88
|
-
## Re-synthesis
|
|
89
|
-
|
|
90
|
-
- If the envelope's `figma_version_id` changed → envelope is fresh; re-run synthesis
|
|
91
|
-
- If only the narrative is stale → truncate from marker to EOF and regenerate
|
|
92
|
-
- Never edit content ABOVE the marker — that is the scaffolder's territory
|
|
93
|
-
|
|
94
|
-
## Selector Heuristics (for downstream `run-test`)
|
|
95
|
-
|
|
96
|
-
During `run-test` Phase 0, provisional selectors can be seeded from the raw JSON:
|
|
97
|
-
|
|
98
|
-
| Figma Signal | Provisional YAML Entry |
|
|
99
|
-
|---|---|
|
|
100
|
-
| Node name ends `Button`, has text | `role: button` + `name: "<text>"` |
|
|
101
|
-
| Node name ends `Input`/`Field` | `placeholder: "<placeholder text>"` |
|
|
102
|
-
| Node name ends `Link`, has text | `role: link` + `name: "<text>"` |
|
|
103
|
-
| componentProperties has `data-testid` | `testid: <value>` |
|
|
104
|
-
| Plain text leaf (outside interactive) | `text: "<content>"` |
|
|
105
|
-
| Node name ends `Icon` | `role: img` + `name: "<accessible name>"` |
|
|
106
|
-
|
|
107
|
-
Every provisional entry MUST carry:
|
|
108
|
-
```
|
|
109
|
-
# @needs-live-verify source=figma node_id=<id>
|
|
110
|
-
```
|
|
111
|
-
Provisional selectors feed `selectors.yaml` as candidates. `run-test` Phase 0 verifies them against the live page and overwrites incorrect entries.
|
|
112
|
-
|
|
113
|
-
## Security
|
|
114
|
-
|
|
115
|
-
- Never include the PAT in `spec_figma.md`, selectors, test data, or any committed file
|
|
116
|
-
- Never log or echo the PAT in terminal output
|
|
117
|
-
- Read only from `.sungen/figma-cache/` and screen directories — never from `.env`
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
# Capture mode: live
|
|
2
|
-
|
|
3
|
-
Navigate a running application, take **one accessibility snapshot** and **one screenshot**, and save them as visual context for test generation. Use when the app is live (dev, staging, or production with read-only access) and you want tests grounded in the actual rendered UI. Handles auth gracefully: if the page redirects to login, ask the user to sign in manually rather than injecting cookies.
|
|
4
|
-
|
|
5
|
-
## Prerequisites
|
|
6
|
-
|
|
7
|
-
- Playwright MCP connected.
|
|
8
|
-
- Dev/staging server reachable (or a public URL).
|
|
9
|
-
- `playwright.config.ts` exists at the project root (for `baseURL` fallback).
|
|
10
|
-
|
|
11
|
-
## Steps
|
|
12
|
-
|
|
13
|
-
### 1. Resolve target URL
|
|
14
|
-
|
|
15
|
-
1. `Live URL` field in `requirements/spec.md` (Overview section)
|
|
16
|
-
2. `baseURL` from `playwright.config.ts` + `URL Path` from `spec.md`
|
|
17
|
-
3. Neither → `AskUserQuestion`: *"Paste the full URL for the page to scan"*
|
|
18
|
-
|
|
19
|
-
### 2. Navigate
|
|
20
|
-
|
|
21
|
-
`browser_navigate` to the resolved URL.
|
|
22
|
-
|
|
23
|
-
### 3. Handle auth redirect
|
|
24
|
-
|
|
25
|
-
If the page redirects to a login route (URL contains `/login`, `/signin`, `/auth`, or content indicates a login screen):
|
|
26
|
-
1. Tell the user which login URL they landed on.
|
|
27
|
-
2. `AskUserQuestion`:
|
|
28
|
-
- **I'll log in manually** — wait for confirmation, then re-navigate to the target URL
|
|
29
|
-
- **Skip live scan** — switch to mode `local`
|
|
30
|
-
- **Cancel**
|
|
31
|
-
3. **Never** inject cookies or localStorage via `browser_evaluate` / `browser_run_code`. Auth belongs to the user.
|
|
32
|
-
|
|
33
|
-
### 4. Snapshot
|
|
34
|
-
|
|
35
|
-
Take **ONE** `browser_snapshot`. This accessibility tree is the primary AI context — roles, names, text, structure that tc-generation uses to identify sections and fields.
|
|
36
|
-
|
|
37
|
-
### 5. Screenshot (recommended)
|
|
38
|
-
|
|
39
|
-
Take **ONE** `browser_take_screenshot` with `fullPage: true`. Save to `requirements/ui/live-<timestamp>.png`, where `<timestamp>` is `YYYYMMDD-HHMM` local time (e.g. `live-20260421-1430.png`).
|
|
40
|
-
|
|
41
|
-
### 6a. Verify unauthenticated redirect target (flow capture only)
|
|
42
|
-
|
|
43
|
-
When capturing for a **flow** with security scenarios (e.g. "unauthenticated user cannot access X"):
|
|
44
|
-
1. Open a **fresh incognito/unauthenticated** context (no storage state).
|
|
45
|
-
2. `browser_navigate` to the protected route.
|
|
46
|
-
3. Record the **actual redirect URL** — do NOT assume `/login`; it may be `/register`, `/`, etc.
|
|
47
|
-
4. Report the redirect target: *"Unauthenticated access to `/dashboard` redirects to `/register`"*.
|
|
48
|
-
5. The caller must use the **actual redirect URL** in Gherkin assertions, never an assumed one.
|
|
49
|
-
|
|
50
|
-
Skip if the flow has no security scenarios or the user says to skip.
|
|
51
|
-
|
|
52
|
-
### 6. Detect discrepancies vs spec
|
|
53
|
-
|
|
54
|
-
If `spec.md` exists, cross-check the snapshot against spec sections: fields in spec but not in snapshot → *missing in UI*; elements in snapshot but not in spec → *missing in spec*. Report findings but **do not** auto-edit `spec.md`.
|
|
55
|
-
|
|
56
|
-
### 7. Report back
|
|
57
|
-
|
|
58
|
-
> Captured live page `<URL>`: Snapshot N interactive elements · Screenshot `requirements/ui/live-<timestamp>.png` · Discrepancies vs spec: <count or "none">
|
|
59
|
-
|
|
60
|
-
Hand back to the calling command. Scans **exactly one** page per invocation.
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
# Capture mode: local
|
|
2
|
-
|
|
3
|
-
Use **pre-existing images** in `requirements/ui/` as visual context. No network, no MCP, no live site — works for any design tool (Figma export, Sketch, Penpot, Zeplin, hand-drawn, staging screenshots). This is the **baseline fallback**: if the live domain is down and Figma MCP isn't configured, this always works as long as the user drops images in the folder.
|
|
4
|
-
|
|
5
|
-
## Steps
|
|
6
|
-
|
|
7
|
-
### 1. List available images
|
|
8
|
-
|
|
9
|
-
Glob `requirements/ui/*.{png,jpg,jpeg,webp,gif}` and report count + filenames. Filter out metadata files (e.g. `figma-meta.md` written by mode figma-mcp) — those are read by `tc-generation` separately, not treated as images here.
|
|
10
|
-
|
|
11
|
-
### 2. Handle empty folder
|
|
12
|
-
|
|
13
|
-
If no images found:
|
|
14
|
-
1. Tell the user the folder is empty, with the full path so they can open it in Finder.
|
|
15
|
-
2. `AskUserQuestion`:
|
|
16
|
-
- **I'll drop images now** — wait for confirmation, then re-glob
|
|
17
|
-
- **Switch to Figma** — switch to mode `figma-mcp`
|
|
18
|
-
- **Switch to live page scan** — switch to mode `live`
|
|
19
|
-
- **Cancel** — abort create-test
|
|
20
|
-
3. If "drop images now", wait for confirmation (e.g. "done") then re-run step 1.
|
|
21
|
-
|
|
22
|
-
### 3. Read images for context
|
|
23
|
-
|
|
24
|
-
Use the `Read` tool on each image — Claude Code reads PNG/JPG/WebP directly as visual context. For large sets (>10 images), ask which are primary and which are states/variants to avoid loading too much at once.
|
|
25
|
-
|
|
26
|
-
### 4. Summarize
|
|
27
|
-
|
|
28
|
-
> Loaded N image(s) from `requirements/ui/`:
|
|
29
|
-
> - `<filename-1>` — <one-line description of what's visible>
|
|
30
|
-
> - `<filename-2>` — <one-line description>
|
|
31
|
-
|
|
32
|
-
Hand back to the calling command.
|
|
33
|
-
|
|
34
|
-
## File naming hints for users
|
|
35
|
-
|
|
36
|
-
Nudge users toward consistent filenames (don't enforce):
|
|
37
|
-
- `<section>-default.png` / `-error.png` / `-loading.png` / `-empty.png` — section states
|
|
38
|
-
- `full-page.png` / `viewport.png` — whole screen (auto-generated by `sungen add --capture`)
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: sungen-capture
|
|
3
|
-
description: 'Acquire visual/design context for test generation from one of four sources (modes): figma-mcp, figma-pat, live, local. Auto-loaded by create-test/add-screen when a visual source is needed, or when --figma flag / spec_figma.md is present. Router skill — read only the mode file you need.'
|
|
4
|
-
user-invocable: false
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Purpose
|
|
8
|
-
|
|
9
|
-
Bring **visual + design context** into test generation so `sungen-tc-generation` can author Gherkin + test-data grounded in the real UI. This is a **router**: pick exactly **one mode** for the run, then read only that mode's file. Do **not** read all four.
|
|
10
|
-
|
|
11
|
-
This skill never generates Gherkin or `selectors.yaml` — it only acquires context and reports back to the calling command.
|
|
12
|
-
|
|
13
|
-
## Pick the mode
|
|
14
|
-
|
|
15
|
-
| Mode | Read | Use when | Needs |
|
|
16
|
-
|---|---|---|---|
|
|
17
|
-
| **figma-mcp** | `mode-figma-mcp.md` | Pre-launch / Figma is source of truth, **Figma Dev Mode MCP** connected | Figma MCP + frame URL |
|
|
18
|
-
| **figma-pat** | `mode-figma-pat.md` | `--figma` flag was used, or `requirements/spec_figma.md` exists (synthesize narrative from cached raw node JSON) | `sungen figma auth` PAT |
|
|
19
|
-
| **live** | `mode-live.md` | App is running (dev/staging/prod read-only) and you want the actual rendered UI | Playwright MCP + reachable URL |
|
|
20
|
-
| **local** | `mode-local.md` | Images already dropped in `requirements/ui/` (any design tool, screenshots, mockups) — baseline fallback, no network | nothing |
|
|
21
|
-
|
|
22
|
-
### How the mode is chosen (when the caller didn't specify)
|
|
23
|
-
|
|
24
|
-
1. `requirements/spec_figma.md` exists → **figma-pat** (PAT flow already ran during `add-screen`).
|
|
25
|
-
2. `requirements/ui/` has images → **local**.
|
|
26
|
-
3. Neither → ask the user which source (figma-mcp / live / local), then load that one mode file.
|
|
27
|
-
|
|
28
|
-
Modes are **mutually exclusive per run**, but the user can run `create-test` again with a different mode to layer context. All modes write to `requirements/ui/` and report back.
|
|
29
|
-
|
|
30
|
-
## What this skill (any mode) does NOT do
|
|
31
|
-
|
|
32
|
-
- Does not generate Gherkin — that's `sungen-tc-generation`.
|
|
33
|
-
- Does not write `selectors.yaml` — that's `/sungen:run-test`.
|
|
34
|
-
- Does not inject auth/cookies — the user logs in manually (see `live`).
|
|
35
|
-
- Does not crawl or generate images.
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: sungen-dashboard
|
|
3
|
-
description: 'Build a single-file HTML dashboard summarising test cases & Playwright results. Auto-loaded by /sungen:dashboard.'
|
|
4
|
-
user-invocable: false
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Purpose
|
|
8
|
-
|
|
9
|
-
Generate `qa/dashboard/index.html` — a single-file, share-ready test report covering all (or selected) screens and flows. The HTML embeds the snapshot data inline, so it can be emailed, Slacked, or committed and opened by anyone via `file://` without any server.
|
|
10
|
-
|
|
11
|
-
**This skill delegates all heavy work to the `sungen dashboard` CLI.** The CLI is the source of truth for parsing logic — do NOT re-parse files in AI. Your role is only to:
|
|
12
|
-
|
|
13
|
-
1. Invoke the CLI.
|
|
14
|
-
2. Show its output verbatim.
|
|
15
|
-
3. Help the user decide next actions.
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
## Architecture
|
|
20
|
-
|
|
21
|
-
```
|
|
22
|
-
User → /sungen:dashboard [screen...]
|
|
23
|
-
│
|
|
24
|
-
▼
|
|
25
|
-
sungen dashboard CLI (deterministic — no AI tokens)
|
|
26
|
-
├─ Discovery: qa/screens/* + qa/flows/*
|
|
27
|
-
├─ Reuse delivery parsers (.feature, .spec.ts, test-data.yaml, results.json)
|
|
28
|
-
├─ Build DashboardSnapshot JSON
|
|
29
|
-
├─ Write qa/dashboard/history/<runId>.json (max 20 retained, oldest pruned)
|
|
30
|
-
├─ Inject payload into pre-built HTML template
|
|
31
|
-
└─ Write qa/dashboard/index.html (~1MB, fully self-contained)
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
Source modules: `src/dashboard/*.ts` + `src/exporters/json-exporter.ts`.
|
|
35
|
-
UI source: `dashboard/` (built once, ships in npm package as `dist/dashboard/templates/index.html`).
|
|
36
|
-
|
|
37
|
-
---
|
|
38
|
-
|
|
39
|
-
## Required sources (CLI tolerates missing files)
|
|
40
|
-
|
|
41
|
-
| # | Source | Path | Required? |
|
|
42
|
-
|---|--------|------|-----------|
|
|
43
|
-
| 1 | Feature file | `qa/screens/<name>/features/<name>.feature` (or `qa/flows/...`) | Yes — screens without a feature are skipped |
|
|
44
|
-
| 2 | Test data | `qa/screens/<name>/test-data/<name>.yaml` | Optional — `{{vars}}` fall back to literal |
|
|
45
|
-
| 3 | Compiled spec | `specs/generated/<name>/<name>.spec.ts` | Optional — flagged as "Not compiled" if missing |
|
|
46
|
-
| 4 | Test results | `specs/generated/<name>/<name>-test-result.json` (or `test-results/results.json`) | Optional — TCs show as "Pending" if missing |
|
|
47
|
-
|
|
48
|
-
Unlike `sungen delivery`, the dashboard CLI is **forgiving** — it always renders whatever data is available. Pre-flight is implicit, not blocking.
|
|
49
|
-
|
|
50
|
-
---
|
|
51
|
-
|
|
52
|
-
## Output structure
|
|
53
|
-
|
|
54
|
-
```
|
|
55
|
-
qa/dashboard/
|
|
56
|
-
├── index.html # share-ready single-file report
|
|
57
|
-
└── history/
|
|
58
|
-
├── 2026-04-26T...Z.json # past snapshots, oldest → newest
|
|
59
|
-
├── 2026-04-27T...Z.json
|
|
60
|
-
└── … # max 20, older pruned automatically
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
Both should be committed to git so collaborators see the same trend lines.
|
|
64
|
-
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
## Dashboard views
|
|
68
|
-
|
|
69
|
-
| View | What it shows |
|
|
70
|
-
|------|---------------|
|
|
71
|
-
| **Overview** | Stat cards (total/passed/failed/pending), pass-rate donut, priority bar chart, trend mini-chart, per-screen progress bars |
|
|
72
|
-
| **Suites** | Tree: screen → scenarios; filter by search/status/priority; click → detail modal with steps, expected, error, trace |
|
|
73
|
-
| **Trends** | Pass-rate line chart + stacked status bars across all retained runs (requires ≥2 runs) |
|
|
74
|
-
| **Compare** | Pick base/head run; per-screen Δ table; lists of newly passing/failing/added/removed/changed tests |
|
|
75
|
-
| **Export** | Browser-side CSV / XLSX download. One-button generation, no server. Same column layout as `sungen delivery` |
|
|
76
|
-
|
|
77
|
-
Trends + Compare are disabled in the sidebar until at least 2 runs exist in history.
|
|
78
|
-
|
|
79
|
-
---
|
|
80
|
-
|
|
81
|
-
## CLI command reference
|
|
82
|
-
|
|
83
|
-
```bash
|
|
84
|
-
# All screens + flows
|
|
85
|
-
sungen dashboard
|
|
86
|
-
|
|
87
|
-
# Specific targets
|
|
88
|
-
sungen dashboard kudos awards flow/checkout
|
|
89
|
-
|
|
90
|
-
# Skip history persistence (one-off / CI ephemeral)
|
|
91
|
-
sungen dashboard --no-history
|
|
92
|
-
|
|
93
|
-
# Cap retained history (default: 20)
|
|
94
|
-
sungen dashboard --max-history 50
|
|
95
|
-
|
|
96
|
-
# Auto-open in default browser
|
|
97
|
-
sungen dashboard --open
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
---
|
|
101
|
-
|
|
102
|
-
## Skill responsibilities (when invoked from /sungen:dashboard)
|
|
103
|
-
|
|
104
|
-
1. **Run the CLI** with whatever arguments came from `$ARGUMENTS`.
|
|
105
|
-
2. **Show the CLI output verbatim** — do not summarize, paraphrase, or omit warnings.
|
|
106
|
-
3. **Offer next-step options via `AskUserQuestion`** based on what just happened:
|
|
107
|
-
- On success → open dashboard, share file, run more tests, build for another screen, done.
|
|
108
|
-
- On error → diagnose from the error message; common causes are missing `qa/` directories or no targets.
|
|
109
|
-
4. **Do NOT** parse `.feature`, `.spec.ts`, or results files yourself — that is the CLI's job.
|
|
110
|
-
5. **Do NOT** touch files under `qa/dashboard/` directly — only the CLI writes there.
|
|
111
|
-
|
|
112
|
-
---
|
|
113
|
-
|
|
114
|
-
## Sharing the dashboard
|
|
115
|
-
|
|
116
|
-
The HTML is self-contained:
|
|
117
|
-
- No CDN or external font — system font stack only.
|
|
118
|
-
- All JS, CSS, charts, and the SheetJS library are inlined.
|
|
119
|
-
- The snapshot payload sits in `<script id="__SUNGEN_DASHBOARD__" type="application/json">…</script>`.
|
|
120
|
-
|
|
121
|
-
Acceptable sharing: email, Slack upload, S3 bucket, committed in git. The recipient opens it directly, no install required. ~1MB on disk, ~300KB gzipped over the wire.
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: sungen-delivery
|
|
3
|
-
description: 'Export Gherkin scenarios + Playwright results → CSV test case deliverable. Auto-loaded by delivery command.'
|
|
4
|
-
user-invocable: false
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Purpose
|
|
8
|
-
|
|
9
|
-
Export test cases from Sungen screens and flows to a standardized CSV file (format BM-2-901-13) for QA delivery.
|
|
10
|
-
|
|
11
|
-
**This skill delegates all heavy work to the `sungen delivery` CLI.** The CLI is the single source of truth for parsing logic — do NOT re-parse files in AI. Your role is only to:
|
|
12
|
-
|
|
13
|
-
1. Invoke the CLI
|
|
14
|
-
2. Show its output verbatim
|
|
15
|
-
3. Help the user react to pre-flight failures
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
## Architecture
|
|
20
|
-
|
|
21
|
-
```
|
|
22
|
-
User → /sungen:delivery [name...]
|
|
23
|
-
│
|
|
24
|
-
▼
|
|
25
|
-
sungen delivery CLI (deterministic — no AI tokens)
|
|
26
|
-
├─ Scope detection (no-arg = all screens + flows)
|
|
27
|
-
├─ Auto-detect: qa/flows/<name>/ → flow, qa/screens/<name>/ → screen
|
|
28
|
-
├─ Pre-flight source checks per target
|
|
29
|
-
├─ Parse .feature (metadata)
|
|
30
|
-
├─ Parse .spec.ts (resolved Playwright code — source of truth)
|
|
31
|
-
├─ Parse test-data.yaml (resolve {{vars}})
|
|
32
|
-
├─ Parse test-results/results.json (match test titles)
|
|
33
|
-
├─ Merge sources + generate CSV rows
|
|
34
|
-
└─ Write qa/deliverables/<name>-testcases.csv
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
Source modules: `src/exporters/*.ts`
|
|
38
|
-
|
|
39
|
-
---
|
|
40
|
-
|
|
41
|
-
## Required sources (CLI pre-flight checks these)
|
|
42
|
-
|
|
43
|
-
| # | Source | Screen path | Flow path | Created by |
|
|
44
|
-
|---|--------|-------------|-----------|------------|
|
|
45
|
-
| 1 | Feature file | `qa/screens/<name>/features/<name>.feature` | `qa/flows/<name>/features/<name>.feature` | `add-screen`/`add-flow` + `create-test` |
|
|
46
|
-
| 2 | Test data | `qa/screens/<name>/test-data/<name>.yaml` | `qa/flows/<name>/test-data/<name>.yaml` | `create-test` |
|
|
47
|
-
| 3 | Selectors | `qa/screens/<name>/selectors/<name>.yaml` | `qa/flows/<name>/selectors/<name>.yaml` | `run-test` |
|
|
48
|
-
| 4 | Compiled spec | `specs/generated/<name>/<name>.spec.ts` | `specs/generated/flows/<name>/<name>.spec.ts` | `sungen generate` |
|
|
49
|
-
| 5 | Test results | `specs/generated/<name>/<name>-test-result.json` or `test-results/results.json` | `specs/generated/flows/<name>/<name>-test-result.json` or global fallback | `run-test` |
|
|
50
|
-
|
|
51
|
-
**Sources 1-4 are blocking** — CLI aborts if any is missing.
|
|
52
|
-
**Source 5 is optional** — CSV is still generated but Test Result/Date/Executor/Env columns are empty (all tests show as Pending).
|
|
53
|
-
|
|
54
|
-
The CLI reads the **per-target result file first** (co-located with `.spec.ts`), then falls back to the global `test-results/results.json`. Per-target is preferred because the global file gets OVERWRITTEN each time Playwright runs, losing results from earlier targets.
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
## Column mapping (handled by CLI)
|
|
59
|
-
|
|
60
|
-
| CSV Column | Source |
|
|
61
|
-
|------------|--------|
|
|
62
|
-
| TC ID | Generated, namespaced per screen/flow: `<SCREEN_UPPER>-<CAT>-<NNN>` (e.g. `VP-SEC-001` on screen `login` → `LOGIN-SEC-001`). The namespace makes it globally unique — the stable key the dashboard tracks each test case by. |
|
|
63
|
-
| Category 1 | Scenario name with VP prefix stripped |
|
|
64
|
-
| Category 2 | VP group: `VP-SEC`→Accessing, `VP-UI`→GUI, `VP-VAL`/`VP-LOGIC`→Function |
|
|
65
|
-
| Category 3 | Feature name (first line of `.feature`) |
|
|
66
|
-
| Category 4 | Screen name |
|
|
67
|
-
| Pre-condition | Auth tag → "Logged in as X" / "Not authenticated" + Given steps (natural language) |
|
|
68
|
-
| Test Data | `{{vars}}` from scenario resolved via test-data.yaml → `key: value; key2: value2` |
|
|
69
|
-
| Steps | `.spec.ts` code comments for interactions (numbered) |
|
|
70
|
-
| Expected results | `.spec.ts` `expect(...)` comments (numbered) |
|
|
71
|
-
| Priority | Tag: `@high`/`@normal`/`@low` (default: Normal) |
|
|
72
|
-
| Testcase type | `@manual` → Manual, else Auto. Not compiled → "Not compiled" |
|
|
73
|
-
| Test Result | results.json status: passed→Passed, failed/timedOut→Failed, skipped→N/A, else Pending |
|
|
74
|
-
| Executed Date | results.json startTime formatted as `dd/mm/yyyy` |
|
|
75
|
-
| Test Executor | `git config user.name` |
|
|
76
|
-
| Test Environment | `playwright.config.ts` baseURL + project name |
|
|
77
|
-
| Note | Error message + trace path (for failed tests) |
|
|
78
|
-
|
|
79
|
-
---
|
|
80
|
-
|
|
81
|
-
## XLSX sheets — Auto / Manual split
|
|
82
|
-
|
|
83
|
-
The `.xlsx` is split into two sheets so QA manages the sets separately:
|
|
84
|
-
- **`Auto`** — automatable test cases (`Auto` + `Not compiled`).
|
|
85
|
-
- **`Manual`** — `@manual` test cases (always present, header-only when there are none).
|
|
86
|
-
|
|
87
|
-
Multi-locale (no `SUNGEN_ENV`): one **`<LOCALE> Auto`** sheet per locale + a single shared **`Manual`** sheet (manual TCs are locale-invariant). The **CSV stays one file with every row** — the `Testcase type` column distinguishes Auto vs Manual.
|
|
88
|
-
|
|
89
|
-
---
|
|
90
|
-
|
|
91
|
-
## API delivery — extra worksheet
|
|
92
|
-
|
|
93
|
-
For **api-kind units** (`qa/api/<area>/`), the `.xlsx` gains a third worksheet **`API detail`** (appended after Auto/Manual). The main BM-2-901-13 Testcases layout is unchanged. The CSV is unchanged (16-column, no extra sheet).
|
|
94
|
-
|
|
95
|
-
### Required sources (API detail sheet only)
|
|
96
|
-
|
|
97
|
-
| Source | Path | Created by |
|
|
98
|
-
|--------|------|------------|
|
|
99
|
-
| Endpoint catalog | `qa/api/<area>/api/apis.yaml` | `sungen add --api` or `sungen api import` |
|
|
100
|
-
| Scenario annotations | `qa/api/<area>/features/<feature>.feature` | `create-test` |
|
|
101
|
-
|
|
102
|
-
### API detail column mapping
|
|
103
|
-
|
|
104
|
-
| Column | Source |
|
|
105
|
-
|--------|--------|
|
|
106
|
-
| Endpoint | `path` from `apis.yaml` catalog entry |
|
|
107
|
-
| Method | `method` from catalog entry (uppercased) |
|
|
108
|
-
| Auth / Datasource | catalog `datasource` + any `@auth:<role>` tag from scenarios calling this endpoint |
|
|
109
|
-
| Request shape | catalog `body` + `params` fields composed as `body: {…}; params: [a, b]` |
|
|
110
|
-
| Expected-status matrix | `@cases:<dataset>` label for data-driven scenarios; catalog `expect.status` as fallback |
|
|
111
|
-
| Flow steps | Ordered `@api:<name>` call chain from multi-call scenarios (e.g. `register → count_users`) |
|
|
112
|
-
| Concurrency invariant | `@concurrent:<N>` + `@query:<oracle>` from concurrent scenarios (e.g. `ok_count=2; @query user_count`) |
|
|
113
|
-
|
|
114
|
-
**Sources are catalog + annotations only** — Field Metadata (FM) is not required for this sheet.
|
|
115
|
-
|
|
116
|
-
---
|
|
117
|
-
|
|
118
|
-
## Excluded from CSV
|
|
119
|
-
|
|
120
|
-
- `@steps:<name>` **base** scenarios — these are setup-only, inlined into `@extend:...` scenarios at compile time
|
|
121
|
-
- Default scaffold `Sample scenario for <screen>` — not a real test
|
|
122
|
-
|
|
123
|
-
---
|
|
124
|
-
|
|
125
|
-
## CLI command reference
|
|
126
|
-
|
|
127
|
-
```bash
|
|
128
|
-
# Export all screens and flows
|
|
129
|
-
sungen delivery
|
|
130
|
-
|
|
131
|
-
# Export specific targets (auto-detects screen vs flow)
|
|
132
|
-
sungen delivery kudos awards nomination-flow
|
|
133
|
-
|
|
134
|
-
# Skip pre-flight (CI only)
|
|
135
|
-
sungen delivery --skip-preflight
|
|
136
|
-
|
|
137
|
-
# Skip targets with blocking misses
|
|
138
|
-
sungen delivery --continue-on-missing
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
Output: `qa/deliverables/<name>-testcases.csv` (UTF-8 with BOM)
|