Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e9c13ed7a1 | ||
|
|
e0e9b289cc | ||
|
|
2efb4e8645 |
@@ -16,7 +16,7 @@ jobs:
|
||||
lint:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
||||
with:
|
||||
python-version: "3.13"
|
||||
@@ -33,7 +33,7 @@ jobs:
|
||||
python-version: ["3.10", "3.11", "3.12", "3.13"]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
@@ -48,7 +48,7 @@ jobs:
|
||||
name: seedgo-audit
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
with:
|
||||
# Full history: the README-freshness check reads `git log` to find the
|
||||
# last commit touching each branch's .py. A shallow (depth-1) checkout
|
||||
@@ -76,7 +76,7 @@ jobs:
|
||||
needs: [test]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
||||
with:
|
||||
python-version: "3.13"
|
||||
|
||||
@@ -39,7 +39,7 @@ jobs:
|
||||
python-version: ["3.12"]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
|
||||
- name: Set up Python ${{ matrix.python-version }}
|
||||
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
||||
|
||||
@@ -18,7 +18,7 @@ jobs:
|
||||
macos-setup:
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
|
||||
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
||||
with:
|
||||
|
||||
@@ -20,7 +20,7 @@ jobs:
|
||||
id-token: write
|
||||
attestations: write
|
||||
steps:
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
||||
with:
|
||||
python-version: "3.13"
|
||||
@@ -64,7 +64,7 @@ jobs:
|
||||
contents: write
|
||||
id-token: write # keyless Sigstore signing (OIDC); no signing key exists
|
||||
steps:
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
name: dist
|
||||
|
||||
@@ -22,7 +22,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: "Checkout code"
|
||||
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ jobs:
|
||||
dependency-scan:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
||||
with:
|
||||
python-version: "3.13"
|
||||
@@ -43,7 +43,7 @@ jobs:
|
||||
actions: read
|
||||
security-events: write
|
||||
steps:
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
- uses: github/codeql-action/init@7188fc363630916deb702c7fdcf4e481b751f97a # v4.37.1
|
||||
with:
|
||||
languages: python
|
||||
|
||||
@@ -18,7 +18,7 @@ jobs:
|
||||
windows-setup:
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
||||
|
||||
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
|
||||
with:
|
||||
|
||||
@@ -5,11 +5,6 @@
|
||||
"name": ".ai_mail.local",
|
||||
"path": ".ai_mail.local"
|
||||
},
|
||||
"d002": {
|
||||
"has_branch_placeholder": false,
|
||||
"name": ".pytest_cache",
|
||||
"path": ".pytest_cache"
|
||||
},
|
||||
"d003": {
|
||||
"has_branch_placeholder": false,
|
||||
"name": ".aipass",
|
||||
@@ -119,16 +114,6 @@
|
||||
"has_branch_placeholder": false,
|
||||
"name": "integrations",
|
||||
"path": "apps/integrations"
|
||||
},
|
||||
"d025": {
|
||||
"has_branch_placeholder": false,
|
||||
"name": "v",
|
||||
"path": ".pytest_cache/v"
|
||||
},
|
||||
"d026": {
|
||||
"has_branch_placeholder": false,
|
||||
"name": "cache",
|
||||
"path": ".pytest_cache/v/cache"
|
||||
}
|
||||
},
|
||||
"files": {
|
||||
@@ -211,7 +196,7 @@
|
||||
"path": ".trinity/observations.json"
|
||||
},
|
||||
"f014": {
|
||||
"content_hash": "d523dee2ef39",
|
||||
"content_hash": "98f1e33dace0",
|
||||
"has_branch_placeholder": false,
|
||||
"name": "passport.json",
|
||||
"path": ".trinity/passport.json"
|
||||
@@ -282,12 +267,6 @@
|
||||
"name": "README.md",
|
||||
"path": "apps/plugins/README.md"
|
||||
},
|
||||
"f026": {
|
||||
"content_hash": "3ed731b65d06",
|
||||
"has_branch_placeholder": false,
|
||||
"name": ".gitignore",
|
||||
"path": ".pytest_cache/.gitignore"
|
||||
},
|
||||
"f027": {
|
||||
"content_hash": "024209a8c889",
|
||||
"has_branch_placeholder": true,
|
||||
@@ -402,24 +381,6 @@
|
||||
"name": "requirements.project.txt",
|
||||
"path": "requirements.project.txt"
|
||||
},
|
||||
"f046": {
|
||||
"content_hash": "37dc88ef9a0a",
|
||||
"has_branch_placeholder": false,
|
||||
"name": "CACHEDIR.TAG",
|
||||
"path": ".pytest_cache/CACHEDIR.TAG"
|
||||
},
|
||||
"f047": {
|
||||
"content_hash": "73fd6fccdd80",
|
||||
"has_branch_placeholder": false,
|
||||
"name": "README.md",
|
||||
"path": ".pytest_cache/README.md"
|
||||
},
|
||||
"f048": {
|
||||
"content_hash": "0575fdabafa9",
|
||||
"has_branch_placeholder": false,
|
||||
"name": "nodeids",
|
||||
"path": ".pytest_cache/v/cache/nodeids"
|
||||
},
|
||||
"f049": {
|
||||
"content_hash": "5610e3ccaf8b",
|
||||
"has_branch_placeholder": false,
|
||||
@@ -429,7 +390,7 @@
|
||||
},
|
||||
"metadata": {
|
||||
"description": "Template file tracking registry for ID-based updates",
|
||||
"last_updated": "2026-07-17",
|
||||
"last_updated": "2026-07-27",
|
||||
"version": "1.0.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,12 +14,14 @@
|
||||
"alias": "",
|
||||
"path": "{{CWD}}",
|
||||
"module": "{{MODULE}}",
|
||||
"email": "{{EMAIL}}",
|
||||
"created": "{{DATE}}",
|
||||
"git_branch": "work/{{branchname}}"
|
||||
},
|
||||
"identity": {
|
||||
"citizen_class": "{{CITIZEN_CLASS}}",
|
||||
"role": "{{ROLE}}",
|
||||
"traits": "{{TRAITS}}",
|
||||
"purpose": "{{PURPOSE_BRIEF}}",
|
||||
"what_i_do": [],
|
||||
"what_i_dont_do": []
|
||||
|
||||
@@ -14,12 +14,14 @@
|
||||
"alias": "",
|
||||
"path": "{{CWD}}",
|
||||
"module": "{{MODULE}}",
|
||||
"email": "{{EMAIL}}",
|
||||
"created": "{{DATE}}",
|
||||
"git_branch": "main"
|
||||
},
|
||||
"identity": {
|
||||
"citizen_class": "manager",
|
||||
"role": "{{ROLE}}",
|
||||
"traits": "{{TRAITS}}",
|
||||
"purpose": "{{PURPOSE_BRIEF}}",
|
||||
"what_i_do": [],
|
||||
"what_i_dont_do": []
|
||||
|
||||
@@ -13,10 +13,9 @@ class-aware update, and backward compatibility.
|
||||
"""
|
||||
|
||||
import json
|
||||
|
||||
import pytest
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
# =============================================================================
|
||||
# CLASS REGISTRY TESTS
|
||||
@@ -172,6 +171,7 @@ class TestClassAwareUpdate:
|
||||
def test_update_cli_accepts_class_with_all(self):
|
||||
"""update aipass_framework --all should parse correctly and call update_all with class filter."""
|
||||
from unittest.mock import patch
|
||||
|
||||
from aipass.spawn.apps.modules.update import handle_update
|
||||
|
||||
# Mock update_all to isolate from real branch state
|
||||
@@ -220,6 +220,16 @@ class TestTemplateStructure:
|
||||
passport = json.loads((tpl / ".trinity" / "passport.json").read_text())
|
||||
assert passport["identity"]["citizen_class"] == "{{CITIZEN_CLASS}}"
|
||||
|
||||
@pytest.mark.parametrize("class_name", ["aipass_framework", "project_agent"])
|
||||
def test_template_passport_has_traits_and_email_placeholders(self, class_name):
|
||||
"""Agent template passports reference TRAITS and EMAIL — unreferenced, both are built and discarded."""
|
||||
from aipass.spawn.apps.handlers.class_registry import get_template_dir
|
||||
|
||||
tpl = get_template_dir(class_name)
|
||||
passport = json.loads((tpl / ".trinity" / "passport.json").read_text())
|
||||
assert passport["identity"]["traits"] == "{{TRAITS}}"
|
||||
assert passport["branch_info"]["email"] == "{{EMAIL}}"
|
||||
|
||||
def test_no_agent_template_dir(self):
|
||||
"""Old agent.template directory should not exist."""
|
||||
spawn_root = Path(__file__).parents[1]
|
||||
@@ -286,6 +296,36 @@ class TestAgentScaffoldContent:
|
||||
passport = json.loads((target / ".trinity" / "passport.json").read_text())
|
||||
assert passport["identity"]["role"] == "Data Analyst"
|
||||
|
||||
def test_created_agent_passport_has_traits(self, tmp_path):
|
||||
"""Passport should include the agent's traits if provided."""
|
||||
from aipass.spawn.apps.modules.core import _spawn_agent
|
||||
|
||||
target = tmp_path / "traits_test"
|
||||
_spawn_agent(str(target), role="Analyst", traits="curious, terse", purpose="Reports")
|
||||
|
||||
passport = json.loads((target / ".trinity" / "passport.json").read_text())
|
||||
assert passport["identity"]["traits"] == "curious, terse"
|
||||
|
||||
def test_created_agent_passport_traits_empty_without_flag(self, tmp_path):
|
||||
"""Omitting traits leaves an empty string — the identity hook skips the line when falsy."""
|
||||
from aipass.spawn.apps.modules.core import _spawn_agent
|
||||
|
||||
target = tmp_path / "no_traits_test"
|
||||
_spawn_agent(str(target), purpose="Testing default")
|
||||
|
||||
passport = json.loads((target / ".trinity" / "passport.json").read_text())
|
||||
assert passport["identity"]["traits"] == ""
|
||||
|
||||
def test_created_agent_passport_has_email(self, tmp_path):
|
||||
"""Passport carries the branch address, so identity does not render 'Email: unknown'."""
|
||||
from aipass.spawn.apps.modules.core import _spawn_agent
|
||||
|
||||
target = tmp_path / "email_test"
|
||||
_spawn_agent(str(target), purpose="Testing email")
|
||||
|
||||
passport = json.loads((target / ".trinity" / "passport.json").read_text())
|
||||
assert passport["branch_info"]["email"] == "@email_test"
|
||||
|
||||
|
||||
# =============================================================================
|
||||
# MULTI-AGENT COEXISTENCE TESTS
|
||||
|
||||
Reference in New Issue
Block a user