mk-qa-master 0.5.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.
Files changed (57) hide show
  1. mk_qa_master-0.5.0/.dockerignore +33 -0
  2. mk_qa_master-0.5.0/.github/CODEOWNERS +5 -0
  3. mk_qa_master-0.5.0/.github/FUNDING.yml +3 -0
  4. mk_qa_master-0.5.0/.github/ISSUE_TEMPLATE/bug_report.yml +53 -0
  5. mk_qa_master-0.5.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
  6. mk_qa_master-0.5.0/.github/ISSUE_TEMPLATE/feature_suggestion.yml +47 -0
  7. mk_qa_master-0.5.0/.github/pull_request_template.md +21 -0
  8. mk_qa_master-0.5.0/.github/workflows/external-pr-policy.yml +63 -0
  9. mk_qa_master-0.5.0/.github/workflows/publish.yml +80 -0
  10. mk_qa_master-0.5.0/.gitignore +13 -0
  11. mk_qa_master-0.5.0/.nojekyll +0 -0
  12. mk_qa_master-0.5.0/CNAME +1 -0
  13. mk_qa_master-0.5.0/Dockerfile +30 -0
  14. mk_qa_master-0.5.0/LICENSE +21 -0
  15. mk_qa_master-0.5.0/LICENSE.zh-TW.md +28 -0
  16. mk_qa_master-0.5.0/PKG-INFO +671 -0
  17. mk_qa_master-0.5.0/README.md +644 -0
  18. mk_qa_master-0.5.0/README.zh-TW.md +542 -0
  19. mk_qa_master-0.5.0/assets/logo.png +0 -0
  20. mk_qa_master-0.5.0/assets/og-image.html +121 -0
  21. mk_qa_master-0.5.0/docs/demo-video-script.md +129 -0
  22. mk_qa_master-0.5.0/docs/framework.md +568 -0
  23. mk_qa_master-0.5.0/docs/qa-knowledge.example.md +132 -0
  24. mk_qa_master-0.5.0/docs/smithery-listing.md +161 -0
  25. mk_qa_master-0.5.0/examples/configs/claude_desktop_config.example.json +12 -0
  26. mk_qa_master-0.5.0/examples/configs/codex-config.example.toml +19 -0
  27. mk_qa_master-0.5.0/examples/configs/gemini-config.example.json +13 -0
  28. mk_qa_master-0.5.0/index.html +1117 -0
  29. mk_qa_master-0.5.0/og-image.png +0 -0
  30. mk_qa_master-0.5.0/pyproject.toml +40 -0
  31. mk_qa_master-0.5.0/sample_report.html +269 -0
  32. mk_qa_master-0.5.0/smithery.yaml +54 -0
  33. mk_qa_master-0.5.0/src/mk_qa_master/__init__.py +3 -0
  34. mk_qa_master-0.5.0/src/mk_qa_master/config.py +64 -0
  35. mk_qa_master-0.5.0/src/mk_qa_master/reporters/__init__.py +3 -0
  36. mk_qa_master-0.5.0/src/mk_qa_master/reporters/html.py +716 -0
  37. mk_qa_master-0.5.0/src/mk_qa_master/resources/__init__.py +3 -0
  38. mk_qa_master-0.5.0/src/mk_qa_master/resources/reports.py +22 -0
  39. mk_qa_master-0.5.0/src/mk_qa_master/runners/__init__.py +31 -0
  40. mk_qa_master-0.5.0/src/mk_qa_master/runners/base.py +43 -0
  41. mk_qa_master-0.5.0/src/mk_qa_master/runners/cypress.py +99 -0
  42. mk_qa_master-0.5.0/src/mk_qa_master/runners/go_test.py +111 -0
  43. mk_qa_master-0.5.0/src/mk_qa_master/runners/jest.py +79 -0
  44. mk_qa_master-0.5.0/src/mk_qa_master/runners/maestro.py +829 -0
  45. mk_qa_master-0.5.0/src/mk_qa_master/runners/pytest_playwright.py +505 -0
  46. mk_qa_master-0.5.0/src/mk_qa_master/security.py +132 -0
  47. mk_qa_master-0.5.0/src/mk_qa_master/server.py +820 -0
  48. mk_qa_master-0.5.0/src/mk_qa_master/tools/__init__.py +6 -0
  49. mk_qa_master-0.5.0/src/mk_qa_master/tools/analyzer.py +746 -0
  50. mk_qa_master-0.5.0/src/mk_qa_master/tools/generator.py +40 -0
  51. mk_qa_master-0.5.0/src/mk_qa_master/tools/optimizer.py +444 -0
  52. mk_qa_master-0.5.0/src/mk_qa_master/tools/qa_context.py +461 -0
  53. mk_qa_master-0.5.0/src/mk_qa_master/tools/reporter.py +13 -0
  54. mk_qa_master-0.5.0/src/mk_qa_master/tools/runner.py +17 -0
  55. mk_qa_master-0.5.0/src/mk_qa_master/tools/telemetry.py +89 -0
  56. mk_qa_master-0.5.0/tests_project/conftest.py +8 -0
  57. mk_qa_master-0.5.0/tests_project/test_example.py +11 -0
