eclipse-gig-core 0.1.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.
@@ -0,0 +1,39 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ concurrency:
12
+ group: ci-${{ github.ref }}
13
+ cancel-in-progress: true
14
+
15
+ jobs:
16
+ test:
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - uses: actions/checkout@v4
20
+
21
+ - uses: actions/setup-python@v5
22
+ with:
23
+ python-version: "3.12"
24
+
25
+ - name: Byte-compile all Python sources
26
+ run: python -m compileall -q .
27
+
28
+ - name: Validate JSON files
29
+ run: |
30
+ for f in *.json; do
31
+ [ -e "$f" ] || continue
32
+ python -m json.tool "$f" > /dev/null && echo "OK $f"
33
+ done
34
+
35
+ # smoke.py drives the full tool surface over stdio; it is not run
36
+ # in CI — the initialize handshake below is the CI smoke.
37
+ - name: MCP initialize handshake smoke
38
+ run: |
39
+ printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"ci","version":"0"}}}' | timeout 30 python server.py | grep -q '"result"'
@@ -0,0 +1,43 @@
1
+ # LEGACY packaging workflow — MANUAL DISPATCH ONLY.
2
+ #
3
+ # TAG PUSHES ARE FORBIDDEN HERE (CT-D2, Verity card
4
+ # container-train-2026-10-26): do NOT add a push/tags trigger to this
5
+ # workflow. A v* tag push previously fired this workflow and published
6
+ # UNSIGNED ghcr.io images tagged 'latest' + <sha> — no cosign, no
7
+ # SBOM/provenance, smoke AFTER the push — bypassing the Container
8
+ # Train's CONTAINER_TRAIN_PUBLISH switch and its smoke-before-push
9
+ # gate (gate A3/A5: "no unsigned latest, ever"). Concrete collision:
10
+ # the approved PyPI publish fires on the v0.1.0 tag; that same tag
11
+ # must NOT publish an unsigned GHCR 'latest'. The Container Train
12
+ # release-images.yml is the ONLY sanctioned image publish path.
13
+ # This file is retained for manual workflow_dispatch only because the
14
+ # train workflow is not yet installed in this repo.
15
+ name: Package
16
+ on:
17
+ workflow_dispatch:
18
+ permissions:
19
+ contents: read
20
+ packages: write
21
+ concurrency:
22
+ group: package-${{ github.ref }}
23
+ cancel-in-progress: true
24
+ jobs:
25
+ image:
26
+ runs-on: ubuntu-latest
27
+ steps:
28
+ - uses: actions/checkout@v4
29
+ - uses: docker/login-action@v3
30
+ with:
31
+ registry: ghcr.io
32
+ username: ${{ github.actor }}
33
+ password: ${{ secrets.GITHUB_TOKEN }}
34
+ - uses: docker/build-push-action@v6
35
+ with:
36
+ context: .
37
+ push: true
38
+ tags: |
39
+ ghcr.io/cyan-eclipse-technologies-llc/eclipse-gig-core-mcp:latest
40
+ ghcr.io/cyan-eclipse-technologies-llc/eclipse-gig-core-mcp:${{ github.sha }}
41
+ - name: Smoke (MCP initialize handshake)
42
+ run: |
43
+ echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"smoke","version":"0"}}}' | docker run -i ghcr.io/cyan-eclipse-technologies-llc/eclipse-gig-core-mcp:${{ github.sha }} | grep -q '"result"'
@@ -0,0 +1,30 @@
1
+ name: Publish to Official MCP Registry
2
+
3
+ # Publishes server.json to registry.modelcontextprotocol.io using GitHub OIDC
4
+ # (no stored secrets). Run manually after changing server.json — each publish
5
+ # needs a new unique "version" in server.json.
6
+ on:
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ id-token: write
11
+ contents: read
12
+
13
+ jobs:
14
+ publish:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+
19
+ - name: Install mcp-publisher
20
+ run: |
21
+ curl -L "https://github.com/modelcontextprotocol/registry/releases/download/v1.8.4/mcp-publisher_linux_amd64.tar.gz" | tar xz mcp-publisher
22
+
23
+ - name: Validate server.json
24
+ run: ./mcp-publisher validate
25
+
26
+ - name: Login with GitHub OIDC
27
+ run: ./mcp-publisher login github-oidc
28
+
29
+ - name: Publish
30
+ run: ./mcp-publisher publish
@@ -0,0 +1,64 @@
1
+ name: Publish to PyPI
2
+
3
+ # Gate S5 (applies to every artifact in the PyPI slate): releases
4
+ # build ONLY here, from a tagged commit, and publish via Trusted
5
+ # Publishing (OIDC) — no long-lived PyPI tokens anywhere, no laptop
6
+ # uploads. PEP 740 attestations are generated by the publish action.
7
+ on:
8
+ push:
9
+ tags: ["v*"]
10
+ workflow_dispatch:
11
+
12
+ permissions:
13
+ contents: read
14
+
15
+ concurrency:
16
+ group: publish-pypi-${{ github.ref }}
17
+ cancel-in-progress: false
18
+
19
+ jobs:
20
+ build:
21
+ runs-on: ubuntu-latest
22
+ steps:
23
+ - uses: actions/checkout@v4
24
+
25
+ - uses: actions/setup-python@v5
26
+ with:
27
+ python-version: "3.12"
28
+
29
+ - name: Run the test suite
30
+ run: python -m unittest discover -s tests
31
+
32
+ - name: Build wheel + sdist
33
+ run: |
34
+ pip install build
35
+ python -m build
36
+
37
+ - name: twine check
38
+ run: |
39
+ pip install twine
40
+ twine check dist/*
41
+
42
+ - uses: actions/upload-artifact@v4
43
+ with:
44
+ name: dist
45
+ path: dist/
46
+
47
+ publish:
48
+ needs: build
49
+ runs-on: ubuntu-latest
50
+ environment:
51
+ name: pypi
52
+ url: https://pypi.org/project/eclipse-gig-core/
53
+ permissions:
54
+ id-token: write # OIDC for Trusted Publishing + PEP 740 attestations
55
+ steps:
56
+ - uses: actions/download-artifact@v4
57
+ with:
58
+ name: dist
59
+ path: dist/
60
+
61
+ - name: Publish to PyPI (Trusted Publishing, PEP 740 attestations)
62
+ uses: pypa/gh-action-pypi-publish@release/v1
63
+ with:
64
+ attestations: true
@@ -0,0 +1,33 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*"]
6
+
7
+ permissions:
8
+ contents: write
9
+
10
+ concurrency:
11
+ group: release-${{ github.ref }}
12
+ cancel-in-progress: false
13
+
14
+ jobs:
15
+ release:
16
+ runs-on: ubuntu-latest
17
+ steps:
18
+ - uses: actions/checkout@v4
19
+
20
+ - name: Build distributable (git archive of the tag)
21
+ run: |
22
+ name="eclipse-gig-core-mcp-${GITHUB_REF_NAME}"
23
+ git archive --format=zip --prefix="${name}/" -o "${name}.zip" HEAD
24
+ ls -la "${name}.zip"
25
+
26
+ - name: Publish GitHub Release with artifact
27
+ env:
28
+ GH_TOKEN: ${{ github.token }}
29
+ run: |
30
+ gh release create "${GITHUB_REF_NAME}" \
31
+ --title "${GITHUB_REF_NAME}" \
32
+ --generate-notes \
33
+ "eclipse-gig-core-mcp-${GITHUB_REF_NAME}.zip"
@@ -0,0 +1,14 @@
1
+ data/
2
+ __pycache__/
3
+ keys/
4
+ *.key
5
+ *.pem
6
+ .env
7
+ .env.*
8
+ *.pyc
9
+ state/
10
+
11
+ # build residue
12
+ *.egg-info/
13
+ build/
14
+ dist/
@@ -0,0 +1,7 @@
1
+ FROM python:3.12-slim
2
+ LABEL io.modelcontextprotocol.server.name="io.github.CYAN-ECLIPSE-TECHNOLOGIES-LLC/gig-core"
3
+ WORKDIR /app
4
+ COPY server.py bazaar-manifest.json ./
5
+ RUN useradd -r appuser && mkdir -p /app/data && chown appuser /app/data
6
+ USER appuser
7
+ ENTRYPOINT ["python", "server.py"]
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Cyan Eclipse Technologies LLC
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,33 @@
1
+ # OWNER-HANDS — eclipse-gig-core PyPI launch
2
+
3
+ Everything in this file is done **by the owner, in the owner's
4
+ browser**. The package is built and locally proven (wheel + sdist,
5
+ clean-venv install, MCP handshake against the installed entry point);
6
+ it is **not yet published** — no Trusted Publisher exists for this
7
+ project yet.
8
+
9
+ > **Stop rule:** no step below creates or hands over an API token.
10
+ > Publishing runs on Trusted Publishing (OIDC) only.
11
+
12
+ ## Trusted Publisher for `eclipse-gig-core` (pending publisher)
13
+
14
+ On <https://pypi.org/manage/account/publishing/> → "Add a new pending
15
+ publisher" → **GitHub** tab. Enter these strings **exactly**:
16
+
17
+ | Field | Value |
18
+ |---|---|
19
+ | PyPI Project Name | `eclipse-gig-core` |
20
+ | GitHub Repository Owner | `CYAN-ECLIPSE-TECHNOLOGIES-LLC` |
21
+ | GitHub Repository Name | `eclipse-gig-core-mcp` |
22
+ | GitHub Workflow Name | `publish-pypi.yml` |
23
+ | Environment Name | `pypi` |
24
+
25
+ ## Ship day (after the publisher above exists)
26
+
27
+ 1. Agent verifies `VERSION` + `server.json` agree at the release
28
+ version and the full test suite is green.
29
+ 2. Owner reviews; agent tags `v<version>` and pushes the tag.
30
+ **Do not tag before the Trusted Publisher exists** — the
31
+ `publish-pypi.yml` workflow fires on `v*` tags and will fail.
32
+ 3. GitHub Actions then builds, runs `twine check`, and publishes to
33
+ PyPI via Trusted Publishing with PEP 740 attestations.
@@ -0,0 +1,71 @@
1
+ Metadata-Version: 2.5
2
+ Name: eclipse-gig-core
3
+ Version: 0.1.0
4
+ Summary: Eclipse Gig Core MCP — the shared core of the Eclipse gig adapter family: one canonical, owner-approved, hash-bound Task Brief; quote normalization to face price + itemized fees + one all-in total; and the mandate hire gate. Fixtures and evaluation only: no live platform call, no hire executed, no payment moved.
5
+ Project-URL: Homepage, https://cetech.ai
6
+ Project-URL: Repository, https://github.com/CYAN-ECLIPSE-TECHNOLOGIES-LLC/eclipse-gig-core-mcp
7
+ Project-URL: Vendor, https://cetech.ai
8
+ Author: Cyan Eclipse Technologies LLC
9
+ License: MIT
10
+ License-File: LICENSE
11
+ Keywords: gig-economy,mcp,model-context-protocol,procurement,task-marketplace
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Topic :: Software Development :: Libraries
17
+ Requires-Python: >=3.10
18
+ Description-Content-Type: text/markdown
19
+
20
+ # eclipse-gig-core
21
+
22
+ mcp-name: io.github.CYAN-ECLIPSE-TECHNOLOGIES-LLC/gig-core
23
+
24
+ **What this is:** the MCP server for **Eclipse Gig Core** — the shared
25
+ core of Cyan Eclipse Technologies' Eclipse gig adapter family. One
26
+ canonical, owner-approved Task Brief becomes a native request, offer
27
+ round, booking, or prep pack on each task marketplace, according to
28
+ what that platform actually sanctions.
29
+
30
+ **What this is not:** phase G0 is fixtures and evaluation only. **No
31
+ live platform call exists in this code, no hire is executed, no review
32
+ is submitted, and no payment moves.** Hiring happens only inside an
33
+ Eclipse Procure / Agent Wallet mandate, evaluated — never executed —
34
+ by this core.
35
+
36
+ ## Run it
37
+
38
+ ```console
39
+ $ pip install eclipse-gig-core
40
+ $ eclipse-gig-core # MCP over stdio, Python stdlib only
41
+ ```
42
+
43
+ MCP client config:
44
+
45
+ ```json
46
+ { "mcpServers": { "eclipse-gig-core": { "command": "uvx", "args": ["eclipse-gig-core"] } } }
47
+ ```
48
+
49
+ ## Tools (10)
50
+
51
+ `brief_create` · `brief_update` · `brief_approve` · `brief_read` ·
52
+ `quote_normalize` · `quote_read` · `hire_check` · `completion_verify` ·
53
+ `review_draft` · `receipt_list`
54
+
55
+ ## Honest scope
56
+
57
+ - The Task Brief is versioned and SHA-256 hash-bound; any
58
+ post-approval edit invalidates the approval. Quotes normalize every
59
+ platform model (lead, stated-budget, fixed-price, hourly) to face
60
+ price and itemized fees — forever separate — plus one all-in total;
61
+ a quote whose fees are unexposed cannot be hireable under a ceiling.
62
+ - The hire gate returns ALLOW / DENY with named reasons, receipted
63
+ either way; in v1, selecting a person requires an owner-confirm
64
+ token even when a mandate allows the money.
65
+ - State persists in `data/state.json` beside the server (override with
66
+ `ECLIPSE_GIG_CORE_STATE`).
67
+ - Certified (local) by the Eclipse Test Bench at v0.1.0; the listing
68
+ status in the Eclipse Bazaar catalog is in-development.
69
+
70
+ Powered by Cyan Eclipse Technologies LLC (cetech.ai) — a Veteran-Owned
71
+ Small Business. MIT licensed.
@@ -0,0 +1,52 @@
1
+ # eclipse-gig-core
2
+
3
+ mcp-name: io.github.CYAN-ECLIPSE-TECHNOLOGIES-LLC/gig-core
4
+
5
+ **What this is:** the MCP server for **Eclipse Gig Core** — the shared
6
+ core of Cyan Eclipse Technologies' Eclipse gig adapter family. One
7
+ canonical, owner-approved Task Brief becomes a native request, offer
8
+ round, booking, or prep pack on each task marketplace, according to
9
+ what that platform actually sanctions.
10
+
11
+ **What this is not:** phase G0 is fixtures and evaluation only. **No
12
+ live platform call exists in this code, no hire is executed, no review
13
+ is submitted, and no payment moves.** Hiring happens only inside an
14
+ Eclipse Procure / Agent Wallet mandate, evaluated — never executed —
15
+ by this core.
16
+
17
+ ## Run it
18
+
19
+ ```console
20
+ $ pip install eclipse-gig-core
21
+ $ eclipse-gig-core # MCP over stdio, Python stdlib only
22
+ ```
23
+
24
+ MCP client config:
25
+
26
+ ```json
27
+ { "mcpServers": { "eclipse-gig-core": { "command": "uvx", "args": ["eclipse-gig-core"] } } }
28
+ ```
29
+
30
+ ## Tools (10)
31
+
32
+ `brief_create` · `brief_update` · `brief_approve` · `brief_read` ·
33
+ `quote_normalize` · `quote_read` · `hire_check` · `completion_verify` ·
34
+ `review_draft` · `receipt_list`
35
+
36
+ ## Honest scope
37
+
38
+ - The Task Brief is versioned and SHA-256 hash-bound; any
39
+ post-approval edit invalidates the approval. Quotes normalize every
40
+ platform model (lead, stated-budget, fixed-price, hourly) to face
41
+ price and itemized fees — forever separate — plus one all-in total;
42
+ a quote whose fees are unexposed cannot be hireable under a ceiling.
43
+ - The hire gate returns ALLOW / DENY with named reasons, receipted
44
+ either way; in v1, selecting a person requires an owner-confirm
45
+ token even when a mandate allows the money.
46
+ - State persists in `data/state.json` beside the server (override with
47
+ `ECLIPSE_GIG_CORE_STATE`).
48
+ - Certified (local) by the Eclipse Test Bench at v0.1.0; the listing
49
+ status in the Eclipse Bazaar catalog is in-development.
50
+
51
+ Powered by Cyan Eclipse Technologies LLC (cetech.ai) — a Veteran-Owned
52
+ Small Business. MIT licensed.
@@ -0,0 +1,75 @@
1
+ # Eclipse Gig Core MCP
2
+
3
+ **Powered by Cyan Eclipse Technologies** — https://cetech.ai
4
+
5
+ **The Eclipse gig adapter family — one canonical, owner-approved Task Brief becomes a native request, offer round, booking, or prep pack on each task marketplace, according to what that platform actually sanctions. Hiring happens only inside an Eclipse Procure / Agent Wallet mandate. It never diverts a hire off-platform, never invents a sanctioned surface that does not exist, and never posts a brief the owner has not approved.**
6
+
7
+ ## Why this exists
8
+
9
+ Task marketplaces do not agree with each other: Thumbtack runs a lead/request model, Airtasker runs post-and-offers, TaskRabbit's partner surface is fixed-price booking, Fiverr is a gig catalog, Upwork is contract/proposal. There is no universal "post" and no universal "price." The gig core is the one place the family agrees: a single hash-bound Task Brief, one quote normalization to an all-in total, one hire gate, one completion standard, one review discipline. Each platform adapter (Compass for Thumbtack is the first) renders the brief natively and never flattens how its hire happens. This family is Eclipse Procure's human-services supply side.
10
+
11
+ ## Status — honest labels
12
+
13
+ v0.1.0, phase **G0 (shared core, fixtures + evaluation only)**. Local stdio transport, Python stdlib only. **No live platform call exists in the code, no hire is executed, no payment moves, no review is submitted, and no certification is claimed — bench pending.** Live request/hire surfaces belong to the adapters at G1, behind owner partner-access gates.
14
+
15
+ ## The Task Brief
16
+
17
+ One immutable, versioned object per job: category + service, scope statement (what done looks like), ZIP-tier location (exact address is released only inside a platform's own post-hire flow — a brief carrying exact-address precision is refused), timing window, **one ALL-IN budget ceiling**, photo refs with the EXIF-strip status recorded on each photo record, `license_required` (`unknown` | `no` | `yes:<type>`), a safety + access block, intended/prohibited platforms, and a details bag adapters draw native form answers from.
18
+
19
+ Approval binds the brief's SHA-256 content hash and the per-platform variant hashes approved with it. **Any post-approval edit creates a new version and invalidates the approval** — approval binds hashes, not vibes.
20
+
21
+ ## Quote normalization — all-in or it is not a quote
22
+
23
+ Every quote normalizes to one record: pro identity with license claims surfaced verbatim (never asserted valid), face price, itemized fees with bearers, platform-stated tax, and one `ALL_IN_TOTAL`. Fees stay separate fields forever; comparisons and the ceiling test run on the all-in only. Pro-borne fees (the Thumbtack lead fee) are itemized because they explain quote levels, but they are not charged to the buyer and stay out of the buyer's all-in. Hourly quotes are rate × the owner-approved hour cap; overruns return to review.
24
+
25
+ A quote whose fees the platform does not expose is `UNEXPOSED` and **cannot be hired under a ceiling**. The only lift is a written, per-quote owner exception recorded in the approval pack; with owner-supplied fee figures the all-in is computed from that itemization and labeled as such — the status stays UNEXPOSED, because the platform never exposed them.
26
+
27
+ ## The hire gate
28
+
29
+ `hire_check` executes nothing; it evaluates a hire against a live Eclipse Procure / Agent Wallet mandate: brief approved at its current hash, mandate present and unexpired, all-in vs mandate cap and vs brief ceiling, category + platform allowlists, approval threshold (above it, an owner token for *this exact quote* — token form `approve-quote-<quote_id>`), quote expiry, fee exposure. Every check, ALLOW or DENY, is receipted.
30
+
31
+ **Person-selection is owner-confirmed in v1, mandate or not:** a mandate ALLOW without the owner-confirm token (`confirm-person-<quote_id>`) returns `MANDATE_ALLOW_PERSON_PENDING` with `hireable: false`. Selecting a person to enter the owner's home does not ride on a budget rule.
32
+
33
+ ## Completion + reviews
34
+
35
+ Platform-done is not verified. `completion_verify` checks each scope item (done / partial / not done, with owner attestation) and stores the platform's state **verbatim in its own field**; a platform-completed claim the owner does not attest opens an `exception` record — never a silent edit.
36
+
37
+ `review_draft` writes from the verification record only: what was hired, what was verified, and timeliness / communication / quality strictly as recorded. A record without quality notes produces a draft with **no quality claims at all**. Leverage language ("refund or…") is refused at draft time. Drafts never submit themselves; the owner approves the exact text.
38
+
39
+ ## Tools (10)
40
+
41
+ | Tool | What it does |
42
+ |---|---|
43
+ | `brief_create` | Create a Task Brief; validates completeness + ZIP-tier precision; issues the version-1 hash. |
44
+ | `brief_update` | New version from content changes; invalidates any approval. |
45
+ | `brief_approve` | Record owner approval of the exact current hash + variant hashes. |
46
+ | `brief_read` | Read a brief with approval validity. |
47
+ | `quote_normalize` | Normalize any model (lead / stated-budget / fixed-price / hourly) to face + itemized fees + all-in; optional ceiling test. |
48
+ | `quote_read` | Read a normalized quote; optional ceiling re-test. |
49
+ | `hire_check` | The mandate gate: ALLOW / MANDATE_ALLOW_PERSON_PENDING / DENY, named reasons, receipted. Executes nothing. |
50
+ | `completion_verify` | Scope-by-scope verification record; platform state separate; mismatch = exception. |
51
+ | `review_draft` | Record-bound review draft; no unrecorded sentiment; leverage language refused. |
52
+ | `receipt_list` | List the append-only receipt chain and verify it. |
53
+
54
+ The denylist is stated in code: no `request_submit`, `hire_execute`, `payment_execute`, `review_submit`, and no session/scraping route (`session_login`, `cookie_reuse`, `scrape_*`) exists at any tier (spec §8.6).
55
+
56
+ ## Run it
57
+
58
+ ```bash
59
+ python3 server.py # MCP over stdio, stdlib only, no dependencies
60
+ python3 smoke.py # end-to-end smoke over real stdio (temp state)
61
+ python3 -m unittest discover tests
62
+ python3 make_icon.py # regenerate icon-512.png
63
+ ```
64
+
65
+ State persists in `data/state.json` beside the server (override with `ECLIPSE_GIG_CORE_STATE`). `data/` is gitignored.
66
+
67
+ ## Roadmap (per spec)
68
+
69
+ - **G0** — this core + the Compass (Thumbtack) fixture adapter.
70
+ - **G1** — Compass live modes behind owner-obtained Thumbtack partner access.
71
+ - **G2** — Airtasker surface verification sprint (Eclipse Tender stays prep-only until a sanctioned route is confirmed).
72
+
73
+ ## License / attribution
74
+
75
+ A Cyan Eclipse Technologies product. The "Powered by Cyan Eclipse Technologies" attribution travels with it.
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1 @@
1
+ {"bench":{"bench_verdict":"CERTIFIED(local)","certified":true,"certified_scope":"local","checks":["exact-address brief refused (ZIP-tier only)","approval binds the exact brief hash","post-approval edit invalidates approval","UNEXPOSED-fee quote never hireable under a ceiling","owner exception: all-in computed, status stays UNEXPOSED","mandate ALLOW without person token is not hireable","platform-done vs owner-not_done opens an exception; states never merge","review draft carries no quality claims the record lacks","leverage language refused at draft time","capability denylist: exactly the 10 G0 tools","receipt chain valid; tamper detected","auth enforced","schema valid","no network surface (local-only build)","no secret leak","sane errors","process health","audit completeness","bench isolation"],"not_tested":["Live platform calls of any kind — G0 contains no live marketplace code path; briefs, quotes, mandates, and verifications are local records evaluated against shipped test data.","Adapter variant approval binding against a live adapter — the Compass fixture adapter is the first consumer; cross-product bench is a later run.","Photo EXIF stripping tooling itself — the core records the strip status per photo as supplied; the stripping tool is adapter/build scope [verify] per spec 5.1."],"scorecard_ref":"test-bench/results/eclipse-gig-core-mcp-2026-10-25.json","status":"CERTIFIED(local) — Eclipse Bazaar Test Bench 2026-10-25, 18/19 checks pass, 1 na (U1 auth: stdio process boundary). Run by W-003 (Verity), suites/gig_core.py."},"category":"Gig / Task Marketplace Infrastructure","created":"2026-10-25","description":"The shared core of the Eclipse gig adapter family: one canonical, owner-approved Task Brief (versioned, SHA-256 hash-bound; any post-approval edit invalidates approval) becomes a native request on each task marketplace through its adapter. The core normalizes quotes from every platform model (lead, stated-budget, fixed-price, hourly) to one record with face price and itemized fees forever separate and a single ALL-IN total; a quote whose fees are UNEXPOSED cannot be hired under a ceiling absent a written per-quote owner exception. The hire gate evaluates a live Eclipse Procure / Agent Wallet mandate (cap, category + platform allowlists, approval threshold, expiry) and returns receipted ALLOW/DENY decisions; in v1, selecting a person requires an owner-confirm token even under a mandate. Completion verification keeps platform state and owner attestation in separate fields (platform-done is not verified), and review drafts are generated only from the verification record. G0 executes nothing and calls nothing live.","icon":"icon-512.png","name":"Eclipse Gig Core MCP","powered_by":"Cyan Eclipse Technologies","price_model":"Free local v0.1; family pricing TBD per spec","repo":null,"slug":"eclipse-gig-core-mcp","status":"In development — v0.1.0 G0 local build (Task Brief core + quote normalization + hire gate evaluation; fixtures only; CERTIFIED(local) — Eclipse Bazaar Test Bench 2026-10-25)","tagline":"One approved Task Brief, every marketplace: hash-bound briefs, all-in quotes, and a hire that runs only inside a mandate.","tools":["brief_create","brief_update","brief_approve","brief_read","quote_normalize","quote_read","hire_check","completion_verify","review_draft","receipt_list"],"transport":"MCP over stdio (HTTP transport on roadmap)","vendor":"Cyan Eclipse Technologies","x402_ready":false}
@@ -0,0 +1,6 @@
1
+ {
2
+ "$schema": "https://glama.ai/mcp/schemas/server.json",
3
+ "maintainers": [
4
+ "cetech-ai"
5
+ ]
6
+ }
Binary file
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env python3
2
+ # Eclipse Gig Core MCP
3
+ # Copyright © 2026 Cyan Eclipse Technologies LLC · cetech.ai
4
+ # Generate icon-512.png — brand §6: eclipse motif on navy (#0d1b2a),
5
+
6
+ """Generate icon-512.png — brand §6: eclipse motif on navy (#0d1b2a),
7
+ one per-product glyph. Gig Core's glyph is the Task Brief itself: a
8
+ document with scope lines and a hash seal, inside the gradient
9
+ eclipse ring. PIL only; deterministic."""
10
+ from PIL import Image, ImageDraw
11
+
12
+ S = 512
13
+ NAVY = (13, 27, 42, 255)
14
+ STOPS = [(15, 246, 247), (0, 212, 255), (123, 44, 191)]
15
+
16
+
17
+ def lerp(a, b, t):
18
+ return tuple(int(a[i] + (b[i] - a[i]) * t) for i in range(3)) + (255,)
19
+
20
+
21
+ def grad(t):
22
+ return lerp(STOPS[0], STOPS[1], t * 2) if t < 0.5 else \
23
+ lerp(STOPS[1], STOPS[2], (t - 0.5) * 2)
24
+
25
+
26
+ def main():
27
+ img = Image.new("RGBA", (S, S), NAVY)
28
+ d = ImageDraw.Draw(img)
29
+ ring = [54, 54, 458, 458]
30
+ for i in range(72):
31
+ t = i / 72
32
+ d.arc(ring, start=i * 5, end=i * 5 + 6, fill=grad(t), width=13)
33
+ d.ellipse([126, 126, 386, 386], fill=NAVY)
34
+ # The brief: a document.
35
+ doc = [176, 130, 336, 382]
36
+ d.rounded_rectangle(doc, radius=14, fill=(8, 12, 20, 255),
37
+ outline=(254, 254, 254, 255), width=6)
38
+ # Scope lines.
39
+ for i, y in enumerate((176, 216, 256)):
40
+ d.line([(204, y), (308, y)], fill=grad(0.2 + 0.2 * i), width=9)
41
+ # Two scope check marks.
42
+ for y in (296, 336):
43
+ d.line([(204, y + 6), (216, y + 16)], fill=grad(0.55), width=6)
44
+ d.line([(216, y + 16), (238, y - 6)], fill=grad(0.55), width=6)
45
+ d.line([(252, y + 4), (308, y + 4)],
46
+ fill=(160, 174, 192, 255), width=7)
47
+ # Hash seal at the document's foot.
48
+ d.ellipse([292, 330, 330, 368], fill=grad(0.85))
49
+ img.save("icon-512.png")
50
+ print("wrote icon-512.png", img.size, img.mode)
51
+
52
+
53
+ if __name__ == "__main__":
54
+ main()
55
+
56
+ # Eclipse Gig Core MCP · © 2026 Cyan Eclipse Technologies LLC · cetech.ai
@@ -0,0 +1,43 @@
1
+ [build-system]
2
+ requires = ["hatchling"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "eclipse-gig-core"
7
+ version = "0.1.0"
8
+ description = "Eclipse Gig Core MCP — the shared core of the Eclipse gig adapter family: one canonical, owner-approved, hash-bound Task Brief; quote normalization to face price + itemized fees + one all-in total; and the mandate hire gate. Fixtures and evaluation only: no live platform call, no hire executed, no payment moved."
9
+ readme = "PYPI_README.md"
10
+ requires-python = ">=3.10"
11
+ license = { text = "MIT" }
12
+ authors = [
13
+ { name = "Cyan Eclipse Technologies LLC" },
14
+ ]
15
+ keywords = ["mcp", "model-context-protocol", "gig-economy", "task-marketplace", "procurement"]
16
+ classifiers = [
17
+ "Development Status :: 3 - Alpha",
18
+ "Intended Audience :: Developers",
19
+ "License :: OSI Approved :: MIT License",
20
+ "Programming Language :: Python :: 3",
21
+ "Topic :: Software Development :: Libraries",
22
+ ]
23
+
24
+ [project.urls]
25
+ Homepage = "https://cetech.ai"
26
+ Repository = "https://github.com/CYAN-ECLIPSE-TECHNOLOGIES-LLC/eclipse-gig-core-mcp"
27
+ Vendor = "https://cetech.ai"
28
+
29
+ [project.scripts]
30
+ eclipse-gig-core = "server:main"
31
+
32
+ # Version lockstep: this version, the VERSION file, server.json, and the
33
+ # server.py docstring all read 0.1.0 — bump them together.
34
+ # Flat layout: the runtime is the top-level server.py module. Runtime
35
+ # data read beside server.py (Path(__file__).parent / ...) is
36
+ # force-included at the same relative path in the wheel.
37
+ [tool.hatch.build.targets.wheel.force-include]
38
+ "server.py" = "server.py"
39
+ "bazaar-manifest.json" = "bazaar-manifest.json"
40
+
41
+ [tool.hatch.build.targets.sdist.force-include]
42
+ "server.py" = "server.py"
43
+ "bazaar-manifest.json" = "bazaar-manifest.json"
@@ -0,0 +1,40 @@
1
+ {
2
+ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
+ "name": "io.github.CYAN-ECLIPSE-TECHNOLOGIES-LLC/gig-core",
4
+ "title": "Eclipse Gig Core MCP",
5
+ "description": "One approved Task Brief, every marketplace: hash-bound briefs, all-in quotes, and a hire that runs",
6
+ "version": "0.1.0",
7
+ "websiteUrl": "https://eclipsebazaar.com",
8
+ "icons": [
9
+ {
10
+ "src": "https://raw.githubusercontent.com/CYAN-ECLIPSE-TECHNOLOGIES-LLC/eclipse-gig-core-mcp/main/icon-512.png",
11
+ "mimeType": "image/png",
12
+ "sizes": [
13
+ "512x512"
14
+ ]
15
+ }
16
+ ],
17
+ "repository": {
18
+ "source": "github",
19
+ "url": "https://github.com/CYAN-ECLIPSE-TECHNOLOGIES-LLC/eclipse-gig-core-mcp"
20
+ },
21
+ "packages": [
22
+ {
23
+ "registryType": "pypi",
24
+ "identifier": "eclipse-gig-core",
25
+ "version": "0.1.0",
26
+ "runtimeHint": "uvx",
27
+ "transport": {
28
+ "type": "stdio"
29
+ }
30
+ },
31
+ {
32
+ "registryType": "oci",
33
+ "identifier": "ghcr.io/cyan-eclipse-technologies-llc/eclipse-gig-core-mcp:0.1.0",
34
+ "runtimeHint": "docker",
35
+ "transport": {
36
+ "type": "stdio"
37
+ }
38
+ }
39
+ ]
40
+ }