tuner-testkit 5.3.0__tar.gz → 6.0.0__tar.gz
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.
- {tuner_testkit-5.3.0/tuner_testkit.egg-info → tuner_testkit-6.0.0}/PKG-INFO +2 -2
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/README.md +1 -1
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/pyproject.toml +1 -1
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/__init__.py +1 -1
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/assets-knowledge.mdc +2 -2
- tuner_testkit-6.0.0/tuner_testkit/apps/dna/dna_payload/.cursor/rules/testcases.mdc +31 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/work-task.mdc +2 -2
- tuner_testkit-6.0.0/tuner_testkit/apps/dna/dna_payload/.cursor/skills/maintain-testcases/SKILL.md +167 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/AGENTS.md +3 -3
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/agent-task-log.md +1 -1
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/artifacts-layout.md +3 -2
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/assets-knowledge-syntax.md +4 -3
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/metadata-conventions.md +4 -4
- tuner_testkit-6.0.0/tuner_testkit/apps/dna/dna_payload/docs/spec/testcase-syntax.md +194 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/work-task.md +3 -1
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/task/store.py +46 -18
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/task/tests/test_store.py +23 -0
- tuner_testkit-6.0.0/tuner_testkit/testcases/tests/test_validate.py +148 -0
- tuner_testkit-6.0.0/tuner_testkit/testcases/validate.py +301 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0/tuner_testkit.egg-info}/PKG-INFO +2 -2
- tuner_testkit-5.3.0/tuner_testkit/apps/dna/dna_payload/.cursor/rules/testcases.mdc +0 -29
- tuner_testkit-5.3.0/tuner_testkit/apps/dna/dna_payload/.cursor/skills/maintain-testcases/SKILL.md +0 -124
- tuner_testkit-5.3.0/tuner_testkit/apps/dna/dna_payload/docs/spec/testcase-syntax.md +0 -120
- tuner_testkit-5.3.0/tuner_testkit/testcases/tests/test_validate.py +0 -76
- tuner_testkit-5.3.0/tuner_testkit/testcases/validate.py +0 -141
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/LICENSE +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/setup.cfg +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/action_words/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/action_words/__main__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/action_words/_internal/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/action_words/_internal/api.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/action_words/_internal/db.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/action_words/_internal/generators.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/action_words/_internal/ids.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/action_words/_internal/wait.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/action_words/base.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/action_words/context.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/action_words/registry.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/api_mock/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/api_mock/app.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/api_mock/errors.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/api_mock/router.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/api_mock/spec.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/api_mock/store.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/api_objects/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/api_objects/auth.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/api_objects/recording/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/api_objects/recording/capture.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/api_objects/recording/codegen.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/api_objects/recording/freeze.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/api_objects/recording/mocks.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/api_objects/recording/normalize.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/api_objects/recording/pipeline.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/api_objects/recording/sanitize.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/api_test/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/api_test/client.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/api_test/errors.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/api_test/jsonpath.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/api_test/model.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/_shared/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/_shared/changelog.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/api_recorder/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/api_recorder/__main__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/api_recorder/addon.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/api_recorder/cli.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/api_recorder/playwright_tap.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/api_recorder/tests/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/api_recorder/tests/test_addon.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/__main__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/build.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/cli.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/agents/bdd-asset-pipeline.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/agents/sut-self-learning.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/agents/sut-source-to-design.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/hooks/sync_registry.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/hooks.json +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/agent-task-log.mdc +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/apps-authoring.mdc +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/apps-handover.mdc +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/bdd-asset-layering.mdc +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/bdd-pipeline-gates.mdc +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/bdd-stage-layout.mdc +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/commit-convention.mdc +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/explore-safety.mdc +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/index-hygiene.mdc +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/packages-db.mdc +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/packages-fake.mdc +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/packages-logging.mdc +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/packages-page-test.mdc +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/analyze-mcp-network/SKILL.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/create-action-word/SKILL.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/create-app/SKILL.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/derive-design-knowledge/SKILL.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/derive-feature-sets/SKILL.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/derive-test-design/SKILL.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/dump-ddl/SKILL.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/explore-sut/SKILL.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/feature-authoring/SKILL.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/feature-review-lint/SKILL.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/freeze-api-objects/SKILL.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/generate-test-report/SKILL.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/maintain-behave-steps/SKILL.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/maintain-index/SKILL.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/maintain-page-objects/SKILL.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/release-template/SKILL.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/reuse-analysis/SKILL.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/run-feature-playwright-mcp/SKILL.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/run-test-execution/SKILL.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/MANIFEST.txt +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/action-words-syntax.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/api-objects-syntax.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/apps-authoring-syntax.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/bdd-run-gherkin-in-playwrightMCP.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/behave-gerkin-syntax.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/behave-step-definitions.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/commit-convention.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/design-knowledge-syntax.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/page-objects-syntax.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/sut-self-learning.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/test-design-syntax.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/tools/git-hooks/README.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/tools/git-hooks/commit-msg +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/tools/git-hooks/pre-commit +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/tools/git-hooks/pre-push +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/tools/git-hooks/secret_scan.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/dna_payload/tools/git-hooks/validate_commit_msg.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/paths.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/source.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/targets.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/tests/test_cli.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dna/tests/test_targets.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/dump_ddl.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/evidence/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/evidence/__main__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/evidence/cli.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/evidence/persist.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/evidence/tests/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/evidence/tests/test_cli.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/evidence/tests/test_persist.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/index_ai/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/index_ai/__main__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/index_ai/registry.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/__main__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/manifest.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/scaffold.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/stubs/INDEX.project.md +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/stubs/apps/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/stubs/behave.ini +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/stubs/config/env.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/stubs/data/sut-accounts.example.yaml +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/stubs/gitignore +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/stubs/packages/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/stubs/packages/action_words/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/stubs/packages/action_words/_internal/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/stubs/packages/action_words/_internal/params.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/stubs/packages/action_words/models.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/stubs/packages/api_objects/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/stubs/packages/api_objects/auth.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/stubs/packages/api_objects/recording/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/stubs/packages/api_objects/registry.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/stubs/packages/page_objects/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/stubs/packages/page_objects/session.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/stubs/tests/features/api_environment.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/stubs/tests/features/api_steps/given.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/stubs/tests/features/api_steps/then.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/stubs/tests/features/api_steps/when.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/stubs/tests/features/ui_environment.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/stubs/tests/features/ui_steps/given.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/stubs/tests/features/ui_steps/then.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/stubs/tests/features/ui_steps/when.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/stubs/tests/pytest/conftest.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/stubs/workbench.cmd +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/stubs/workbench.sh +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/tests/test_git_hooks.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/init_repo/tests/test_scaffold.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/mock_server/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/mock_server/__main__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/mock_server/cli.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/mock_server/seed.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/mock_server/tool.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/page_recorder/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/page_recorder/__main__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/page_recorder/capture.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/page_recorder/cli.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/page_recorder/codegen.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/page_recorder/freeze.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/page_recorder/inject.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/page_recorder/session.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/page_recorder/tests/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/page_recorder/tests/test_capture.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/page_recorder/tests/test_cli.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/page_recorder/tests/test_freeze.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/recorder/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/recorder/__main__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/recorder/cli.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/recorder/tests/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/recorder/tests/test_cli.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/task/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/task/__main__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/task/cli.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/apps/task/validate.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/artifacts.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/catalog/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/catalog/build.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/catalog/directory.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/catalog/front_matter.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/catalog/scan.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/catalog/tests/test_build.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/catalog/tests/test_directory.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/catalog/tests/test_front_matter.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/config.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/db/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/db/client.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/db/connection.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/excel/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/excel/workbook.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/fake/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/fake/__main__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/fake/catalog.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/fake/china.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/fake/cli.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/fake/core.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/fake/medical.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/fake/wrappers.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/logging/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/logging/context.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/logging/core.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/logging/helpers.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/logging/hooks.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/logging/scenario_file.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/page_test/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/page_test/__main__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/page_test/base.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/page_test/driver.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/page_test/errors.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/page_test/harvest.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/page_test/health.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/page_test/locator.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/page_test/model.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/page_test/registry.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/page_test/session.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/page_test/steps.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/page_test/testing.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/project.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/testcases/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/testcases/__main__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/tools/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/tools/manifest.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/tools/runner.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/tools/tests/test_manifest.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/tools/tests/test_runner.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workbench/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workbench/__main__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workbench/app.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workbench/cli.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workbench/kinds/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workbench/kinds/app_generic.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workbench/kinds/word_db_seed.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workbench/kinds/word_generic.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workbench/static/app.css +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workbench/templates/_params_form.html +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workbench/templates/ai.html +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workbench/templates/ai_detail.html +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workbench/templates/base.html +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workbench/templates/env.html +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workbench/templates/history.html +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workbench/templates/home.html +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workbench/templates/knowledge.html +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workbench/templates/run.html +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workbench/templates/tool.html +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workbench/templates/tools.html +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workbench/templates/word.html +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workbench/templates/word_db_seed.html +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workbench/templates/words.html +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workbench/tests/test_app.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workspace/__init__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workspace/__main__.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workspace/cli.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workspace/index_render.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workspace/meta.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workspace/tests/test_index_render.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit/workspace/tests/test_meta.py +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit.egg-info/SOURCES.txt +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit.egg-info/dependency_links.txt +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit.egg-info/entry_points.txt +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit.egg-info/requires.txt +0 -0
- {tuner_testkit-5.3.0 → tuner_testkit-6.0.0}/tuner_testkit.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tuner-testkit
|
|
3
|
-
Version:
|
|
3
|
+
Version: 6.0.0
|
|
4
4
|
Summary: Shared test runtime, recorders, and DNA overlay for SUT test repos
|
|
5
5
|
Author: tuner-testkit contributors
|
|
6
6
|
License-Expression: MIT
|
|
@@ -221,4 +221,4 @@ uv sync --extra all
|
|
|
221
221
|
(被测系统 = 平台本身,uv workspace 成员,共用 `.venv`):路线图在 `dogfood/assets/domain-notes/platform/roadmap.md`,
|
|
222
222
|
验收活文档在 `dogfood/tests/features/`。见 [`dogfood/README.md`](dogfood/README.md)。
|
|
223
223
|
|
|
224
|
-
5.3.0 发行说明(功能用例集 `assets/testcases/`)见 [`docs/changelog/TEMPLATE-5.3.0.md`](docs/changelog/TEMPLATE-5.3.0.md);5.2.0 发行说明(work task / 测试设计 / 证据附件)见 [`docs/changelog/TEMPLATE-5.2.0.md`](docs/changelog/TEMPLATE-5.2.0.md);5.1.0 发行说明(工作台 / meta stamp / `--json`)见 [`docs/changelog/TEMPLATE-5.1.0.md`](docs/changelog/TEMPLATE-5.1.0.md);5.0.0(Plane Job 协议退场、`tuner-workspace`)见 [`TEMPLATE-5.0.0.md`](docs/changelog/TEMPLATE-5.0.0.md);4.3.0 见 [`TEMPLATE-4.3.0.md`](docs/changelog/TEMPLATE-4.3.0.md);3.x → 4.x 迁移见 [`TEMPLATE-4.0.0.md`](docs/changelog/TEMPLATE-4.0.0.md)。平台能力地图见 [`INDEX.md`](INDEX.md)。
|
|
224
|
+
6.0.0 发行说明(一条用例一个文件)见 [`docs/changelog/TEMPLATE-6.0.0.md`](docs/changelog/TEMPLATE-6.0.0.md);5.3.1 发行说明(已回答提问归档)见 [`docs/changelog/TEMPLATE-5.3.1.md`](docs/changelog/TEMPLATE-5.3.1.md);5.3.0 发行说明(功能用例集 `assets/testcases/`)见 [`docs/changelog/TEMPLATE-5.3.0.md`](docs/changelog/TEMPLATE-5.3.0.md);5.2.0 发行说明(work task / 测试设计 / 证据附件)见 [`docs/changelog/TEMPLATE-5.2.0.md`](docs/changelog/TEMPLATE-5.2.0.md);5.1.0 发行说明(工作台 / meta stamp / `--json`)见 [`docs/changelog/TEMPLATE-5.1.0.md`](docs/changelog/TEMPLATE-5.1.0.md);5.0.0(Plane Job 协议退场、`tuner-workspace`)见 [`TEMPLATE-5.0.0.md`](docs/changelog/TEMPLATE-5.0.0.md);4.3.0 见 [`TEMPLATE-4.3.0.md`](docs/changelog/TEMPLATE-4.3.0.md);3.x → 4.x 迁移见 [`TEMPLATE-4.0.0.md`](docs/changelog/TEMPLATE-4.0.0.md)。平台能力地图见 [`INDEX.md`](INDEX.md)。
|
|
@@ -173,4 +173,4 @@ uv sync --extra all
|
|
|
173
173
|
(被测系统 = 平台本身,uv workspace 成员,共用 `.venv`):路线图在 `dogfood/assets/domain-notes/platform/roadmap.md`,
|
|
174
174
|
验收活文档在 `dogfood/tests/features/`。见 [`dogfood/README.md`](dogfood/README.md)。
|
|
175
175
|
|
|
176
|
-
5.3.0 发行说明(功能用例集 `assets/testcases/`)见 [`docs/changelog/TEMPLATE-5.3.0.md`](docs/changelog/TEMPLATE-5.3.0.md);5.2.0 发行说明(work task / 测试设计 / 证据附件)见 [`docs/changelog/TEMPLATE-5.2.0.md`](docs/changelog/TEMPLATE-5.2.0.md);5.1.0 发行说明(工作台 / meta stamp / `--json`)见 [`docs/changelog/TEMPLATE-5.1.0.md`](docs/changelog/TEMPLATE-5.1.0.md);5.0.0(Plane Job 协议退场、`tuner-workspace`)见 [`TEMPLATE-5.0.0.md`](docs/changelog/TEMPLATE-5.0.0.md);4.3.0 见 [`TEMPLATE-4.3.0.md`](docs/changelog/TEMPLATE-4.3.0.md);3.x → 4.x 迁移见 [`TEMPLATE-4.0.0.md`](docs/changelog/TEMPLATE-4.0.0.md)。平台能力地图见 [`INDEX.md`](INDEX.md)。
|
|
176
|
+
6.0.0 发行说明(一条用例一个文件)见 [`docs/changelog/TEMPLATE-6.0.0.md`](docs/changelog/TEMPLATE-6.0.0.md);5.3.1 发行说明(已回答提问归档)见 [`docs/changelog/TEMPLATE-5.3.1.md`](docs/changelog/TEMPLATE-5.3.1.md);5.3.0 发行说明(功能用例集 `assets/testcases/`)见 [`docs/changelog/TEMPLATE-5.3.0.md`](docs/changelog/TEMPLATE-5.3.0.md);5.2.0 发行说明(work task / 测试设计 / 证据附件)见 [`docs/changelog/TEMPLATE-5.2.0.md`](docs/changelog/TEMPLATE-5.2.0.md);5.1.0 发行说明(工作台 / meta stamp / `--json`)见 [`docs/changelog/TEMPLATE-5.1.0.md`](docs/changelog/TEMPLATE-5.1.0.md);5.0.0(Plane Job 协议退场、`tuner-workspace`)见 [`TEMPLATE-5.0.0.md`](docs/changelog/TEMPLATE-5.0.0.md);4.3.0 见 [`TEMPLATE-4.3.0.md`](docs/changelog/TEMPLATE-4.3.0.md);3.x → 4.x 迁移见 [`TEMPLATE-4.0.0.md`](docs/changelog/TEMPLATE-4.0.0.md)。平台能力地图见 [`INDEX.md`](INDEX.md)。
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
description: assets/ is the knowledge base for humans and the LLM; enforce provenance metadata, raw-vs-curated boundaries, and grounding (consult INDEX before generating)
|
|
3
3
|
globs: assets/**
|
|
4
4
|
alwaysApply: false
|
|
5
|
-
version: 1.2.
|
|
5
|
+
version: 1.2.1
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# assets — 知识层硬约束
|
|
@@ -26,7 +26,7 @@ SUT 自学习见 `docs/spec/sut-self-learning.md`;design schema 见
|
|
|
26
26
|
|
|
27
27
|
- 目录分类固定:`ddl/<datasource>/`、`sql/`、`usecases/<domain>/`、
|
|
28
28
|
`domain-notes/<domain>/`、`explore/<app>/`、`design/<app>/`、`testdesign/`、
|
|
29
|
-
`testcases
|
|
29
|
+
`testcases/<模块>/<套件>/`、`testreport/`
|
|
30
30
|
(新增类别前先改 spec,再改本 rule)。功能用例集见 `docs/spec/testcase-syntax.md`。
|
|
31
31
|
- 人工/半自动区文件头必须带元数据:`domain / source / date / version / confidence`
|
|
32
32
|
(Markdown 用 YAML front-matter,SQL 用顶部 `--` 注释)。
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Functional testcases live one case per file under assets/testcases/<module>/<suite>/<Case-ID>.md; suite notes live in that folder's README
|
|
3
|
+
globs: assets/testcases/**
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
version: 1.3.0
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# testcases — 功能用例集
|
|
9
|
+
|
|
10
|
+
完整规范:`docs/spec/testcase-syntax.md`。生成或改写走 skill `maintain-testcases`。
|
|
11
|
+
|
|
12
|
+
## 位置
|
|
13
|
+
|
|
14
|
+
- 总索引:`assets/testcases/README.md`
|
|
15
|
+
- 模块说明:`assets/testcases/<模块>/README.md`
|
|
16
|
+
- 一个套件一个目录:`assets/testcases/<模块>/<套件>/README.md`
|
|
17
|
+
- 一条用例一个文件:`assets/testcases/<模块>/<套件>/<用例ID>.md`
|
|
18
|
+
- 不要写到 `usecases/`、`testdesign/` 或 `tests/features/`。
|
|
19
|
+
|
|
20
|
+
## 用例文件
|
|
21
|
+
|
|
22
|
+
- 文件名等于 `id`。一级标题是 `<id> <title>`。
|
|
23
|
+
- `type` 为 `正向` 或 `反向`。`status` 为 `就绪` 或 `废弃`。`execution` 为 `手工` 或 `自动`。
|
|
24
|
+
- `## 步骤` 从 `### 1` 连续编号。每步有 `- 操作:` 和 `- 预期:`。
|
|
25
|
+
- 套件级、不属于单条用例的说明写在套件 README 的 `## 详情`。
|
|
26
|
+
- ID 形如 `User-Login-valid-credentials`:`id_prefix` 加小写 kebab-case slug(2–5 个词)。全库唯一;不改、不复用。删除一条不改其余 ID。
|
|
27
|
+
|
|
28
|
+
## 禁止
|
|
29
|
+
|
|
30
|
+
- 密码、token、Cookie、Authorization。账号只写 `account_id`。
|
|
31
|
+
- 没有出处的业务规则。出处是用户本次说明,或索引能指向的知识。
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Work tasks live in work/tasks. When a human must choose a missing evidence channel, write an inbox question and block the task instead of inventing the channel.
|
|
3
3
|
alwaysApply: true
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.1.0
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# 工作任务与人类提问
|
|
@@ -15,7 +15,7 @@ version: 1.0.0
|
|
|
15
15
|
- 端到端点击用 `type: test-execution`,`design` 指向已有测试设计;报告写入 `assets/testreport/`,证据用 `tuner-evidence persist` 或 `attach` 挂上 `task_id`、截图、脱敏日志、接口 JSON。
|
|
16
16
|
- 执行结束后把结果写入该测试设计的「执行反馈」,只引用证据路径。
|
|
17
17
|
- 仓库没有写明的证据通道(典型是后端日志:SSH 目录、日志接口、Rancher API)立刻 `tuner-task ask`。日志主题用 `sut-log-source`。
|
|
18
|
-
- 提问写入 `artifacts/inbox/questions/` 后停止这一支,把任务保持在 `blocked`,直到 `tuner-task answer
|
|
18
|
+
- 提问写入 `artifacts/inbox/questions/` 后停止这一支,把任务保持在 `blocked`,直到 `tuner-task answer`。回答后的问题文件在 `artifacts/inbox/archived-question/`。
|
|
19
19
|
|
|
20
20
|
## Must not
|
|
21
21
|
|
tuner_testkit-6.0.0/tuner_testkit/apps/dna/dna_payload/.cursor/skills/maintain-testcases/SKILL.md
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: maintain-testcases
|
|
3
|
+
version: 1.3.0
|
|
4
|
+
description: Creates and updates functional testcases so each case is its own Markdown file under assets/testcases/<module>/<suite>/<Case-ID>.md, with suite notes in that folder's README. Uses a TestLink-style template (summary, preconditions, numbered steps, expected results, status). Use when the user asks to 编写/生成/维护测试用例, add a module or suite, or mentions assets/testcases or a case ID. Do not use for testdesign click-paths or behave .feature files.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Maintain testcases
|
|
8
|
+
|
|
9
|
+
## Scope
|
|
10
|
+
|
|
11
|
+
- **Write**: `assets/testcases/**` only.
|
|
12
|
+
- **Must follow**: `docs/spec/testcase-syntax.md`.
|
|
13
|
+
- **Out of scope**: `assets/testdesign/`(用 `derive-test-design`)、`tests/features/**`(用 `feature-authoring`)、pytest。
|
|
14
|
+
|
|
15
|
+
## Before writing
|
|
16
|
+
|
|
17
|
+
1. 读 `assets/testcases/README.md`、目标模块的 `README.md`、目标套件的 `README.md`(没有就先按下面的模板建)。
|
|
18
|
+
2. 读 `INDEX.md`;存在 `INDEX.project.md` 时一并读。只采用已有 usecase / domain-notes / explore / design,或用户本次给出的事实。
|
|
19
|
+
3. 套件 README 已有 `id_prefix` 就沿用,不要另起缩写。新建套件时用套件名的英文词,每词首字母大写、`-` 连接(`用户登录` → `User-Login`)。确认这个前缀没有被别的套件占用。
|
|
20
|
+
4. 新用例 ID 为 `<id_prefix>-<slug>`,文件名就是 `<用例ID>.md`。`slug` 是测试点的英文短名:小写 kebab-case,2–5 个词,只含 `[a-z0-9]` 与 `-`。从测试点提炼条件,不翻译整段步骤,不加序号,不把正向/反向写进 slug。
|
|
21
|
+
5. 查重:`rg -N "^id: User-Login-valid-credentials$" assets/testcases`。完整 ID 全库唯一。已出现过的 slug 不复用(含已从树里删除、仍被报告或 evidence 引用的 ID)。
|
|
22
|
+
|
|
23
|
+
## Where a case goes
|
|
24
|
+
|
|
25
|
+
- 已有同名 `<模块>/<套件>/`:只新增或修改其中的 `<用例ID>.md`,并改套件 README 的用例表。不把多条用例写回一个文件。
|
|
26
|
+
- 模块已存在、套件没有:新建 `assets/testcases/<模块>/<套件>/README.md` 和用例文件,并在该模块 README 的套件清单加一行。
|
|
27
|
+
- 模块也没有:新建模块目录和模块 README,再在总索引的模块表加一行,然后写套件。
|
|
28
|
+
|
|
29
|
+
套件级说明(数据流、共同前置、本套件特有的边界)不属于任何一条用例时,只写在套件 `README.md` 的 `## 详情`。没有这种说明就不写 `## 详情`。
|
|
30
|
+
|
|
31
|
+
## Templates
|
|
32
|
+
|
|
33
|
+
用例文件。空的可选节不要写出。步骤从 1 编号;原来只有一段操作和一段预期时保持一步。
|
|
34
|
+
|
|
35
|
+
```markdown
|
|
36
|
+
---
|
|
37
|
+
kind: testcase
|
|
38
|
+
id: User-Login-valid-credentials
|
|
39
|
+
title: 正确账号密码
|
|
40
|
+
suite: 用户登录
|
|
41
|
+
module: 用户系统
|
|
42
|
+
id_prefix: User-Login
|
|
43
|
+
type: 正向
|
|
44
|
+
status: 就绪
|
|
45
|
+
execution: 手工
|
|
46
|
+
source: <依据路径或需求名>
|
|
47
|
+
version: 1.0.0
|
|
48
|
+
confidence: medium
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
# User-Login-valid-credentials 正确账号密码
|
|
52
|
+
|
|
53
|
+
## 前置条件
|
|
54
|
+
|
|
55
|
+
账号已注册。
|
|
56
|
+
|
|
57
|
+
## 步骤
|
|
58
|
+
|
|
59
|
+
### 1
|
|
60
|
+
|
|
61
|
+
- 操作:输入已注册账号与正确密码,点击登录
|
|
62
|
+
- 预期:进入首页或个人中心
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
反向用例是另一个文件,例如 `User-Login-wrong-password.md`,`type: 反向`。可选节:`## 摘要`、`## 测试数据`、`## 备注`。不知道重要性就不写 `importance`。
|
|
66
|
+
|
|
67
|
+
套件 README:
|
|
68
|
+
|
|
69
|
+
```markdown
|
|
70
|
+
---
|
|
71
|
+
kind: testcase-suite
|
|
72
|
+
id: user-login
|
|
73
|
+
id_prefix: User-Login
|
|
74
|
+
title: 用户登录
|
|
75
|
+
module: 用户系统
|
|
76
|
+
source: <依据路径或需求名>
|
|
77
|
+
version: 1.0.0
|
|
78
|
+
confidence: medium
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
# 用户登录
|
|
82
|
+
|
|
83
|
+
## 详情
|
|
84
|
+
|
|
85
|
+
不属于任何一条用例的说明。没有就不写这一节。
|
|
86
|
+
|
|
87
|
+
## 用例
|
|
88
|
+
|
|
89
|
+
| ID | 名称 | 类型 | 状态 |
|
|
90
|
+
| --- | --- | --- | --- |
|
|
91
|
+
| [User-Login-valid-credentials](User-Login-valid-credentials.md) | 正确账号密码 | 正向 | 就绪 |
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
总索引 `assets/testcases/README.md`:
|
|
95
|
+
|
|
96
|
+
```markdown
|
|
97
|
+
---
|
|
98
|
+
kind: testcase-index
|
|
99
|
+
title: 测试用例模块索引
|
|
100
|
+
version: 1.0.0
|
|
101
|
+
confidence: high
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
# 测试用例模块索引
|
|
105
|
+
|
|
106
|
+
规范:`docs/spec/testcase-syntax.md`。一个套件一个目录,一条用例一个文件。ID 全库唯一。删除一条用例不改其余 ID,不复用 slug。
|
|
107
|
+
|
|
108
|
+
## 放置规则
|
|
109
|
+
|
|
110
|
+
- 新用例归入已有模块的套件目录;对不上时才新增模块目录。
|
|
111
|
+
- 套件目录名 = 套件标题。用例文件名 = 用例 ID。
|
|
112
|
+
- 不写密码、token、Cookie。账号只写 `account_id`。
|
|
113
|
+
|
|
114
|
+
## 模块
|
|
115
|
+
|
|
116
|
+
| 模块 | 目录 | 范围 | 状态 |
|
|
117
|
+
| --- | --- | --- | --- |
|
|
118
|
+
| <模块> | `assets/testcases/<模块>/` | <一句话> | 在用 |
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
模块 README:
|
|
122
|
+
|
|
123
|
+
```markdown
|
|
124
|
+
---
|
|
125
|
+
kind: testcase-module
|
|
126
|
+
id: <ascii-slug>
|
|
127
|
+
title: <模块>
|
|
128
|
+
module: <模块>
|
|
129
|
+
version: 1.0.0
|
|
130
|
+
confidence: high
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
# <模块>
|
|
134
|
+
|
|
135
|
+
## 范围
|
|
136
|
+
|
|
137
|
+
## 不测
|
|
138
|
+
|
|
139
|
+
## 套件
|
|
140
|
+
|
|
141
|
+
| 套件 | 目录 |
|
|
142
|
+
| --- | --- |
|
|
143
|
+
| <套件> | [<套件>](<套件>/README.md) |
|
|
144
|
+
|
|
145
|
+
## 相关知识
|
|
146
|
+
|
|
147
|
+
无
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
字段和 TestLink 的对应关系见 `docs/spec/testcase-syntax.md`。
|
|
151
|
+
|
|
152
|
+
## Update rules
|
|
153
|
+
|
|
154
|
+
- 改操作或预期:保留原 ID,只 bump 该用例文件的 `version`。套件详情或用例表变了,再 bump 套件 README。
|
|
155
|
+
- 测试点含义变了才换 slug,新建文件。旧 ID 不复用。在 `## 备注` 写 `曾用:<旧 ID>`。
|
|
156
|
+
- 删除:删掉该 `<用例ID>.md`,并从套件用例表去掉这一行。不改其他用例的 ID。
|
|
157
|
+
- 废弃:`status` 改为 `废弃`,在备注写原因。不删除文件,不把 ID 让给新用例,标题不加 `(废弃)`。
|
|
158
|
+
- 拆套件或改套件名:用例带着原 ID 搬家,并改两边 README 的链接。每条用例的 `suite` 改成新目录名。
|
|
159
|
+
|
|
160
|
+
## Finish
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
python -m tuner_testkit.testcases assets/testcases
|
|
164
|
+
uv run tuner-workspace meta stamp <改过的.md> --kind <testcase|testcase-suite|testcase-module|testcase-index>
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
校验失败就改文件再跑,通过后再停。有 `INDEX.project.md` 时在其知识表登记新套件 README 的路径(只读 front-matter);平台仓没有业务用例时不要往根 `INDEX.md` 填模块明细。
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!-- version: 1.7.
|
|
1
|
+
<!-- version: 1.7.1 -->
|
|
2
2
|
# AGENTS — 平台总入口(轻量 DM)
|
|
3
3
|
|
|
4
4
|
> 本文件是"repo as a platform"的**稳定世界观**:只写不常变的分层结构与角色。
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
| 测试层 | `tests/` | 自动化测试代码(behave `features/` + `pytest/`)。 | behave / pytest |
|
|
22
22
|
| 文档层 | `docs/` | 仓库使用说明与规范(`docs/spec/**`)。 | 只读 |
|
|
23
23
|
|
|
24
|
-
配套:`config/`(环境/数据源)、`.cursor/`(AI 组件,见下)、`work/tasks/`(入库的任务上下文,规范 `docs/spec/work-task.md`)、`artifacts/`·`logs/`(运行产出,规范 `docs/spec/artifacts-layout.md`:MCP evidence 落 `artifacts/evidence/<run_id>/`;agent 任务记录落 `artifacts/inbox
|
|
24
|
+
配套:`config/`(环境/数据源)、`.cursor/`(AI 组件,见下)、`work/tasks/`(入库的任务上下文,规范 `docs/spec/work-task.md`)、`artifacts/`·`logs/`(运行产出,规范 `docs/spec/artifacts-layout.md`:MCP evidence 落 `artifacts/evidence/<run_id>/`;agent 任务记录落 `artifacts/inbox/`;阻塞式人类提问未回答时落 `artifacts/inbox/questions/`,回答后移到 `artifacts/inbox/archived-question/`;工具运行落 `artifacts/runs/<run_id>/`;回归报告落 `artifacts/reports/<run_id>/`,每个 run 目录带 `manifest.json`)。SUT 登录本机文件:`data/sut-accounts.local.yaml`(gitignore)。
|
|
25
25
|
|
|
26
26
|
## 2. 三角色
|
|
27
27
|
|
|
@@ -62,7 +62,7 @@ flowchart TD
|
|
|
62
62
|
- **仓库初始化/发布** → `tuner-init scaffold`(骨架 + 依赖 `tuner-testkit` + 一次 `tuner-dna sync`)+ `release-template` skill。下游升 kit:`uv add tuner-testkit==x.y.z` 然后 `tuner-dna sync`,再提交。
|
|
63
63
|
- **读/索引知识** → 先查 `INDEX.md`;若存在 `INDEX.project.md` 则一并查。索引维护用 `maintain-index` skill。
|
|
64
64
|
- **发布任务** → `tuner-task create` 写入 `work/tasks/`。测试设计走 `derive-test-design`;端到端点击报告走 `run-test-execution`。缺人才能决定的通道(如后端日志)用 `tuner-task ask`,不要猜。
|
|
65
|
-
- **功能测试用例** → skill `maintain-testcases`,落在 `assets/testcases
|
|
65
|
+
- **功能测试用例** → skill `maintain-testcases`,落在 `assets/testcases/<模块>/<套件>/<用例ID>.md`(规格 `docs/spec/testcase-syntax.md`)。这不是测试设计,也不直接产出 `.feature`。
|
|
66
66
|
|
|
67
67
|
## 5. 全程硬约束(跨分支)
|
|
68
68
|
|
|
@@ -72,7 +72,7 @@ evidence:
|
|
|
72
72
|
artifacts/inbox/questions/Q-<YYYYMMDD>-<nnn>.md
|
|
73
73
|
```
|
|
74
74
|
|
|
75
|
-
|
|
75
|
+
回答后同一文件移到 `artifacts/inbox/archived-question/`。字段与命令见 `docs/spec/work-task.md`。提问后把对应 `work/tasks` 标为 `blocked`。回答写入任务的 `## Decisions`;可复用的通道说明策展到 `assets/domain-notes/`。
|
|
76
76
|
|
|
77
77
|
## 5. 密钥
|
|
78
78
|
|
|
@@ -16,7 +16,8 @@ description: 交付物目录 artifacts/ 的子目录职责、run 级 manifest.js
|
|
|
16
16
|
artifacts/
|
|
17
17
|
├── evidence/<run_id>/ # Playwright MCP / 网络 dump(tuner-evidence persist);脱敏;gitignore
|
|
18
18
|
├── inbox/<utc>-<agent>-<slice>.md # agent 任务记录(agent-task-log.md);gitignore
|
|
19
|
-
├── inbox/questions/Q-<YYYYMMDD>-<nnn>.md #
|
|
19
|
+
├── inbox/questions/Q-<YYYYMMDD>-<nnn>.md # 未回答的人类提问(work-task.md);gitignore
|
|
20
|
+
├── inbox/archived-question/Q-<YYYYMMDD>-<nnn>.md # 已回答的提问;gitignore
|
|
20
21
|
├── runs/<run_id>/ # 工具 / 动作词的一次运行(tuner-workspace run、工作台);gitignore
|
|
21
22
|
├── reports/<run_id>/ # 一次回归(behave / pytest)的报告与摘要;gitignore
|
|
22
23
|
├── catalogs/workspace.json # tuner-workspace catalog 产物;gitignore
|
|
@@ -68,7 +69,7 @@ artifacts/
|
|
|
68
69
|
| behave(`*_environment.py` 钩子) | `reports/<run_id>/` | `summary.json`(feature/scenario 状态)、`manifest.json`;`-f html-pretty -o $TUNER_REPORT_DIR/report.html` 时 html 同目录 |
|
|
69
70
|
| pytest | `reports/<run_id>/` | `pytest --junitxml artifacts/reports/<run_id>/junit.xml`,再 `tuner_testkit.artifacts.finish_run` 写 manifest |
|
|
70
71
|
| `tuner-evidence persist` / `attach` | `evidence/<run_id>/` | `network.jsonl` / `actions.jsonl` / `run_summary.md` / `screenshots/` / `logs/` / `api/`;`manifest.params.task_id` 指向 `work/tasks` |
|
|
71
|
-
| agent(编排) | `inbox/` | 会话流水见 `agent-task-log.md
|
|
72
|
+
| agent(编排) | `inbox/` | 会话流水见 `agent-task-log.md`;未回答提问见 `inbox/questions/`,已回答见 `inbox/archived-question/` |
|
|
72
73
|
| `tuner-workspace catalog` | `catalogs/workspace.json` | 见 `tuner_testkit/workspace/README.md` |
|
|
73
74
|
|
|
74
75
|
环境变量 `TUNER_REPORT_DIR` 指定本次回归的 run 目录(不设则钩子自动生成 `reports/<run_id>/`);
|
|
@@ -17,9 +17,10 @@ assets/
|
|
|
17
17
|
├── explore/<app>/<name>.md # 探索式测试产出的能力清单 / 站点地图(半自动)
|
|
18
18
|
├── design/<app>/<route-slug>.md # API↔DB effects 收敛知识(见 design-knowledge-syntax)
|
|
19
19
|
├── testdesign/<sut>/<slug>.md # 测试设计(见 test-design-syntax);执行反馈回写在此
|
|
20
|
-
├── testcases/README.md
|
|
21
|
-
├── testcases/<模块>/README.md
|
|
22
|
-
├── testcases
|
|
20
|
+
├── testcases/README.md # 功能用例集总索引(见 testcase-syntax)
|
|
21
|
+
├── testcases/<模块>/README.md # 模块范围与套件清单
|
|
22
|
+
├── testcases/<模块>/<套件>/README.md # 套件说明与用例索引
|
|
23
|
+
├── testcases/<模块>/<套件>/<用例ID>.md # 一条用例一个文件
|
|
23
24
|
├── testreport/<name>.md # 测试报告类原始资产
|
|
24
25
|
└── CHANGELOG.md # 自动区变更流水(供 maintain-index 读取 delta)
|
|
25
26
|
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: metadata-conventions
|
|
3
|
-
version: 1.
|
|
3
|
+
version: 1.1.0
|
|
4
4
|
description: 统一 front-matter / run manifest 字段家族,供 catalog、工作台与未来企业平台解析「谁在何时创建了什么」。
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -13,7 +13,7 @@ description: 统一 front-matter / run manifest 字段家族,供 catalog、工
|
|
|
13
13
|
|
|
14
14
|
| 字段 | 类型 | 含义 |
|
|
15
15
|
| --- | --- | --- |
|
|
16
|
-
| `kind` | string | `app` / `action_word` / `testreport` / `inbox` / `question` / `task` / `testdesign` / `testcase` / `testcase-module` / `testcase-index` / `explore` / `design` / `usecase` / `domain-note` |
|
|
16
|
+
| `kind` | string | `app` / `action_word` / `testreport` / `inbox` / `question` / `task` / `testdesign` / `testcase` / `testcase-suite` / `testcase-module` / `testcase-index` / `explore` / `design` / `usecase` / `domain-note` |
|
|
17
17
|
| `id` | string | 稳定标识(`tool_id` / `word_id` / 报告 slug) |
|
|
18
18
|
| `title` | string | 短标题 |
|
|
19
19
|
| `author` | email | 创建者,来自 `git config user.email` |
|
|
@@ -54,9 +54,9 @@ catalog 同时用 `git log --diff-filter=A --format=%ae -- <path>` 算首次提
|
|
|
54
54
|
### 任务与测试设计
|
|
55
55
|
|
|
56
56
|
- `kind: task` 落在 `work/tasks/TASK-*.md`,字段见 `docs/spec/work-task.md`。
|
|
57
|
-
- `kind: question`
|
|
57
|
+
- `kind: question` 未回答落在 `artifacts/inbox/questions/Q-*.md`,回答后移到 `artifacts/inbox/archived-question/`(不入库)。
|
|
58
58
|
- `kind: testdesign` 落在 `assets/testdesign/<sut>/<slug>.md`,字段见 `docs/spec/test-design-syntax.md`。
|
|
59
|
-
- `kind: testcase` 落在 `assets/testcases
|
|
59
|
+
- `kind: testcase` 落在 `assets/testcases/<模块>/<套件>/<用例ID>.md`;套件说明是 `testcase-suite`,模块说明是 `testcase-module`,总索引是 `testcase-index`。字段见 `docs/spec/testcase-syntax.md`。
|
|
60
60
|
|
|
61
61
|
### run manifest
|
|
62
62
|
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: testcase-syntax
|
|
3
|
+
version: 1.3.0
|
|
4
|
+
description: assets/testcases 的模块、套件目录、单用例文件,以及和 TestLink 对齐的步骤字段。功能用例集的唯一事实源。
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 测试用例(testcase-syntax)
|
|
8
|
+
|
|
9
|
+
> 一条用例一个 Markdown 文件。一个套件一个目录,不属于任何一条用例的说明写在该目录的 `README.md`。
|
|
10
|
+
> 字段对齐 TestLink 的 Test Suite / Test Case:套件详情、摘要、前置条件、分步操作与预期、执行方式、状态。
|
|
11
|
+
> 维护流程见 skill `maintain-testcases`。编辑约束见 `.cursor/rules/testcases.mdc`。
|
|
12
|
+
|
|
13
|
+
## 1. 和相邻知识的分工
|
|
14
|
+
|
|
15
|
+
| 路径 | 记什么 |
|
|
16
|
+
| --- | --- |
|
|
17
|
+
| `assets/usecases/` | 导入或讲解过的业务场景,不是带稳定 ID 的用例集 |
|
|
18
|
+
| `assets/testdesign/` | 一次任务的范围、策略和点击路径 |
|
|
19
|
+
| `assets/testcases/` | 按模块 / 套件维护的用例集。每条用例一个文件、一个稳定 ID |
|
|
20
|
+
| `tests/features/` | 已自动化的 Gherkin。本规范不写 `.feature` |
|
|
21
|
+
|
|
22
|
+
## 2. 目录
|
|
23
|
+
|
|
24
|
+
```text
|
|
25
|
+
assets/testcases/README.md # 模块总索引
|
|
26
|
+
assets/testcases/<模块>/README.md # 模块范围、边界、套件清单
|
|
27
|
+
assets/testcases/<模块>/<套件>/README.md # 套件说明和用例索引
|
|
28
|
+
assets/testcases/<模块>/<套件>/<用例ID>.md # 一条用例
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
例子:`assets/testcases/用户系统/用户登录/User-Login-valid-credentials.md`。
|
|
32
|
+
|
|
33
|
+
- 模块目录名 = 模块显示名。
|
|
34
|
+
- 套件目录名 = 套件显示名 = 套件 README 的 `title` 与一级标题。
|
|
35
|
+
- 用例文件名(不含 `.md`)= 该文件 front-matter 的 `id`。
|
|
36
|
+
- 只允许这两层:模块下面是套件目录,套件目录里只有 `README.md` 和用例文件。
|
|
37
|
+
- 名称不要用 `\ / : * ? " < > |`。
|
|
38
|
+
|
|
39
|
+
## 3. 套件 README
|
|
40
|
+
|
|
41
|
+
`kind: testcase-suite`。`id_prefix` 写在这里,之后不得改。同一 `id_prefix` 只能属于一个套件。
|
|
42
|
+
|
|
43
|
+
```markdown
|
|
44
|
+
# 用户登录
|
|
45
|
+
|
|
46
|
+
## 详情
|
|
47
|
+
|
|
48
|
+
不属于任何一条用例的说明。没有这种说明就不写这一节。
|
|
49
|
+
|
|
50
|
+
## 用例
|
|
51
|
+
|
|
52
|
+
| ID | 名称 | 类型 | 状态 |
|
|
53
|
+
| --- | --- | --- | --- |
|
|
54
|
+
| [User-Login-valid-credentials](User-Login-valid-credentials.md) | 正确账号密码 | 正向 | 就绪 |
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
一级标题等于套件目录名。用例表的每一行指向同目录下的一个用例文件,不多不少。
|
|
58
|
+
|
|
59
|
+
## 4. 用例文件
|
|
60
|
+
|
|
61
|
+
`kind: testcase`。一个文件只有一条用例。
|
|
62
|
+
|
|
63
|
+
```markdown
|
|
64
|
+
---
|
|
65
|
+
kind: testcase
|
|
66
|
+
id: User-Login-valid-credentials
|
|
67
|
+
title: 正确账号密码
|
|
68
|
+
suite: 用户登录
|
|
69
|
+
module: 用户系统
|
|
70
|
+
id_prefix: User-Login
|
|
71
|
+
type: 正向
|
|
72
|
+
status: 就绪
|
|
73
|
+
execution: 手工
|
|
74
|
+
source: <assets/… 或需求名>
|
|
75
|
+
version: 1.0.0
|
|
76
|
+
confidence: medium
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
# User-Login-valid-credentials 正确账号密码
|
|
80
|
+
|
|
81
|
+
## 摘要
|
|
82
|
+
|
|
83
|
+
登录成功后进入已登录页面。
|
|
84
|
+
|
|
85
|
+
## 前置条件
|
|
86
|
+
|
|
87
|
+
账号已注册。
|
|
88
|
+
|
|
89
|
+
## 测试数据
|
|
90
|
+
|
|
91
|
+
账号 `account_id`。口令不写进本文件。
|
|
92
|
+
|
|
93
|
+
## 步骤
|
|
94
|
+
|
|
95
|
+
### 1
|
|
96
|
+
|
|
97
|
+
- 操作:输入已注册账号与正确密码,点击登录
|
|
98
|
+
- 预期:进入首页或个人中心
|
|
99
|
+
|
|
100
|
+
## 备注
|
|
101
|
+
|
|
102
|
+
可选。
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
空的可选节不要写出来。节的顺序固定为:摘要、前置条件、测试数据、步骤、备注。
|
|
106
|
+
|
|
107
|
+
| 节 | 是否必填 | 写什么 |
|
|
108
|
+
| --- | --- | --- |
|
|
109
|
+
| 摘要 | 否 | 标题里放不下的目的。不要把 `title` 再抄一遍 |
|
|
110
|
+
| 前置条件 | 否 | 开测前必须已经成立的状态 |
|
|
111
|
+
| 测试数据 | 否 | `account_id` 或数据文件路径。不写密码、token、Cookie |
|
|
112
|
+
| 步骤 | 是 | 从 `### 1` 连续编号。每步先 `- 操作:`,再 `- 预期:` |
|
|
113
|
+
| 备注 | 否 | 已知限制、曾用 ID、废弃原因 |
|
|
114
|
+
|
|
115
|
+
原来只有一段操作和一段预期的用例,保持为一步。不要拆成文件里没有写出的多步。
|
|
116
|
+
|
|
117
|
+
`type` 只取 `正向` 或 `反向`。`status` 只取 `就绪` 或 `废弃`。`execution` 只取 `手工` 或 `自动`,没写自动化的用例用 `手工`。`importance` 可选,只取 `低`、`中`、`高`;不知道就不写。
|
|
118
|
+
|
|
119
|
+
一级标题必须是 `<id> <title>`。`title` 末尾不要加 `(废弃)`。
|
|
120
|
+
|
|
121
|
+
## 5. 用例 ID
|
|
122
|
+
|
|
123
|
+
ID 是全库唯一键:`<id_prefix>-<slug>`。
|
|
124
|
+
|
|
125
|
+
- `id_prefix`:套件名的英文词,每词首字母大写,用 `-` 连接。`用户登录` → `User-Login`。只含字母和连字符,不含数字。
|
|
126
|
+
- `slug`:这条用例在验证的条件。英文小写 kebab-case,2–5 个词,每词只含 `[a-z0-9]`。从测试点提炼,不翻译整段步骤,不加序号。正向/反向留在 `type`,不写进 slug。
|
|
127
|
+
- 例:`User-Login-valid-credentials`、`User-Login-wrong-password`。不同套件的前缀不同,所以 slug 可以相同。
|
|
128
|
+
- 新增前查完整 ID:`rg -N "^id: User-Login-valid-credentials$" assets/testcases`。
|
|
129
|
+
- 已发出的 ID 不改、不复用。删除一条用例时删掉该文件,并从其套件 README 的用例表去掉这一行。不改其他 ID。
|
|
130
|
+
- 不再新发 `<id_prefix>` 紧接 4 位序号的 ID(如 `User-Login0001`)。
|
|
131
|
+
- 测试点含义变了才换 slug,新文件的备注写 `曾用:<旧 ID>`。旧文件删除或标废弃,旧 ID 不复用。
|
|
132
|
+
- 废弃:`status` 改为 `废弃`,原因写进备注。保留文件,不把 ID 让给新用例。
|
|
133
|
+
|
|
134
|
+
`assets/testreport/` 与 `artifacts/evidence/` 里的旧序号是当时的报告键和文件名,不回写。
|
|
135
|
+
|
|
136
|
+
没有依据的业务规则不要写进操作或预期。依据来自用户说明,或 `INDEX.md` / `INDEX.project.md` 能指向的 usecase、domain-notes、explore、design。
|
|
137
|
+
|
|
138
|
+
## 6. 和 TestLink 的对应
|
|
139
|
+
|
|
140
|
+
| TestLink | 本规范 |
|
|
141
|
+
| --- | --- |
|
|
142
|
+
| Test Suite | `<套件>/` 目录 |
|
|
143
|
+
| Suite details | 套件 README 的 `## 详情` |
|
|
144
|
+
| Test Case | `<用例ID>.md` |
|
|
145
|
+
| Name | `title` |
|
|
146
|
+
| Summary | `## 摘要` |
|
|
147
|
+
| Preconditions | `## 前置条件` |
|
|
148
|
+
| Step actions | `- 操作:` |
|
|
149
|
+
| Expected Results | `- 预期:` |
|
|
150
|
+
| Execution Type(Manual / Automated) | `execution`:`手工` / `自动` |
|
|
151
|
+
| Importance(Low / Medium / High) | `importance`:`低` / `中` / `高`。不知道省略 |
|
|
152
|
+
| Status = Obsolete | `status: 废弃`。在用为 `就绪` |
|
|
153
|
+
| 自定义说明 | `## 备注`;账号和夹具写在 `## 测试数据` |
|
|
154
|
+
|
|
155
|
+
不另造 TestLink 外部编号。`id` 就是稳定键。
|
|
156
|
+
|
|
157
|
+
## 7. Front-matter
|
|
158
|
+
|
|
159
|
+
套件 README:
|
|
160
|
+
|
|
161
|
+
```yaml
|
|
162
|
+
---
|
|
163
|
+
kind: testcase-suite
|
|
164
|
+
id: user-login
|
|
165
|
+
id_prefix: User-Login
|
|
166
|
+
title: 用户登录
|
|
167
|
+
module: 用户系统
|
|
168
|
+
sut: <sut 短名,未知可省略>
|
|
169
|
+
source: <assets/… 或需求名>
|
|
170
|
+
version: 1.0.0
|
|
171
|
+
confidence: medium
|
|
172
|
+
---
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
用例文件见第 4 节。`suite` 等于套件目录名,`module` 等于模块目录名,`id_prefix` 等于所属套件的 `id_prefix`。
|
|
176
|
+
|
|
177
|
+
模块 README 用 `kind: testcase-module`。总索引用 `kind: testcase-index`。
|
|
178
|
+
|
|
179
|
+
人工修改后 bump 被改文件的 `version`。改一条用例的操作或预期时,只 bump 该用例文件。增删用例,或修改套件详情时,bump 套件 README。署名用 `tuner-workspace meta stamp <path> --kind testcase`(套件 README 用 `testcase-suite`,模块 README 用 `testcase-module`,总索引用 `testcase-index`)。
|
|
180
|
+
|
|
181
|
+
## 8. 三份 README
|
|
182
|
+
|
|
183
|
+
`assets/testcases/README.md` 告诉人和 LLM:模块怎么划分、新套件该进哪个目录、当前有哪些模块。至少包含:
|
|
184
|
+
|
|
185
|
+
- 放置规则(指向本 spec)
|
|
186
|
+
- 模块表:模块名、目录、一句话范围、状态(`在用` / `规划中`)
|
|
187
|
+
|
|
188
|
+
`assets/testcases/<模块>/README.md` 至少包含:
|
|
189
|
+
|
|
190
|
+
- 这个模块测什么、不测什么
|
|
191
|
+
- 套件清单:每个套件一行,链接到 `<套件>/README.md`
|
|
192
|
+
- 相关知识路径(没有就写「无」)
|
|
193
|
+
|
|
194
|
+
套件 README 的用例表与该目录下的用例文件一致。新增或重命名套件时,模块 README 和总索引一起改。
|
|
@@ -14,7 +14,8 @@ description: 入库任务 work/tasks、阻塞式人类提问,以及和测试
|
|
|
14
14
|
|
|
15
15
|
```text
|
|
16
16
|
work/tasks/TASK-<YYYYMMDD>-<nnn>.md # 入库
|
|
17
|
-
artifacts/inbox/questions/Q-<YYYYMMDD>-<nnn>.md
|
|
17
|
+
artifacts/inbox/questions/Q-<YYYYMMDD>-<nnn>.md # 未回答;gitignore
|
|
18
|
+
artifacts/inbox/archived-question/Q-<YYYYMMDD>-<nnn>.md # 已回答;gitignore
|
|
18
19
|
```
|
|
19
20
|
|
|
20
21
|
`work/**` 的提交 scope 是 `work`。问题文件不入库;人答完后的结论写回任务的 `## Decisions`,需要留下的通道说明再策展到 `assets/domain-notes/`。
|
|
@@ -73,6 +74,7 @@ tuner-task answer Q-20260924-001 --option rancher-api \
|
|
|
73
74
|
```
|
|
74
75
|
|
|
75
76
|
- 提问立刻落盘,并把任务标为 `blocked`。只挡住依赖该答案的回写;不依赖日志的点击可以先做完,但在回答前不要编写取日志实现,也不要选定通道。
|
|
77
|
+
- `tuner-task answer` 把问题文件从 `questions/` 移到 `archived-question/`,未回答的问题仍只留在 `questions/`。同一天的新问题编号会计入归档,避免复用已回答的 ID。
|
|
76
78
|
- `--note` 只留可入库的指向。CLI 拒绝 `password=` / `token:` / `Bearer …` 这类赋值。
|
|
77
79
|
- `skip` 表示报告里日志证据写「无」,设计上的日志断言保持未验证。
|
|
78
80
|
- `tuner-task finish` 在仍有 `status: open` 且 `blocking: true` 的问题时失败。
|