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.
Files changed (101) hide show
  1. eidos_ai-0.1.0/.devcontainer/devcontainer.json +59 -0
  2. eidos_ai-0.1.0/.devcontainer/post-create.sh +52 -0
  3. eidos_ai-0.1.0/.github/workflows/ci.yml +90 -0
  4. eidos_ai-0.1.0/.github/workflows/release.yml +79 -0
  5. eidos_ai-0.1.0/.gitignore +25 -0
  6. eidos_ai-0.1.0/.vscode/python.code-snippets +205 -0
  7. eidos_ai-0.1.0/.vscode/settings.json +24 -0
  8. eidos_ai-0.1.0/LICENSE +21 -0
  9. eidos_ai-0.1.0/PKG-INFO +96 -0
  10. eidos_ai-0.1.0/README.adoc +77 -0
  11. eidos_ai-0.1.0/assets/plugin_reference/README.md +74 -0
  12. eidos_ai-0.1.0/assets/plugin_reference/hooks.json +31 -0
  13. eidos_ai-0.1.0/assets/plugin_reference/mcp_config.json +10 -0
  14. eidos_ai-0.1.0/assets/plugin_reference/plugin.json +31 -0
  15. eidos_ai-0.1.0/assets/plugin_reference/rules/AGENTS.md +34 -0
  16. eidos_ai-0.1.0/assets/plugin_reference/scripts/lint_docs.py +281 -0
  17. eidos_ai-0.1.0/assets/plugin_reference/skills/eidos/SKILL.md +176 -0
  18. eidos_ai-0.1.0/assets/plugin_reference/skills/eidos-architecture/SKILL.md +111 -0
  19. eidos_ai-0.1.0/assets/plugin_reference/skills/eidos-delta/SKILL.md +127 -0
  20. eidos_ai-0.1.0/assets/plugin_reference/skills/eidos-design/SKILL.md +276 -0
  21. eidos_ai-0.1.0/assets/plugin_reference/skills/eidos-extract/SKILL.md +255 -0
  22. eidos_ai-0.1.0/assets/plugin_reference/skills/eidos-init/SKILL.md +153 -0
  23. eidos_ai-0.1.0/assets/plugin_reference/skills/eidos-invariants/SKILL.md +136 -0
  24. eidos_ai-0.1.0/assets/schemas/agent_plugins/mcp.schema.json +121 -0
  25. eidos_ai-0.1.0/assets/schemas/agent_plugins/plugin.schema.json +66 -0
  26. eidos_ai-0.1.0/assets/schemas/v1/delta/delta.schema.yaml +166 -0
  27. eidos_ai-0.1.0/assets/schemas/v1/design/screen.schema.yaml +83 -0
  28. eidos_ai-0.1.0/assets/schemas/v1/design/system.schema.yaml +101 -0
  29. eidos_ai-0.1.0/assets/schemas/v1/design/ui-component.schema.yaml +105 -0
  30. eidos_ai-0.1.0/assets/schemas/v1/product/capability.schema.yaml +153 -0
  31. eidos_ai-0.1.0/assets/schemas/v1/product/domain.schema.yaml +78 -0
  32. eidos_ai-0.1.0/assets/schemas/v1/product/exploration.schema.yaml +86 -0
  33. eidos_ai-0.1.0/assets/schemas/v1/product/persona.schema.yaml +60 -0
  34. eidos_ai-0.1.0/assets/schemas/v1/product/policy.schema.yaml +69 -0
  35. eidos_ai-0.1.0/assets/schemas/v1/product/system.schema.yaml +102 -0
  36. eidos_ai-0.1.0/assets/schemas/v1/tech/architecture.schema.yaml +147 -0
  37. eidos_ai-0.1.0/assets/schemas/v1/tech/component.schema.yaml +105 -0
  38. eidos_ai-0.1.0/assets/schemas/v1/tech/contract.schema.yaml +37 -0
  39. eidos_ai-0.1.0/eidos/.gitignore +3 -0
  40. eidos_ai-0.1.0/eidos/architecture/components/cli.adoc +64 -0
  41. eidos_ai-0.1.0/eidos/architecture/components/core.adoc +69 -0
  42. eidos_ai-0.1.0/eidos/architecture/components/mcp.adoc +55 -0
  43. eidos_ai-0.1.0/eidos/architecture/components/plugin.adoc +58 -0
  44. eidos_ai-0.1.0/eidos/architecture/components/portal.adoc +62 -0
  45. eidos_ai-0.1.0/eidos/architecture/contracts/cli.adoc +110 -0
  46. eidos_ai-0.1.0/eidos/architecture/contracts/mcp.adoc +38 -0
  47. eidos_ai-0.1.0/eidos/architecture/contracts/portal.adoc +26 -0
  48. eidos_ai-0.1.0/eidos/architecture/system-architecture.adoc +145 -0
  49. eidos_ai-0.1.0/eidos/deltas/dlt-2026-001.adoc +48 -0
  50. eidos_ai-0.1.0/eidos/deltas/dlt-2026-002.adoc +31 -0
  51. eidos_ai-0.1.0/eidos/deltas/dlt-2026-003.adoc +32 -0
  52. eidos_ai-0.1.0/eidos/deltas/dlt-2026-004.adoc +41 -0
  53. eidos_ai-0.1.0/eidos/deltas/dlt-2026-005.adoc +41 -0
  54. eidos_ai-0.1.0/eidos/deltas/dlt-2026-006.adoc +45 -0
  55. eidos_ai-0.1.0/eidos/deltas/dlt-2026-007.adoc +58 -0
  56. eidos_ai-0.1.0/eidos/deltas/dlt-2026-008.adoc +42 -0
  57. eidos_ai-0.1.0/eidos/deltas/dlt-2026-009.adoc +48 -0
  58. eidos_ai-0.1.0/eidos/domains/agent-harness/capabilities/agent-adapter.adoc +36 -0
  59. eidos_ai-0.1.0/eidos/domains/agent-harness/domain.adoc +27 -0
  60. eidos_ai-0.1.0/eidos/domains/product-core/capabilities/exploration-discovery.adoc +35 -0
  61. eidos_ai-0.1.0/eidos/domains/product-core/capabilities/living-spec-engine.adoc +47 -0
  62. eidos_ai-0.1.0/eidos/domains/product-core/capabilities/spec-delta-mutations.adoc +40 -0
  63. eidos_ai-0.1.0/eidos/domains/product-core/domain.adoc +28 -0
  64. eidos_ai-0.1.0/eidos/domains/vcs-sync/capabilities/github-gitlab-bridge.adoc +34 -0
  65. eidos_ai-0.1.0/eidos/domains/vcs-sync/domain.adoc +28 -0
  66. eidos_ai-0.1.0/eidos/personas/autonomous-agent.adoc +25 -0
  67. eidos_ai-0.1.0/eidos/personas/product-lead.adoc +25 -0
  68. eidos_ai-0.1.0/eidos/policies/POL-001-git-as-single-source-of-truth.adoc +17 -0
  69. eidos_ai-0.1.0/eidos/policies/POL-002-invariant-test-enforcement.adoc +17 -0
  70. eidos_ai-0.1.0/eidos/system.adoc +73 -0
  71. eidos_ai-0.1.0/pyproject.toml +41 -0
  72. eidos_ai-0.1.0/src/eidos/__init__.py +4 -0
  73. eidos_ai-0.1.0/src/eidos/agent/__init__.py +2 -0
  74. eidos_ai-0.1.0/src/eidos/agent/base.py +43 -0
  75. eidos_ai-0.1.0/src/eidos/cli/__init__.py +2 -0
  76. eidos_ai-0.1.0/src/eidos/cli/main.py +1113 -0
  77. eidos_ai-0.1.0/src/eidos/core/__init__.py +2 -0
  78. eidos_ai-0.1.0/src/eidos/core/assets.py +59 -0
  79. eidos_ai-0.1.0/src/eidos/core/models.py +47 -0
  80. eidos_ai-0.1.0/src/eidos/core/parser.py +59 -0
  81. eidos_ai-0.1.0/src/eidos/core/scaffolder.py +1016 -0
  82. eidos_ai-0.1.0/src/eidos/core/validator.py +158 -0
  83. eidos_ai-0.1.0/src/eidos/mcp/__init__.py +2 -0
  84. eidos_ai-0.1.0/src/eidos/mcp/server.py +517 -0
  85. eidos_ai-0.1.0/src/eidos/plugin/__init__.py +20 -0
  86. eidos_ai-0.1.0/src/eidos/plugin/installer.py +372 -0
  87. eidos_ai-0.1.0/src/eidos/plugin/validator.py +261 -0
  88. eidos_ai-0.1.0/src/eidos/plugin/version.py +173 -0
  89. eidos_ai-0.1.0/src/eidos/portal/__init__.py +7 -0
  90. eidos_ai-0.1.0/src/eidos/portal/assets.py +762 -0
  91. eidos_ai-0.1.0/src/eidos/portal/builder.py +31 -0
  92. eidos_ai-0.1.0/src/eidos/portal/generator.py +291 -0
  93. eidos_ai-0.1.0/src/eidos/portal/server.py +103 -0
  94. eidos_ai-0.1.0/src/eidos/vcs/__init__.py +2 -0
  95. eidos_ai-0.1.0/src/eidos/vcs/bridge.py +40 -0
  96. eidos_ai-0.1.0/tests/__init__.py +2 -0
  97. eidos_ai-0.1.0/tests/test_mcp.py +88 -0
  98. eidos_ai-0.1.0/tests/test_plugin.py +531 -0
  99. eidos_ai-0.1.0/tests/test_portal.py +133 -0
  100. eidos_ai-0.1.0/tests/test_scaffolder.py +553 -0
  101. 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.
@@ -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].