portlight 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.
- portlight-1.0.0/.github/workflows/ci.yml +44 -0
- portlight-1.0.0/.github/workflows/pages.yml +50 -0
- portlight-1.0.0/.github/workflows/publish.yml +31 -0
- portlight-1.0.0/.github/workflows/release-binaries.yml +80 -0
- portlight-1.0.0/.gitignore +20 -0
- portlight-1.0.0/CHANGELOG.md +27 -0
- portlight-1.0.0/LICENSE +21 -0
- portlight-1.0.0/PKG-INFO +196 -0
- portlight-1.0.0/README.es.md +173 -0
- portlight-1.0.0/README.fr.md +173 -0
- portlight-1.0.0/README.hi.md +173 -0
- portlight-1.0.0/README.it.md +173 -0
- portlight-1.0.0/README.ja.md +173 -0
- portlight-1.0.0/README.md +173 -0
- portlight-1.0.0/README.pt-BR.md +173 -0
- portlight-1.0.0/README.zh.md +173 -0
- portlight-1.0.0/SCORECARD.md +49 -0
- portlight-1.0.0/SECURITY.md +35 -0
- portlight-1.0.0/SHIP_GATE.md +82 -0
- portlight-1.0.0/artifacts/balance/balance-report.json +328 -0
- portlight-1.0.0/artifacts/balance/balance-report.md +52 -0
- portlight-1.0.0/artifacts/stress/stress-report.json +97 -0
- portlight-1.0.0/artifacts/stress/stress-report.md +18 -0
- portlight-1.0.0/docs/ALPHA_STATUS.md +80 -0
- portlight-1.0.0/docs/CAREER_PATHS.md +145 -0
- portlight-1.0.0/docs/COMMANDS.md +227 -0
- portlight-1.0.0/docs/EXAMPLE_RUNS.md +160 -0
- portlight-1.0.0/docs/FIRST_VOYAGE.md +143 -0
- portlight-1.0.0/docs/KNOWN_ISSUES.md +78 -0
- portlight-1.0.0/docs/RELEASE_NOTES_ALPHA.md +95 -0
- portlight-1.0.0/docs/START_HERE.md +116 -0
- portlight-1.0.0/docs/WHY_PORTLIGHT.md +54 -0
- portlight-1.0.0/pyproject.toml +39 -0
- portlight-1.0.0/site/astro.config.mjs +29 -0
- portlight-1.0.0/site/package-lock.json +7941 -0
- portlight-1.0.0/site/package.json +20 -0
- portlight-1.0.0/site/src/content/docs/handbook/architecture.md +61 -0
- portlight-1.0.0/site/src/content/docs/handbook/career-paths.md +58 -0
- portlight-1.0.0/site/src/content/docs/handbook/commands.md +72 -0
- portlight-1.0.0/site/src/content/docs/handbook/getting-started.md +64 -0
- portlight-1.0.0/site/src/content/docs/handbook/index.md +32 -0
- portlight-1.0.0/site/src/content/docs/handbook/trading.md +63 -0
- portlight-1.0.0/site/src/content.config.ts +4 -0
- portlight-1.0.0/site/src/pages/index.astro +33 -0
- portlight-1.0.0/site/src/site-config.ts +52 -0
- portlight-1.0.0/site/src/styles/global.css +3 -0
- portlight-1.0.0/site/src/styles/starlight-custom.css +11 -0
- portlight-1.0.0/site/tsconfig.json +5 -0
- portlight-1.0.0/src/portlight/__init__.py +3 -0
- portlight-1.0.0/src/portlight/__main__.py +5 -0
- portlight-1.0.0/src/portlight/app/__init__.py +1 -0
- portlight-1.0.0/src/portlight/app/cli.py +809 -0
- portlight-1.0.0/src/portlight/app/formatting.py +172 -0
- portlight-1.0.0/src/portlight/app/session.py +706 -0
- portlight-1.0.0/src/portlight/app/views.py +1456 -0
- portlight-1.0.0/src/portlight/balance/__init__.py +1 -0
- portlight-1.0.0/src/portlight/balance/aggregates.py +160 -0
- portlight-1.0.0/src/portlight/balance/collectors.py +210 -0
- portlight-1.0.0/src/portlight/balance/policies.py +641 -0
- portlight-1.0.0/src/portlight/balance/reporting.py +241 -0
- portlight-1.0.0/src/portlight/balance/runner.py +190 -0
- portlight-1.0.0/src/portlight/balance/scenarios.py +77 -0
- portlight-1.0.0/src/portlight/balance/types.py +202 -0
- portlight-1.0.0/src/portlight/content/__init__.py +1 -0
- portlight-1.0.0/src/portlight/content/campaign.py +386 -0
- portlight-1.0.0/src/portlight/content/contracts.py +256 -0
- portlight-1.0.0/src/portlight/content/goods.py +14 -0
- portlight-1.0.0/src/portlight/content/infrastructure.py +442 -0
- portlight-1.0.0/src/portlight/content/ports.py +178 -0
- portlight-1.0.0/src/portlight/content/routes.py +47 -0
- portlight-1.0.0/src/portlight/content/ships.py +68 -0
- portlight-1.0.0/src/portlight/content/world.py +81 -0
- portlight-1.0.0/src/portlight/engine/__init__.py +1 -0
- portlight-1.0.0/src/portlight/engine/campaign.py +1297 -0
- portlight-1.0.0/src/portlight/engine/captain_identity.py +246 -0
- portlight-1.0.0/src/portlight/engine/contracts.py +577 -0
- portlight-1.0.0/src/portlight/engine/economy.py +234 -0
- portlight-1.0.0/src/portlight/engine/infrastructure.py +1221 -0
- portlight-1.0.0/src/portlight/engine/models.py +238 -0
- portlight-1.0.0/src/portlight/engine/reputation.py +365 -0
- portlight-1.0.0/src/portlight/engine/save.py +728 -0
- portlight-1.0.0/src/portlight/engine/voyage.py +409 -0
- portlight-1.0.0/src/portlight/receipts/__init__.py +1 -0
- portlight-1.0.0/src/portlight/receipts/core.py +45 -0
- portlight-1.0.0/src/portlight/receipts/models.py +55 -0
- portlight-1.0.0/src/portlight/stress/__init__.py +1 -0
- portlight-1.0.0/src/portlight/stress/invariants.py +324 -0
- portlight-1.0.0/src/portlight/stress/reporting.py +98 -0
- portlight-1.0.0/src/portlight/stress/runner.py +157 -0
- portlight-1.0.0/src/portlight/stress/scenarios.py +148 -0
- portlight-1.0.0/src/portlight/stress/types.py +78 -0
- portlight-1.0.0/tests/__init__.py +0 -0
- portlight-1.0.0/tests/balance/__init__.py +0 -0
- portlight-1.0.0/tests/balance/test_captain_parity.py +104 -0
- portlight-1.0.0/tests/balance/test_finance_infra.py +77 -0
- portlight-1.0.0/tests/balance/test_scenarios.py +130 -0
- portlight-1.0.0/tests/balance/test_victory_paths.py +98 -0
- portlight-1.0.0/tests/stress/__init__.py +0 -0
- portlight-1.0.0/tests/stress/test_campaign_under_stress.py +227 -0
- portlight-1.0.0/tests/stress/test_invariants.py +438 -0
- portlight-1.0.0/tests/stress/test_save_load_crisis.py +395 -0
- portlight-1.0.0/tests/stress/test_scenarios.py +133 -0
- portlight-1.0.0/tests/test_brokers_licenses.py +562 -0
- portlight-1.0.0/tests/test_campaign.py +1280 -0
- portlight-1.0.0/tests/test_captain_identity.py +351 -0
- portlight-1.0.0/tests/test_contracts.py +740 -0
- portlight-1.0.0/tests/test_credit.py +431 -0
- portlight-1.0.0/tests/test_depth.py +324 -0
- portlight-1.0.0/tests/test_economy.py +234 -0
- portlight-1.0.0/tests/test_infrastructure.py +516 -0
- portlight-1.0.0/tests/test_insurance.py +458 -0
- portlight-1.0.0/tests/test_receipts.py +85 -0
- portlight-1.0.0/tests/test_reputation.py +475 -0
- portlight-1.0.0/tests/test_save.py +90 -0
- portlight-1.0.0/tests/test_session.py +236 -0
- portlight-1.0.0/tests/test_views.py +248 -0
- portlight-1.0.0/tests/test_voyage.py +146 -0
- portlight-1.0.0/tests/test_world.py +82 -0
- portlight-1.0.0/tools/run_balance.py +123 -0
- portlight-1.0.0/tools/run_stress.py +73 -0
- portlight-1.0.0/verify.sh +26 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
paths:
|
|
7
|
+
- 'src/**'
|
|
8
|
+
- 'tests/**'
|
|
9
|
+
- 'pyproject.toml'
|
|
10
|
+
- '.github/workflows/ci.yml'
|
|
11
|
+
pull_request:
|
|
12
|
+
branches: [main]
|
|
13
|
+
paths:
|
|
14
|
+
- 'src/**'
|
|
15
|
+
- 'tests/**'
|
|
16
|
+
- 'pyproject.toml'
|
|
17
|
+
- '.github/workflows/ci.yml'
|
|
18
|
+
workflow_dispatch:
|
|
19
|
+
|
|
20
|
+
concurrency:
|
|
21
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
22
|
+
cancel-in-progress: true
|
|
23
|
+
|
|
24
|
+
jobs:
|
|
25
|
+
test:
|
|
26
|
+
runs-on: ubuntu-latest
|
|
27
|
+
strategy:
|
|
28
|
+
matrix:
|
|
29
|
+
python-version: ['3.11', '3.12']
|
|
30
|
+
steps:
|
|
31
|
+
- uses: actions/checkout@v4
|
|
32
|
+
|
|
33
|
+
- uses: actions/setup-python@v5
|
|
34
|
+
with:
|
|
35
|
+
python-version: ${{ matrix.python-version }}
|
|
36
|
+
|
|
37
|
+
- name: Install dependencies
|
|
38
|
+
run: pip install -e ".[dev]" ruff
|
|
39
|
+
|
|
40
|
+
- name: Lint
|
|
41
|
+
run: ruff check src/ tests/
|
|
42
|
+
|
|
43
|
+
- name: Test
|
|
44
|
+
run: pytest tests/ -x -q
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
name: Deploy Pages
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
paths:
|
|
7
|
+
- 'site/**'
|
|
8
|
+
- '.github/workflows/pages.yml'
|
|
9
|
+
workflow_dispatch:
|
|
10
|
+
|
|
11
|
+
concurrency:
|
|
12
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
13
|
+
cancel-in-progress: true
|
|
14
|
+
|
|
15
|
+
permissions:
|
|
16
|
+
contents: read
|
|
17
|
+
pages: write
|
|
18
|
+
id-token: write
|
|
19
|
+
|
|
20
|
+
jobs:
|
|
21
|
+
build:
|
|
22
|
+
runs-on: ubuntu-latest
|
|
23
|
+
steps:
|
|
24
|
+
- uses: actions/checkout@v4
|
|
25
|
+
|
|
26
|
+
- uses: actions/setup-node@v4
|
|
27
|
+
with:
|
|
28
|
+
node-version: 22
|
|
29
|
+
|
|
30
|
+
- name: Install site dependencies
|
|
31
|
+
working-directory: site
|
|
32
|
+
run: npm ci
|
|
33
|
+
|
|
34
|
+
- name: Build site
|
|
35
|
+
working-directory: site
|
|
36
|
+
run: npm run build
|
|
37
|
+
|
|
38
|
+
- uses: actions/upload-pages-artifact@v3
|
|
39
|
+
with:
|
|
40
|
+
path: site/dist
|
|
41
|
+
|
|
42
|
+
deploy:
|
|
43
|
+
needs: build
|
|
44
|
+
runs-on: ubuntu-latest
|
|
45
|
+
environment:
|
|
46
|
+
name: github-pages
|
|
47
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
48
|
+
steps:
|
|
49
|
+
- id: deployment
|
|
50
|
+
uses: actions/deploy-pages@v4
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
concurrency:
|
|
8
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
9
|
+
cancel-in-progress: true
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
publish:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
environment: pypi
|
|
15
|
+
permissions:
|
|
16
|
+
id-token: write
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v4
|
|
19
|
+
|
|
20
|
+
- uses: actions/setup-python@v5
|
|
21
|
+
with:
|
|
22
|
+
python-version: "3.12"
|
|
23
|
+
|
|
24
|
+
- name: Install build tools
|
|
25
|
+
run: pip install build
|
|
26
|
+
|
|
27
|
+
- name: Build package
|
|
28
|
+
run: python -m build
|
|
29
|
+
|
|
30
|
+
- name: Publish to PyPI
|
|
31
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
name: Release Binaries
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
env:
|
|
9
|
+
TOOL_NAME: portlight
|
|
10
|
+
ENTRYPOINT: src/portlight/__main__.py
|
|
11
|
+
|
|
12
|
+
concurrency:
|
|
13
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
14
|
+
cancel-in-progress: true
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
build:
|
|
18
|
+
strategy:
|
|
19
|
+
matrix:
|
|
20
|
+
include:
|
|
21
|
+
- os: ubuntu-latest
|
|
22
|
+
target: linux-x64
|
|
23
|
+
ext: ""
|
|
24
|
+
- os: macos-latest
|
|
25
|
+
target: darwin-arm64
|
|
26
|
+
ext: ""
|
|
27
|
+
- os: windows-latest
|
|
28
|
+
target: win-x64
|
|
29
|
+
ext: ".exe"
|
|
30
|
+
runs-on: ${{ matrix.os }}
|
|
31
|
+
steps:
|
|
32
|
+
- uses: actions/checkout@v4
|
|
33
|
+
|
|
34
|
+
- uses: astral-sh/setup-uv@v3
|
|
35
|
+
|
|
36
|
+
- run: uv python install 3.12
|
|
37
|
+
|
|
38
|
+
- run: uv venv
|
|
39
|
+
|
|
40
|
+
- name: Install dependencies + PyInstaller
|
|
41
|
+
run: uv pip install . "pyinstaller>=6.9.0"
|
|
42
|
+
|
|
43
|
+
- name: Build binary
|
|
44
|
+
shell: bash
|
|
45
|
+
run: |
|
|
46
|
+
VERSION=${GITHUB_REF_NAME#v}
|
|
47
|
+
uv run pyinstaller --onefile --name "${{ env.TOOL_NAME }}" --console \
|
|
48
|
+
--collect-submodules rich \
|
|
49
|
+
"${{ env.ENTRYPOINT }}"
|
|
50
|
+
OUTNAME="${{ env.TOOL_NAME }}-${VERSION}-${{ matrix.target }}${{ matrix.ext }}"
|
|
51
|
+
mv "dist/${{ env.TOOL_NAME }}${{ matrix.ext }}" "dist/${OUTNAME}"
|
|
52
|
+
echo "ASSET_NAME=${OUTNAME}" >> "$GITHUB_ENV"
|
|
53
|
+
|
|
54
|
+
- uses: actions/upload-artifact@v4
|
|
55
|
+
with:
|
|
56
|
+
name: binary-${{ matrix.target }}
|
|
57
|
+
path: dist/${{ env.ASSET_NAME }}
|
|
58
|
+
|
|
59
|
+
release:
|
|
60
|
+
needs: build
|
|
61
|
+
runs-on: ubuntu-latest
|
|
62
|
+
permissions:
|
|
63
|
+
contents: write
|
|
64
|
+
steps:
|
|
65
|
+
- uses: actions/download-artifact@v4
|
|
66
|
+
with:
|
|
67
|
+
path: artifacts
|
|
68
|
+
merge-multiple: true
|
|
69
|
+
|
|
70
|
+
- name: Generate checksums
|
|
71
|
+
shell: bash
|
|
72
|
+
run: |
|
|
73
|
+
VERSION=${GITHUB_REF_NAME#v}
|
|
74
|
+
cd artifacts
|
|
75
|
+
sha256sum * > "checksums-${VERSION}.txt"
|
|
76
|
+
cat "checksums-${VERSION}.txt"
|
|
77
|
+
|
|
78
|
+
- uses: softprops/action-gh-release@v2
|
|
79
|
+
with:
|
|
80
|
+
files: artifacts/*
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
__pycache__/
|
|
2
|
+
*.pyc
|
|
3
|
+
*.pyo
|
|
4
|
+
*.egg-info/
|
|
5
|
+
dist/
|
|
6
|
+
build/
|
|
7
|
+
.eggs/
|
|
8
|
+
*.egg
|
|
9
|
+
.pytest_cache/
|
|
10
|
+
.mypy_cache/
|
|
11
|
+
.venv/
|
|
12
|
+
venv/
|
|
13
|
+
*.swp
|
|
14
|
+
*.swo
|
|
15
|
+
.DS_Store
|
|
16
|
+
saves/
|
|
17
|
+
site/.astro/
|
|
18
|
+
site/dist/
|
|
19
|
+
site/node_modules/
|
|
20
|
+
.polyglot-cache.json
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/).
|
|
7
|
+
|
|
8
|
+
## [0.1.0-alpha] - 2026-03-20
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **Economy** — scarcity-driven pricing across 10 ports, 8 goods, 17 routes with flood penalty and market shocks
|
|
13
|
+
- **Voyages** — multi-day travel with storms, pirates, inspections, provisions, hull, and crew
|
|
14
|
+
- **Captain identity** — merchant, smuggler, navigator with 8-20% pricing gaps and distinct access profiles
|
|
15
|
+
- **Contracts** — 6 families with trust/standing gates, provenance-validated delivery, deadline tracking
|
|
16
|
+
- **Reputation** — regional standing, customs heat, commercial trust, multi-axis access model
|
|
17
|
+
- **Infrastructure** — warehouses (3 tiers), broker offices (2 tiers × 3 regions), 5 licenses with real upkeep
|
|
18
|
+
- **Insurance** — hull, cargo, contract guarantee policies with heat surcharges and claim resolution
|
|
19
|
+
- **Credit** — 3 tiers with interest accrual, payment deadlines, default consequences
|
|
20
|
+
- **Campaign** — 27 milestones, 7 career profile tags, 4 victory paths with diagnostics
|
|
21
|
+
- **Save/load** — full compound state round-trip (economy + contracts + infrastructure + insurance + credit + campaign)
|
|
22
|
+
- **CLI** — 30 commands via Typer with Rich rendering, welcome screen, contextual hints, grouped guide
|
|
23
|
+
- **Onboarding** — welcome view, hint system, flood explanation, contract deadline context, daily upkeep display
|
|
24
|
+
- **Balance harness** — 7 policy bots, 7 scenario packs, structured JSON/markdown reporting
|
|
25
|
+
- **Stress testing** — 14 cross-system invariants, 9 compound stress scenarios, trace recording
|
|
26
|
+
- **Documentation** — README, START_HERE, FIRST_VOYAGE, COMMANDS, CAREER_PATHS, EXAMPLE_RUNS, ALPHA_STATUS, KNOWN_ISSUES, RELEASE_NOTES
|
|
27
|
+
- 609 tests across 24 files
|
portlight-1.0.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 mcp-tool-shop
|
|
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.
|
portlight-1.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: portlight
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Trade-first maritime strategy CLI — route arbitrage, contracts, infrastructure, finance, and commercial reputation across a living regional economy
|
|
5
|
+
Author-email: mcp-tool-shop <64996768+mcp-tool-shop@users.noreply.github.com>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
Keywords: cli,game,maritime,strategy,trading
|
|
9
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
10
|
+
Classifier: Environment :: Console
|
|
11
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
15
|
+
Classifier: Topic :: Games/Entertainment :: Simulation
|
|
16
|
+
Requires-Python: >=3.11
|
|
17
|
+
Requires-Dist: rich>=13.0
|
|
18
|
+
Requires-Dist: typer>=0.9
|
|
19
|
+
Provides-Extra: dev
|
|
20
|
+
Requires-Dist: pytest-cov>=5.0; extra == 'dev'
|
|
21
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
|
|
24
|
+
<p align="center">
|
|
25
|
+
<a href="README.ja.md">日本語</a> | <a href="README.zh.md">中文</a> | <a href="README.es.md">Español</a> | <a href="README.fr.md">Français</a> | <a href="README.hi.md">हिन्दी</a> | <a href="README.it.md">Italiano</a> | <a href="README.pt-BR.md">Português (BR)</a>
|
|
26
|
+
</p>
|
|
27
|
+
|
|
28
|
+
<p align="center">
|
|
29
|
+
<img src="https://raw.githubusercontent.com/mcp-tool-shop-org/brand/main/logos/portlight/readme.png" width="800" alt="Portlight">
|
|
30
|
+
</p>
|
|
31
|
+
|
|
32
|
+
<p align="center">
|
|
33
|
+
<a href="https://github.com/mcp-tool-shop-org/portlight/actions"><img src="https://github.com/mcp-tool-shop-org/portlight/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
|
|
34
|
+
<a href="https://github.com/mcp-tool-shop-org/portlight/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="MIT License"></a>
|
|
35
|
+
<a href="https://mcp-tool-shop-org.github.io/portlight/"><img src="https://img.shields.io/badge/docs-landing_page-blue" alt="Landing Page"></a>
|
|
36
|
+
</p>
|
|
37
|
+
|
|
38
|
+
A trade-first maritime strategy CLI where you build a merchant career through route arbitrage, contracts, infrastructure, finance, and commercial reputation across a living regional economy.
|
|
39
|
+
|
|
40
|
+
## Why Portlight
|
|
41
|
+
|
|
42
|
+
Most trading games flatten trade into a number that goes up. Portlight treats trade as a commercial discipline:
|
|
43
|
+
|
|
44
|
+
- **Prices react to your trades.** Dump grain at a port and the price crashes. Every sale shifts the local market.
|
|
45
|
+
- **Ports have real economic identities.** Porto Novo produces grain cheaply. Al-Manar consumes silk hungrily. These aren't random — they're structural.
|
|
46
|
+
- **Voyages carry risk.** Storms, pirates, inspections. Your provisions, hull, and crew matter.
|
|
47
|
+
- **Contracts require proof.** Deliver the right goods to the right port with tracked provenance. No faking it.
|
|
48
|
+
- **Infrastructure changes how you trade.** Warehouses let you stage cargo. Brokers improve contract quality. Licenses unlock premium access.
|
|
49
|
+
- **Finance is leverage with teeth.** Credit lets you move faster. Default, and doors close.
|
|
50
|
+
- **The game reads what you built.** Your trade history, infrastructure, reputation, and routes form a career profile. The game tells you what kind of trade house you actually are.
|
|
51
|
+
|
|
52
|
+
## The Core Loop
|
|
53
|
+
|
|
54
|
+
1. Inspect the market — find what's cheap here and expensive elsewhere
|
|
55
|
+
2. Buy cargo — load your hold
|
|
56
|
+
3. Sail — cross routes under weather, crew, and provision pressure
|
|
57
|
+
4. Sell — earn margin, shift the local market
|
|
58
|
+
5. Reinvest — upgrade your ship, lease a warehouse, open a broker office
|
|
59
|
+
6. Build access — earn trust, reduce heat, unlock contracts and licenses
|
|
60
|
+
7. Pursue a commercial destiny — four distinct victory paths based on what you actually built
|
|
61
|
+
|
|
62
|
+
## Quick Start
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
# Install
|
|
66
|
+
pip install -e ".[dev]"
|
|
67
|
+
|
|
68
|
+
# Start a new game
|
|
69
|
+
portlight new "Captain Hawk" --type merchant
|
|
70
|
+
|
|
71
|
+
# Look at what's for sale
|
|
72
|
+
portlight market
|
|
73
|
+
|
|
74
|
+
# Buy cheap goods
|
|
75
|
+
portlight buy grain 10
|
|
76
|
+
|
|
77
|
+
# Check available routes
|
|
78
|
+
portlight routes
|
|
79
|
+
|
|
80
|
+
# Sail to where grain sells high
|
|
81
|
+
portlight sail al_manar
|
|
82
|
+
|
|
83
|
+
# Advance through the voyage
|
|
84
|
+
portlight advance
|
|
85
|
+
|
|
86
|
+
# Sell at destination
|
|
87
|
+
portlight sell grain 10
|
|
88
|
+
|
|
89
|
+
# See your trade history
|
|
90
|
+
portlight ledger
|
|
91
|
+
|
|
92
|
+
# Check your career progress
|
|
93
|
+
portlight milestones
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
See [docs/START_HERE.md](docs/START_HERE.md) for a guided first session and [docs/FIRST_VOYAGE.md](docs/FIRST_VOYAGE.md) for a detailed early-game walkthrough.
|
|
97
|
+
|
|
98
|
+
## Captain Types
|
|
99
|
+
|
|
100
|
+
| Captain | Identity | Edge | Trade-off |
|
|
101
|
+
|---------|----------|------|-----------|
|
|
102
|
+
| **Merchant** | Licensed trader, Mediterranean base | Better prices, lower inspection rates, trust grows faster | No black market access |
|
|
103
|
+
| **Smuggler** | Discreet operator, West Africa base | Black market access, luxury margins, contraband trade | Higher heat, more inspections |
|
|
104
|
+
| **Navigator** | Deep-water explorer, Mediterranean base | Faster ships, longer range, East Indies access early | Weaker initial commercial standing |
|
|
105
|
+
|
|
106
|
+
## Systems
|
|
107
|
+
|
|
108
|
+
**Economy** — Scarcity-driven pricing across 10 ports, 8 goods, 17 routes. Flood penalties punish dumping. Market shocks create regional opportunities.
|
|
109
|
+
|
|
110
|
+
**Voyages** — Multi-day travel with weather events, pirate encounters, inspections. Provisions, hull, and crew are real resources.
|
|
111
|
+
|
|
112
|
+
**Captains** — Three distinct archetypes with 8-20% pricing gaps, unique starting positions, and different access profiles.
|
|
113
|
+
|
|
114
|
+
**Contracts** — Six contract families gated by trust and standing. Provenance-validated delivery. Real deadlines with real consequences.
|
|
115
|
+
|
|
116
|
+
**Reputation** — Regional standing, port-specific reputation, customs heat, and commercial trust. A multi-axis access model that opens and closes doors.
|
|
117
|
+
|
|
118
|
+
**Infrastructure** — Warehouses (3 tiers), broker offices (2 tiers across 3 regions), and 5 purchasable licenses. Each changes trade timing, scale, or access.
|
|
119
|
+
|
|
120
|
+
**Insurance** — Hull, cargo, and contract guarantee policies. Heat surcharges. Claim resolution with denial conditions.
|
|
121
|
+
|
|
122
|
+
**Credit** — Three tiers of credit with interest accrual, payment deadlines, and default consequences. Leverage with real risk.
|
|
123
|
+
|
|
124
|
+
**Career** — 27 milestones across 6 families. Career profile interpretation (primary/secondary/emerging tags). Four victory paths: Lawful Trade House, Shadow Network, Oceanic Reach, and Commercial Empire.
|
|
125
|
+
|
|
126
|
+
## Victory Paths
|
|
127
|
+
|
|
128
|
+
- **Lawful Trade House** — Disciplined legitimacy. High trust, premium contracts, clean reputation, infrastructure breadth.
|
|
129
|
+
- **Shadow Network** — Profitable discreet trade. Luxury margins under scrutiny, heat management, resilient operations.
|
|
130
|
+
- **Oceanic Reach** — Long-haul commercial power. East Indies access, distant infrastructure, premium route mastery.
|
|
131
|
+
- **Commercial Empire** — Integrated multi-region operation. Infrastructure in every region, diversified revenue, financial leverage.
|
|
132
|
+
|
|
133
|
+
See [docs/CAREER_PATHS.md](docs/CAREER_PATHS.md) for detailed player-facing descriptions.
|
|
134
|
+
|
|
135
|
+
## Command Reference
|
|
136
|
+
|
|
137
|
+
Run `portlight guide` in-game for a grouped command reference, or see [docs/COMMANDS.md](docs/COMMANDS.md).
|
|
138
|
+
|
|
139
|
+
| Group | Commands |
|
|
140
|
+
|-------|----------|
|
|
141
|
+
| Trading | `market`, `buy`, `sell`, `cargo` |
|
|
142
|
+
| Navigation | `routes`, `sail`, `advance`, `port`, `provision`, `repair`, `hire` |
|
|
143
|
+
| Contracts | `contracts`, `accept`, `obligations`, `abandon` |
|
|
144
|
+
| Infrastructure | `warehouse`, `office`, `license` |
|
|
145
|
+
| Finance | `insure`, `credit` |
|
|
146
|
+
| Career | `captain`, `reputation`, `milestones`, `status`, `ledger`, `shipyard` |
|
|
147
|
+
| System | `save`, `load`, `guide` |
|
|
148
|
+
|
|
149
|
+
## Alpha Status
|
|
150
|
+
|
|
151
|
+
Portlight is in alpha. The core systems are complete and stress-tested, but balance is actively being tuned.
|
|
152
|
+
|
|
153
|
+
**What's solid:**
|
|
154
|
+
- All systems functional end-to-end
|
|
155
|
+
- 609 tests across 24 files
|
|
156
|
+
- 14 cross-system invariants enforced under 9 compound stress scenarios
|
|
157
|
+
- Balance harness with 7 policy bots across 7 scenario packs
|
|
158
|
+
|
|
159
|
+
**What's being tuned:**
|
|
160
|
+
- Smuggler scaling (currently under-performing on ship progression)
|
|
161
|
+
- Mediterranean route concentration (Porto Novo / Silva Bay dominates traffic)
|
|
162
|
+
- Contract completion rates (delivery logic gaps in automated runs)
|
|
163
|
+
- Insurance adoption (currently near zero in simulated play)
|
|
164
|
+
|
|
165
|
+
See [docs/ALPHA_STATUS.md](docs/ALPHA_STATUS.md) for details and [docs/KNOWN_ISSUES.md](docs/KNOWN_ISSUES.md) for specific items.
|
|
166
|
+
|
|
167
|
+
## Security and Data
|
|
168
|
+
|
|
169
|
+
Portlight is a **local-only CLI game**. It makes zero network connections during gameplay. Data touched: local save files (`saves/`) and report artifacts (`artifacts/`), all JSON on the local filesystem. No secrets, credentials, telemetry, or remote services. No elevated permissions required. See [SECURITY.md](SECURITY.md) for the full policy.
|
|
170
|
+
|
|
171
|
+
## Development
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
# Install with dev dependencies
|
|
175
|
+
pip install -e ".[dev]"
|
|
176
|
+
|
|
177
|
+
# Run tests
|
|
178
|
+
pytest
|
|
179
|
+
|
|
180
|
+
# Run balance simulation
|
|
181
|
+
python tools/run_balance.py
|
|
182
|
+
|
|
183
|
+
# Run stress tests
|
|
184
|
+
python tools/run_stress.py
|
|
185
|
+
|
|
186
|
+
# Lint
|
|
187
|
+
ruff check src/ tests/
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## License
|
|
191
|
+
|
|
192
|
+
MIT
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
Built by <a href="https://mcp-tool-shop.github.io/">MCP Tool Shop</a>
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<a href="README.ja.md">日本語</a> | <a href="README.zh.md">中文</a> | <a href="README.md">English</a> | <a href="README.fr.md">Français</a> | <a href="README.hi.md">हिन्दी</a> | <a href="README.it.md">Italiano</a> | <a href="README.pt-BR.md">Português (BR)</a>
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<p align="center">
|
|
6
|
+
<img src="https://raw.githubusercontent.com/mcp-tool-shop-org/brand/main/logos/portlight/readme.png" width="400" alt="Portlight">
|
|
7
|
+
</p>
|
|
8
|
+
|
|
9
|
+
<p align="center">
|
|
10
|
+
<a href="https://github.com/mcp-tool-shop-org/portlight/actions"><img src="https://github.com/mcp-tool-shop-org/portlight/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
|
|
11
|
+
<a href="https://github.com/mcp-tool-shop-org/portlight/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="MIT License"></a>
|
|
12
|
+
<a href="https://mcp-tool-shop-org.github.io/portlight/"><img src="https://img.shields.io/badge/docs-landing_page-blue" alt="Landing Page"></a>
|
|
13
|
+
</p>
|
|
14
|
+
|
|
15
|
+
Una estrategia marítima centrada en el comercio, donde construyes una carrera como comerciante a través de la optimización de rutas, contratos, infraestructura, finanzas y reputación comercial en una economía regional dinámica.
|
|
16
|
+
|
|
17
|
+
## ¿Por qué Portlight?
|
|
18
|
+
|
|
19
|
+
La mayoría de los juegos de comercio simplifican el comercio a un número que simplemente aumenta. Portlight trata el comercio como una disciplina comercial:
|
|
20
|
+
|
|
21
|
+
- **Los precios reaccionan a tus transacciones.** Si vendes grandes cantidades de grano en un puerto, el precio se desploma. Cada venta altera el mercado local.
|
|
22
|
+
- **Los puertos tienen identidades económicas reales.** Porto Novo produce grano a bajo costo. Al-Manar consume seda con avidez. Estas características no son aleatorias, sino estructurales.
|
|
23
|
+
- **Los viajes implican riesgos.** Tormentas, piratas, inspecciones. Tus provisiones, el casco y la tripulación son importantes.
|
|
24
|
+
- **Los contratos requieren pruebas.** Debes entregar los productos correctos en el puerto correcto, con un registro de procedencia verificable. No se permiten falsificaciones.
|
|
25
|
+
- **La infraestructura cambia la forma en que operas.** Los almacenes te permiten almacenar mercancías. Los intermediarios mejoran la calidad de los contratos. Las licencias desbloquean acceso premium.
|
|
26
|
+
- **El crédito es una herramienta poderosa, pero con riesgos.** El crédito te permite actuar más rápido. Si incumples, perderás acceso a él.
|
|
27
|
+
- **El juego evalúa lo que has construido.** Tu historial comercial, infraestructura, reputación y rutas forman un perfil de carrera. El juego te indica qué tipo de empresa comercial eres realmente.
|
|
28
|
+
|
|
29
|
+
## El Ciclo Principal
|
|
30
|
+
|
|
31
|
+
1. Analiza el mercado: encuentra qué productos son baratos aquí y caros en otro lugar.
|
|
32
|
+
2. Compra mercancías: carga tu bodega.
|
|
33
|
+
3. Navega: atraviesa rutas bajo la presión del clima, la tripulación y las provisiones.
|
|
34
|
+
4. Vende: obtén ganancias, altera el mercado local.
|
|
35
|
+
5. Reinvierta: mejora tu barco, alquila un almacén, abre una oficina de intermediarios.
|
|
36
|
+
6. Construye acceso: gana confianza, reduce la atención negativa, desbloquea contratos y licencias.
|
|
37
|
+
7. Persigue un destino comercial: cuatro caminos distintos hacia la victoria, basados en lo que realmente has construido.
|
|
38
|
+
|
|
39
|
+
## Guía de inicio rápido
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# Install
|
|
43
|
+
pip install -e ".[dev]"
|
|
44
|
+
|
|
45
|
+
# Start a new game
|
|
46
|
+
portlight new "Captain Hawk" --type merchant
|
|
47
|
+
|
|
48
|
+
# Look at what's for sale
|
|
49
|
+
portlight market
|
|
50
|
+
|
|
51
|
+
# Buy cheap goods
|
|
52
|
+
portlight buy grain 10
|
|
53
|
+
|
|
54
|
+
# Check available routes
|
|
55
|
+
portlight routes
|
|
56
|
+
|
|
57
|
+
# Sail to where grain sells high
|
|
58
|
+
portlight sail al_manar
|
|
59
|
+
|
|
60
|
+
# Advance through the voyage
|
|
61
|
+
portlight advance
|
|
62
|
+
|
|
63
|
+
# Sell at destination
|
|
64
|
+
portlight sell grain 10
|
|
65
|
+
|
|
66
|
+
# See your trade history
|
|
67
|
+
portlight ledger
|
|
68
|
+
|
|
69
|
+
# Check your career progress
|
|
70
|
+
portlight milestones
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Consulta [docs/START_HERE.md](docs/START_HERE.md) para una primera sesión guiada y [docs/FIRST_VOYAGE.md](docs/FIRST_VOYAGE.md) para una descripción detallada de las primeras etapas del juego.
|
|
74
|
+
|
|
75
|
+
## Tipos de Capitanes
|
|
76
|
+
|
|
77
|
+
| Capitán | Identidad | Ventaja | Compromiso |
|
|
78
|
+
|---------|----------|------|-----------|
|
|
79
|
+
| **Merchant** | Comerciante con licencia, base en el Mediterráneo | Mejores precios, tasas de inspección más bajas, la confianza crece más rápido. | Sin acceso al mercado negro. |
|
|
80
|
+
| **Smuggler** | Operador discreto, base en África Occidental. | Acceso al mercado negro, márgenes de lujo, comercio de contrabando. | Mayor atención negativa, más inspecciones. |
|
|
81
|
+
| **Navigator** | Explorador de aguas profundas, base en el Mediterráneo. | Barcos más rápidos, mayor alcance, acceso temprano a las Indias Orientales. | Posición comercial inicial más débil. |
|
|
82
|
+
|
|
83
|
+
## Sistemas
|
|
84
|
+
|
|
85
|
+
**Economía:** Precios determinados por la escasez en 10 puertos, 8 productos, 17 rutas. Las penalizaciones por sobreproducción castigan la venta masiva. Los shocks del mercado crean oportunidades regionales.
|
|
86
|
+
|
|
87
|
+
**Viajes:** Viajes de varios días con eventos climáticos, encuentros con piratas e inspecciones. Las provisiones, el casco y la tripulación son recursos reales.
|
|
88
|
+
|
|
89
|
+
**Capitanes:** Tres arquetipos distintos con diferencias de precios del 8 al 20%, posiciones de inicio únicas y diferentes perfiles de acceso.
|
|
90
|
+
|
|
91
|
+
**Contratos:** Seis familias de contratos bloqueadas por la confianza y la reputación. Entrega con validación de procedencia. Plazos reales con consecuencias reales.
|
|
92
|
+
|
|
93
|
+
**Reputación:** Posición regional, reputación específica de cada puerto, atención de las aduanas y confianza comercial. Un modelo de acceso de múltiples ejes que abre y cierra puertas.
|
|
94
|
+
|
|
95
|
+
**Infraestructura:** Almacenes (3 niveles), oficinas de intermediarios (2 niveles en 3 regiones) y 5 licencias comprables. Cada una cambia el tiempo, la escala o el acceso al comercio.
|
|
96
|
+
|
|
97
|
+
**Seguro:** Pólizas de seguro de casco, carga y garantía de contrato. Cargos por atención negativa. Resolución de reclamaciones con condiciones de denegación.
|
|
98
|
+
|
|
99
|
+
**Crédito:** Tres niveles de crédito con acumulación de intereses, plazos de pago y consecuencias por incumplimiento. Una herramienta poderosa con riesgos reales.
|
|
100
|
+
|
|
101
|
+
**Carrera** — 27 hitos en 6 categorías. Interpretación del perfil de carrera (etiquetas primarias/secundarias/emergentes). Cuatro caminos hacia la victoria: Casa Comercial Legítima, Red de la Sombra, Alcance Oceánico e Imperio Comercial.
|
|
102
|
+
|
|
103
|
+
## Caminos hacia la Victoria
|
|
104
|
+
|
|
105
|
+
- **Casa Comercial Legítima** — Legitimidad disciplinada. Alta confianza, contratos premium, reputación intachable, amplia infraestructura.
|
|
106
|
+
- **Red de la Sombra** — Comercio discreto y rentable. Márgenes de lujo bajo escrutinio, gestión de riesgos, operaciones resilientes.
|
|
107
|
+
- **Alcance Oceánico** — Poder comercial de largo alcance. Acceso a las Indias Orientales, infraestructura distante, dominio de rutas premium.
|
|
108
|
+
- **Imperio Comercial** — Operación integrada en múltiples regiones. Infraestructura en cada región, diversificación de ingresos, apalancamiento financiero.
|
|
109
|
+
|
|
110
|
+
Consulte [docs/CAREER_PATHS.md](docs/CAREER_PATHS.md) para obtener descripciones detalladas dirigidas al jugador.
|
|
111
|
+
|
|
112
|
+
## Referencia de Comandos
|
|
113
|
+
|
|
114
|
+
Ejecute `portlight guide` dentro del juego para obtener una referencia de comandos agrupada, o consulte [docs/COMMANDS.md](docs/COMMANDS.md).
|
|
115
|
+
|
|
116
|
+
| Grupo | Comandos |
|
|
117
|
+
|-------|----------|
|
|
118
|
+
| Comercio | `market`, `buy`, `sell`, `cargo` |
|
|
119
|
+
| Navegación | `routes`, `sail`, `advance`, `port`, `provision`, `repair`, `hire` |
|
|
120
|
+
| Contratos | `contracts`, `accept`, `obligations`, `abandon` |
|
|
121
|
+
| Infraestructura | `warehouse`, `office`, `license` |
|
|
122
|
+
| Finanzas | `insure`, `credit` |
|
|
123
|
+
| Carrera | `captain`, `reputation`, `milestones`, `status`, `ledger`, `shipyard` |
|
|
124
|
+
| Sistema | `save`, `load`, `guide` |
|
|
125
|
+
|
|
126
|
+
## Estado Alpha
|
|
127
|
+
|
|
128
|
+
Portlight está en estado alpha. Los sistemas principales están completos y han sido sometidos a pruebas de estrés, pero el equilibrio se está ajustando activamente.
|
|
129
|
+
|
|
130
|
+
**Lo que está funcionando correctamente:**
|
|
131
|
+
- Todos los sistemas son funcionales de extremo a extremo.
|
|
132
|
+
- 609 pruebas en 24 archivos.
|
|
133
|
+
- 14 invariantes entre sistemas aplicadas bajo 9 escenarios de estrés compuestos.
|
|
134
|
+
- Sistema de equilibrio con 7 bots de política en 7 paquetes de escenarios.
|
|
135
|
+
|
|
136
|
+
**Lo que se está ajustando:**
|
|
137
|
+
- Escalado de contrabandistas (actualmente con un rendimiento inferior en la progresión de la nave).
|
|
138
|
+
- Concentración de rutas en el Mediterráneo (Porto Novo / Silva Bay dominan el tráfico).
|
|
139
|
+
- Tasas de finalización de contratos (fallas en la lógica de entrega en ejecuciones automatizadas).
|
|
140
|
+
- Adopción de seguros (actualmente cercana a cero en pruebas simuladas).
|
|
141
|
+
|
|
142
|
+
Consulte [docs/ALPHA_STATUS.md](docs/ALPHA_STATUS.md) para obtener detalles y [docs/KNOWN_ISSUES.md](docs/KNOWN_ISSUES.md) para obtener información específica.
|
|
143
|
+
|
|
144
|
+
## Seguridad y Datos
|
|
145
|
+
|
|
146
|
+
Portlight es un juego de **línea de comandos que solo funciona localmente**. No realiza ninguna conexión de red durante el juego. Datos accedidos: archivos de guardado locales (`saves/`) y archivos de informe (`artifacts/`), todos en formato JSON en el sistema de archivos local. No hay secretos, credenciales, telemetría ni servicios remotos. No se requieren permisos elevados. Consulte [SECURITY.md](SECURITY.md) para obtener la política completa.
|
|
147
|
+
|
|
148
|
+
## Desarrollo
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
# Install with dev dependencies
|
|
152
|
+
pip install -e ".[dev]"
|
|
153
|
+
|
|
154
|
+
# Run tests
|
|
155
|
+
pytest
|
|
156
|
+
|
|
157
|
+
# Run balance simulation
|
|
158
|
+
python tools/run_balance.py
|
|
159
|
+
|
|
160
|
+
# Run stress tests
|
|
161
|
+
python tools/run_stress.py
|
|
162
|
+
|
|
163
|
+
# Lint
|
|
164
|
+
ruff check src/ tests/
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## Licencia
|
|
168
|
+
|
|
169
|
+
MIT
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
Desarrollado por <a href="https://mcp-tool-shop.github.io/">MCP Tool Shop</a>
|