tuner-testkit 5.1.0__tar.gz → 5.2.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.1.0/tuner_testkit.egg-info → tuner_testkit-5.2.0}/PKG-INFO +2 -2
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/README.md +1 -1
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/pyproject.toml +2 -1
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/__init__.py +1 -1
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/commit-convention.mdc +3 -3
- tuner_testkit-5.2.0/tuner_testkit/apps/dna/dna_payload/.cursor/rules/work-task.mdc +24 -0
- tuner_testkit-5.2.0/tuner_testkit/apps/dna/dna_payload/.cursor/skills/derive-test-design/SKILL.md +73 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/generate-test-report/SKILL.md +3 -1
- tuner_testkit-5.2.0/tuner_testkit/apps/dna/dna_payload/.cursor/skills/run-test-execution/SKILL.md +42 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/AGENTS.md +5 -3
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/MANIFEST.txt +1 -1
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/agent-task-log.md +11 -1
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/artifacts-layout.md +4 -2
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/assets-knowledge-syntax.md +2 -1
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/commit-convention.md +1 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/metadata-conventions.md +8 -1
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/sut-self-learning.md +1 -1
- tuner_testkit-5.2.0/tuner_testkit/apps/dna/dna_payload/docs/spec/test-design-syntax.md +66 -0
- tuner_testkit-5.2.0/tuner_testkit/apps/dna/dna_payload/docs/spec/work-task.md +93 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/tools/git-hooks/validate_commit_msg.py +3 -1
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/evidence/cli.py +31 -1
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/evidence/persist.py +143 -2
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/evidence/tests/test_persist.py +32 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/tests/test_git_hooks.py +3 -0
- tuner_testkit-5.2.0/tuner_testkit/apps/task/__init__.py +5 -0
- tuner_testkit-5.2.0/tuner_testkit/apps/task/__main__.py +3 -0
- tuner_testkit-5.2.0/tuner_testkit/apps/task/cli.py +192 -0
- tuner_testkit-5.2.0/tuner_testkit/apps/task/store.py +460 -0
- tuner_testkit-5.2.0/tuner_testkit/apps/task/tests/test_store.py +108 -0
- tuner_testkit-5.2.0/tuner_testkit/apps/task/validate.py +47 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0/tuner_testkit.egg-info}/PKG-INFO +2 -2
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit.egg-info/SOURCES.txt +8 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit.egg-info/entry_points.txt +1 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/LICENSE +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/setup.cfg +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/action_words/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/action_words/__main__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/action_words/_internal/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/action_words/_internal/api.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/action_words/_internal/db.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/action_words/_internal/generators.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/action_words/_internal/ids.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/action_words/_internal/wait.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/action_words/base.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/action_words/context.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/action_words/registry.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/api_mock/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/api_mock/app.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/api_mock/errors.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/api_mock/router.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/api_mock/spec.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/api_mock/store.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/api_objects/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/api_objects/auth.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/api_objects/recording/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/api_objects/recording/capture.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/api_objects/recording/codegen.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/api_objects/recording/freeze.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/api_objects/recording/mocks.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/api_objects/recording/normalize.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/api_objects/recording/pipeline.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/api_objects/recording/sanitize.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/api_test/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/api_test/client.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/api_test/errors.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/api_test/jsonpath.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/api_test/model.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/_shared/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/_shared/changelog.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/api_recorder/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/api_recorder/__main__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/api_recorder/addon.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/api_recorder/cli.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/api_recorder/playwright_tap.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/api_recorder/tests/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/api_recorder/tests/test_addon.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/__main__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/build.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/cli.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/agents/bdd-asset-pipeline.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/agents/sut-self-learning.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/agents/sut-source-to-design.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/hooks/sync_registry.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/hooks.json +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/agent-task-log.mdc +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/apps-authoring.mdc +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/apps-handover.mdc +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/assets-knowledge.mdc +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/bdd-asset-layering.mdc +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/bdd-pipeline-gates.mdc +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/bdd-stage-layout.mdc +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/explore-safety.mdc +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/index-hygiene.mdc +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/packages-db.mdc +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/packages-fake.mdc +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/packages-logging.mdc +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/packages-page-test.mdc +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/analyze-mcp-network/SKILL.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/create-action-word/SKILL.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/create-app/SKILL.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/derive-design-knowledge/SKILL.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/derive-feature-sets/SKILL.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/dump-ddl/SKILL.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/explore-sut/SKILL.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/feature-authoring/SKILL.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/feature-review-lint/SKILL.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/freeze-api-objects/SKILL.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/maintain-behave-steps/SKILL.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/maintain-index/SKILL.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/maintain-page-objects/SKILL.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/release-template/SKILL.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/reuse-analysis/SKILL.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/run-feature-playwright-mcp/SKILL.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/action-words-syntax.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/api-objects-syntax.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/apps-authoring-syntax.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/bdd-run-gherkin-in-playwrightMCP.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/behave-gerkin-syntax.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/behave-step-definitions.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/design-knowledge-syntax.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/page-objects-syntax.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/tools/git-hooks/README.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/tools/git-hooks/commit-msg +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/tools/git-hooks/pre-commit +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/tools/git-hooks/pre-push +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/dna_payload/tools/git-hooks/secret_scan.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/paths.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/source.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/targets.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/tests/test_cli.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dna/tests/test_targets.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/dump_ddl.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/evidence/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/evidence/__main__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/evidence/tests/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/evidence/tests/test_cli.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/index_ai/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/index_ai/__main__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/index_ai/registry.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/__main__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/manifest.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/scaffold.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/stubs/INDEX.project.md +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/stubs/apps/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/stubs/behave.ini +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/stubs/config/env.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/stubs/data/sut-accounts.example.yaml +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/stubs/gitignore +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/stubs/packages/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/stubs/packages/action_words/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/stubs/packages/action_words/_internal/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/stubs/packages/action_words/_internal/params.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/stubs/packages/action_words/models.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/stubs/packages/api_objects/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/stubs/packages/api_objects/auth.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/stubs/packages/api_objects/recording/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/stubs/packages/api_objects/registry.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/stubs/packages/page_objects/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/stubs/packages/page_objects/session.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/stubs/tests/features/api_environment.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/stubs/tests/features/api_steps/given.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/stubs/tests/features/api_steps/then.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/stubs/tests/features/api_steps/when.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/stubs/tests/features/ui_environment.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/stubs/tests/features/ui_steps/given.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/stubs/tests/features/ui_steps/then.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/stubs/tests/features/ui_steps/when.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/stubs/tests/pytest/conftest.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/stubs/workbench.cmd +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/stubs/workbench.sh +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/init_repo/tests/test_scaffold.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/mock_server/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/mock_server/__main__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/mock_server/cli.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/mock_server/seed.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/mock_server/tool.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/page_recorder/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/page_recorder/__main__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/page_recorder/capture.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/page_recorder/cli.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/page_recorder/codegen.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/page_recorder/freeze.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/page_recorder/inject.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/page_recorder/session.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/page_recorder/tests/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/page_recorder/tests/test_capture.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/page_recorder/tests/test_cli.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/page_recorder/tests/test_freeze.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/recorder/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/recorder/__main__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/recorder/cli.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/recorder/tests/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/apps/recorder/tests/test_cli.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/artifacts.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/catalog/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/catalog/build.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/catalog/directory.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/catalog/front_matter.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/catalog/scan.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/catalog/tests/test_build.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/catalog/tests/test_directory.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/catalog/tests/test_front_matter.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/config.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/db/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/db/client.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/db/connection.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/excel/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/excel/workbook.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/fake/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/fake/__main__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/fake/catalog.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/fake/china.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/fake/cli.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/fake/core.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/fake/medical.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/fake/wrappers.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/logging/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/logging/context.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/logging/core.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/logging/helpers.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/logging/hooks.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/logging/scenario_file.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/page_test/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/page_test/__main__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/page_test/base.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/page_test/driver.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/page_test/errors.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/page_test/harvest.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/page_test/health.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/page_test/locator.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/page_test/model.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/page_test/registry.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/page_test/session.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/page_test/steps.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/page_test/testing.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/project.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/tools/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/tools/manifest.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/tools/runner.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/tools/tests/test_manifest.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/tools/tests/test_runner.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workbench/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workbench/__main__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workbench/app.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workbench/cli.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workbench/kinds/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workbench/kinds/app_generic.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workbench/kinds/word_db_seed.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workbench/kinds/word_generic.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workbench/static/app.css +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workbench/templates/_params_form.html +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workbench/templates/ai.html +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workbench/templates/ai_detail.html +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workbench/templates/base.html +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workbench/templates/env.html +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workbench/templates/history.html +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workbench/templates/home.html +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workbench/templates/knowledge.html +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workbench/templates/run.html +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workbench/templates/tool.html +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workbench/templates/tools.html +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workbench/templates/word.html +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workbench/templates/word_db_seed.html +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workbench/templates/words.html +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workbench/tests/test_app.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workspace/__init__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workspace/__main__.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workspace/cli.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workspace/index_render.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workspace/meta.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workspace/tests/test_index_render.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit/workspace/tests/test_meta.py +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit.egg-info/dependency_links.txt +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.0}/tuner_testkit.egg-info/requires.txt +0 -0
- {tuner_testkit-5.1.0 → tuner_testkit-5.2.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: 5.
|
|
3
|
+
Version: 5.2.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.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
|
+
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.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
|
+
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)。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "tuner-testkit"
|
|
3
|
-
version = "5.
|
|
3
|
+
version = "5.2.0"
|
|
4
4
|
description = "Shared test runtime, recorders, and DNA overlay for SUT test repos"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = "MIT"
|
|
@@ -78,6 +78,7 @@ tuner-fake = "tuner_testkit.fake.cli:main"
|
|
|
78
78
|
tuner-page-test = "tuner_testkit.page_test.__main__:main"
|
|
79
79
|
tuner-action-words = "tuner_testkit.action_words.__main__:main"
|
|
80
80
|
tuner-evidence = "tuner_testkit.apps.evidence.cli:main"
|
|
81
|
+
tuner-task = "tuner_testkit.apps.task.cli:main"
|
|
81
82
|
tuner-workbench = "tuner_testkit.workbench.cli:main"
|
|
82
83
|
|
|
83
84
|
[build-system]
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Commits must follow Conventional Commits with a layer-aligned scope; the declared scope must cover the layers actually changed. Single source of truth is docs/spec/commit-convention.md.
|
|
3
3
|
alwaysApply: true
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.2.0
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# 提交规范(Conventional Commits + 六层 scope)
|
|
@@ -12,8 +12,8 @@ version: 1.1.0
|
|
|
12
12
|
- `type` ∈ `feat|fix|refactor|docs|test|perf|chore|build|ci|style|revert`。
|
|
13
13
|
- `scope` 用**对齐六层/资产类别**的值:`assets / apps / packages / api_objects /
|
|
14
14
|
page_objects / action_words / tests / docs / rules / skills / agents / hooks /
|
|
15
|
-
init_repo / index / dogfood`(多层用逗号分隔,如 `feat(apps,packages): ...`;
|
|
16
|
-
`dogfood/**` 一律用 `dogfood`)。
|
|
15
|
+
init_repo / index / dogfood / work`(多层用逗号分隔,如 `feat(apps,packages): ...`;
|
|
16
|
+
`dogfood/**` 一律用 `dogfood`;`work/tasks` 用 `work`)。
|
|
17
17
|
- **scope 必须覆盖本次真实改动涉及的层**(`packages` 是三个子资产层的上位 scope)。
|
|
18
18
|
|
|
19
19
|
一眼可读优先:让人从提交信息就看出"更新了 assets、新增了 apps、录制了新的 api_objects"等。
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
---
|
|
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
|
+
alwaysApply: true
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 工作任务与人类提问
|
|
8
|
+
|
|
9
|
+
细则见 `docs/spec/work-task.md`、`docs/spec/test-design-syntax.md`。
|
|
10
|
+
|
|
11
|
+
## Must
|
|
12
|
+
|
|
13
|
+
- 人发布的任务用 `tuner-task create` 写入 `work/tasks/TASK-*.md`,不要只留在聊天里。
|
|
14
|
+
- 测试设计写入 `assets/testdesign/`,并用 `tuner-task validate` 检查八个章节。
|
|
15
|
+
- 端到端点击用 `type: test-execution`,`design` 指向已有测试设计;报告写入 `assets/testreport/`,证据用 `tuner-evidence persist` 或 `attach` 挂上 `task_id`、截图、脱敏日志、接口 JSON。
|
|
16
|
+
- 执行结束后把结果写入该测试设计的「执行反馈」,只引用证据路径。
|
|
17
|
+
- 仓库没有写明的证据通道(典型是后端日志:SSH 目录、日志接口、Rancher API)立刻 `tuner-task ask`。日志主题用 `sut-log-source`。
|
|
18
|
+
- 提问写入 `artifacts/inbox/questions/` 后停止这一支,把任务保持在 `blocked`,直到 `tuner-task answer`。
|
|
19
|
+
|
|
20
|
+
## Must not
|
|
21
|
+
|
|
22
|
+
- 在人回答前选定日志通道,或编写对应的 SSH / HTTP / Rancher 取数实现。
|
|
23
|
+
- 把密码、token、Cookie 写进任务、问题、`--note` 或 domain-notes。用 `account_id`、环境变量名或 `config/env_local.py` 指向。
|
|
24
|
+
- 用 `artifacts/inbox/` 的会话流水代替 `work/tasks`。会话流水仍然要写,见 `agent-task-log`。
|
tuner_testkit-5.2.0/tuner_testkit/apps/dna/dna_payload/.cursor/skills/derive-test-design/SKILL.md
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: derive-test-design
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: Write assets/testdesign/<sut>/<slug>.md from a work task plus usecases, domain-notes, explore, or design notes. Use when the task type is test-design or the user asks for a test design. Do not invent click paths that are not in evidence or a cited source.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Derive test design
|
|
8
|
+
|
|
9
|
+
## Scope
|
|
10
|
+
|
|
11
|
+
- **Write**: `assets/testdesign/<sut>/<slug>.md`,并让任务的 `outputs` 指向它。
|
|
12
|
+
- **Read**: `work/tasks/<id>.md`、`assets/usecases`、`assets/domain-notes`、`assets/explore`、`assets/design`、`INDEX.md`(及 `INDEX.project.md`)。
|
|
13
|
+
- **Must follow**: `docs/spec/test-design-syntax.md`、`docs/spec/work-task.md`。
|
|
14
|
+
|
|
15
|
+
## Steps
|
|
16
|
+
|
|
17
|
+
1. 若还没有任务:`tuner-task create --type test-design --title … --input <已有知识路径>`。
|
|
18
|
+
2. 只根据 inputs 里点名的知识写范围、不测、风险、策略、点击路径、用例大纲。没有页面流或证据支撑的点击行不要编。
|
|
19
|
+
3. 「执行反馈」写「无」。
|
|
20
|
+
4. front-matter:`kind: testdesign`,`task_id` 指向任务,`source` 或 `evidence` 至少一项。
|
|
21
|
+
5. 校验并署名:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
uv run tuner-task validate assets/testdesign/<sut>/<slug>.md
|
|
25
|
+
uv run tuner-workspace meta stamp assets/testdesign/<sut>/<slug>.md --kind testdesign
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
6. 把该路径挂到任务上:`uv run tuner-task bind <TASK> --output assets/testdesign/<sut>/<slug>.md`。
|
|
29
|
+
|
|
30
|
+
## Template
|
|
31
|
+
|
|
32
|
+
```markdown
|
|
33
|
+
---
|
|
34
|
+
kind: testdesign
|
|
35
|
+
id: <slug>
|
|
36
|
+
title: <一句话>
|
|
37
|
+
sut: <sut>
|
|
38
|
+
task_id: TASK-YYYYMMDD-nnn
|
|
39
|
+
source: <assets/...>
|
|
40
|
+
version: 1.0.0
|
|
41
|
+
confidence: high
|
|
42
|
+
evidence: []
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
# <title>
|
|
46
|
+
|
|
47
|
+
## 范围
|
|
48
|
+
|
|
49
|
+
## 不测
|
|
50
|
+
|
|
51
|
+
## 风险
|
|
52
|
+
|
|
53
|
+
## 策略
|
|
54
|
+
|
|
55
|
+
## 点击路径
|
|
56
|
+
|
|
57
|
+
| id | 页面流 | 操作 | 期望 |
|
|
58
|
+
| --- | --- | --- | --- |
|
|
59
|
+
|
|
60
|
+
## 用例大纲
|
|
61
|
+
|
|
62
|
+
## 执行反馈
|
|
63
|
+
|
|
64
|
+
| run_id | task_id | 结果 | 要回写的结论 |
|
|
65
|
+
| --- | --- | --- | --- |
|
|
66
|
+
|
|
67
|
+
## 证据与来源
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Hard rules
|
|
71
|
+
|
|
72
|
+
- 缺日志来源时 `tuner-task ask --topic sut-log-source`,不要写死 SSH、日志接口或 Rancher。
|
|
73
|
+
- 不把响应体、截图、密钥抄进设计。
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: generate-test-report
|
|
3
3
|
description: Turn a regression run under artifacts/reports/<run_id>/ (plus inbox and optional design notes) into a curated Markdown test report at assets/testreport/<sut>/<yyyy-mm>/<slug>.md with metadata-conventions front-matter. Use when the user asks to 生成测试报告 / write a test report / 汇总回归结果.
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.1.0
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Generate Test Report
|
|
@@ -35,6 +35,8 @@ period: <YYYY-MM>
|
|
|
35
35
|
result: {total: 0, passed: 0, failed: 0}
|
|
36
36
|
evidence: []
|
|
37
37
|
features: []
|
|
38
|
+
task_id: # 有 work task 时填写
|
|
39
|
+
design: # test-execution 指向 assets/testdesign/...
|
|
38
40
|
confidence: high
|
|
39
41
|
source: artifacts/reports/<run_id>
|
|
40
42
|
---
|
tuner_testkit-5.2.0/tuner_testkit/apps/dna/dna_payload/.cursor/skills/run-test-execution/SKILL.md
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: run-test-execution
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: Run the click paths in a test design, attach screenshots and sanitized API or log evidence, and write a curated test report that links back to the design. Use when the task type is test-execution or the user asks for an end-to-end click report.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Run test execution
|
|
8
|
+
|
|
9
|
+
## Scope
|
|
10
|
+
|
|
11
|
+
- **Read**: 任务的 `design`(`assets/testdesign/**`)及其「点击路径」。
|
|
12
|
+
- **Write**: `assets/testreport/<sut>/<yyyy-mm>/<slug>.md`,回写设计的「执行反馈」,必要时 `tuner-evidence attach`。
|
|
13
|
+
- **Must follow**: `docs/spec/work-task.md`、`docs/spec/test-design-syntax.md`、`generate-test-report` skill。
|
|
14
|
+
|
|
15
|
+
## Steps
|
|
16
|
+
|
|
17
|
+
1. `tuner-task create --type test-execution --title … --design assets/testdesign/<sut>/<slug>.md`,或继续已有任务。然后 `tuner-task start <id>`。
|
|
18
|
+
2. 按「点击路径」每一行执行 `python -m tuner_testkit.page_test run <page_id> --flow <flow>`,或对应的 behave UI 场景。失败步使用 page_test 已有的整页截图路径。
|
|
19
|
+
3. 把当次网络、截图、接口 JSON、日志片段放进同一次 evidence run,并带上任务号:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
uv run tuner-evidence persist --run-id <run_id> --scenario explore:<slug> --network captures.jsonl --task-id <TASK> --screenshot <png> --api <response.json>
|
|
23
|
+
uv run tuner-evidence attach --run-id <run_id> --task-id <TASK> --log <excerpt.log> --screenshot <png>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
4. 设计要求日志证据,但仓库没有 log provider(domain-notes 或 `apps/` 里没有)时,立刻:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
uv run tuner-task ask --task <TASK> --topic sut-log-source --prompt "仓库没有写明后端日志从哪取"
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
然后停止依赖日志的回写。不要选择 SSH、日志接口或 Rancher,也不要开始写 fetcher。人回答后再按 `create-app` 做对应工具。人选择 `skip` 时,报告里日志写「无」。
|
|
33
|
+
|
|
34
|
+
5. 用 `generate-test-report` 写报告。front-matter 额外加上 `task_id` 与 `design`。结果表每一行带证据相对路径(截图、`api/*.json`、`logs/*.log`)。
|
|
35
|
+
6. 在测试设计「执行反馈」追加一行:`run_id`、`task_id`、通过或失败、要回写的结论。不改「范围」,除非人确认。
|
|
36
|
+
7. `uv run tuner-task bind <id> --output assets/testreport/<sut>/<yyyy-mm>/<slug>.md --evidence artifacts/evidence/<run_id>/`,然后 `tuner-task finish <id>`。仍有未答问题时 CLI 会失败。
|
|
37
|
+
|
|
38
|
+
## Hard rules
|
|
39
|
+
|
|
40
|
+
- 报告和设计只链到 `artifacts/evidence/<run_id>/`,不入库截图或响应原文。
|
|
41
|
+
- 不编造未出现在 summary 或证据里的失败数。
|
|
42
|
+
- 点出的新副作用策展到 `assets/design/`,并在设计的风险里加一行指向同一 `run_id`。
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!-- version: 1.
|
|
1
|
+
<!-- version: 1.6.0 -->
|
|
2
2
|
# AGENTS — 平台总入口(轻量 DM)
|
|
3
3
|
|
|
4
4
|
> 本文件是"repo as a platform"的**稳定世界观**:只写不常变的分层结构与角色。
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
|
|
14
14
|
| 层 | 目录 | 职责 | 谁运行 |
|
|
15
15
|
| --- | --- | --- | --- |
|
|
16
|
-
| 知识层 | `assets/` | 给人和 LLM 阅读、生成测试代码的基础知识(ddl / sql / usecases / domain-notes / explore / design / testreport)。见 `docs/spec/assets-knowledge-syntax.md`。 | 只读引用 |
|
|
16
|
+
| 知识层 | `assets/` | 给人和 LLM 阅读、生成测试代码的基础知识(ddl / sql / usecases / domain-notes / explore / design / testdesign / testreport)。见 `docs/spec/assets-knowledge-syntax.md`。 | 只读引用 |
|
|
17
17
|
| 运行库 | `tuner_testkit/`(PyPI:`tuner-testkit`) | 公共运行时与 CLI(db / logging / api_test / page_test / fake / recorders / dna)。SUT 用 `uv` 锁版本。 | `import tuner_testkit`;`tuner-recorder` 等 scripts |
|
|
18
18
|
| 组件层 | `packages/` | **本仓业务资产**(api_objects / page_objects / action_words),不是 kit 运行库。 | 被 import |
|
|
19
19
|
| 工具层 | `apps/` | **本仓私有**工具。公共工具在 `tuner_testkit.apps`。见 `docs/spec/apps-authoring-syntax.md`。 | `python -m apps.<name>`(仅项目工具) |
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
| 测试层 | `tests/` | 自动化测试代码(behave `features/` + `pytest/`)。 | behave / pytest |
|
|
22
22
|
| 文档层 | `docs/` | 仓库使用说明与规范(`docs/spec/**`)。 | 只读 |
|
|
23
23
|
|
|
24
|
-
配套:`config/`(环境/数据源)、`.cursor/`(AI 组件,见下)、`artifacts/`·`logs/`(运行产出,规范 `docs/spec/artifacts-layout.md`:MCP evidence 落 `artifacts/evidence/<run_id>/`;agent 任务记录落 `artifacts/inbox/`;工具运行落 `artifacts/runs/<run_id>/`;回归报告落 `artifacts/reports/<run_id>/`,每个 run 目录带 `manifest.json`)。SUT 登录本机文件:`data/sut-accounts.local.yaml`(gitignore)。
|
|
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/runs/<run_id>/`;回归报告落 `artifacts/reports/<run_id>/`,每个 run 目录带 `manifest.json`)。SUT 登录本机文件:`data/sut-accounts.local.yaml`(gitignore)。
|
|
25
25
|
|
|
26
26
|
## 2. 三角色
|
|
27
27
|
|
|
@@ -50,6 +50,7 @@ flowchart TD
|
|
|
50
50
|
Q -->|"缺少知识(ddl/api/用例)"| Know["先跑 kit CLI 回填 assets\n再走生成"]
|
|
51
51
|
Q -->|"新建/更新项目仓"| Init["tuner-init / tuner-dna / release-template"]
|
|
52
52
|
Q -->|"读/策展/索引知识"| Idx["查 INDEX.md + maintain-index skill"]
|
|
53
|
+
Q -->|"发布任务 / 测试设计 / 端到端执行"| Task["work/tasks + tuner-task\ndocs/spec/work-task.md"]
|
|
53
54
|
```
|
|
54
55
|
|
|
55
56
|
- **学习被测系统** → `.cursor/agents/sut-self-learning.md`(编排 explore → freeze → design;规格 `docs/spec/sut-self-learning.md`;任务 log 见 `docs/spec/agent-task-log.md`)。
|
|
@@ -59,6 +60,7 @@ flowchart TD
|
|
|
59
60
|
- **补知识** → 用 `tuner-dump-ddl`、Playwright MCP 探索(落盘 `artifacts/evidence/`)、`tuner-recorder` / `tuner-api-recorder` / `tuner-page-recorder` 等回填,再进入生成。
|
|
60
61
|
- **仓库初始化/发布** → `tuner-init scaffold`(骨架 + 依赖 `tuner-testkit` + 一次 `tuner-dna sync`)+ `release-template` skill。下游升 kit:`uv add tuner-testkit==x.y.z` 然后 `tuner-dna sync`,再提交。
|
|
61
62
|
- **读/索引知识** → 先查 `INDEX.md`;若存在 `INDEX.project.md` 则一并查。索引维护用 `maintain-index` skill。
|
|
63
|
+
- **发布任务** → `tuner-task create` 写入 `work/tasks/`。测试设计走 `derive-test-design`;端到端点击报告走 `run-test-execution`。缺人才能决定的通道(如后端日志)用 `tuner-task ask`,不要猜。
|
|
62
64
|
|
|
63
65
|
## 5. 全程硬约束(跨分支)
|
|
64
66
|
|
|
@@ -64,7 +64,17 @@ evidence:
|
|
|
64
64
|
|
|
65
65
|
对照两轮 dogfood 时,另写 `## Loop delta`:相对上一份 inbox,少了哪些手工步骤、多了哪些平台能力。
|
|
66
66
|
|
|
67
|
-
## 4.
|
|
67
|
+
## 4. 人类提问(阻塞)
|
|
68
|
+
|
|
69
|
+
必须由人选择的缺口(仓库没写明的后端日志来源等)不写进会话流水,立刻另存:
|
|
70
|
+
|
|
71
|
+
```text
|
|
72
|
+
artifacts/inbox/questions/Q-<YYYYMMDD>-<nnn>.md
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
字段与命令见 `docs/spec/work-task.md`。提问后把对应 `work/tasks` 标为 `blocked`。回答写入任务的 `## Decisions`;可复用的通道说明策展到 `assets/domain-notes/`。
|
|
76
|
+
|
|
77
|
+
## 5. 密钥
|
|
68
78
|
|
|
69
79
|
- 可用 `account_id` 指向 `data/sut-accounts.local.yaml` 的条目。
|
|
70
80
|
- 禁止密码、token、Cookie、Authorization 原文。
|
|
@@ -16,6 +16,7 @@ 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 # 阻塞式人类提问(work-task.md);gitignore
|
|
19
20
|
├── runs/<run_id>/ # 工具 / 动作词的一次运行(tuner-workspace run、工作台);gitignore
|
|
20
21
|
├── reports/<run_id>/ # 一次回归(behave / pytest)的报告与摘要;gitignore
|
|
21
22
|
├── catalogs/workspace.json # tuner-workspace catalog 产物;gitignore
|
|
@@ -66,8 +67,8 @@ artifacts/
|
|
|
66
67
|
| `tuner-workspace run` / 工作台 | `runs/<run_id>/` | `stdout.log`、`stderr.log`、`envelope.json`(工具 `--json` 输出)、`manifest.json` |
|
|
67
68
|
| behave(`*_environment.py` 钩子) | `reports/<run_id>/` | `summary.json`(feature/scenario 状态)、`manifest.json`;`-f html-pretty -o $TUNER_REPORT_DIR/report.html` 时 html 同目录 |
|
|
68
69
|
| pytest | `reports/<run_id>/` | `pytest --junitxml artifacts/reports/<run_id>/junit.xml`,再 `tuner_testkit.artifacts.finish_run` 写 manifest |
|
|
69
|
-
| `tuner-evidence persist` | `evidence/<run_id>/` | `network.jsonl` / `actions.jsonl` / `run_summary.md
|
|
70
|
-
| agent(编排) | `inbox/` |
|
|
70
|
+
| `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`;人类提问见 `inbox/questions/` 与 `work-task.md` |
|
|
71
72
|
| `tuner-workspace catalog` | `catalogs/workspace.json` | 见 `tuner_testkit/workspace/README.md` |
|
|
72
73
|
|
|
73
74
|
环境变量 `TUNER_REPORT_DIR` 指定本次回归的 run 目录(不设则钩子自动生成 `reports/<run_id>/`);
|
|
@@ -92,3 +93,4 @@ artifacts/
|
|
|
92
93
|
- `artifacts/reports/<run_id>/` 是**原始交付物**;人工或 `generate-test-report` skill 整理后的报告落
|
|
93
94
|
`assets/testreport/<sut>/<yyyy-mm>/<slug>.md`,front-matter 用 `evidence: [artifacts/reports/<run_id>]` 指回来源。
|
|
94
95
|
- `artifacts/inbox/` 不是 evidence;evidence 只认 `artifacts/evidence/<run_id>/`。
|
|
96
|
+
- 入库的任务在 `work/tasks/`,不在 inbox。inbox 里的 question 只是本机待答消息。
|
|
@@ -16,13 +16,14 @@ assets/
|
|
|
16
16
|
├── domain-notes/<domain>/<name>.md# 业务讲解、字段含义、权限规则、环境约束
|
|
17
17
|
├── explore/<app>/<name>.md # 探索式测试产出的能力清单 / 站点地图(半自动)
|
|
18
18
|
├── design/<app>/<route-slug>.md # API↔DB effects 收敛知识(见 design-knowledge-syntax)
|
|
19
|
+
├── testdesign/<sut>/<slug>.md # 测试设计(见 test-design-syntax);执行反馈回写在此
|
|
19
20
|
├── testreport/<name>.md # 测试报告类原始资产
|
|
20
21
|
└── CHANGELOG.md # 自动区变更流水(供 maintain-index 读取 delta)
|
|
21
22
|
```
|
|
22
23
|
|
|
23
24
|
- **自动区**(工具产出,可被覆盖重写):`ddl/`、以及每次生成会追加 `CHANGELOG.md`。
|
|
24
25
|
人不手改这些文件的内容语义;要更新就重跑工具。
|
|
25
|
-
- **人工/半自动区**:`sql/`、`usecases/`、`domain-notes/`、`explore/`、`design/`、`testreport/`。
|
|
26
|
+
- **人工/半自动区**:`sql/`、`usecases/`、`domain-notes/`、`explore/`、`design/`、`testdesign/`、`testreport/`。
|
|
26
27
|
- `apidoc/` **不单列**:人工导入的接口说明放 `domain-notes/` 或 `usecases/`;
|
|
27
28
|
运行时冻结的契约在 `packages/api_objects/`。是否再拆目录留给下游实践决定。
|
|
28
29
|
|
|
@@ -52,6 +52,7 @@
|
|
|
52
52
|
| `init_repo` | `tuner_testkit/apps/init_repo/**` | 初始化工具与 release |
|
|
53
53
|
| `index` | `INDEX.md`、`INDEX.project.md`、`.cursor/REGISTRY.md` | 索引/注册表 |
|
|
54
54
|
| `dogfood` | `dogfood/**` | 平台仓内用 scaffold 生成的 dogfood workspace(知识、feature、fixture) |
|
|
55
|
+
| `work` | `work/**` | 入库的任务(`work/tasks`)与任务上的 Decision |
|
|
55
56
|
|
|
56
57
|
> `packages` 视为 `api_objects` / `page_objects` / `action_words` 的**上位 scope**:
|
|
57
58
|
> 声明 `packages` 可覆盖这三者的改动。
|
|
@@ -13,7 +13,7 @@ description: 统一 front-matter / run manifest 字段家族,供 catalog、工
|
|
|
13
13
|
|
|
14
14
|
| 字段 | 类型 | 含义 |
|
|
15
15
|
| --- | --- | --- |
|
|
16
|
-
| `kind` | string | `app` / `action_word` / `testreport` / `inbox` / `explore` / `design` / `usecase` / `domain-note` |
|
|
16
|
+
| `kind` | string | `app` / `action_word` / `testreport` / `inbox` / `question` / `task` / `testdesign` / `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` |
|
|
@@ -43,6 +43,7 @@ catalog 同时用 `git log --diff-filter=A --format=%ae -- <path>` 算首次提
|
|
|
43
43
|
落点:`assets/testreport/<sut>/<yyyy-mm>/<slug>.md`。
|
|
44
44
|
|
|
45
45
|
额外:`run_id` / `period` / `result`(`{total,passed,failed}`)/ `evidence[]` / `features[]`。
|
|
46
|
+
端到端执行报告再加 `task_id` / `design`(指向 `work/tasks` 与 `assets/testdesign`)。
|
|
46
47
|
|
|
47
48
|
正文固定章节:范围 / 环境 / 结果 / 缺陷 / 风险 / 证据链接。见 skill `generate-test-report`。
|
|
48
49
|
|
|
@@ -50,6 +51,12 @@ catalog 同时用 `git log --diff-filter=A --format=%ae -- <path>` 算首次提
|
|
|
50
51
|
|
|
51
52
|
沿用 `docs/spec/agent-task-log.md`,再加 `author`。
|
|
52
53
|
|
|
54
|
+
### 任务与测试设计
|
|
55
|
+
|
|
56
|
+
- `kind: task` 落在 `work/tasks/TASK-*.md`,字段见 `docs/spec/work-task.md`。
|
|
57
|
+
- `kind: question` 落在 `artifacts/inbox/questions/Q-*.md`(不入库)。
|
|
58
|
+
- `kind: testdesign` 落在 `assets/testdesign/<sut>/<slug>.md`,字段见 `docs/spec/test-design-syntax.md`。
|
|
59
|
+
|
|
53
60
|
### run manifest
|
|
54
61
|
|
|
55
62
|
`artifacts/runs|<reports>/<run_id>/manifest.json`:`producer.user_email` / `producer.host` /
|
|
@@ -64,7 +64,7 @@ artifacts/evidence/<run_id>/ ← 统一落盘(强制)
|
|
|
64
64
|
| MCP 网络 + DOM | Playwright MCP;必须落盘 evidence | `artifacts/evidence/` |
|
|
65
65
|
| DDL | `tuner-dump-ddl` | `assets/ddl/` |
|
|
66
66
|
| 源码 | 工程师给出前后端路径,LLM 读 models/views/urls | `assets/design/`(inferred) |
|
|
67
|
-
| 应用日志 |
|
|
67
|
+
| 应用日志 | 仓库已有说明时按 `create-app` 写 log fetcher;没有说明时 `tuner-task ask --topic sut-log-source`,等人在 SSH 目录、日志接口、Rancher API 中选一个 | `apps/<name>/`;决定记在 `work/tasks` 与 `assets/domain-notes` |
|
|
68
68
|
| DB 日志 / diff | 用户自建,或后续参考 `tuner-db-diff` | `apps/` 或 kit |
|
|
69
69
|
| 人工文档 | 原样放入,只补 front-matter | `assets/usecases` / `domain-notes` |
|
|
70
70
|
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: test-design-syntax
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: assets/testdesign 的章节、front-matter,以及被 test-execution 回写的执行反馈。
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 测试设计(test-design-syntax)
|
|
8
|
+
|
|
9
|
+
> 一篇文档描述一条可执行的测试设计。它记「测什么、怎么点、期望是什么」。
|
|
10
|
+
> `assets/design/` 仍只记一条路由的副作用,不要混进本文。
|
|
11
|
+
|
|
12
|
+
## 1. 路径
|
|
13
|
+
|
|
14
|
+
```text
|
|
15
|
+
assets/testdesign/<sut>/<slug>.md
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## 2. Front-matter
|
|
19
|
+
|
|
20
|
+
```yaml
|
|
21
|
+
kind: testdesign
|
|
22
|
+
id: order-create
|
|
23
|
+
title: 订单创建
|
|
24
|
+
sut: order
|
|
25
|
+
task_id: TASK-20260924-001
|
|
26
|
+
source: assets/usecases/order/create.md
|
|
27
|
+
version: 1.0.0
|
|
28
|
+
confidence: high
|
|
29
|
+
evidence:
|
|
30
|
+
- artifacts/evidence/20260924T000000Z-order-create/
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
`source` 与 `evidence` 至少有一个。`tuner-task validate <path>` 会检查。
|
|
34
|
+
|
|
35
|
+
## 3. 正文
|
|
36
|
+
|
|
37
|
+
八个二级标题都要在,缺信息写「无」:
|
|
38
|
+
|
|
39
|
+
```markdown
|
|
40
|
+
## 范围
|
|
41
|
+
## 不测
|
|
42
|
+
## 风险
|
|
43
|
+
## 策略
|
|
44
|
+
## 点击路径
|
|
45
|
+
## 用例大纲
|
|
46
|
+
## 执行反馈
|
|
47
|
+
## 证据与来源
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
「点击路径」用表,供 `test-execution` 逐行点击:
|
|
51
|
+
|
|
52
|
+
```markdown
|
|
53
|
+
| id | 页面流 | 操作 | 期望 |
|
|
54
|
+
| --- | --- | --- | --- |
|
|
55
|
+
| P1 | web.order_create@v1 / submit | 填写必填项并点击提交 | 列表出现新订单 |
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
「执行反馈」由执行任务回写,不在设计阶段编造结果:
|
|
59
|
+
|
|
60
|
+
```markdown
|
|
61
|
+
| run_id | task_id | 结果 | 要回写的结论 |
|
|
62
|
+
| --- | --- | --- | --- |
|
|
63
|
+
| 20260924T000000Z-order | TASK-20260924-002 | failed | P1 提交后列表未刷新,见证据截图 |
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
证据只写 `artifacts/evidence/<run_id>/` 下的相对路径,不粘贴截图、响应体或日志原文。
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: work-task
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: 入库任务 work/tasks、阻塞式人类提问,以及和测试设计、证据、测试报告的闭环。
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 工作任务(work-task)
|
|
8
|
+
|
|
9
|
+
> 人在 workspace 里发布的任务是 Agent 的事务上下文,写入 Git。
|
|
10
|
+
> 会话流水仍在 `artifacts/inbox/<utc>-<agent>-<slice>.md`(gitignore)。
|
|
11
|
+
> 必须由人回答的问题写到 `artifacts/inbox/questions/`,不猜 SSH、日志接口或 Rancher。
|
|
12
|
+
|
|
13
|
+
## 1. 路径
|
|
14
|
+
|
|
15
|
+
```text
|
|
16
|
+
work/tasks/TASK-<YYYYMMDD>-<nnn>.md # 入库
|
|
17
|
+
artifacts/inbox/questions/Q-<YYYYMMDD>-<nnn>.md # gitignore,本机异步信箱
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
`work/**` 的提交 scope 是 `work`。问题文件不入库;人答完后的结论写回任务的 `## Decisions`,需要留下的通道说明再策展到 `assets/domain-notes/`。
|
|
21
|
+
|
|
22
|
+
## 2. 任务类型
|
|
23
|
+
|
|
24
|
+
| type | 输入 | 产出 | 证据 |
|
|
25
|
+
| --- | --- | --- | --- |
|
|
26
|
+
| `explore` | URL / account_id | `assets/explore/` | `artifacts/evidence/<run_id>/` |
|
|
27
|
+
| `test-design` | 用例、domain-notes、explore、design | `assets/testdesign/<sut>/<slug>.md` | 需求或探索来源,见 test-design-syntax |
|
|
28
|
+
| `test-execution` | 已存在的 testdesign(front-matter `design`) | `assets/testreport/<sut>/<yyyy-mm>/<slug>.md` | 同一次 run 的截图、网络、接口响应、日志 |
|
|
29
|
+
|
|
30
|
+
`test-execution` 按测试设计里的「点击路径」跑 `page_test run` 或 behave UI,不代替测试设计,也不承担纯 API 回归。
|
|
31
|
+
|
|
32
|
+
状态:`open` → `in_progress` → `done`。存在未回答的阻塞问题时为 `blocked`。全部答完后回到 `in_progress`。
|
|
33
|
+
|
|
34
|
+
## 3. Front-matter
|
|
35
|
+
|
|
36
|
+
```yaml
|
|
37
|
+
kind: task
|
|
38
|
+
id: TASK-20260924-001
|
|
39
|
+
title: 订单创建端到端
|
|
40
|
+
type: test-execution
|
|
41
|
+
status: open
|
|
42
|
+
objective: 按测试设计点完订单创建并写出报告
|
|
43
|
+
scope: [order-create]
|
|
44
|
+
inputs: []
|
|
45
|
+
outputs: []
|
|
46
|
+
design: assets/testdesign/order/create.md
|
|
47
|
+
evidence: []
|
|
48
|
+
questions: []
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
作者与日期用 `tuner-workspace meta stamp`(`tuner-task create` 会调用)。禁止写入密码、token、Cookie。
|
|
52
|
+
|
|
53
|
+
## 4. 人类提问循环
|
|
54
|
+
|
|
55
|
+
仓库里还没有该通道的说明时才问。`assets/domain-notes`、`INDEX`、已有 `apps/<log-fetcher>` 能回答的,直接用。
|
|
56
|
+
|
|
57
|
+
日志通道没有 provider 时,主题固定为 `sut-log-source`,选项固定为:
|
|
58
|
+
|
|
59
|
+
| id | 含义 |
|
|
60
|
+
| --- | --- |
|
|
61
|
+
| `ssh-dir` | SSH 到指定目录读日志文件 |
|
|
62
|
+
| `log-api` | 调用已有日志接口 |
|
|
63
|
+
| `rancher-api` | 用 Rancher API 拉 Pod 日志 |
|
|
64
|
+
| `skip` | 本轮不做日志通道 |
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
tuner-task ask --task TASK-20260924-001 --topic sut-log-source \
|
|
68
|
+
--prompt "仓库没有写明后端日志从哪取"
|
|
69
|
+
|
|
70
|
+
tuner-task answer Q-20260924-001 --option rancher-api \
|
|
71
|
+
--note "命名空间见 env_local 的 LOG_SOURCE" \
|
|
72
|
+
--curate assets/domain-notes/order/log-source.md
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
- 提问立刻落盘,并把任务标为 `blocked`。只挡住依赖该答案的回写;不依赖日志的点击可以先做完,但在回答前不要编写取日志实现,也不要选定通道。
|
|
76
|
+
- `--note` 只留可入库的指向。CLI 拒绝 `password=` / `token:` / `Bearer …` 这类赋值。
|
|
77
|
+
- `skip` 表示报告里日志证据写「无」,设计上的日志断言保持未验证。
|
|
78
|
+
- `tuner-task finish` 在仍有 `status: open` 且 `blocking: true` 的问题时失败。
|
|
79
|
+
- `test-execution` 收口时,`design` 与 `outputs` 里的路径必须已在磁盘上。
|
|
80
|
+
|
|
81
|
+
## 5. 和测试设计的闭环
|
|
82
|
+
|
|
83
|
+
```text
|
|
84
|
+
test-design(点击路径 + 期望)
|
|
85
|
+
→ task type=test-execution
|
|
86
|
+
→ 端到端点击
|
|
87
|
+
→ artifacts/evidence/<run_id>/(截图、network、api、logs)
|
|
88
|
+
→ assets/testreport(每条路径的结果 + 证据路径)
|
|
89
|
+
→ 回写 testdesign「执行反馈」
|
|
90
|
+
→ 通道类决定写入 Decisions,并在需要时策展 domain-notes
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
点击失败只记入「执行反馈」。接口与落库不一致时写 Decision,并引用 evidence 相对路径。点出设计没覆盖的副作用时策展 `assets/design/`,风险行指向同一 `run_id`。
|
|
@@ -30,7 +30,7 @@ ALLOWED_TYPES = {
|
|
|
30
30
|
|
|
31
31
|
ALLOWED_SCOPES = {
|
|
32
32
|
"assets", "apps", "packages", "api_objects", "page_objects", "action_words",
|
|
33
|
-
"tests", "docs", "rules", "skills", "agents", "hooks", "init_repo", "index",
|
|
33
|
+
"tests", "docs", "rules", "skills", "agents", "hooks", "init_repo", "index", "work",
|
|
34
34
|
# in-repo dogfood workspace (scaffolded from this platform repo)
|
|
35
35
|
"dogfood",
|
|
36
36
|
# fine-grained package aliases also accepted
|
|
@@ -84,6 +84,8 @@ def _path_to_layer(path: str) -> str | None:
|
|
|
84
84
|
return "packages"
|
|
85
85
|
if p.startswith("apps/"):
|
|
86
86
|
return "apps"
|
|
87
|
+
if p.startswith("work/"):
|
|
88
|
+
return "work"
|
|
87
89
|
if p.startswith("assets/"):
|
|
88
90
|
return "assets"
|
|
89
91
|
if p.startswith("tests/"):
|
|
@@ -14,7 +14,7 @@ from pathlib import Path
|
|
|
14
14
|
from tuner_testkit.logging import log_error
|
|
15
15
|
from tuner_testkit.project import ensure_project_on_path, project_root
|
|
16
16
|
|
|
17
|
-
from .persist import load_jsonl, load_run, persist
|
|
17
|
+
from .persist import attach, load_jsonl, load_run, persist
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
def build_parser() -> argparse.ArgumentParser:
|
|
@@ -34,6 +34,10 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
34
34
|
persist_p.add_argument("--actions", type=Path, default=None, help="optional actions JSONL")
|
|
35
35
|
persist_p.add_argument("--intent", default="", help="short intent blurb for generated run_summary.md")
|
|
36
36
|
persist_p.add_argument("--summary", type=Path, default=None, help="optional run_summary.md to copy")
|
|
37
|
+
persist_p.add_argument("--task-id", default="", help="work task id, stored on the run manifest")
|
|
38
|
+
persist_p.add_argument("--screenshot", type=Path, action="append", default=[], help="image copied under screenshots/")
|
|
39
|
+
persist_p.add_argument("--log", type=Path, action="append", default=[], help="log excerpt, redacted, under logs/")
|
|
40
|
+
persist_p.add_argument("--api", type=Path, action="append", default=[], help="JSON response, sanitized, under api/")
|
|
37
41
|
persist_p.add_argument(
|
|
38
42
|
"--root",
|
|
39
43
|
type=Path,
|
|
@@ -41,6 +45,16 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
41
45
|
help="project root (default: tuner project_root())",
|
|
42
46
|
)
|
|
43
47
|
|
|
48
|
+
attach_p = sub.add_parser("attach", help="add screenshots, logs, or API JSON to a run")
|
|
49
|
+
attach_p.add_argument("--run-id", required=True)
|
|
50
|
+
attach_p.add_argument("--scenario", default="attach")
|
|
51
|
+
attach_p.add_argument("--intent", default="")
|
|
52
|
+
attach_p.add_argument("--task-id", default="")
|
|
53
|
+
attach_p.add_argument("--screenshot", type=Path, action="append", default=[])
|
|
54
|
+
attach_p.add_argument("--log", type=Path, action="append", default=[])
|
|
55
|
+
attach_p.add_argument("--api", type=Path, action="append", default=[])
|
|
56
|
+
attach_p.add_argument("--root", type=Path, default=None)
|
|
57
|
+
|
|
44
58
|
routes_p = sub.add_parser("routes", help="print unique method+path from an existing run")
|
|
45
59
|
routes_p.add_argument("--run-id", required=True)
|
|
46
60
|
routes_p.add_argument("--root", type=Path, default=None)
|
|
@@ -73,9 +87,25 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
73
87
|
intent=ns.intent,
|
|
74
88
|
summary_text=summary,
|
|
75
89
|
root=root,
|
|
90
|
+
task_id=ns.task_id,
|
|
91
|
+
screenshots=ns.screenshot,
|
|
92
|
+
logs=ns.log,
|
|
93
|
+
apis=ns.api,
|
|
76
94
|
)
|
|
77
95
|
_print_json(payload)
|
|
78
96
|
return 0
|
|
97
|
+
if ns.cmd == "attach":
|
|
98
|
+
_print_json(attach(
|
|
99
|
+
run_id=ns.run_id,
|
|
100
|
+
root=root,
|
|
101
|
+
scenario_id=ns.scenario,
|
|
102
|
+
intent=ns.intent,
|
|
103
|
+
task_id=ns.task_id,
|
|
104
|
+
screenshots=ns.screenshot,
|
|
105
|
+
logs=ns.log,
|
|
106
|
+
apis=ns.api,
|
|
107
|
+
))
|
|
108
|
+
return 0
|
|
79
109
|
if ns.cmd == "routes":
|
|
80
110
|
_print_json(load_run(ns.run_id, root=root))
|
|
81
111
|
return 0
|