eidos-ai 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.
- eidos_ai-0.1.0/.devcontainer/devcontainer.json +59 -0
- eidos_ai-0.1.0/.devcontainer/post-create.sh +52 -0
- eidos_ai-0.1.0/.github/workflows/ci.yml +90 -0
- eidos_ai-0.1.0/.github/workflows/release.yml +79 -0
- eidos_ai-0.1.0/.gitignore +25 -0
- eidos_ai-0.1.0/.vscode/python.code-snippets +205 -0
- eidos_ai-0.1.0/.vscode/settings.json +24 -0
- eidos_ai-0.1.0/LICENSE +21 -0
- eidos_ai-0.1.0/PKG-INFO +96 -0
- eidos_ai-0.1.0/README.adoc +77 -0
- eidos_ai-0.1.0/assets/plugin_reference/README.md +74 -0
- eidos_ai-0.1.0/assets/plugin_reference/hooks.json +31 -0
- eidos_ai-0.1.0/assets/plugin_reference/mcp_config.json +10 -0
- eidos_ai-0.1.0/assets/plugin_reference/plugin.json +31 -0
- eidos_ai-0.1.0/assets/plugin_reference/rules/AGENTS.md +34 -0
- eidos_ai-0.1.0/assets/plugin_reference/scripts/lint_docs.py +281 -0
- eidos_ai-0.1.0/assets/plugin_reference/skills/eidos/SKILL.md +176 -0
- eidos_ai-0.1.0/assets/plugin_reference/skills/eidos-architecture/SKILL.md +111 -0
- eidos_ai-0.1.0/assets/plugin_reference/skills/eidos-delta/SKILL.md +127 -0
- eidos_ai-0.1.0/assets/plugin_reference/skills/eidos-design/SKILL.md +276 -0
- eidos_ai-0.1.0/assets/plugin_reference/skills/eidos-extract/SKILL.md +255 -0
- eidos_ai-0.1.0/assets/plugin_reference/skills/eidos-init/SKILL.md +153 -0
- eidos_ai-0.1.0/assets/plugin_reference/skills/eidos-invariants/SKILL.md +136 -0
- eidos_ai-0.1.0/assets/schemas/agent_plugins/mcp.schema.json +121 -0
- eidos_ai-0.1.0/assets/schemas/agent_plugins/plugin.schema.json +66 -0
- eidos_ai-0.1.0/assets/schemas/v1/delta/delta.schema.yaml +166 -0
- eidos_ai-0.1.0/assets/schemas/v1/design/screen.schema.yaml +83 -0
- eidos_ai-0.1.0/assets/schemas/v1/design/system.schema.yaml +101 -0
- eidos_ai-0.1.0/assets/schemas/v1/design/ui-component.schema.yaml +105 -0
- eidos_ai-0.1.0/assets/schemas/v1/product/capability.schema.yaml +153 -0
- eidos_ai-0.1.0/assets/schemas/v1/product/domain.schema.yaml +78 -0
- eidos_ai-0.1.0/assets/schemas/v1/product/exploration.schema.yaml +86 -0
- eidos_ai-0.1.0/assets/schemas/v1/product/persona.schema.yaml +60 -0
- eidos_ai-0.1.0/assets/schemas/v1/product/policy.schema.yaml +69 -0
- eidos_ai-0.1.0/assets/schemas/v1/product/system.schema.yaml +102 -0
- eidos_ai-0.1.0/assets/schemas/v1/tech/architecture.schema.yaml +147 -0
- eidos_ai-0.1.0/assets/schemas/v1/tech/component.schema.yaml +105 -0
- eidos_ai-0.1.0/assets/schemas/v1/tech/contract.schema.yaml +37 -0
- eidos_ai-0.1.0/eidos/.gitignore +3 -0
- eidos_ai-0.1.0/eidos/architecture/components/cli.adoc +64 -0
- eidos_ai-0.1.0/eidos/architecture/components/core.adoc +69 -0
- eidos_ai-0.1.0/eidos/architecture/components/mcp.adoc +55 -0
- eidos_ai-0.1.0/eidos/architecture/components/plugin.adoc +58 -0
- eidos_ai-0.1.0/eidos/architecture/components/portal.adoc +62 -0
- eidos_ai-0.1.0/eidos/architecture/contracts/cli.adoc +110 -0
- eidos_ai-0.1.0/eidos/architecture/contracts/mcp.adoc +38 -0
- eidos_ai-0.1.0/eidos/architecture/contracts/portal.adoc +26 -0
- eidos_ai-0.1.0/eidos/architecture/system-architecture.adoc +145 -0
- eidos_ai-0.1.0/eidos/deltas/dlt-2026-001.adoc +48 -0
- eidos_ai-0.1.0/eidos/deltas/dlt-2026-002.adoc +31 -0
- eidos_ai-0.1.0/eidos/deltas/dlt-2026-003.adoc +32 -0
- eidos_ai-0.1.0/eidos/deltas/dlt-2026-004.adoc +41 -0
- eidos_ai-0.1.0/eidos/deltas/dlt-2026-005.adoc +41 -0
- eidos_ai-0.1.0/eidos/deltas/dlt-2026-006.adoc +45 -0
- eidos_ai-0.1.0/eidos/deltas/dlt-2026-007.adoc +58 -0
- eidos_ai-0.1.0/eidos/deltas/dlt-2026-008.adoc +42 -0
- eidos_ai-0.1.0/eidos/deltas/dlt-2026-009.adoc +48 -0
- eidos_ai-0.1.0/eidos/domains/agent-harness/capabilities/agent-adapter.adoc +36 -0
- eidos_ai-0.1.0/eidos/domains/agent-harness/domain.adoc +27 -0
- eidos_ai-0.1.0/eidos/domains/product-core/capabilities/exploration-discovery.adoc +35 -0
- eidos_ai-0.1.0/eidos/domains/product-core/capabilities/living-spec-engine.adoc +47 -0
- eidos_ai-0.1.0/eidos/domains/product-core/capabilities/spec-delta-mutations.adoc +40 -0
- eidos_ai-0.1.0/eidos/domains/product-core/domain.adoc +28 -0
- eidos_ai-0.1.0/eidos/domains/vcs-sync/capabilities/github-gitlab-bridge.adoc +34 -0
- eidos_ai-0.1.0/eidos/domains/vcs-sync/domain.adoc +28 -0
- eidos_ai-0.1.0/eidos/personas/autonomous-agent.adoc +25 -0
- eidos_ai-0.1.0/eidos/personas/product-lead.adoc +25 -0
- eidos_ai-0.1.0/eidos/policies/POL-001-git-as-single-source-of-truth.adoc +17 -0
- eidos_ai-0.1.0/eidos/policies/POL-002-invariant-test-enforcement.adoc +17 -0
- eidos_ai-0.1.0/eidos/system.adoc +73 -0
- eidos_ai-0.1.0/pyproject.toml +41 -0
- eidos_ai-0.1.0/src/eidos/__init__.py +4 -0
- eidos_ai-0.1.0/src/eidos/agent/__init__.py +2 -0
- eidos_ai-0.1.0/src/eidos/agent/base.py +43 -0
- eidos_ai-0.1.0/src/eidos/cli/__init__.py +2 -0
- eidos_ai-0.1.0/src/eidos/cli/main.py +1113 -0
- eidos_ai-0.1.0/src/eidos/core/__init__.py +2 -0
- eidos_ai-0.1.0/src/eidos/core/assets.py +59 -0
- eidos_ai-0.1.0/src/eidos/core/models.py +47 -0
- eidos_ai-0.1.0/src/eidos/core/parser.py +59 -0
- eidos_ai-0.1.0/src/eidos/core/scaffolder.py +1016 -0
- eidos_ai-0.1.0/src/eidos/core/validator.py +158 -0
- eidos_ai-0.1.0/src/eidos/mcp/__init__.py +2 -0
- eidos_ai-0.1.0/src/eidos/mcp/server.py +517 -0
- eidos_ai-0.1.0/src/eidos/plugin/__init__.py +20 -0
- eidos_ai-0.1.0/src/eidos/plugin/installer.py +372 -0
- eidos_ai-0.1.0/src/eidos/plugin/validator.py +261 -0
- eidos_ai-0.1.0/src/eidos/plugin/version.py +173 -0
- eidos_ai-0.1.0/src/eidos/portal/__init__.py +7 -0
- eidos_ai-0.1.0/src/eidos/portal/assets.py +762 -0
- eidos_ai-0.1.0/src/eidos/portal/builder.py +31 -0
- eidos_ai-0.1.0/src/eidos/portal/generator.py +291 -0
- eidos_ai-0.1.0/src/eidos/portal/server.py +103 -0
- eidos_ai-0.1.0/src/eidos/vcs/__init__.py +2 -0
- eidos_ai-0.1.0/src/eidos/vcs/bridge.py +40 -0
- eidos_ai-0.1.0/tests/__init__.py +2 -0
- eidos_ai-0.1.0/tests/test_mcp.py +88 -0
- eidos_ai-0.1.0/tests/test_plugin.py +531 -0
- eidos_ai-0.1.0/tests/test_portal.py +133 -0
- eidos_ai-0.1.0/tests/test_scaffolder.py +553 -0
- eidos_ai-0.1.0/tests/test_validator.py +43 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Eidos Devcontainer",
|
|
3
|
+
"image": "ubuntu:26.04",
|
|
4
|
+
"features": {
|
|
5
|
+
"ghcr.io/devcontainers/features/common-utils:2": {
|
|
6
|
+
"installZsh": true,
|
|
7
|
+
"configureZshAsDefaultShell": true,
|
|
8
|
+
"installOhMyZsh": true,
|
|
9
|
+
"installOhMyZshConfig": true,
|
|
10
|
+
"upgradePackages": true,
|
|
11
|
+
"nonFreePackages": true,
|
|
12
|
+
"username": "vscode"
|
|
13
|
+
},
|
|
14
|
+
"ghcr.io/devcontainers/features/git:1": {},
|
|
15
|
+
"ghcr.io/devcontainers/features/git-lfs:1": {},
|
|
16
|
+
"ghcr.io/devcontainers/features/github-cli:1": {},
|
|
17
|
+
"ghcr.io/devcontainer-community/devcontainer-features/astral.sh-uv:1": {
|
|
18
|
+
"shellautocompletion": true
|
|
19
|
+
},
|
|
20
|
+
"ghcr.io/devcontainers/features/docker-in-docker:2": {
|
|
21
|
+
"moby": false
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"containerEnv": {
|
|
25
|
+
// uv cannot use hardlinks across the /tmp → workspace boundary in Codespaces;
|
|
26
|
+
// copy mode avoids "Invalid cross-device link" errors.
|
|
27
|
+
"UV_LINK_MODE": "copy"
|
|
28
|
+
},
|
|
29
|
+
"mounts": [
|
|
30
|
+
"source=eidos-gemini,target=/home/vscode/.gemini,type=volume"
|
|
31
|
+
],
|
|
32
|
+
"remoteUser": "vscode",
|
|
33
|
+
"postCreateCommand": "bash .devcontainer/post-create.sh",
|
|
34
|
+
"customizations": {
|
|
35
|
+
"vscode": {
|
|
36
|
+
"extensions": [
|
|
37
|
+
// --- Python & Astral Toolchain ---
|
|
38
|
+
"ms-python.python",
|
|
39
|
+
"ms-python.debugpy",
|
|
40
|
+
"ms-python.vscode-python-envs",
|
|
41
|
+
"charliermarsh.ruff",
|
|
42
|
+
"astral-sh.ty",
|
|
43
|
+
// --- Containers & Virtualization ---
|
|
44
|
+
"ms-azuretools.vscode-containers",
|
|
45
|
+
// --- Living Architecture & Specifications ---
|
|
46
|
+
"asciidoctor.asciidoctor-vscode",
|
|
47
|
+
"mathematic.vscode-pdf",
|
|
48
|
+
// --- Configuration & Schemas ---
|
|
49
|
+
"tamasfe.even-better-toml",
|
|
50
|
+
"redhat.vscode-yaml",
|
|
51
|
+
// --- Git & Source Control ---
|
|
52
|
+
"mhutchie.git-graph",
|
|
53
|
+
"donjayamanne.githistory",
|
|
54
|
+
// --- AI Agents & Harness ---
|
|
55
|
+
"google.google-antigravity"
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
echo "========================================================"
|
|
5
|
+
echo "🚀 Initializing Eidos Dev Container Environment..."
|
|
6
|
+
echo "========================================================"
|
|
7
|
+
|
|
8
|
+
export PATH="$HOME/.local/bin:$PATH"
|
|
9
|
+
|
|
10
|
+
# 1. Install Python 3.15 via uv
|
|
11
|
+
echo "==> Ensuring Python 3.15 via uv..."
|
|
12
|
+
uv python install --default 3.15
|
|
13
|
+
|
|
14
|
+
# 2. Set up Python virtual environment and install Eidos in editable mode
|
|
15
|
+
echo "==> Setting up Eidos virtual environment with Python 3.15..."
|
|
16
|
+
uv venv --python 3.15 .venv
|
|
17
|
+
uv pip install -e ".[dev]"
|
|
18
|
+
|
|
19
|
+
# 3. Configure persistent AI tool directories and migrate initial backups
|
|
20
|
+
echo "==> Configuring persistent volumes (~/.gemini)..."
|
|
21
|
+
sudo mkdir -p "${HOME}/.gemini"
|
|
22
|
+
sudo chown -R vscode:vscode "${HOME}/.gemini"
|
|
23
|
+
chmod 700 "${HOME}/.gemini"
|
|
24
|
+
|
|
25
|
+
BACKUP_DIR="${PWD}/backups"
|
|
26
|
+
if [ -d "${BACKUP_DIR}/.gemini" ]; then
|
|
27
|
+
echo " Migrating initial Gemini data from ${BACKUP_DIR}/.gemini..."
|
|
28
|
+
cp -a "${BACKUP_DIR}/.gemini/." "${HOME}/.gemini/"
|
|
29
|
+
rm -rf "${BACKUP_DIR}/.gemini"
|
|
30
|
+
elif [ -d "${BACKUP_DIR}/gemini" ]; then
|
|
31
|
+
echo " Migrating initial Gemini data from ${BACKUP_DIR}/gemini..."
|
|
32
|
+
cp -a "${BACKUP_DIR}/gemini/." "${HOME}/.gemini/"
|
|
33
|
+
rm -rf "${BACKUP_DIR}/gemini"
|
|
34
|
+
fi
|
|
35
|
+
|
|
36
|
+
if [ -d "${BACKUP_DIR}" ]; then
|
|
37
|
+
rmdir "${BACKUP_DIR}" 2>/dev/null || true
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
sudo chown -R vscode:vscode "${HOME}/.gemini"
|
|
41
|
+
|
|
42
|
+
# 4. Validate Eidos specifications
|
|
43
|
+
if [ -f ".venv/bin/eidos" ]; then
|
|
44
|
+
echo "==> Validating Eidos living specifications..."
|
|
45
|
+
.venv/bin/eidos validate eidos || true
|
|
46
|
+
fi
|
|
47
|
+
|
|
48
|
+
echo "========================================================"
|
|
49
|
+
echo "✅ Eidos Dev Container Ready!"
|
|
50
|
+
echo " - uv: $(uv --version)"
|
|
51
|
+
echo " - python: $(python --version 2>/dev/null || echo 'not on PATH')"
|
|
52
|
+
echo "========================================================"
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
concurrency:
|
|
10
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
11
|
+
cancel-in-progress: true
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
validate:
|
|
15
|
+
name: Validate Specs & Plugin
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
steps:
|
|
18
|
+
- name: Checkout repository
|
|
19
|
+
uses: actions/checkout@v7
|
|
20
|
+
|
|
21
|
+
- name: Set up uv
|
|
22
|
+
uses: astral-sh/setup-uv@v10.3.0
|
|
23
|
+
with:
|
|
24
|
+
enable-cache: true
|
|
25
|
+
version: "latest"
|
|
26
|
+
|
|
27
|
+
- name: Set up Python
|
|
28
|
+
run: uv python install 3.12
|
|
29
|
+
|
|
30
|
+
- name: Install dependencies
|
|
31
|
+
run: uv sync --all-extras --dev
|
|
32
|
+
|
|
33
|
+
- name: Validate Eidos living specifications
|
|
34
|
+
run: uv run eidos validate eidos
|
|
35
|
+
|
|
36
|
+
- name: Validate Agent Plugin conformance
|
|
37
|
+
run: uv run eidos plugin validate
|
|
38
|
+
|
|
39
|
+
test:
|
|
40
|
+
name: Test (Python ${{ matrix.python-version }})
|
|
41
|
+
runs-on: ubuntu-latest
|
|
42
|
+
strategy:
|
|
43
|
+
fail-fast: false
|
|
44
|
+
matrix:
|
|
45
|
+
python-version: ["3.11", "3.12", "3.13", "3.14"]
|
|
46
|
+
steps:
|
|
47
|
+
- name: Checkout repository
|
|
48
|
+
uses: actions/checkout@v7
|
|
49
|
+
|
|
50
|
+
- name: Set up uv
|
|
51
|
+
uses: astral-sh/setup-uv@v10.3.0
|
|
52
|
+
with:
|
|
53
|
+
enable-cache: true
|
|
54
|
+
version: "latest"
|
|
55
|
+
|
|
56
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
57
|
+
run: uv python install ${{ matrix.python-version }}
|
|
58
|
+
|
|
59
|
+
- name: Install dependencies
|
|
60
|
+
run: uv sync --python ${{ matrix.python-version }} --all-extras --dev
|
|
61
|
+
|
|
62
|
+
- name: Run test suite with coverage
|
|
63
|
+
run: uv run pytest -v --cov=src/eidos --cov-report=term-missing
|
|
64
|
+
|
|
65
|
+
build-portal:
|
|
66
|
+
name: Build Living Portal
|
|
67
|
+
runs-on: ubuntu-latest
|
|
68
|
+
steps:
|
|
69
|
+
- name: Checkout repository
|
|
70
|
+
uses: actions/checkout@v7
|
|
71
|
+
|
|
72
|
+
- name: Set up uv
|
|
73
|
+
uses: astral-sh/setup-uv@v10.3.0
|
|
74
|
+
with:
|
|
75
|
+
enable-cache: true
|
|
76
|
+
version: "latest"
|
|
77
|
+
|
|
78
|
+
- name: Set up Python
|
|
79
|
+
run: uv python install 3.12
|
|
80
|
+
|
|
81
|
+
- name: Install dependencies
|
|
82
|
+
run: uv sync --all-extras --dev
|
|
83
|
+
|
|
84
|
+
- name: Generate static living portal
|
|
85
|
+
run: uv run eidos build-site --path eidos --out public
|
|
86
|
+
|
|
87
|
+
- name: Verify generated static portal assets
|
|
88
|
+
run: |
|
|
89
|
+
test -f public/index.html
|
|
90
|
+
test -f public/data.json
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
name: Release to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
push:
|
|
7
|
+
tags:
|
|
8
|
+
- "v*.*.*"
|
|
9
|
+
workflow_dispatch:
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: read
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
build:
|
|
16
|
+
name: Build package distributions 📦
|
|
17
|
+
runs-on: ubuntu-latest
|
|
18
|
+
steps:
|
|
19
|
+
- name: Checkout repository
|
|
20
|
+
uses: actions/checkout@v7
|
|
21
|
+
|
|
22
|
+
- name: Set up uv
|
|
23
|
+
uses: astral-sh/setup-uv@v10.3.0
|
|
24
|
+
with:
|
|
25
|
+
enable-cache: true
|
|
26
|
+
version: "latest"
|
|
27
|
+
|
|
28
|
+
- name: Set up Python
|
|
29
|
+
run: uv python install 3.12
|
|
30
|
+
|
|
31
|
+
- name: Build sdist and wheel
|
|
32
|
+
run: uv build
|
|
33
|
+
|
|
34
|
+
- name: Upload build artifacts
|
|
35
|
+
uses: actions/upload-artifact@v7
|
|
36
|
+
with:
|
|
37
|
+
name: python-package-distributions
|
|
38
|
+
path: dist/
|
|
39
|
+
if-no-files-found: error
|
|
40
|
+
|
|
41
|
+
publish-to-pypi:
|
|
42
|
+
name: Publish to PyPI 🚀
|
|
43
|
+
needs: [build]
|
|
44
|
+
runs-on: ubuntu-latest
|
|
45
|
+
environment:
|
|
46
|
+
name: pypi
|
|
47
|
+
url: https://pypi.org/p/eidos-ai
|
|
48
|
+
permissions:
|
|
49
|
+
id-token: write # Required for PyPI Trusted Publishing (OIDC)
|
|
50
|
+
steps:
|
|
51
|
+
- name: Download build artifacts
|
|
52
|
+
uses: actions/download-artifact@v8
|
|
53
|
+
with:
|
|
54
|
+
name: python-package-distributions
|
|
55
|
+
path: dist/
|
|
56
|
+
|
|
57
|
+
- name: Publish package distributions to PyPI
|
|
58
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
59
|
+
with:
|
|
60
|
+
skip-existing: true
|
|
61
|
+
|
|
62
|
+
github-release:
|
|
63
|
+
name: Attach assets to GitHub Release 🏷️
|
|
64
|
+
needs: [build]
|
|
65
|
+
runs-on: ubuntu-latest
|
|
66
|
+
if: startsWith(github.ref, 'refs/tags/v') || github.event_name == 'release'
|
|
67
|
+
permissions:
|
|
68
|
+
contents: write
|
|
69
|
+
steps:
|
|
70
|
+
- name: Download build artifacts
|
|
71
|
+
uses: actions/download-artifact@v8
|
|
72
|
+
with:
|
|
73
|
+
name: python-package-distributions
|
|
74
|
+
path: dist/
|
|
75
|
+
|
|
76
|
+
- name: Upload artifacts to GitHub Release
|
|
77
|
+
uses: softprops/action-gh-release@v3
|
|
78
|
+
with:
|
|
79
|
+
files: dist/*
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# Virtual environments
|
|
7
|
+
.venv/
|
|
8
|
+
venv/
|
|
9
|
+
ENV/
|
|
10
|
+
|
|
11
|
+
# Testing & Coverage
|
|
12
|
+
.pytest_cache/
|
|
13
|
+
.coverage
|
|
14
|
+
htmlcov/
|
|
15
|
+
|
|
16
|
+
# Distribution / packaging
|
|
17
|
+
dist/
|
|
18
|
+
build/
|
|
19
|
+
*.egg-info/
|
|
20
|
+
|
|
21
|
+
# Local agent plugins installation
|
|
22
|
+
.agents/
|
|
23
|
+
.cursor/
|
|
24
|
+
.claude/
|
|
25
|
+
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
{
|
|
2
|
+
"if": {
|
|
3
|
+
"scope": "python",
|
|
4
|
+
"prefix": "if",
|
|
5
|
+
"body": ["if ${1:expression}:", "\t${2:pass}"],
|
|
6
|
+
"description": "Code snippet for an if statement"
|
|
7
|
+
},
|
|
8
|
+
"if/else": {
|
|
9
|
+
"scope": "python",
|
|
10
|
+
"prefix": "if/else",
|
|
11
|
+
"body": ["if ${1:condition}:", "\t${2:pass}", "else:", "\t${3:pass}"],
|
|
12
|
+
"description": "Code snippet for an if statement with else"
|
|
13
|
+
},
|
|
14
|
+
"elif": {
|
|
15
|
+
"scope": "python",
|
|
16
|
+
"prefix": "elif",
|
|
17
|
+
"body": ["elif ${1:expression}:", "\t${2:pass}"],
|
|
18
|
+
"description": "Code snippet for an elif"
|
|
19
|
+
},
|
|
20
|
+
"else": {
|
|
21
|
+
"scope": "python",
|
|
22
|
+
"prefix": "else",
|
|
23
|
+
"body": ["else:", "\t${1:pass}"],
|
|
24
|
+
"description": "Code snippet for an else"
|
|
25
|
+
},
|
|
26
|
+
"while": {
|
|
27
|
+
"scope": "python",
|
|
28
|
+
"prefix": "while",
|
|
29
|
+
"body": ["while ${1:expression}:", "\t${2:pass}"],
|
|
30
|
+
"description": "Code snippet for a while loop"
|
|
31
|
+
},
|
|
32
|
+
"while/else": {
|
|
33
|
+
"scope": "python",
|
|
34
|
+
"prefix": "while/else",
|
|
35
|
+
"body": ["while ${1:expression}:", "\t${2:pass}", "else:", "\t${3:pass}"],
|
|
36
|
+
"description": "Code snippet for a while loop with else"
|
|
37
|
+
},
|
|
38
|
+
"for": {
|
|
39
|
+
"scope": "python",
|
|
40
|
+
"prefix": "for",
|
|
41
|
+
"body": ["for ${1:target_list} in ${2:expression_list}:", "\t${3:pass}"],
|
|
42
|
+
"description": "Code snippet for a for loop"
|
|
43
|
+
},
|
|
44
|
+
"for/else": {
|
|
45
|
+
"scope": "python",
|
|
46
|
+
"prefix": "for/else",
|
|
47
|
+
"body": ["for ${1:target_list} in ${2:expression_list}:", "\t${3:pass}", "else:", "\t${4:pass}"],
|
|
48
|
+
"description": "Code snippet for a for loop with else"
|
|
49
|
+
},
|
|
50
|
+
"try/except": {
|
|
51
|
+
"scope": "python",
|
|
52
|
+
"prefix": "try/except",
|
|
53
|
+
"body": ["try:", "\t${1:pass}", "except ${2:expression} as ${3:identifier}:", "\t${4:pass}"],
|
|
54
|
+
"description": "Code snippet for a try/except statement"
|
|
55
|
+
},
|
|
56
|
+
"try/finally": {
|
|
57
|
+
"scope": "python",
|
|
58
|
+
"prefix": "try/finally",
|
|
59
|
+
"body": ["try:", "\t${1:pass}", "finally:", "\t${2:pass}"],
|
|
60
|
+
"description": "Code snippet for a try/finally statement"
|
|
61
|
+
},
|
|
62
|
+
"try/except/else": {
|
|
63
|
+
"scope": "python",
|
|
64
|
+
"prefix": "try/except/else",
|
|
65
|
+
"body": [
|
|
66
|
+
"try:",
|
|
67
|
+
"\t${1:pass}",
|
|
68
|
+
"except ${2:expression} as ${3:identifier}:",
|
|
69
|
+
"\t${4:pass}",
|
|
70
|
+
"else:",
|
|
71
|
+
"\t${5:pass}"
|
|
72
|
+
],
|
|
73
|
+
"description": "Code snippet for a try/except/else statement"
|
|
74
|
+
},
|
|
75
|
+
"try/except/finally": {
|
|
76
|
+
"scope": "python",
|
|
77
|
+
"prefix": "try/except/finally",
|
|
78
|
+
"body": [
|
|
79
|
+
"try:",
|
|
80
|
+
"\t${1:pass}",
|
|
81
|
+
"except ${2:expression} as ${3:identifier}:",
|
|
82
|
+
"\t${4:pass}",
|
|
83
|
+
"finally:",
|
|
84
|
+
"\t${5:pass}"
|
|
85
|
+
],
|
|
86
|
+
"description": "Code snippet for a try/except/finally statement"
|
|
87
|
+
},
|
|
88
|
+
"try/except/else/finally": {
|
|
89
|
+
"scope": "python",
|
|
90
|
+
"prefix": "try/except/else/finally",
|
|
91
|
+
"body": [
|
|
92
|
+
"try:",
|
|
93
|
+
"\t${1:pass}",
|
|
94
|
+
"except ${2:expression} as ${3:identifier}:",
|
|
95
|
+
"\t${4:pass}",
|
|
96
|
+
"else:",
|
|
97
|
+
"\t${5:pass}",
|
|
98
|
+
"finally:",
|
|
99
|
+
"\t${6:pass}"
|
|
100
|
+
],
|
|
101
|
+
"description": "Code snippet for a try/except/else/finally statement"
|
|
102
|
+
},
|
|
103
|
+
"with": {
|
|
104
|
+
"scope": "python",
|
|
105
|
+
"prefix": "with",
|
|
106
|
+
"body": ["with ${1:expression} as ${2:target}:", "\t${3:pass}"],
|
|
107
|
+
"description": "Code snippet for a with statement"
|
|
108
|
+
},
|
|
109
|
+
"def": {
|
|
110
|
+
"scope": "python",
|
|
111
|
+
"prefix": "def",
|
|
112
|
+
"body": ["def ${1:funcname}(${2:parameter_list}):", "\t\"\"\"", "\t${3:docstring}", "\t\"\"\"", "\t${4:pass}"],
|
|
113
|
+
"description": "Code snippet for a function definition"
|
|
114
|
+
},
|
|
115
|
+
"def(class method)": {
|
|
116
|
+
"scope": "python",
|
|
117
|
+
"prefix": "def(class method)",
|
|
118
|
+
"body": ["def ${1:funcname}(self, ${2:parameter_list}):", "\t\"\"\"", "\t${3:docstring}", "\t\"\"\"", "\t${4:pass}"],
|
|
119
|
+
"description": "Code snippet for a class method"
|
|
120
|
+
},
|
|
121
|
+
"def(static class method)": {
|
|
122
|
+
"scope": "python",
|
|
123
|
+
"prefix": "def(static class method)",
|
|
124
|
+
"body": ["@staticmethod", "def ${1:funcname}(${2:parameter_list}):", "\t\"\"\"", "\t${3:docstring}", "\t\"\"\"", "\t${4:pass}"],
|
|
125
|
+
"description": "Code snippet for a static class method"
|
|
126
|
+
},
|
|
127
|
+
"def(abstract class method)": {
|
|
128
|
+
"scope": "python",
|
|
129
|
+
"prefix": "def(abstract class method)",
|
|
130
|
+
"body": ["def ${1:funcname}(self, ${2:parameter_list}):", "\t\"\"\"", "\t${3:docstring}", "\t\"\"\"", "\traise NotImplementedError"],
|
|
131
|
+
"description": "Code snippet for an abstract class method"
|
|
132
|
+
},
|
|
133
|
+
"class": {
|
|
134
|
+
"scope": "python",
|
|
135
|
+
"prefix": "class",
|
|
136
|
+
"body": ["class ${1:classname}(${2:object}):", "\t\"\"\"", "\t${3:docstring}", "\t\"\"\"", "\t${4:pass}"],
|
|
137
|
+
"description": "Code snippet for a class definition"
|
|
138
|
+
},
|
|
139
|
+
"lambda": {
|
|
140
|
+
"scope": "python",
|
|
141
|
+
"prefix": "lambda",
|
|
142
|
+
"body": ["lambda ${1:parameter_list}: ${2:expression}"],
|
|
143
|
+
"description": "Code snippet for a lambda statement"
|
|
144
|
+
},
|
|
145
|
+
"if(main)": {
|
|
146
|
+
"scope": "python",
|
|
147
|
+
"prefix": "__main__",
|
|
148
|
+
"body": ["if __name__ == \"__main__\":", " ${1:pass}"],
|
|
149
|
+
"description": "Code snippet for a `if __name__ == \"__main__\": ...` block"
|
|
150
|
+
},
|
|
151
|
+
"async/def": {
|
|
152
|
+
"scope": "python",
|
|
153
|
+
"prefix": "async/def",
|
|
154
|
+
"body": ["async def ${1:funcname}(${2:parameter_list}):", "\t${3:pass}"],
|
|
155
|
+
"description": "Code snippet for an async function definition"
|
|
156
|
+
},
|
|
157
|
+
"async/for": {
|
|
158
|
+
"scope": "python",
|
|
159
|
+
"prefix": "async/for",
|
|
160
|
+
"body": ["async for ${1:target} in ${2:iter}:", "\t${3:block}"],
|
|
161
|
+
"description": "Code snippet for an async for statement"
|
|
162
|
+
},
|
|
163
|
+
"async/for/else": {
|
|
164
|
+
"scope": "python",
|
|
165
|
+
"prefix": "async/for/else",
|
|
166
|
+
"body": ["async for ${1:target} in ${2:iter}:", "\t${3:block}", "else:", "\t${4:block}"],
|
|
167
|
+
"description": "Code snippet for an async for statement with else"
|
|
168
|
+
},
|
|
169
|
+
"async/with": {
|
|
170
|
+
"scope": "python",
|
|
171
|
+
"prefix": "async/with",
|
|
172
|
+
"body": ["async with ${1:expr} as ${2:var}:", "\t${3:block}"],
|
|
173
|
+
"description": "Code snippet for an async with statement"
|
|
174
|
+
},
|
|
175
|
+
"ipdb": {
|
|
176
|
+
"scope": "python",
|
|
177
|
+
"prefix": "ipdb",
|
|
178
|
+
"body": "import ipdb; ipdb.set_trace()",
|
|
179
|
+
"description": "Code snippet for ipdb debug"
|
|
180
|
+
},
|
|
181
|
+
"pdb": {
|
|
182
|
+
"scope": "python",
|
|
183
|
+
"prefix": "pdb",
|
|
184
|
+
"body": "import pdb; pdb.set_trace()",
|
|
185
|
+
"description": "Code snippet for pdb debug"
|
|
186
|
+
},
|
|
187
|
+
"pudb": {
|
|
188
|
+
"scope": "python",
|
|
189
|
+
"prefix": "pudb",
|
|
190
|
+
"body": "import pudb; pudb.set_trace()",
|
|
191
|
+
"description": "Code snippet for pudb debug"
|
|
192
|
+
},
|
|
193
|
+
"add/new/cell": {
|
|
194
|
+
"scope": "python",
|
|
195
|
+
"prefix": "add/new/cell",
|
|
196
|
+
"body": "# %%",
|
|
197
|
+
"description": "Code snippet to add a new cell"
|
|
198
|
+
},
|
|
199
|
+
"mark/markdown": {
|
|
200
|
+
"scope": "python",
|
|
201
|
+
"prefix": "mark/markdown",
|
|
202
|
+
"body": "# %% [markdown]",
|
|
203
|
+
"description": "Code snippet to add a new markdown cell"
|
|
204
|
+
}
|
|
205
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"remote.autoForwardPortsSource": "process",
|
|
3
|
+
"python-envs.defaultEnvManager": "ms-python.python:system",
|
|
4
|
+
"python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python",
|
|
5
|
+
"python.languageServer": "None",
|
|
6
|
+
"python.testing.pytestEnabled": true,
|
|
7
|
+
"python.testing.pytestArgs": [
|
|
8
|
+
"tests"
|
|
9
|
+
],
|
|
10
|
+
"[python]": {
|
|
11
|
+
"editor.defaultFormatter": "charliermarsh.ruff",
|
|
12
|
+
"editor.formatOnSave": true,
|
|
13
|
+
"editor.codeActionsOnSave": {
|
|
14
|
+
"source.fixAll": "explicit",
|
|
15
|
+
"source.organizeImports": "explicit"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"editor.formatOnSave": true,
|
|
19
|
+
"files.eol": "\n",
|
|
20
|
+
"files.trimTrailingWhitespace": true,
|
|
21
|
+
"files.insertFinalNewline": true,
|
|
22
|
+
"asciidoc.extensions.enableKroki": true,
|
|
23
|
+
"asciidoc.extensions.kroki.serverUrl": "https://kroki.io"
|
|
24
|
+
}
|
eidos_ai-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Eidos Contributors
|
|
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.
|
eidos_ai-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: eidos-ai
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Git-Native, Agent-Agnostic Development AI Ecosystem & Lifecycle Orchestrator
|
|
5
|
+
Author: Eidos Contributors
|
|
6
|
+
License: MIT
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
Requires-Python: >=3.11
|
|
9
|
+
Requires-Dist: jsonschema>=4.20.0
|
|
10
|
+
Requires-Dist: pydantic>=2.7.0
|
|
11
|
+
Requires-Dist: pyyaml>=6.0.1
|
|
12
|
+
Requires-Dist: rich>=13.7.0
|
|
13
|
+
Requires-Dist: typer>=0.12.0
|
|
14
|
+
Provides-Extra: dev
|
|
15
|
+
Requires-Dist: pytest-cov>=4.1.0; extra == 'dev'
|
|
16
|
+
Requires-Dist: pytest>=8.0.0; extra == 'dev'
|
|
17
|
+
Requires-Dist: ruff>=0.4.0; extra == 'dev'
|
|
18
|
+
Description-Content-Type: text/plain
|
|
19
|
+
|
|
20
|
+
= Eidos: Git-Native AI Software Development Ecosystem
|
|
21
|
+
:toc: left
|
|
22
|
+
:icons: font
|
|
23
|
+
:source-highlighter: highlight.js
|
|
24
|
+
|
|
25
|
+
Eidos is an open, Git-native, agent-agnostic development framework designed to unify product definition, architectural invariants, and autonomous coding agents under executable specifications.
|
|
26
|
+
|
|
27
|
+
This repository dogfoods the **Eidos Specification Standard** to define Eidos itself.
|
|
28
|
+
|
|
29
|
+
== Repository Architecture
|
|
30
|
+
|
|
31
|
+
[source,text]
|
|
32
|
+
----
|
|
33
|
+
eidos/
|
|
34
|
+
├── pyproject.toml # Modern Python package definition (uv/hatchling)
|
|
35
|
+
│
|
|
36
|
+
├── src/eidos/ # [THE ENGINE / SOLUTION]
|
|
37
|
+
│ ├── cli/ # CLI commands (`eidos validate`, `eidos delta`, etc.)
|
|
38
|
+
│ ├── core/ # AsciiDoc + YAML frontmatter parser & validator
|
|
39
|
+
│ ├── agent/ # Pluggable agent adapters (agy, claude, codex)
|
|
40
|
+
│ ├── vcs/ # GitHub & GitLab sync engine
|
|
41
|
+
│ └── schemas/v1/ # Portable JSON/YAML Schemas bundled as package data
|
|
42
|
+
│ ├── product/ # Product definition schemas
|
|
43
|
+
│ │ ├── system.schema.yaml
|
|
44
|
+
│ │ ├── domain.schema.yaml
|
|
45
|
+
│ │ ├── capability.schema.yaml
|
|
46
|
+
│ │ ├── policy.schema.yaml
|
|
47
|
+
│ │ ├── persona.schema.yaml
|
|
48
|
+
│ │ └── exploration.schema.yaml
|
|
49
|
+
│ ├── tech/ # Technical architecture schemas
|
|
50
|
+
│ │ ├── architecture.schema.yaml
|
|
51
|
+
│ │ ├── component.schema.yaml
|
|
52
|
+
│ │ └── contract.schema.yaml
|
|
53
|
+
│ └── delta/ # Mutation & evolution schemas
|
|
54
|
+
│ └── delta.schema.yaml
|
|
55
|
+
│
|
|
56
|
+
├── eidos/ # [THE LIVING SPECIFICATION / REAL USAGE]
|
|
57
|
+
│ ├── system.adoc # Root system descriptor
|
|
58
|
+
│ ├── personas/ # Human & AI actor roles
|
|
59
|
+
│ ├── policies/ # Non-negotiable architectural invariants
|
|
60
|
+
│ ├── domains/ # Bounded contexts & capabilities
|
|
61
|
+
│ ├── architecture/ # System architecture, components, & contracts
|
|
62
|
+
│ └── deltas/ # In-flight and applied mutations
|
|
63
|
+
│
|
|
64
|
+
└── tests/ # Engine & specification test suites
|
|
65
|
+
----
|
|
66
|
+
|
|
67
|
+
== Key Distinctions from Existing Tools
|
|
68
|
+
|
|
69
|
+
[cols="1,2,2", options="header"]
|
|
70
|
+
|===
|
|
71
|
+
| Dimension | Traditional / Existing Tools | Eidos Approach
|
|
72
|
+
| **Scope** | Coding loop only (Aider, Claude Code) or monolithic bot (Devin) | Full SDLC: Exploration -> Product Baseline -> SpecDelta -> Code -> CI
|
|
73
|
+
| **Specifications** | Ephemeral Jira tickets, stale Confluence/Notion pages | Versioned YAML frontmatter + AsciiDoc living in Git
|
|
74
|
+
| **Change Management** | Narrative RFC essays that rot in archive folders | Declarative `SpecDelta` mutations applied automatically upon merge
|
|
75
|
+
| **Agent Support** | Vendor-locked to a single proprietary LLM | Pluggable adapter layer supporting `agy`, Claude Code, Codex, Copilot
|
|
76
|
+
| **VCS Support** | GitHub-only or closed web UI | Native bidirectional support for both GitHub and GitLab
|
|
77
|
+
|===
|
|
78
|
+
|
|
79
|
+
== Navigating the Specifications
|
|
80
|
+
|
|
81
|
+
* **Root System**: Link to link:file://eidos/system.adoc[`system.adoc`]
|
|
82
|
+
* **Product Domains**:
|
|
83
|
+
** Link to link:file://eidos/domains/product-core/domain.adoc[`Product Intelligence Domain`]
|
|
84
|
+
** Link to link:file://eidos/domains/agent-harness/domain.adoc[`Agent Harness Domain`]
|
|
85
|
+
** Link to link:file://eidos/domains/vcs-sync/domain.adoc[`VCS Sync Domain`]
|
|
86
|
+
* **Policies**:
|
|
87
|
+
** Link to link:file://eidos/policies/POL-001-git-as-single-source-of-truth.adoc[`POL-001: Git Source of Truth`]
|
|
88
|
+
** Link to link:file://eidos/policies/POL-002-invariant-test-enforcement.adoc[`POL-002: Invariant Test Enforcement`]
|
|
89
|
+
* **Technical Architecture**:
|
|
90
|
+
** Link to link:file://eidos/architecture/system-architecture.adoc[`Global System Architecture`]
|
|
91
|
+
** Link to link:file://eidos/architecture/components/engine.adoc[`Component: Eidos Engine`]
|
|
92
|
+
** Link to link:file://eidos/architecture/contracts/cli.adoc[`Contract: Eidos CLI`]
|
|
93
|
+
|
|
94
|
+
== License
|
|
95
|
+
|
|
96
|
+
Licensed under the link:LICENSE[MIT License].
|