@@ -0,0 +1,33 @@
1
+ # Keep the image small and predictable — only the package source needs
2
+ # to enter the build context.
3
+ .git
4
+ .gitignore
5
+ .github
6
+ .venv
7
+ venv
8
+ .python-version
9
+
10
+ # Python build artifacts
11
+ __pycache__
12
+ *.py[cod]
13
+ *.egg-info
14
+ build
15
+ dist
16
+
17
+ # Test outputs from local development (don't ship sample data)
18
+ tests_project
19
+ test-results
20
+
21
+ # Repo-level docs, examples, branding — not needed at runtime
22
+ docs
23
+ examples
24
+ assets
25
+ index.html
26
+ sample_report.html
27
+ *.zh-TW.md
28
+ CNAME
29
+
30
+ # Editor / OS noise
31
+ .DS_Store
32
+ .vscode
33
+ .idea
@@ -0,0 +1,5 @@
1
+ # Single-maintainer repo — every change requires owner review.
2
+ # Paired with branch protection's "Require review from Code Owners"
3
+ # so even if the auto-close workflow ever misfires, nothing can merge
4
+ # without @kao273183 approving.
5
+ * @kao273183
@@ -0,0 +1,3 @@
1
+ # Surfaces a ❤️ Sponsor button on the repo page.
2
+ # Add more entries here when GitHub Sponsors / Ko-fi / etc. come online.
3
+ buy_me_a_coffee: minikao
@@ -0,0 +1,53 @@
1
+ name: Bug report
2
+ description: Something broken or behaving unexpectedly in mk-qa-master.
3
+ title: "[Bug] "
4
+ labels: ["bug"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ Thanks for filing a bug! / 感謝回報問題!
10
+ This repo is maintained solo — external PRs are auto-closed. Please describe the issue here and I'll handle the fix.
11
+
12
+ - type: input
13
+ id: runner
14
+ attributes:
15
+ label: QA_RUNNER
16
+ description: Which runner are you using? (pytest / jest / cypress / go / maestro)
17
+ placeholder: maestro
18
+ validations:
19
+ required: true
20
+
21
+ - type: input
22
+ id: env
23
+ attributes:
24
+ label: Environment
25
+ description: OS / Python version / Maestro version (if mobile) / client (Claude Desktop, Cursor, Codex CLI, Gemini CLI...)
26
+ placeholder: "macOS 14.5, Python 3.11, Maestro 1.36, Claude Desktop"
27
+ validations:
28
+ required: true
29
+
30
+ - type: textarea
31
+ id: repro
32
+ attributes:
33
+ label: Steps to reproduce
34
+ description: Minimal steps. If it involves a specific prompt, paste the exact prompt.
35
+ placeholder: |
36
+ 1. Set QA_RUNNER=maestro and QA_ANDROID_HOST=127.0.0.1:5555
37
+ 2. Ask Claude to "analyze the home screen"
38
+ 3. ...
39
+ validations:
40
+ required: true
41
+
42
+ - type: textarea
43
+ id: expected
44
+ attributes:
45
+ label: Expected vs actual
46
+ validations:
47
+ required: true
48
+
49
+ - type: textarea
50
+ id: logs
51
+ attributes:
52
+ label: Relevant logs / error output
53
+ render: shell
@@ -0,0 +1,5 @@
1
+ blank_issues_enabled: true
2
+ contact_links:
3
+ - name: Discussions / Q&A
4
+ url: https://github.com/kao273183/mk-qa-master/discussions
5
+ about: General questions, ideas, or chat that aren't bug reports or feature requests.
@@ -0,0 +1,47 @@
1
+ name: Feature suggestion
2
+ description: Idea for a new runner, tool, or behavior. I'll evaluate and implement if it fits.
3
+ title: "[Idea] "
4
+ labels: ["enhancement"]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: |
9
+ Thanks for the idea! / 感謝你的點子!
10
+ This repo is maintained solo and **doesn't accept external PRs** — please describe the suggestion here. If it fits the project, I'll build it.
11
+
12
+ - type: textarea
13
+ id: problem
14
+ attributes:
15
+ label: What problem does this solve?
16
+ description: Concrete scenario where the current behavior falls short.
17
+ validations:
18
+ required: true
19
+
20
+ - type: textarea
21
+ id: proposal
22
+ attributes:
23
+ label: Proposed behavior
24
+ description: What should happen. Sketches / pseudocode / API shape welcome.
25
+ validations:
26
+ required: true
27
+
28
+ - type: textarea
29
+ id: alternatives
30
+ attributes:
31
+ label: Alternatives you considered (optional)
32
+
33
+ - type: dropdown
34
+ id: scope
35
+ attributes:
36
+ label: Which layer?
37
+ multiple: true
38
+ options:
39
+ - Runner (pytest / jest / cypress / go / maestro / new framework)
40
+ - Analyzer (analyze_url / analyze_screen)
41
+ - Generator (generate_test / auto_generate_tests)
42
+ - Optimizer / self-improvement coach
43
+ - HTML reporter
44
+ - QA knowledge layer
45
+ - MCP tool surface (server.py)
46
+ - Docs / examples
47
+ - Other
@@ -0,0 +1,21 @@
1
+ <!--
2
+ ⚠️ Heads up — external PRs are auto-closed.
3
+
4
+ This repo is maintained solo. If you're not @kao273183 or an invited
5
+ collaborator, your PR will be politely closed by a bot and you'll be
6
+ redirected to Issues.
7
+
8
+ If you have a bug or idea, please file it here instead:
9
+ https://github.com/kao273183/mk-qa-master/issues/new/choose
10
+
11
+ Owner / collaborator PRs: delete this comment block and describe the change below.
12
+ -->
13
+
14
+ ## Summary
15
+
16
+
17
+ ## Linked issue
18
+ Closes #
19
+
20
+ ## Test plan
21
+ - [ ]
@@ -0,0 +1,63 @@
1
+ name: External PR policy
2
+
3
+ # Closes PRs from non-OWNER / non-COLLABORATOR / non-MEMBER authors with a
4
+ # friendly message redirecting to Issues. This repo welcomes ideas + bug
5
+ # reports, but the codebase is maintained solo — see CONTRIBUTING in the
6
+ # README for the rationale.
7
+ #
8
+ # `pull_request_target` runs in the base repo's context, so we get a
9
+ # GITHUB_TOKEN with write perms even when the PR comes from a fork. We
10
+ # only read PR metadata; never check out fork code here.
11
+
12
+ on:
13
+ pull_request_target:
14
+ types: [opened, reopened]
15
+
16
+ permissions:
17
+ pull-requests: write
18
+ issues: write
19
+
20
+ jobs:
21
+ gate:
22
+ runs-on: ubuntu-latest
23
+ if: >-
24
+ github.event.pull_request.author_association != 'OWNER' &&
25
+ github.event.pull_request.author_association != 'COLLABORATOR' &&
26
+ github.event.pull_request.author_association != 'MEMBER'
27
+ steps:
28
+ - name: Comment and close
29
+ uses: actions/github-script@v7
30
+ with:
31
+ script: |
32
+ const pr = context.payload.pull_request;
33
+ const body = [
34
+ `Hi @${pr.user.login}, thanks for taking the time to contribute! 🙏`,
35
+ ``,
36
+ `This repository is **maintained solo** and does not accept external pull requests at this time.`,
37
+ `If you found a bug or have an idea, please open an **Issue** instead — I read every one and will implement it myself if it fits the project's direction.`,
38
+ ``,
39
+ `→ https://github.com/${context.repo.owner}/${context.repo.repo}/issues/new/choose`,
40
+ ``,
41
+ `---`,
42
+ ``,
43
+ `Hi @${pr.user.login},感謝你願意貢獻 🙏`,
44
+ ``,
45
+ `這個 repo **由我一人維護**,目前不收外部 PR。`,
46
+ `如果你發現 bug 或有想法,歡迎開 **Issue** — 我每一則都會看,覺得方向對的我會自己實作。`,
47
+ ``,
48
+ `Closing this PR for now. No offense intended.`
49
+ ].join('\n');
50
+
51
+ await github.rest.issues.createComment({
52
+ owner: context.repo.owner,
53
+ repo: context.repo.repo,
54
+ issue_number: pr.number,
55
+ body,
56
+ });
57
+
58
+ await github.rest.pulls.update({
59
+ owner: context.repo.owner,
60
+ repo: context.repo.repo,
61
+ pull_number: pr.number,
62
+ state: 'closed',
63
+ });
@@ -0,0 +1,80 @@
1
+ name: Publish to PyPI
2
+
3
+ # Triggered by every published GitHub Release. Releases are created
4
+ # manually (via `gh release create` or the GitHub UI) so we keep
5
+ # control over what hits PyPI — no auto-publish on tag push.
6
+ #
7
+ # Authentication: PyPI Trusted Publishing (OIDC). No API token stored;
8
+ # instead a one-time setup on PyPI links this repo + workflow file to
9
+ # the project name. Setup steps live in the README "Publishing" section.
10
+
11
+ on:
12
+ release:
13
+ types: [published]
14
+
15
+ permissions:
16
+ # OIDC token exchange for Trusted Publishing — no PYPI_API_TOKEN secret needed.
17
+ id-token: write
18
+ contents: read
19
+
20
+ jobs:
21
+ build:
22
+ name: Build distribution
23
+ runs-on: ubuntu-latest
24
+ steps:
25
+ - uses: actions/checkout@v4
26
+
27
+ - name: Set up Python
28
+ uses: actions/setup-python@v5
29
+ with:
30
+ python-version: "3.12"
31
+
32
+ - name: Install build tooling
33
+ run: python -m pip install --upgrade build twine
34
+
35
+ - name: Verify pyproject version matches the release tag
36
+ # The release tag (e.g. `v0.4.2`) must equal `v<pyproject.version>`.
37
+ # Catches the "tagged but forgot to bump pyproject" failure mode
38
+ # before we ship a wrong-versioned wheel.
39
+ run: |
40
+ set -eu
41
+ TAG="${GITHUB_REF_NAME#v}"
42
+ PY_VER=$(python -c "import tomllib; print(tomllib.load(open('pyproject.toml','rb'))['project']['version'])")
43
+ echo "release tag (without v) = $TAG"
44
+ echo "pyproject version = $PY_VER"
45
+ test "$TAG" = "$PY_VER"
46
+
47
+ - name: Build sdist + wheel
48
+ run: python -m build
49
+
50
+ - name: Validate distribution metadata
51
+ # Catches malformed README, missing classifiers, etc. before upload.
52
+ run: twine check dist/*
53
+
54
+ - name: Upload distribution artifacts
55
+ uses: actions/upload-artifact@v4
56
+ with:
57
+ name: dist
58
+ path: dist/
59
+
60
+ publish:
61
+ name: Publish to PyPI
62
+ needs: build
63
+ runs-on: ubuntu-latest
64
+ # Pin to an environment so PyPI's Trusted Publisher config can scope
65
+ # to this exact workflow + env name; protects against a compromised
66
+ # PR ever auto-publishing.
67
+ environment:
68
+ name: pypi
69
+ url: https://pypi.org/project/mk-qa-master/
70
+ steps:
71
+ - name: Download distribution artifacts
72
+ uses: actions/download-artifact@v4
73
+ with:
74
+ name: dist
75
+ path: dist/
76
+
77
+ - name: Publish to PyPI
78
+ uses: pypa/gh-action-pypi-publish@release/v1
79
+ # No `with: password:` — Trusted Publishing uses OIDC token in
80
+ # the runner's environment automatically.
@@ -0,0 +1,13 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *$py.class
4
+ *.egg-info/
5
+ .venv/
6
+ venv/
7
+ .pytest_cache/
8
+ tests_project/report.json
9
+ tests_project/report.html
10
+ tests_project/optimization-plan.md
11
+ tests_project/junit.xml
12
+ tests_project/test-results/
13
+ .DS_Store
File without changes
@@ -0,0 +1 @@
1
+ mcp.chenjundigital.com
@@ -0,0 +1,30 @@
1
+ # MK QA Master container — built primarily so Glama (and any other MCP
2
+ # catalog that introspects servers in a sandbox) can boot the server,
3
+ # send `initialize` + `tools/list` over stdio, and confirm a clean
4
+ # JSON-RPC response.
5
+ #
6
+ # Day-to-day use stays `uvx mk-qa-master` on the host: real test runs
7
+ # need access to the user's project files, browsers, simulators, etc.
8
+ # that live outside any sane container. This image is deliberately
9
+ # minimal — enough to answer introspection, not enough to actually run
10
+ # pytest / playwright / maestro.
11
+
12
+ FROM python:3.12-slim
13
+
14
+ # Install from local source so the image always reflects the current
15
+ # commit (introspection should pass even before a PyPI release).
16
+ WORKDIR /srv
17
+ COPY pyproject.toml README.md LICENSE ./
18
+ COPY src/ ./src/
19
+ RUN pip install --no-cache-dir .
20
+
21
+ # Defaults for the introspection probe. QA_PROJECT_ROOT just needs to
22
+ # resolve to a writable path — config.py only `.resolve()`s it, doesn't
23
+ # require it to exist until a real run happens (which we don't expect
24
+ # inside this container).
25
+ ENV QA_RUNNER=pytest \
26
+ QA_PROJECT_ROOT=/tmp/qa-project \
27
+ PYTHONUNBUFFERED=1
28
+
29
+ WORKDIR /tmp/qa-project
30
+ ENTRYPOINT ["python", "-m", "mk_qa_master.server"]
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Jack Kao
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,28 @@
1
+ # MIT 授權條款(中文翻譯)
2
+
3
+ > ⚠️ **本份為英文版 [`LICENSE`](LICENSE) 的中文翻譯,僅供理解參考之用。**
4
+ > **若文義或法律爭議發生,以英文原版為準。**
5
+
6
+ 著作權所有 (c) 2026 Jack Kao
7
+
8
+ 謹此免費授予任何取得本軟體與相關說明文件(以下簡稱「本軟體」)副本之人,
9
+ 不受限制地處理本軟體之權利,包括但不限於使用、複製、修改、合併、出版、
10
+ 散布、再授權及/或販售本軟體之副本,並允許接受本軟體之人在符合下列條件
11
+ 之情況下進行上述行為:
12
+
13
+ 上述著作權聲明及本許可聲明應包含於本軟體之所有副本或實質部分之中。
14
+
15
+ 本軟體係「按現狀」提供,不附帶任何形式之明示或默示擔保,包括但不限於
16
+ 適售性、適合特定目的及不侵權之擔保。在任何情況下,作者或著作權持有人
17
+ 均不對任何索賠、損害或其他責任負責,無論係於合約訴訟、侵權行為或其他
18
+ 情形下,因本軟體、本軟體之使用或其他相關事宜所引起、所致或所連帶發生
19
+ 之責任。
20
+
21
+ ---
22
+
23
+ ## 白話摘要(非法律條文)
24
+
25
+ - ✅ 你可以用、改、散布、再授權、商用
26
+ - ✅ 改寫之後不必開源、私有閉源也行
27
+ - ⚠️ **唯一要求**:你的 copy 裡要保留原作者的 copyright + 這份授權聲明
28
+ - ❌ **不附保證**:用了出問題作者不負責,不能反過來追究