prodpilot 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- prodpilot-1.0.0/.cursor/mcp.json +9 -0
- prodpilot-1.0.0/.github/workflows/release.yml +98 -0
- prodpilot-1.0.0/.github/workflows/tests.yml +78 -0
- prodpilot-1.0.0/.gitignore +35 -0
- prodpilot-1.0.0/.vscode/mcp.json +9 -0
- prodpilot-1.0.0/CHANGELOG.md +120 -0
- prodpilot-1.0.0/LICENSE +21 -0
- prodpilot-1.0.0/PKG-INFO +310 -0
- prodpilot-1.0.0/README.md +274 -0
- prodpilot-1.0.0/SECURITY.md +42 -0
- prodpilot-1.0.0/THIRD_PARTY_NOTICES.md +14 -0
- prodpilot-1.0.0/docs/architecture.md +248 -0
- prodpilot-1.0.0/docs/compatibility.md +351 -0
- prodpilot-1.0.0/docs/corrections.md +68 -0
- prodpilot-1.0.0/docs/evaluation.md +245 -0
- prodpilot-1.0.0/docs/metrics.md +190 -0
- prodpilot-1.0.0/docs/phase1-verification.md +96 -0
- prodpilot-1.0.0/docs/pipeline.md +556 -0
- prodpilot-1.0.0/docs/quickstart.md +126 -0
- prodpilot-1.0.0/docs/stability.md +54 -0
- prodpilot-1.0.0/pyproject.toml +66 -0
- prodpilot-1.0.0/src/prodpilot/__init__.py +9 -0
- prodpilot-1.0.0/src/prodpilot/__main__.py +10 -0
- prodpilot-1.0.0/src/prodpilot/astchecks.py +1019 -0
- prodpilot-1.0.0/src/prodpilot/audit.py +343 -0
- prodpilot-1.0.0/src/prodpilot/blueprint.py +227 -0
- prodpilot-1.0.0/src/prodpilot/builds.py +348 -0
- prodpilot-1.0.0/src/prodpilot/buildtest.py +529 -0
- prodpilot-1.0.0/src/prodpilot/cicd.py +506 -0
- prodpilot-1.0.0/src/prodpilot/cli.py +302 -0
- prodpilot-1.0.0/src/prodpilot/config.py +348 -0
- prodpilot-1.0.0/src/prodpilot/connect.py +213 -0
- prodpilot-1.0.0/src/prodpilot/constraints.py +390 -0
- prodpilot-1.0.0/src/prodpilot/dataset.py +461 -0
- prodpilot-1.0.0/src/prodpilot/detection.py +269 -0
- prodpilot-1.0.0/src/prodpilot/dispatch.py +408 -0
- prodpilot-1.0.0/src/prodpilot/entropy.py +321 -0
- prodpilot-1.0.0/src/prodpilot/extraction.py +1007 -0
- prodpilot-1.0.0/src/prodpilot/features.py +355 -0
- prodpilot-1.0.0/src/prodpilot/filechecks.py +498 -0
- prodpilot-1.0.0/src/prodpilot/findings.py +59 -0
- prodpilot-1.0.0/src/prodpilot/gate.py +314 -0
- prodpilot-1.0.0/src/prodpilot/gh.py +342 -0
- prodpilot-1.0.0/src/prodpilot/jsparse.py +262 -0
- prodpilot-1.0.0/src/prodpilot/labels.py +803 -0
- prodpilot-1.0.0/src/prodpilot/loop.py +395 -0
- prodpilot-1.0.0/src/prodpilot/model/model.joblib +0 -0
- prodpilot-1.0.0/src/prodpilot/monitor.py +178 -0
- prodpilot-1.0.0/src/prodpilot/negatives.py +359 -0
- prodpilot-1.0.0/src/prodpilot/preflight.py +240 -0
- prodpilot-1.0.0/src/prodpilot/prereqs.py +76 -0
- prodpilot-1.0.0/src/prodpilot/prodpush.py +303 -0
- prodpilot-1.0.0/src/prodpilot/projectstate.py +228 -0
- prodpilot-1.0.0/src/prodpilot/provider.py +132 -0
- prodpilot-1.0.0/src/prodpilot/push.py +300 -0
- prodpilot-1.0.0/src/prodpilot/reaudit.py +149 -0
- prodpilot-1.0.0/src/prodpilot/render.py +376 -0
- prodpilot-1.0.0/src/prodpilot/rules.py +437 -0
- prodpilot-1.0.0/src/prodpilot/scoring.py +209 -0
- prodpilot-1.0.0/src/prodpilot/sealing.py +380 -0
- prodpilot-1.0.0/src/prodpilot/server.py +316 -0
- prodpilot-1.0.0/src/prodpilot/smoke.py +350 -0
- prodpilot-1.0.0/src/prodpilot/templates.py +647 -0
- prodpilot-1.0.0/src/prodpilot/training.py +651 -0
- prodpilot-1.0.0/src/prodpilot/vendor/node_modules/acorn/LICENSE +21 -0
- prodpilot-1.0.0/src/prodpilot/vendor/node_modules/acorn/dist/acorn.mjs +6313 -0
- prodpilot-1.0.0/src/prodpilot/vendor/node_modules/acorn/package.json +50 -0
- prodpilot-1.0.0/src/prodpilot/vendor/node_modules/acorn-jsx/LICENSE +19 -0
- prodpilot-1.0.0/src/prodpilot/vendor/node_modules/acorn-jsx/index.js +488 -0
- prodpilot-1.0.0/src/prodpilot/vendor/node_modules/acorn-jsx/package.json +27 -0
- prodpilot-1.0.0/src/prodpilot/vendor/node_modules/acorn-jsx/xhtml.js +255 -0
- prodpilot-1.0.0/src/prodpilot/vendor/parse.mjs +68 -0
- prodpilot-1.0.0/src/prodpilot/verify.py +212 -0
- prodpilot-1.0.0/tests/apply.py +242 -0
- prodpilot-1.0.0/tests/conftest.py +13 -0
- prodpilot-1.0.0/tests/pipeline.py +427 -0
- prodpilot-1.0.0/tests/samples/amb_two_drivers/package.json +8 -0
- prodpilot-1.0.0/tests/samples/amb_two_drivers/src/server.js +9 -0
- prodpilot-1.0.0/tests/samples/amb_two_entries/package.json +6 -0
- prodpilot-1.0.0/tests/samples/amb_two_entries/src/app.js +2 -0
- prodpilot-1.0.0/tests/samples/amb_two_entries/src/index.js +2 -0
- prodpilot-1.0.0/tests/samples/amb_two_entries/src/server.js +2 -0
- prodpilot-1.0.0/tests/samples/amb_two_lockfiles/package-lock.json +1 -0
- prodpilot-1.0.0/tests/samples/amb_two_lockfiles/package.json +8 -0
- prodpilot-1.0.0/tests/samples/amb_two_lockfiles/src/server.js +3 -0
- prodpilot-1.0.0/tests/samples/amb_two_lockfiles/yarn.lock +1 -0
- prodpilot-1.0.0/tests/samples/amb_two_roots/package.json +8 -0
- prodpilot-1.0.0/tests/samples/amb_two_roots/src/server.js +7 -0
- prodpilot-1.0.0/tests/samples/amb_unnamed_secret/package.json +8 -0
- prodpilot-1.0.0/tests/samples/amb_unnamed_secret/src/server.js +11 -0
- prodpilot-1.0.0/tests/samples/ambiguous_fullstack/package.json +17 -0
- prodpilot-1.0.0/tests/samples/ambiguous_fullstack/server.js +4 -0
- prodpilot-1.0.0/tests/samples/docker_ok/Dockerfile +6 -0
- prodpilot-1.0.0/tests/samples/docker_ok/package.json +9 -0
- prodpilot-1.0.0/tests/samples/docker_ok/server.js +15 -0
- prodpilot-1.0.0/tests/samples/node_express_api/package.json +18 -0
- prodpilot-1.0.0/tests/samples/node_express_api/src/server.js +8 -0
- prodpilot-1.0.0/tests/samples/node_express_gated/.dockerignore +4 -0
- prodpilot-1.0.0/tests/samples/node_express_gated/.env.example +2 -0
- prodpilot-1.0.0/tests/samples/node_express_gated/.github/workflows/deploy.yml +9 -0
- prodpilot-1.0.0/tests/samples/node_express_gated/.gitignore +4 -0
- prodpilot-1.0.0/tests/samples/node_express_gated/Dockerfile +14 -0
- prodpilot-1.0.0/tests/samples/node_express_gated/package.json +22 -0
- prodpilot-1.0.0/tests/samples/node_express_gated/src/server.js +51 -0
- prodpilot-1.0.0/tests/samples/node_express_hardened/.env.example +5 -0
- prodpilot-1.0.0/tests/samples/node_express_hardened/package.json +17 -0
- prodpilot-1.0.0/tests/samples/node_express_hardened/src/db/pool.js +10 -0
- prodpilot-1.0.0/tests/samples/node_express_hardened/src/logger.js +9 -0
- prodpilot-1.0.0/tests/samples/node_express_hardened/src/routes/orderRoutes.js +8 -0
- prodpilot-1.0.0/tests/samples/node_express_hardened/src/server.js +41 -0
- prodpilot-1.0.0/tests/samples/node_express_insecure/package.json +15 -0
- prodpilot-1.0.0/tests/samples/node_express_insecure/src/controllers/invoiceController.js +8 -0
- prodpilot-1.0.0/tests/samples/node_express_insecure/src/routes/invoiceRoutes.js +11 -0
- prodpilot-1.0.0/tests/samples/node_express_insecure/src/server.js +23 -0
- prodpilot-1.0.0/tests/samples/node_express_ready/.dockerignore +4 -0
- prodpilot-1.0.0/tests/samples/node_express_ready/.github/workflows/deploy.yml +10 -0
- prodpilot-1.0.0/tests/samples/node_express_ready/.gitignore +3 -0
- prodpilot-1.0.0/tests/samples/node_express_ready/Dockerfile +14 -0
- prodpilot-1.0.0/tests/samples/node_express_ready/package.json +12 -0
- prodpilot-1.0.0/tests/samples/node_express_ready/src/server.js +9 -0
- prodpilot-1.0.0/tests/samples/node_express_secrets/package.json +6 -0
- prodpilot-1.0.0/tests/samples/node_express_secrets/src/config.js +8 -0
- prodpilot-1.0.0/tests/samples/node_express_secure/package.json +15 -0
- prodpilot-1.0.0/tests/samples/node_express_secure/src/controllers/userController.js +12 -0
- prodpilot-1.0.0/tests/samples/node_express_secure/src/routes/userRoutes.js +8 -0
- prodpilot-1.0.0/tests/samples/node_express_secure/src/server.js +22 -0
- prodpilot-1.0.0/tests/samples/node_express_secure/src/services/userService.js +7 -0
- prodpilot-1.0.0/tests/samples/node_express_wildcard/package.json +6 -0
- prodpilot-1.0.0/tests/samples/node_express_wildcard/src/server.js +10 -0
- prodpilot-1.0.0/tests/samples/react_vite_app/package.json +20 -0
- prodpilot-1.0.0/tests/samples/react_vite_app/src/main.jsx +4 -0
- prodpilot-1.0.0/tests/samples/react_vite_app/vite.config.js +6 -0
- prodpilot-1.0.0/tests/samples/react_vite_hardened/.env.example +2 -0
- prodpilot-1.0.0/tests/samples/react_vite_hardened/package.json +13 -0
- prodpilot-1.0.0/tests/samples/react_vite_hardened/src/ErrorBoundary.jsx +23 -0
- prodpilot-1.0.0/tests/samples/react_vite_hardened/src/api.js +6 -0
- prodpilot-1.0.0/tests/samples/react_vite_hardened/src/main.jsx +23 -0
- prodpilot-1.0.0/tests/samples/react_vite_hardened/vite.config.js +4 -0
- prodpilot-1.0.0/tests/samples/react_vite_noroute/package.json +13 -0
- prodpilot-1.0.0/tests/samples/react_vite_noroute/src/routes.jsx +12 -0
- prodpilot-1.0.0/tests/samples/react_vite_noroute/vite.config.js +3 -0
- prodpilot-1.0.0/tests/samples/react_vite_ready/.dockerignore +4 -0
- prodpilot-1.0.0/tests/samples/react_vite_ready/.github/workflows/deploy.yml +10 -0
- prodpilot-1.0.0/tests/samples/react_vite_ready/.gitignore +4 -0
- prodpilot-1.0.0/tests/samples/react_vite_ready/Dockerfile +13 -0
- prodpilot-1.0.0/tests/samples/react_vite_ready/nginx.conf +22 -0
- prodpilot-1.0.0/tests/samples/react_vite_ready/package.json +13 -0
- prodpilot-1.0.0/tests/samples/react_vite_ready/src/main.jsx +8 -0
- prodpilot-1.0.0/tests/samples/react_vite_ready/vite.config.js +4 -0
- prodpilot-1.0.0/tests/samples/react_vite_ts_config/package.json +19 -0
- prodpilot-1.0.0/tests/samples/react_vite_ts_config/src/main.tsx +8 -0
- prodpilot-1.0.0/tests/samples/react_vite_ts_config/vite.config.ts +9 -0
- prodpilot-1.0.0/tests/samples/unrecognized_python_service/app.py +8 -0
- prodpilot-1.0.0/tests/samples/unrecognized_python_service/pyproject.toml +5 -0
- prodpilot-1.0.0/tests/samples/vite_without_react/package.json +17 -0
- prodpilot-1.0.0/tests/samples/vite_without_react/src/main.js +5 -0
- prodpilot-1.0.0/tests/samples/vite_without_react/vite.config.js +6 -0
- prodpilot-1.0.0/tests/test_astchecks.py +700 -0
- prodpilot-1.0.0/tests/test_audit.py +323 -0
- prodpilot-1.0.0/tests/test_builds.py +261 -0
- prodpilot-1.0.0/tests/test_buildtest.py +631 -0
- prodpilot-1.0.0/tests/test_cicd.py +721 -0
- prodpilot-1.0.0/tests/test_clients.py +172 -0
- prodpilot-1.0.0/tests/test_config_secrets.py +375 -0
- prodpilot-1.0.0/tests/test_connect.py +257 -0
- prodpilot-1.0.0/tests/test_constraints.py +526 -0
- prodpilot-1.0.0/tests/test_dataset.py +598 -0
- prodpilot-1.0.0/tests/test_detect_stack_tool.py +167 -0
- prodpilot-1.0.0/tests/test_detection.py +215 -0
- prodpilot-1.0.0/tests/test_dispatch.py +471 -0
- prodpilot-1.0.0/tests/test_env_keys.py +77 -0
- prodpilot-1.0.0/tests/test_extraction.py +592 -0
- prodpilot-1.0.0/tests/test_features.py +514 -0
- prodpilot-1.0.0/tests/test_filechecks.py +460 -0
- prodpilot-1.0.0/tests/test_fix_tools.py +348 -0
- prodpilot-1.0.0/tests/test_gate.py +813 -0
- prodpilot-1.0.0/tests/test_gh.py +467 -0
- prodpilot-1.0.0/tests/test_handshake.py +97 -0
- prodpilot-1.0.0/tests/test_labels.py +1026 -0
- prodpilot-1.0.0/tests/test_loop.py +426 -0
- prodpilot-1.0.0/tests/test_negatives.py +306 -0
- prodpilot-1.0.0/tests/test_packaged_model.py +49 -0
- prodpilot-1.0.0/tests/test_pipeline.py +87 -0
- prodpilot-1.0.0/tests/test_preflight.py +440 -0
- prodpilot-1.0.0/tests/test_prereqs.py +94 -0
- prodpilot-1.0.0/tests/test_prodpush.py +603 -0
- prodpilot-1.0.0/tests/test_provider.py +505 -0
- prodpilot-1.0.0/tests/test_push.py +462 -0
- prodpilot-1.0.0/tests/test_reaudit.py +330 -0
- prodpilot-1.0.0/tests/test_render.py +780 -0
- prodpilot-1.0.0/tests/test_rules.py +348 -0
- prodpilot-1.0.0/tests/test_scoring.py +385 -0
- prodpilot-1.0.0/tests/test_sealing.py +393 -0
- prodpilot-1.0.0/tests/test_smoke.py +450 -0
- prodpilot-1.0.0/tests/test_stdio_roundtrip.py +130 -0
- prodpilot-1.0.0/tests/test_templates.py +455 -0
- prodpilot-1.0.0/tests/test_training.py +647 -0
- prodpilot-1.0.0/tests/test_verify.py +646 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
# Publishes to PyPI when a version tag such as v1.0.0rc1 is pushed. It uses
|
|
4
|
+
# PyPI's trusted publishing, so no PyPI token is stored anywhere: the project
|
|
5
|
+
# must first be registered on PyPI with this repository and this workflow as
|
|
6
|
+
# its trusted publisher, and the pypi environment created in the repository.
|
|
7
|
+
|
|
8
|
+
on:
|
|
9
|
+
push:
|
|
10
|
+
tags: ["v*"]
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
build:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v4
|
|
17
|
+
|
|
18
|
+
- uses: actions/setup-python@v5
|
|
19
|
+
with:
|
|
20
|
+
python-version: "3.11"
|
|
21
|
+
|
|
22
|
+
- name: Refuse a tag that does not match the package version
|
|
23
|
+
run: |
|
|
24
|
+
version=$(python -c "import tomllib; print(tomllib.load(open('pyproject.toml', 'rb'))['project']['version'])")
|
|
25
|
+
if [ "v$version" != "$GITHUB_REF_NAME" ]; then
|
|
26
|
+
echo "tag $GITHUB_REF_NAME does not match version $version in pyproject.toml"
|
|
27
|
+
exit 1
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
- name: Build
|
|
31
|
+
run: |
|
|
32
|
+
python -m pip install build
|
|
33
|
+
python -m build
|
|
34
|
+
|
|
35
|
+
- uses: actions/upload-artifact@v4
|
|
36
|
+
with:
|
|
37
|
+
name: dist
|
|
38
|
+
path: dist/
|
|
39
|
+
|
|
40
|
+
publish:
|
|
41
|
+
needs: build
|
|
42
|
+
runs-on: ubuntu-latest
|
|
43
|
+
environment: pypi
|
|
44
|
+
permissions:
|
|
45
|
+
id-token: write
|
|
46
|
+
steps:
|
|
47
|
+
- uses: actions/download-artifact@v4
|
|
48
|
+
with:
|
|
49
|
+
name: dist
|
|
50
|
+
path: dist/
|
|
51
|
+
|
|
52
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
53
|
+
with:
|
|
54
|
+
# A re-run of a tag whose files are already on PyPI passes instead of
|
|
55
|
+
# failing, because a version can never be uploaded twice.
|
|
56
|
+
skip-existing: true
|
|
57
|
+
# Each file is signed as built by this workflow, so anyone can check
|
|
58
|
+
# where it came from.
|
|
59
|
+
attestations: true
|
|
60
|
+
|
|
61
|
+
# The GitHub release is made from the tag, so a tag push is all it takes to
|
|
62
|
+
# publish. Its notes are the section this version already has in CHANGELOG.md.
|
|
63
|
+
release:
|
|
64
|
+
needs: publish
|
|
65
|
+
runs-on: ubuntu-latest
|
|
66
|
+
permissions:
|
|
67
|
+
contents: write
|
|
68
|
+
steps:
|
|
69
|
+
- uses: actions/checkout@v4
|
|
70
|
+
|
|
71
|
+
- uses: actions/download-artifact@v4
|
|
72
|
+
with:
|
|
73
|
+
name: dist
|
|
74
|
+
path: dist/
|
|
75
|
+
|
|
76
|
+
- name: Take the notes for this version out of the changelog
|
|
77
|
+
run: |
|
|
78
|
+
python - <<'PY' > notes.md
|
|
79
|
+
import os, pathlib, re
|
|
80
|
+
version = os.environ["GITHUB_REF_NAME"].lstrip("v")
|
|
81
|
+
text = pathlib.Path("CHANGELOG.md").read_text(encoding="utf-8")
|
|
82
|
+
found = re.search(rf"^## {re.escape(version)}(?:,[^\n]*)?\n(.*?)(?=^## |\Z)",
|
|
83
|
+
text, re.S | re.M)
|
|
84
|
+
print((found.group(1).strip() if found else
|
|
85
|
+
f"ProdPilot {version}.").strip())
|
|
86
|
+
PY
|
|
87
|
+
test -s notes.md
|
|
88
|
+
|
|
89
|
+
- name: Create the release
|
|
90
|
+
env:
|
|
91
|
+
GH_TOKEN: ${{ github.token }}
|
|
92
|
+
run: |
|
|
93
|
+
case "$GITHUB_REF_NAME" in
|
|
94
|
+
*rc*|*a[0-9]*|*b[0-9]*) pre="--prerelease" ;;
|
|
95
|
+
*) pre="" ;;
|
|
96
|
+
esac
|
|
97
|
+
gh release create "$GITHUB_REF_NAME" dist/* \
|
|
98
|
+
--title "ProdPilot $GITHUB_REF_NAME" --notes-file notes.md $pre
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
name: Tests
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
test:
|
|
10
|
+
strategy:
|
|
11
|
+
fail-fast: false
|
|
12
|
+
matrix:
|
|
13
|
+
# Linux runs the Docker tests against the runner's daemon. macOS and
|
|
14
|
+
# Windows runners have no Docker daemon, so those tests skip there, as
|
|
15
|
+
# they do on any machine without one. Windows is here because ProdPilot
|
|
16
|
+
# is developed on it, so it is the platform most users of this code see.
|
|
17
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
18
|
+
python: ["3.11", "3.12", "3.13", "3.14"]
|
|
19
|
+
runs-on: ${{ matrix.os }}
|
|
20
|
+
steps:
|
|
21
|
+
- uses: actions/checkout@v4
|
|
22
|
+
|
|
23
|
+
- uses: actions/setup-python@v5
|
|
24
|
+
with:
|
|
25
|
+
python-version: ${{ matrix.python }}
|
|
26
|
+
|
|
27
|
+
- uses: actions/setup-node@v4
|
|
28
|
+
with:
|
|
29
|
+
node-version: "20"
|
|
30
|
+
|
|
31
|
+
- name: Give git an identity for the commits the tests make
|
|
32
|
+
run: |
|
|
33
|
+
git config --global user.name "ProdPilot CI"
|
|
34
|
+
git config --global user.email "ci@prodpilot.invalid"
|
|
35
|
+
git config --global init.defaultBranch main
|
|
36
|
+
|
|
37
|
+
- name: Install
|
|
38
|
+
run: python -m pip install -e . pytest pytest-asyncio
|
|
39
|
+
|
|
40
|
+
- name: Test
|
|
41
|
+
run: python -m pytest -q
|
|
42
|
+
|
|
43
|
+
# What a user gets from pip, checked on all three systems: the wheel installs
|
|
44
|
+
# outside the repository, the command runs, and the shipped model loads.
|
|
45
|
+
package:
|
|
46
|
+
strategy:
|
|
47
|
+
fail-fast: false
|
|
48
|
+
matrix:
|
|
49
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
50
|
+
runs-on: ${{ matrix.os }}
|
|
51
|
+
steps:
|
|
52
|
+
- uses: actions/checkout@v4
|
|
53
|
+
|
|
54
|
+
- uses: actions/setup-python@v5
|
|
55
|
+
with:
|
|
56
|
+
python-version: "3.11"
|
|
57
|
+
|
|
58
|
+
- name: Build the wheel and the source distribution
|
|
59
|
+
run: |
|
|
60
|
+
python -m pip install build
|
|
61
|
+
python -m build
|
|
62
|
+
|
|
63
|
+
- name: Install the wheel outside the repository and load the shipped model
|
|
64
|
+
shell: bash
|
|
65
|
+
run: |
|
|
66
|
+
python -m venv "$RUNNER_TEMP/user"
|
|
67
|
+
bin="$RUNNER_TEMP/user/bin"
|
|
68
|
+
[ -d "$bin" ] || bin="$RUNNER_TEMP/user/Scripts"
|
|
69
|
+
"$bin/python" -m pip install --quiet dist/*.whl
|
|
70
|
+
cd "$RUNNER_TEMP"
|
|
71
|
+
"$bin/prodpilot" --help
|
|
72
|
+
"$bin/python" -c "from prodpilot import scoring; m = scoring.load(); print('model loaded, operating point', m.threshold)"
|
|
73
|
+
|
|
74
|
+
- uses: actions/upload-artifact@v4
|
|
75
|
+
if: matrix.os == 'ubuntu-latest'
|
|
76
|
+
with:
|
|
77
|
+
name: dist
|
|
78
|
+
path: dist/
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
__pycache__/
|
|
2
|
+
*.py[cod]
|
|
3
|
+
*.egg-info/
|
|
4
|
+
build/
|
|
5
|
+
dist/
|
|
6
|
+
|
|
7
|
+
.venv/
|
|
8
|
+
venv/
|
|
9
|
+
env/
|
|
10
|
+
|
|
11
|
+
.pytest_cache/
|
|
12
|
+
.coverage
|
|
13
|
+
htmlcov/
|
|
14
|
+
|
|
15
|
+
.env
|
|
16
|
+
.env.*
|
|
17
|
+
!.env.example
|
|
18
|
+
|
|
19
|
+
.DS_Store
|
|
20
|
+
Thumbs.db
|
|
21
|
+
|
|
22
|
+
# Vendored JavaScript parser. The dist rule above matches acorn's build
|
|
23
|
+
# directory, which would drop the parser itself from both the repository and
|
|
24
|
+
# the wheel and ship a package that cannot parse anything.
|
|
25
|
+
!src/prodpilot/vendor/node_modules/acorn/dist/
|
|
26
|
+
!src/prodpilot/vendor/**
|
|
27
|
+
|
|
28
|
+
# Phase 5 dataset. Manifest and cache only, never committed.
|
|
29
|
+
data/
|
|
30
|
+
|
|
31
|
+
# Retired and superseded data files, kept locally rather than deleted.
|
|
32
|
+
backup/
|
|
33
|
+
|
|
34
|
+
# Devin project-local MCP config: holds a path that only works on one machine
|
|
35
|
+
.devin/mcp_config.local.json
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 1.0.0, 20 September 2026
|
|
4
|
+
|
|
5
|
+
The first stable release. What changed is what the project now promises, how
|
|
6
|
+
widely it is tested, and two faults that running the suite on Windows for the
|
|
7
|
+
first time uncovered.
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- A Docker daemon in Windows container mode was reported as available, and
|
|
12
|
+
every build then failed with "no matching manifest for windows/amd64" and no
|
|
13
|
+
classification. ProdPilot now says the daemon runs Windows containers and
|
|
14
|
+
that its images are Linux, which names what to change.
|
|
15
|
+
- On Windows, the credential file was reported as readable by other accounts
|
|
16
|
+
when the only entries left were SYSTEM, the Administrators group and OWNER
|
|
17
|
+
RIGHTS. The first two read every file on the machine whatever a file's
|
|
18
|
+
entries say, and they survive breaking inheritance on an account that is an
|
|
19
|
+
administrator, so the warning could not be acted on; they are now expected
|
|
20
|
+
and named in the report. OWNER RIGHTS is not an account at all, but a bound
|
|
21
|
+
on what the file's owner may do, so it is not counted. Any other account on
|
|
22
|
+
the file is still a fault.
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
|
|
26
|
+
- [docs/stability.md](docs/stability.md): what 1.x keeps stable. The five tool
|
|
27
|
+
names and their fields, the rule identifiers, the commands and their flags,
|
|
28
|
+
where credentials live, and the gate's three conditions. It also says what is
|
|
29
|
+
not promised, including the score a given project receives, the number of
|
|
30
|
+
rules and the model's estimates.
|
|
31
|
+
- The test workflow runs on Windows as well as Linux and macOS, so the platform
|
|
32
|
+
ProdPilot is developed on is covered by its own suite.
|
|
33
|
+
- The packaged wheel is installed outside the repository on all three systems,
|
|
34
|
+
and the shipped model is loaded there, so what `pip install prodpilot` gives
|
|
35
|
+
a user is checked on each of them.
|
|
36
|
+
- Files published to PyPI carry attestations, so anyone can check that they
|
|
37
|
+
were built by this repository's release workflow.
|
|
38
|
+
|
|
39
|
+
### Known limits
|
|
40
|
+
|
|
41
|
+
These are unchanged from the release candidates and are stated here rather than
|
|
42
|
+
dropped:
|
|
43
|
+
|
|
44
|
+
- Supported stacks are Node.js with Express and React with Vite; the only
|
|
45
|
+
deployment target is Render.
|
|
46
|
+
- How often a live agent's delegated fix passes verification has not been
|
|
47
|
+
measured across the six delegated rules.
|
|
48
|
+
- Not yet observed end to end on a real service: the deploy tool called by an
|
|
49
|
+
IDE agent, and the CI/CD workflow ProdPilot writes redeploying a live service
|
|
50
|
+
from GitHub Actions. The nine stages and the generated workflow are covered
|
|
51
|
+
by the suite against scripted APIs.
|
|
52
|
+
- Render's own automatic deploy stays on, so a push can start a second deploy
|
|
53
|
+
beside the workflow's; the workflow waits for the newer one.
|
|
54
|
+
|
|
55
|
+
## 1.0.0rc2, 20 September 2026
|
|
56
|
+
|
|
57
|
+
A packaging and documentation release. The code is the same as 1.0.0rc1.
|
|
58
|
+
|
|
59
|
+
### Fixed
|
|
60
|
+
|
|
61
|
+
- The description on PyPI said the release was not on PyPI yet, because that
|
|
62
|
+
was true when 1.0.0rc1 was built. A description can only be corrected by
|
|
63
|
+
publishing again, which is what this version is for.
|
|
64
|
+
|
|
65
|
+
### Changed
|
|
66
|
+
|
|
67
|
+
- The install table names pip beside pipx and uv, and says why pipx and uv are
|
|
68
|
+
recommended for a command line tool.
|
|
69
|
+
- Tagging now publishes on its own: the release workflow creates the GitHub
|
|
70
|
+
release after the upload, with the notes this changelog already holds for the
|
|
71
|
+
version, the wheel and the sdist attached, and a candidate marked as a
|
|
72
|
+
pre-release. An upload skips files already on PyPI, so a re-run of a tag no
|
|
73
|
+
longer fails.
|
|
74
|
+
|
|
75
|
+
## 1.0.0rc1, 20 September 2026
|
|
76
|
+
|
|
77
|
+
The first release candidate, prepared for a beta with outside users.
|
|
78
|
+
|
|
79
|
+
### Added
|
|
80
|
+
|
|
81
|
+
- The MCP server with five tools: stack detection with production blueprints,
|
|
82
|
+
fix instructions and independent verification of applied fixes for fifty
|
|
83
|
+
rules, and ProdPush, which takes a project that passes the scoring gate to a
|
|
84
|
+
live, smoke tested Render service with an active CI/CD pipeline.
|
|
85
|
+
- `prodpilot connect vscode|cursor|devin`, which connects each IDE's agent to
|
|
86
|
+
the installed ProdPilot in the place that IDE documents.
|
|
87
|
+
- `prodpilot doctor` now checks git, Node.js and the Docker daemon.
|
|
88
|
+
- Tool annotations: four tools are marked read only and the deploy tool as
|
|
89
|
+
changing its environment.
|
|
90
|
+
- LICENSE, SECURITY.md, third-party notices, a test workflow and a release
|
|
91
|
+
workflow for PyPI trusted publishing.
|
|
92
|
+
|
|
93
|
+
### Changed
|
|
94
|
+
|
|
95
|
+
- The gate's model ships inside the package, so an installed ProdPilot has
|
|
96
|
+
one; scikit-learn is pinned to 1.9.0, the version that saved it.
|
|
97
|
+
- Runs on Python 3.11 to 3.14, where it was 3.11 only. The full suite passes
|
|
98
|
+
on 3.11, 3.13 and 3.14 on Windows with a Docker daemon; 3.12 is covered by
|
|
99
|
+
the test workflow.
|
|
100
|
+
- The CI/CD workflow ProdPilot writes waits for the deploy it started before
|
|
101
|
+
checking the service, instead of a fixed 90 second wait.
|
|
102
|
+
- Content fixes declare the environment keys they read, so a CORS fix no
|
|
103
|
+
longer breaks the environment template and gets reverted.
|
|
104
|
+
|
|
105
|
+
### Fixed
|
|
106
|
+
|
|
107
|
+
- A failed Docker build kept none of its output, because the build log was read
|
|
108
|
+
twice from a one-pass generator; its summary now names the cause.
|
|
109
|
+
|
|
110
|
+
### Known limits
|
|
111
|
+
|
|
112
|
+
- Supported stacks are Node.js with Express and React with Vite; the only
|
|
113
|
+
deployment target is Render.
|
|
114
|
+
- How often a live agent's delegated fix passes verification has not been
|
|
115
|
+
measured.
|
|
116
|
+
- Not yet observed on real services: the deploy tool called by an IDE agent,
|
|
117
|
+
the new workflow on GitHub Actions, and `prodpilot connect` in the real
|
|
118
|
+
clients.
|
|
119
|
+
- Render's own automatic deploy stays on, so a push can start a second deploy
|
|
120
|
+
beside the workflow's; the workflow waits for the newer one.
|
prodpilot-1.0.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Muhammad Sudais Khalid, Muhammad Farooq Khan, Muhammad Talha Khan
|
|
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.
|
prodpilot-1.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: prodpilot
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: A layered MCP-based system for automated production readiness and deployment of vibe-coded projects.
|
|
5
|
+
Project-URL: Homepage, https://github.com/prodpilotai/ProdPilot
|
|
6
|
+
Project-URL: Repository, https://github.com/prodpilotai/ProdPilot
|
|
7
|
+
Project-URL: Documentation, https://github.com/prodpilotai/ProdPilot/blob/main/docs/quickstart.md
|
|
8
|
+
Project-URL: Changelog, https://github.com/prodpilotai/ProdPilot/blob/main/CHANGELOG.md
|
|
9
|
+
Project-URL: Issues, https://github.com/prodpilotai/ProdPilot/issues
|
|
10
|
+
Author-email: Muhammad Sudais Khalid <msudaiskhalid.ai@gmail.com>, Muhammad Farooq Khan <farooqhoi52@gmail.com>, Muhammad Talha Khan <hotikhanbhai@gmail.com>
|
|
11
|
+
License: MIT
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
Keywords: audit,ci-cd,deployment,devops,mcp,production-readiness,render
|
|
14
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
15
|
+
Classifier: Environment :: Console
|
|
16
|
+
Classifier: Intended Audience :: Developers
|
|
17
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
18
|
+
Classifier: Operating System :: OS Independent
|
|
19
|
+
Classifier: Programming Language :: Python :: 3
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
24
|
+
Classifier: Topic :: Software Development :: Build Tools
|
|
25
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
26
|
+
Classifier: Topic :: System :: Installation/Setup
|
|
27
|
+
Requires-Python: <3.15,>=3.11
|
|
28
|
+
Requires-Dist: docker>=7.0.0
|
|
29
|
+
Requires-Dist: joblib>=1.4.0
|
|
30
|
+
Requires-Dist: mcp>=2.0.0
|
|
31
|
+
Requires-Dist: pynacl>=1.5.0
|
|
32
|
+
Requires-Dist: scikit-learn==1.9.0
|
|
33
|
+
Requires-Dist: tomli-w>=1.0.0
|
|
34
|
+
Requires-Dist: typer>=0.16.0
|
|
35
|
+
Description-Content-Type: text/markdown
|
|
36
|
+
|
|
37
|
+
# ProdPilot
|
|
38
|
+
|
|
39
|
+
**Takes a web app you built with an AI coding assistant from "it works on my machine" to a live, verified deployment, without leaving your IDE.**
|
|
40
|
+
|
|
41
|
+
[](https://github.com/prodpilotai/ProdPilot/actions/workflows/tests.yml)
|
|
42
|
+
[](pyproject.toml)
|
|
43
|
+
[](LICENSE)
|
|
44
|
+
[](CHANGELOG.md)
|
|
45
|
+
|
|
46
|
+
AI coding assistants make it quick to build a Node.js API or a React app that
|
|
47
|
+
runs on your laptop. Getting it to run in production is where it breaks:
|
|
48
|
+
credentials hardcoded in the source, no security headers, no container setup,
|
|
49
|
+
no health check, and a deploy that fails with an error you have never seen.
|
|
50
|
+
|
|
51
|
+
ProdPilot finds those gaps, has your IDE's own coding agent fix them one at a
|
|
52
|
+
time, checks every fix itself, and deploys the project to Render with a CI/CD
|
|
53
|
+
pipeline once it is ready. It works as a Model Context Protocol (MCP) server: a
|
|
54
|
+
small program on your machine that the agent in VS Code with GitHub Copilot,
|
|
55
|
+
Cursor or Devin can call as a set of tools. ProdPilot calls no AI service
|
|
56
|
+
itself.
|
|
57
|
+
|
|
58
|
+
It is for developers building **Node.js with Express** APIs or **React with
|
|
59
|
+
Vite** apps who want them deployed properly, not just deployed.
|
|
60
|
+
|
|
61
|
+
## Features
|
|
62
|
+
|
|
63
|
+
- **A production audit of 50 rules** across security, secrets, environment,
|
|
64
|
+
build, connectivity, API, structure, observability and git hygiene, scored
|
|
65
|
+
from 0 to 100.
|
|
66
|
+
- **Fixes your agent applies and ProdPilot verifies.** The agent reports a
|
|
67
|
+
fix; ProdPilot re-runs that rule's own check on your files and decides. A fix
|
|
68
|
+
that breaks something that already worked is undone.
|
|
69
|
+
- **Predictable changes.** 44 of the 50 rules come with an exact change for the
|
|
70
|
+
agent to apply; only 6 ask it to write code, inside limits ProdPilot sets.
|
|
71
|
+
- **A gate that asks whether it will really deploy.** A score of at least 90,
|
|
72
|
+
no critical failures, and an estimate from a model trained on 684 real Render
|
|
73
|
+
deployments.
|
|
74
|
+
- **Deployment in one call.** Nine stages, from a local Docker build to a live,
|
|
75
|
+
smoke tested Render service with a GitHub Actions pipeline. It stops at the
|
|
76
|
+
first stage that fails and tells you why.
|
|
77
|
+
- **Your credentials stay yours.** They live in a file only your account can
|
|
78
|
+
read, never in the project, and repository secrets are encrypted before they
|
|
79
|
+
leave your machine.
|
|
80
|
+
- **Works in the IDE you already use.** One command connects VS Code, Cursor or
|
|
81
|
+
Devin, formerly Windsurf.
|
|
82
|
+
|
|
83
|
+
## Quick start
|
|
84
|
+
|
|
85
|
+
You need Python 3.11 to 3.14, Node.js 20 or later, Docker running, git, a
|
|
86
|
+
GitHub token and a Render API key.
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
pipx install prodpilot # 1. install
|
|
90
|
+
prodpilot setup # 2. store your GitHub token and Render API key
|
|
91
|
+
prodpilot connect vscode # 3. connect your IDE: vscode, cursor, or devin --project PATH
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
To pin the version, ask for `prodpilot==1.0.0`.
|
|
95
|
+
|
|
96
|
+
Then check that everything ProdPilot needs is in place:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
prodpilot doctor
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
```text
|
|
103
|
+
ProdPilot doctor
|
|
104
|
+
|
|
105
|
+
Config file: ~/.prodpilot/config.toml
|
|
106
|
+
found
|
|
107
|
+
github_token: stored
|
|
108
|
+
render_api_key: stored
|
|
109
|
+
permissions: access is limited to the current user
|
|
110
|
+
|
|
111
|
+
Tools ProdPilot runs:
|
|
112
|
+
git: git version 2.54.0.windows.1
|
|
113
|
+
Node.js: v26.3.0
|
|
114
|
+
Docker: daemon 29.7.2
|
|
115
|
+
|
|
116
|
+
All checks passed.
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
In VS Code, run **MCP: List Servers** and start `prodpilot`. Open your project
|
|
120
|
+
and ask the agent:
|
|
121
|
+
|
|
122
|
+
> Use ProdPilot to audit this project and fix what it reports, one rule at a time.
|
|
123
|
+
|
|
124
|
+
## Installation
|
|
125
|
+
|
|
126
|
+
| Method | Command |
|
|
127
|
+
| --- | --- |
|
|
128
|
+
| pipx, recommended | `pipx install prodpilot` |
|
|
129
|
+
| uv | `uv tool install prodpilot` |
|
|
130
|
+
| pip | `pip install prodpilot` |
|
|
131
|
+
| From source | `git clone https://github.com/prodpilotai/ProdPilot && cd ProdPilot && pip install .` |
|
|
132
|
+
|
|
133
|
+
`pip install prodpilot` works and is the shortest route. pipx and uv are
|
|
134
|
+
recommended because ProdPilot is a command line tool: they keep it and its
|
|
135
|
+
dependencies in their own environment, so it cannot clash with the packages of
|
|
136
|
+
whatever project you are working on. That matters here because ProdPilot pins
|
|
137
|
+
scikit-learn to the version that saved the model it ships, which only that
|
|
138
|
+
version is guaranteed to read.
|
|
139
|
+
|
|
140
|
+
Check the install with `prodpilot --help`, which lists `serve`, `setup`,
|
|
141
|
+
`doctor` and `connect`.
|
|
142
|
+
|
|
143
|
+
| Requirement | Why |
|
|
144
|
+
| --- | --- |
|
|
145
|
+
| Python 3.11, 3.12, 3.13 or 3.14 | ProdPilot itself |
|
|
146
|
+
| Node.js 20 or later | The audit parses your JavaScript with Node |
|
|
147
|
+
| Docker, running | The gate and the deploy build your project in a container first |
|
|
148
|
+
| git, and a GitHub repository set as the project's `origin` | Deploys push the files ProdPilot generated |
|
|
149
|
+
| A GitHub token | A classic token with the `repo` and `workflow` scopes, or a fine grained one with read and write access to contents, secrets and workflows |
|
|
150
|
+
| A Render account and API key | Render is where the project is deployed |
|
|
151
|
+
|
|
152
|
+
ProdPilot is developed on Windows 11, and its test workflow runs the suite on
|
|
153
|
+
Linux, macOS and Windows for Python 3.11 to 3.14. The same workflow installs
|
|
154
|
+
the built wheel outside the repository on all three systems and loads the
|
|
155
|
+
shipped model, which is what `pip install prodpilot` gives you.
|
|
156
|
+
|
|
157
|
+
## Usage
|
|
158
|
+
|
|
159
|
+
### Audit and fix
|
|
160
|
+
|
|
161
|
+
> Use ProdPilot to audit this project and fix what it reports, one rule at a
|
|
162
|
+
> time, reporting each fix with prodpilot_fix_applied.
|
|
163
|
+
|
|
164
|
+
The agent asks ProdPilot for the exact change each failing rule needs, applies
|
|
165
|
+
it, and reports back. ProdPilot re-runs the rule's check and answers
|
|
166
|
+
`resolved`, `unresolved` or `blocked`, whatever the agent claimed. On one of
|
|
167
|
+
the deliberately broken sample projects in this repository, the first audit
|
|
168
|
+
scores 13 out of 100 with 6 critical failures; after the fix loop it scores 96
|
|
169
|
+
with none.
|
|
170
|
+
|
|
171
|
+
### Deploy
|
|
172
|
+
|
|
173
|
+
Commit your changes, then:
|
|
174
|
+
|
|
175
|
+
> Deploy this project with prodpilot_deploy.
|
|
176
|
+
|
|
177
|
+
The deploy creates a real Render service on the free plan and pushes to your
|
|
178
|
+
GitHub repository, so the agent is told to confirm with you first. You get a
|
|
179
|
+
live URL and a GitHub Actions workflow that redeploys on every push and checks
|
|
180
|
+
the service afterwards. A small Express API that the fix loop took from 69 to
|
|
181
|
+
100 went live on Render this way, all nine stages passing, in 82 seconds.
|
|
182
|
+
|
|
183
|
+
### When something is refused
|
|
184
|
+
|
|
185
|
+
ProdPilot always says which condition failed. These are real messages:
|
|
186
|
+
|
|
187
|
+
```text
|
|
188
|
+
score 89 but 1 critical rule(s) still fail: SEC-003
|
|
189
|
+
score 99 meets the threshold, but the model estimates a 5% chance of deploying, below its operating point of 37%
|
|
190
|
+
build failed, missing dependency: npm error The `npm ci` command can only install with an existing package-lock.json or
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## Tools and commands
|
|
194
|
+
|
|
195
|
+
The five tools your IDE's agent sees:
|
|
196
|
+
|
|
197
|
+
| Tool | What it does |
|
|
198
|
+
| --- | --- |
|
|
199
|
+
| `prodpilot_ping` | Confirms the server is running |
|
|
200
|
+
| `prodpilot_detect_stack` | Identifies the project's stack and returns what a production-ready version must contain |
|
|
201
|
+
| `prodpilot_fix_instruction` | Returns the exact change, or the limits for the change, that fixes one failing rule |
|
|
202
|
+
| `prodpilot_fix_applied` | Takes the agent's report of a fix and answers from the rule's own check |
|
|
203
|
+
| `prodpilot_deploy` | Runs the nine deploy stages; creates a real Render service and pushes to GitHub |
|
|
204
|
+
|
|
205
|
+
The commands you run:
|
|
206
|
+
|
|
207
|
+
| Command | What it does |
|
|
208
|
+
| --- | --- |
|
|
209
|
+
| `prodpilot setup` | Stores the GitHub token and Render API key in `~/.prodpilot/config.toml`, readable only by you |
|
|
210
|
+
| `prodpilot doctor [--project PATH]` | Checks the credentials, git, Node.js and Docker; with `--project`, that the project's state file is kept out of git |
|
|
211
|
+
| `prodpilot connect vscode\|cursor\|devin [--project PATH]` | Adds ProdPilot to that IDE's configuration; `--project` is for Devin, which is set up per project |
|
|
212
|
+
| `prodpilot serve` | Starts the MCP server over stdio; your IDE runs this for you |
|
|
213
|
+
|
|
214
|
+
## How it works
|
|
215
|
+
|
|
216
|
+
```mermaid
|
|
217
|
+
flowchart LR
|
|
218
|
+
A[Your project] --> B[Audit: 50 rules, score 0 to 100]
|
|
219
|
+
B --> C[Fix loop: your agent applies, ProdPilot verifies]
|
|
220
|
+
C --> B
|
|
221
|
+
C --> D{Gate: score 90 or more, no critical failure, model estimate}
|
|
222
|
+
D -- refused --> C
|
|
223
|
+
D -- cleared --> E[Deploy: 9 stages]
|
|
224
|
+
E --> F[Live on Render, with CI/CD]
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
Each rule has its own check, and a fix only counts when that check passes on
|
|
228
|
+
the files on disk. Each rule gets three attempts, and the loop runs up to five
|
|
229
|
+
times while the gate stays shut. The deploy stages are pre-flight checks,
|
|
230
|
+
environment sealing, a local Docker build and run, a push of the generated
|
|
231
|
+
files, the Render deployment, deploy monitoring, a smoke test of the live
|
|
232
|
+
service, and CI/CD wiring. The design, the model and the data behind it are in
|
|
233
|
+
[docs/architecture.md](docs/architecture.md).
|
|
234
|
+
|
|
235
|
+
## Privacy and security
|
|
236
|
+
|
|
237
|
+
- ProdPilot talks only to GitHub, Render, and, while building your project,
|
|
238
|
+
Docker Hub and the npm registry. It sends no telemetry.
|
|
239
|
+
- Your GitHub token and Render API key are stored outside every project, in a
|
|
240
|
+
file restricted to your account.
|
|
241
|
+
- Secrets go to the test container at run time, never into the image, and to
|
|
242
|
+
GitHub encrypted with your repository's public key.
|
|
243
|
+
|
|
244
|
+
Report a vulnerability privately as described in [SECURITY.md](SECURITY.md).
|
|
245
|
+
|
|
246
|
+
## Limitations
|
|
247
|
+
|
|
248
|
+
- Two stacks only: Node.js with Express, and React with Vite.
|
|
249
|
+
- One deployment target: Render, on its free plan.
|
|
250
|
+
- For the 6 rules where the agent writes the change, how often a live agent's
|
|
251
|
+
change passes on the first try has not been measured yet.
|
|
252
|
+
- A project whose code requires a file it does not contain can pass the audit;
|
|
253
|
+
the Docker build during the deploy catches it and names the missing module.
|
|
254
|
+
- Render's own automatic deploy stays on, so a push can start a second deploy
|
|
255
|
+
beside the workflow's; the workflow waits for the newer one.
|
|
256
|
+
- This is a beta. Not yet observed on real services: a deploy started by an IDE
|
|
257
|
+
agent, the generated workflow running on GitHub Actions, and `prodpilot
|
|
258
|
+
connect` inside Cursor and Devin.
|
|
259
|
+
|
|
260
|
+
## What's in 1.0.0
|
|
261
|
+
|
|
262
|
+
- The deployability model ships inside the package.
|
|
263
|
+
- `prodpilot connect` sets up VS Code, Cursor and Devin in one command.
|
|
264
|
+
- `prodpilot doctor` checks git, Node.js and Docker.
|
|
265
|
+
- The generated CI/CD workflow waits for its own deploy before checking the
|
|
266
|
+
service.
|
|
267
|
+
- Runs on Python 3.11 to 3.14.
|
|
268
|
+
|
|
269
|
+
The full list is in [CHANGELOG.md](CHANGELOG.md).
|
|
270
|
+
|
|
271
|
+
## Documentation
|
|
272
|
+
|
|
273
|
+
- [Quick start and troubleshooting](docs/quickstart.md)
|
|
274
|
+
- [Architecture: the audit, the fix loop, the gate, the model and the data](docs/architecture.md)
|
|
275
|
+
- [IDE compatibility, observed in each client](docs/compatibility.md)
|
|
276
|
+
- [The whole chain run on every sample project](docs/pipeline.md)
|
|
277
|
+
- [Measured fix reliability](docs/metrics.md)
|
|
278
|
+
- [The deployability model's evaluation](docs/evaluation.md)
|
|
279
|
+
- [What 1.x keeps stable](docs/stability.md)
|
|
280
|
+
|
|
281
|
+
## Contributing
|
|
282
|
+
|
|
283
|
+
```bash
|
|
284
|
+
git clone https://github.com/prodpilotai/ProdPilot
|
|
285
|
+
cd ProdPilot
|
|
286
|
+
python -m venv .venv
|
|
287
|
+
.venv/bin/pip install -e . --group dev # on Windows: .venv\Scripts\pip; needs pip 25.1 or later
|
|
288
|
+
.venv/bin/python -m pytest
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
The tests reach no live service: Render and GitHub are scripted. Tests that
|
|
292
|
+
build real Docker images are skipped when no Docker daemon is running. Please
|
|
293
|
+
open an issue before a large change, and run the suite before sending a pull
|
|
294
|
+
request.
|
|
295
|
+
|
|
296
|
+
Questions and bug reports go to
|
|
297
|
+
[GitHub issues](https://github.com/prodpilotai/ProdPilot/issues).
|
|
298
|
+
|
|
299
|
+
## License
|
|
300
|
+
|
|
301
|
+
MIT, see [LICENSE](LICENSE). Bundled third-party code is listed in
|
|
302
|
+
[THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).
|
|
303
|
+
|
|
304
|
+
## Credits
|
|
305
|
+
|
|
306
|
+
Built by Muhammad Sudais Khalid, Muhammad Farooq Khan and Muhammad Talha Khan
|
|
307
|
+
as the Final Year Project BSAI-FYP-2026 of the Department of Artificial
|
|
308
|
+
Intelligence, Shifa Tameer-e-Millat University, at the Artificial Intelligence
|
|
309
|
+
Technology Centre, National Centre for Physics, Islamabad. Supervised by Mr.
|
|
310
|
+
Rehan Naveed Abbasi, Muhammad Tahir with industrial supervision by Dr. Rana Fayyaz Ahmad and Muhammad Junaid Asif.
|