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.
- mk_qa_master-0.5.0/.dockerignore +33 -0
- mk_qa_master-0.5.0/.github/CODEOWNERS +5 -0
- mk_qa_master-0.5.0/.github/FUNDING.yml +3 -0
- mk_qa_master-0.5.0/.github/ISSUE_TEMPLATE/bug_report.yml +53 -0
- mk_qa_master-0.5.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
- mk_qa_master-0.5.0/.github/ISSUE_TEMPLATE/feature_suggestion.yml +47 -0
- mk_qa_master-0.5.0/.github/pull_request_template.md +21 -0
- mk_qa_master-0.5.0/.github/workflows/external-pr-policy.yml +63 -0
- mk_qa_master-0.5.0/.github/workflows/publish.yml +80 -0
- mk_qa_master-0.5.0/.gitignore +13 -0
- mk_qa_master-0.5.0/.nojekyll +0 -0
- mk_qa_master-0.5.0/CNAME +1 -0
- mk_qa_master-0.5.0/Dockerfile +30 -0
- mk_qa_master-0.5.0/LICENSE +21 -0
- mk_qa_master-0.5.0/LICENSE.zh-TW.md +28 -0
- mk_qa_master-0.5.0/PKG-INFO +671 -0
- mk_qa_master-0.5.0/README.md +644 -0
- mk_qa_master-0.5.0/README.zh-TW.md +542 -0
- mk_qa_master-0.5.0/assets/logo.png +0 -0
- mk_qa_master-0.5.0/assets/og-image.html +121 -0
- mk_qa_master-0.5.0/docs/demo-video-script.md +129 -0
- mk_qa_master-0.5.0/docs/framework.md +568 -0
- mk_qa_master-0.5.0/docs/qa-knowledge.example.md +132 -0
- mk_qa_master-0.5.0/docs/smithery-listing.md +161 -0
- mk_qa_master-0.5.0/examples/configs/claude_desktop_config.example.json +12 -0
- mk_qa_master-0.5.0/examples/configs/codex-config.example.toml +19 -0
- mk_qa_master-0.5.0/examples/configs/gemini-config.example.json +13 -0
- mk_qa_master-0.5.0/index.html +1117 -0
- mk_qa_master-0.5.0/og-image.png +0 -0
- mk_qa_master-0.5.0/pyproject.toml +40 -0
- mk_qa_master-0.5.0/sample_report.html +269 -0
- mk_qa_master-0.5.0/smithery.yaml +54 -0
- mk_qa_master-0.5.0/src/mk_qa_master/__init__.py +3 -0
- mk_qa_master-0.5.0/src/mk_qa_master/config.py +64 -0
- mk_qa_master-0.5.0/src/mk_qa_master/reporters/__init__.py +3 -0
- mk_qa_master-0.5.0/src/mk_qa_master/reporters/html.py +716 -0
- mk_qa_master-0.5.0/src/mk_qa_master/resources/__init__.py +3 -0
- mk_qa_master-0.5.0/src/mk_qa_master/resources/reports.py +22 -0
- mk_qa_master-0.5.0/src/mk_qa_master/runners/__init__.py +31 -0
- mk_qa_master-0.5.0/src/mk_qa_master/runners/base.py +43 -0
- mk_qa_master-0.5.0/src/mk_qa_master/runners/cypress.py +99 -0
- mk_qa_master-0.5.0/src/mk_qa_master/runners/go_test.py +111 -0
- mk_qa_master-0.5.0/src/mk_qa_master/runners/jest.py +79 -0
- mk_qa_master-0.5.0/src/mk_qa_master/runners/maestro.py +829 -0
- mk_qa_master-0.5.0/src/mk_qa_master/runners/pytest_playwright.py +505 -0
- mk_qa_master-0.5.0/src/mk_qa_master/security.py +132 -0
- mk_qa_master-0.5.0/src/mk_qa_master/server.py +820 -0
- mk_qa_master-0.5.0/src/mk_qa_master/tools/__init__.py +6 -0
- mk_qa_master-0.5.0/src/mk_qa_master/tools/analyzer.py +746 -0
- mk_qa_master-0.5.0/src/mk_qa_master/tools/generator.py +40 -0
- mk_qa_master-0.5.0/src/mk_qa_master/tools/optimizer.py +444 -0
- mk_qa_master-0.5.0/src/mk_qa_master/tools/qa_context.py +461 -0
- mk_qa_master-0.5.0/src/mk_qa_master/tools/reporter.py +13 -0
- mk_qa_master-0.5.0/src/mk_qa_master/tools/runner.py +17 -0
- mk_qa_master-0.5.0/src/mk_qa_master/tools/telemetry.py +89 -0
- mk_qa_master-0.5.0/tests_project/conftest.py +8 -0
- 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,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,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.
|
|
File without changes
|
mk_qa_master-0.5.0/CNAME
ADDED
|
@@ -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
|
+
- ❌ **不附保證**:用了出問題作者不負責,不能反過來追究
|