diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..b31791d --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @michaelheller diff --git a/agentos-spine/agentos-spine/.gitignore b/agentos-spine/agentos-spine/.gitignore new file mode 100644 index 0000000..02ecd7e --- /dev/null +++ b/agentos-spine/agentos-spine/.gitignore @@ -0,0 +1,29 @@ +# Local archives / extracted repos (do not commit) +_archives/ +spine/ +components/ + +# OS/editor noise +.DS_Store +Thumbs.db +__MACOSX/ + +# Python noise +.venv/ +venv/ +env/ +__pycache__/ +*.pyc +*.pyo + +# Node +node_modules/ + +# Rust/Go build artifacts +target/ +dist/ +build/ + +# IDE +.idea/ +.vscode/ diff --git a/agentos-spine/agentos-spine/LICENSE b/agentos-spine/agentos-spine/LICENSE new file mode 100644 index 0000000..ac4108c --- /dev/null +++ b/agentos-spine/agentos-spine/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 SocioProphet + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/agentos-spine/agentos-spine/Makefile b/agentos-spine/agentos-spine/Makefile new file mode 100644 index 0000000..cc3ca9e --- /dev/null +++ b/agentos-spine/agentos-spine/Makefile @@ -0,0 +1,12 @@ +.PHONY: help ingest validate + +help: + @echo "Targets:" + @echo " make ingest - extract _archives/Archive.zip into spine/" + @echo " make validate - run hygiene + license validation over spine/" + +ingest: + python3 scripts/ingest_archives.py --archive _archives/Archive.zip + +validate: + python3 scripts/validate_spine.py diff --git a/agentos-spine/agentos-spine/README.md b/agentos-spine/agentos-spine/README.md new file mode 100644 index 0000000..5355cd6 --- /dev/null +++ b/agentos-spine/agentos-spine/README.md @@ -0,0 +1,45 @@ +# AgentOS Spine + +This repository is the **integration spine** for the SocioProphet / SourceOS ecosystem. + +It is intentionally **contract-first**: + +- **Standards and artifacts are authoritative** (git + AIWG artifacts) +- Tools integrate **only via stable interfaces** (adapters + contract tests) +- Higher-risk components (copyleft / source-available / proprietary / unclear license) are **boxed** behind + service boundaries and can be replaced without rewriting the world. + +## Quick start (local) + +1) Put your downloaded archives in `_archives/`: + +- `_archives/Archive.zip` (the spine bundle: SourceOS, TriTRPC, standards, etc.) +- optionally other repo zips you want to inspect + +2) Extract + normalize the spine workspace: + +```bash +python3 scripts/ingest_archives.py --archive _archives/Archive.zip +``` + +This creates `spine/` with normalized folder names (and strips `.git`, `.DS_Store`, `.venv`, `__pycache__`, `*.pyc`). + +3) Validate hygiene + license posture: + +```bash +python3 scripts/validate_spine.py +``` + +## Repo contents + +- `registry/` — canonical tool/repo registry (license + lane + replacement posture) +- `interfaces/` — stable contracts (Executor, Orchestrator, BrowserOps, MemoryAPI, MeaningGraphAPI, etc.) +- `docs/` — rollout plan, guardrails, replacement strategy +- `scripts/` — ingestion + validation utilities (safe defaults) + +## Non-goals + +This repo is **not** a monorepo of all components. It is a control plane for: +- what we integrate, +- how we integrate it, +- and how we keep it swappable. diff --git a/agentos-spine/agentos-spine/docs/REPLACEMENT_STRATEGY.md b/agentos-spine/agentos-spine/docs/REPLACEMENT_STRATEGY.md new file mode 100644 index 0000000..4aa5ad1 --- /dev/null +++ b/agentos-spine/agentos-spine/docs/REPLACEMENT_STRATEGY.md @@ -0,0 +1,21 @@ +# Replacement strategy (provider + contract tests) + +We adopt components quickly **without getting trapped** by: + +1) Defining a stable interface (e.g., MeaningGraphAPI, KnowledgeBaseAPI) +2) Writing contract tests against the interface +3) Adopting an initial provider (AD4M, Fortemi, Inbox Zero, etc.) behind an adapter +4) Building a permissive replacement that passes the same contract tests + +## Priorities + +Replace-first: +- Fortemi (BUSL) + +Use-now, replace-if-needed: +- AD4M (boxed behind MeaningGraphAPI) +- Inbox Zero (GPL/AGPL lane; boxed behind MailOpsAPI) + +Security-boxed: +- Desktop automation (Agent-S) +- Anything with marketplace/skills ingestion (must be allowlisted) diff --git a/agentos-spine/agentos-spine/docs/ROLL_OUT.md b/agentos-spine/agentos-spine/docs/ROLL_OUT.md new file mode 100644 index 0000000..6d29c50 --- /dev/null +++ b/agentos-spine/agentos-spine/docs/ROLL_OUT.md @@ -0,0 +1,28 @@ +# Rollout plan (first 90 days) + +## Phase 0: Hygiene + license truth (blocking) + +- Ensure every spine repo has an explicit LICENSE file +- Remove accidental junk from snapshots: .DS_Store, .venv, __pycache__, *.pyc, nested .git +- Add CI gates so junk cannot re-enter + +## Phase 1: Conformance gates + +- TriTRPC fixtures + determinism tests are executable and green +- Standards repos validate schema IDs and enforce formatting + +## Phase 2: Workspace materialization + +- Use sociosphere runner (or equivalent) to materialize pinned repos +- One command runs: fetch -> validate -> verify fixtures + +## Phase 3: OS integration substrate (local) + +- Base packages, sandbox runner, secrets broker +- Install core tools (executors, orchestrator) behind agentctl + +## Phase 4: Providers boxed + replacement projects + +- AD4M behind MeaningGraphAPI + contract tests +- Fortemi behind KnowledgeBaseAPI + start KB-Core replacement +- Inbox Zero behind MailOpsAPI + start MailOps-Core replacement (optional) diff --git a/agentos-spine/agentos-spine/docs/STANDARDS_GUARDRAILS.md b/agentos-spine/agentos-spine/docs/STANDARDS_GUARDRAILS.md new file mode 100644 index 0000000..24caa44 --- /dev/null +++ b/agentos-spine/agentos-spine/docs/STANDARDS_GUARDRAILS.md @@ -0,0 +1,30 @@ +# Standards and architecture guardrails + +These guardrails exist to prevent accidental architectural drift while integrating many repos/tools. + +## 1) SourceOS independence + +SourceOS must operate without socios. +Socios is **opt-in** and gated (Proof-of-Life + signed intent). + +## 2) Protocol directionality + +If we use sociosphere as workspace/orchestrator and TritRPC as protocol: +- sociosphere -> tritrpc is allowed +- tritrpc -> sociosphere is forbidden + +This prevents circular dependencies between the orchestrator and the protocol spec. + +## 3) Canonical truth + +- Canonical standards live in the SocioProphet standards repos (+ TriTRPC spec/fixtures). +- Canonical project truth is git + AIWG artifacts. +- Memory providers (Mem0/Fortemi/etc.) are caches/services and must be exportable. + +## 4) Boxing rule + +Anything not permissively licensed (MIT/Apache/BSD/CC0) is boxed behind: +- an adapter interface, and +- a runtime boundary (separate process/container/VM). + +This keeps replacements cheap. diff --git a/agentos-spine/agentos-spine/interfaces/browser_ops.md b/agentos-spine/agentos-spine/interfaces/browser_ops.md new file mode 100644 index 0000000..7efc264 --- /dev/null +++ b/agentos-spine/agentos-spine/interfaces/browser_ops.md @@ -0,0 +1,17 @@ +# BrowserOpsAPI (v0.1) + +Goal: auditable browser automation with deterministic trace capture. + +## Required operations + +- `open(url)` +- `click(selector|text)` +- `type(selector, text)` +- `extract(selector|pattern) -> data` +- `screenshot() -> image` +- `trace_export() -> TraceRef` + +## Providers + +- Stagehand (primary) +- browser-use (alternate) diff --git a/agentos-spine/agentos-spine/interfaces/desktop_ops.md b/agentos-spine/agentos-spine/interfaces/desktop_ops.md new file mode 100644 index 0000000..d30a321 --- /dev/null +++ b/agentos-spine/agentos-spine/interfaces/desktop_ops.md @@ -0,0 +1,14 @@ +# DesktopOpsAPI (v0.1) + +Goal: OS/GUI automation when browser-only is insufficient. + +## Safety requirements (hard) + +- runs in a sandbox (VM / container + display proxy) +- no ambient secrets +- explicit allowlist of filesystem mounts +- explicit network egress rules + +## Provider + +- Agent-S diff --git a/agentos-spine/agentos-spine/interfaces/executor.md b/agentos-spine/agentos-spine/interfaces/executor.md new file mode 100644 index 0000000..26ee40f --- /dev/null +++ b/agentos-spine/agentos-spine/interfaces/executor.md @@ -0,0 +1,26 @@ +# ExecutorAPI (v0.1) + +Goal: a stable contract for tools that **apply changes** and **run commands** in a working tree. + +## Required operations + +- `plan(task, context) -> Plan` +- `apply(plan) -> ApplyResult` +- `run(command, cwd, env) -> RunResult` +- `diff() -> Diff` +- `snapshot() -> SnapshotRef` (optional; for evidence) + +## Evidence requirements + +Every Executor must emit: +- applied diff (unified diff or patch ID) +- stdout/stderr + exit code +- tool/version identifiers +- inputs (task ID, repo ref) and outputs (artifacts) + +## Providers (examples) + +- OpenCode +- Goose +- Aider +- Continue diff --git a/agentos-spine/agentos-spine/interfaces/knowledge_base_api.md b/agentos-spine/agentos-spine/interfaces/knowledge_base_api.md new file mode 100644 index 0000000..acb4838 --- /dev/null +++ b/agentos-spine/agentos-spine/interfaces/knowledge_base_api.md @@ -0,0 +1,16 @@ +# KnowledgeBaseAPI (v0.1) + +Goal: durable project knowledge base (documents + semantic search), swappable. + +## Required operations + +- `ingest(doc, metadata) -> doc_id` +- `search(query, filters) -> hits` +- `get(doc_id) -> doc` +- `export_snapshot() -> snapshot_ref` +- `import_snapshot(snapshot_ref)` + +## Providers + +- Fortemi (evaluation / boxed) +- KB-Core (planned permissive replacement: pgvector/qdrant/etc.) diff --git a/agentos-spine/agentos-spine/interfaces/mail_ops_api.md b/agentos-spine/agentos-spine/interfaces/mail_ops_api.md new file mode 100644 index 0000000..5621549 --- /dev/null +++ b/agentos-spine/agentos-spine/interfaces/mail_ops_api.md @@ -0,0 +1,16 @@ +# MailOpsAPI (v0.1) + +Goal: email triage and automation behind a swappable contract. + +## Required operations + +- `sync()` +- `triage_queue() -> threads` +- `classify(thread_id) -> labels` +- `draft(thread_id, intent) -> draft` +- `apply(thread_id, actions)` + +## Providers + +- Inbox Zero (boxed service) +- MailOps-Core (planned permissive replacement) diff --git a/agentos-spine/agentos-spine/interfaces/meaning_graph_api.md b/agentos-spine/agentos-spine/interfaces/meaning_graph_api.md new file mode 100644 index 0000000..6e20942 --- /dev/null +++ b/agentos-spine/agentos-spine/interfaces/meaning_graph_api.md @@ -0,0 +1,16 @@ +# MeaningGraphAPI (v0.1) + +Goal: represent agent/claim graphs (identity + assertions + relations) with portability. + +## Required operations + +- `put_claim(agent_id, claim, provenance) -> claim_id` +- `link(src_claim_id, rel, dst_claim_id, provenance) -> link_id` +- `query(query_spec) -> results` +- `export_snapshot() -> snapshot_ref` +- `import_snapshot(snapshot_ref)` + +## Providers + +- AD4M (current provider) +- MG-Core (planned permissive replacement) diff --git a/agentos-spine/agentos-spine/interfaces/memory_api.md b/agentos-spine/agentos-spine/interfaces/memory_api.md new file mode 100644 index 0000000..17b09c5 --- /dev/null +++ b/agentos-spine/agentos-spine/interfaces/memory_api.md @@ -0,0 +1,16 @@ +# MemoryAPI (v0.1) + +Goal: cross-session memory store for agents. + +## Required operations + +- `put(item: MemoryItem) -> id` +- `get(id) -> MemoryItem` +- `search(query, filters) -> MemoryItem[]` +- `export() -> ArchiveRef` +- `import(ArchiveRef)` + +## Providers + +- Mem0 (primary) +- (optional) local sqlite/jsonl for offline mode diff --git a/agentos-spine/agentos-spine/interfaces/orchestrator.md b/agentos-spine/agentos-spine/interfaces/orchestrator.md new file mode 100644 index 0000000..084e0c6 --- /dev/null +++ b/agentos-spine/agentos-spine/interfaces/orchestrator.md @@ -0,0 +1,16 @@ +# OrchestratorAPI (v0.1) + +Goal: coordinate multiple roles/agents over one or more repos, while collecting evidence and enforcing gates. + +## Required operations + +- `spawn(role, config) -> AgentHandle` +- `assign(agent, task) -> TaskHandle` +- `collect(task) -> EvidenceBundle` +- `synthesize(evidence[]) -> Decision` +- `gate(decision, policy) -> GateResult` + +## Providers (examples) + +- Gastown +- (optional) AIWG ensemble patterns diff --git a/agentos-spine/agentos-spine/manifest/workspace.toml b/agentos-spine/agentos-spine/manifest/workspace.toml new file mode 100644 index 0000000..79cb79a --- /dev/null +++ b/agentos-spine/agentos-spine/manifest/workspace.toml @@ -0,0 +1,51 @@ +[workspace] +name = "agentos-spine" +version = "0.1" + +# This manifest mirrors sociosphere's format so we can reuse their runner tooling. +# All entries below assume local materialization under `spine/`. + +[[repos]] +name = "sourceos" +role = "os" +local_path = "spine/sourceos" + +[[repos]] +name = "sociosphere" +role = "workspace_orchestrator" +local_path = "spine/sociosphere" + +[[repos]] +name = "tritrpc" +role = "protocol" +local_path = "spine/tritrpc" + +[[repos]] +name = "standards_storage" +role = "standards" +local_path = "spine/standards-storage" + +[[repos]] +name = "standards_knowledge" +role = "standards" +local_path = "spine/standards-knowledge" + +[[repos]] +name = "agentplane" +role = "execution_plane" +local_path = "spine/agentplane" + +[[repos]] +name = "tritfabric" +role = "runtime" +local_path = "spine/tritfabric" + +[[repos]] +name = "socios" +role = "opt_in_automation" +local_path = "spine/socios" + +[[repos]] +name = "global_devsecops_intelligence" +role = "spec_bundle" +local_path = "spine/global-devsecops-intelligence" diff --git a/agentos-spine/agentos-spine/registry/tools.csv b/agentos-spine/agentos-spine/registry/tools.csv new file mode 100644 index 0000000..3ad20f6 --- /dev/null +++ b/agentos-spine/agentos-spine/registry/tools.csv @@ -0,0 +1,39 @@ +id,name,kind,layer,lane,license,source,interfaces,replacement,notes +sourceos,SourceOS,repo,L0-os-sandbox,spine-core,MIT,Archive.zip:SourceOS-main,(none),none,OS substrate; must operate without socios. +sociosphere,sociosphere,repo,L3-orchestration,spine-core,NO_LICENSE_IN_ARCHIVE,Archive.zip:sociosphere-main,OrchestratorAPI,none,Workspace/orchestrator. Add LICENSE before distribution. +tritrpc,TriTRPC,repo,L3-protocol,spine-core,MIT,Archive.zip:TriTRPC-main,(protocol),none,Deterministic RPC protocol + fixtures. +standards-storage,socioprophet-standards-storage,repo,L0-standards,spine-core,MIT,Archive.zip:socioprophet-standards-storage,(standards),none,Canonical platform standards. +standards-knowledge,socioprophet-standards-knowledge,repo,L0-standards,spine-core,MIT,Archive.zip:socioprophet-standards-knowledge,(standards),none,Canonical knowledge context standards. +agentplane,agentplane,repo,L2-execution,spine-core,MIT,Archive.zip:agentplane,ExecutorAPI,none,Execution/control plane; evidence bundles; sandbox-friendly. +tritfabric,tritfabric,repo,L2-runtime,spine-core,MIT,Archive.zip:tritfabric_repo_fresh,(runtime),none,Opt-in runtime service; default-deny; local-first mode. +socios,socios,repo,L3-community-automation,boxed,GPL-3.0,Archive.zip:socios-main,(automation),optional,Opt-in community automation. OFF by default. Keep separate service; avoid linking into base OS distribution. +global-devsecops-intelligence,global-devsecops-intelligence,repo,L0-specs,blocked,NO_LICENSE_IN_ARCHIVE,Archive.zip:global-devsecops-intelligence,(specs),none,Spec bundle. Add LICENSE before using beyond internal reference. +aiwg,AIWG,repo,L3-process-spine,core,MIT,aiwg-main.zip,Process Spine,none,"Workflow spine: artifacts, stage gates, ensemble patterns." +vercel-ai-sdk,Vercel AI SDK (ai),repo,L6-app-framework,support,Apache-2.0,ai-main.zip,(app sdk),none,App-layer agent SDK (TypeScript). +browser-use,browser-use,repo,L4-browser-ops,support,MIT,browser-use-main.zip,BrowserOpsAPI,none,Alternate BrowserOps driver. +agent-s,Agent-S,repo,L4-desktop-ops,restricted,Apache-2.0,Agent-S-main.zip,DesktopOpsAPI,none,Desktop/GUI automation. Sandbox+opt-in only. +inbox-zero,Inbox Zero,repo,L7-vertical,boxed,GPL-3.0,inbox-zero-main.zip,MailOpsAPI,planned,Email automation app. Keep as separate service; do not link into OS base. +fortemi,Fortemi,repo,L5-knowledge,quarantine,BUSL-1.1,fortemi-main.zip,KnowledgeBaseAPI,replace-first,Source-available; evaluation only. Build permissive KB-Core replacement early. +skill-seekers,Skill Seekers,repo,L5-ingestion,support,MIT,Skill_Seekers-development.zip,Extractor,none,RAG preprocessing / ingestion helpers. +seomachine,seomachine,repo,L7-vertical,support,MIT,seomachine-main.zip,(rig),none,SEO rig (Claude Code workspace). +agent-inbox,agent-inbox,repo,L7-vertical,support,MIT,agent-inbox-main.zip,(rig),none,Inbox rig / patterns. +anus,ANUS,repo,L7-vertical,support,Apache-2.0,ANUS-main.zip,(example),none,Agentic CLI example; useful as sandbox. +argos,argos,repo,L0-patterns,support,CC0-1.0,argos-main.zip,(patterns),none,Authz patterns reference. +bmad-builder,bmad-builder,repo,L3-process-playbooks,support,MIT,bmad-builder-main.zip,(playbooks),none,Process/playbook builder. +ace-framework,ACE Framework,repo,L3-process-playbooks,support,MIT,ACE_Framework-main.zip,(playbooks),none,Principles/process pack. +full-small-app-workflow,Full Small App Workflow,repo,L3-process-playbooks,support,MIT,Full-Small-App-Workflow-main.zip,(playbooks),none,Workflow template. +rappy-lobster,rappy-lobster,repo,L7-vertical,blocked,AMBIGUOUS (MIT-like LICENSE text; package.json=UNLICENSED),rappy-lobster-main.zip,(unknown),none,Do not ship/use until license contradiction resolved. +gastown,Gastown,external,L3-orchestration,core,MIT,external,OrchestratorAPI,none,Multi-agent workspace orchestrator. +opencode,OpenCode,external,L2-executor,core,MIT,external,ExecutorAPI,none,Terminal executor. +goose,Goose,external,L2-executor,core,Apache-2.0,external,ExecutorAPI,none,Alternate executor. +aider,Aider,external,L2-executor,support,Apache-2.0,external,ExecutorAPI,none,Patch-centric executor. +continue,Continue,external,L2-executor,support,Apache-2.0,external,ExecutorAPI,none,IDE executor/review. +stagehand,Stagehand,external,L4-browser-ops,core,MIT,external,BrowserOpsAPI,none,Primary browser automation driver. +tabby,TabbyML Tabby,external,L1-devx,support,Apache-2.0 (ee/ separate),external,(assist),none,Self-hosted coding assistant. Keep EE boundary strict. +mem0,Mem0,external,L5-memory,core,Apache-2.0,external,MemoryAPI,none,Primary memory service. +ad4m,AD4M,external,L5-meaning-graph,boxed,CAL-1.0 (upstream),external,MeaningGraphAPI,planned,Use behind MeaningGraphAPI; build MG-Core replacement for portability. +ontogpt,OntoGPT,external,L5-extraction,support,BSD-3-Clause,external,Extractor,none,Ontology-grounded extraction. +vlmrun,VLM Run,external,L5-extraction,support,Apache-2.0,external,Extractor,none,Schema hub + runners. +subconscious,Subconscious Systems,external,L8-experimental,boxed,VERIFY_PER_REPO,external,(optional),none,Optional external engine. Keep API-only until licensing clarified. +zed,Zed,external,L1-devx,boxed,GPL/AGPL (verify),external,(tool),none,Developer editor. Do not embed into OS distro without compliance plan. +warp,Warp,external,L1-devx,boxed,Proprietary,external,(tool),none,Optional terminal UX only. diff --git a/agentos-spine/agentos-spine/registry/tools.yaml b/agentos-spine/agentos-spine/registry/tools.yaml new file mode 100644 index 0000000..73c2131 --- /dev/null +++ b/agentos-spine/agentos-spine/registry/tools.yaml @@ -0,0 +1,439 @@ +version: '0.1' +generated_at: '2026-02-11T20:24:59.554912+00:00' +policy: + preferred_licenses: + - MIT + - Apache-2.0 + permissive_allowed: + - BSD-3-Clause + - CC0-1.0 + boxed_required: + - GPL-3.0 + - AGPL-3.0 + - CAL-1.0 + - BUSL-1.1 + - Proprietary + - VERIFY_PER_REPO + - NO_LICENSE_IN_ARCHIVE + - AMBIGUOUS + block_if_missing_license: true +tools: +- id: sourceos + name: SourceOS + kind: repo + layer: L0-os-sandbox + lane: spine-core + license: MIT + source: Archive.zip:SourceOS-main + interfaces: + - (none) + replacement: none + notes: OS substrate; must operate without socios. +- id: sociosphere + name: sociosphere + kind: repo + layer: L3-orchestration + lane: spine-core + license: NO_LICENSE_IN_ARCHIVE + source: Archive.zip:sociosphere-main + interfaces: + - OrchestratorAPI + replacement: none + notes: Workspace/orchestrator. Add LICENSE before distribution. +- id: tritrpc + name: TriTRPC + kind: repo + layer: L3-protocol + lane: spine-core + license: MIT + source: Archive.zip:TriTRPC-main + interfaces: + - (protocol) + replacement: none + notes: Deterministic RPC protocol + fixtures. +- id: standards-storage + name: socioprophet-standards-storage + kind: repo + layer: L0-standards + lane: spine-core + license: MIT + source: Archive.zip:socioprophet-standards-storage + interfaces: + - (standards) + replacement: none + notes: Canonical platform standards. +- id: standards-knowledge + name: socioprophet-standards-knowledge + kind: repo + layer: L0-standards + lane: spine-core + license: MIT + source: Archive.zip:socioprophet-standards-knowledge + interfaces: + - (standards) + replacement: none + notes: Canonical knowledge context standards. +- id: agentplane + name: agentplane + kind: repo + layer: L2-execution + lane: spine-core + license: MIT + source: Archive.zip:agentplane + interfaces: + - ExecutorAPI + replacement: none + notes: Execution/control plane; evidence bundles; sandbox-friendly. +- id: tritfabric + name: tritfabric + kind: repo + layer: L2-runtime + lane: spine-core + license: MIT + source: Archive.zip:tritfabric_repo_fresh + interfaces: + - (runtime) + replacement: none + notes: Opt-in runtime service; default-deny; local-first mode. +- id: socios + name: socios + kind: repo + layer: L3-community-automation + lane: boxed + license: GPL-3.0 + source: Archive.zip:socios-main + interfaces: + - (automation) + replacement: optional + notes: Opt-in community automation. OFF by default. Keep separate service; avoid + linking into base OS distribution. +- id: global-devsecops-intelligence + name: global-devsecops-intelligence + kind: repo + layer: L0-specs + lane: blocked + license: NO_LICENSE_IN_ARCHIVE + source: Archive.zip:global-devsecops-intelligence + interfaces: + - (specs) + replacement: none + notes: Spec bundle. Add LICENSE before using beyond internal reference. +- id: aiwg + name: AIWG + kind: repo + layer: L3-process-spine + lane: core + license: MIT + source: aiwg-main.zip + interfaces: + - Process Spine + replacement: none + notes: 'Workflow spine: artifacts, stage gates, ensemble patterns.' +- id: vercel-ai-sdk + name: Vercel AI SDK (ai) + kind: repo + layer: L6-app-framework + lane: support + license: Apache-2.0 + source: ai-main.zip + interfaces: + - (app sdk) + replacement: none + notes: App-layer agent SDK (TypeScript). +- id: browser-use + name: browser-use + kind: repo + layer: L4-browser-ops + lane: support + license: MIT + source: browser-use-main.zip + interfaces: + - BrowserOpsAPI + replacement: none + notes: Alternate BrowserOps driver. +- id: agent-s + name: Agent-S + kind: repo + layer: L4-desktop-ops + lane: restricted + license: Apache-2.0 + source: Agent-S-main.zip + interfaces: + - DesktopOpsAPI + replacement: none + notes: Desktop/GUI automation. Sandbox+opt-in only. +- id: inbox-zero + name: Inbox Zero + kind: repo + layer: L7-vertical + lane: boxed + license: GPL-3.0 + source: inbox-zero-main.zip + interfaces: + - MailOpsAPI + replacement: planned + notes: Email automation app. Keep as separate service; do not link into OS base. +- id: fortemi + name: Fortemi + kind: repo + layer: L5-knowledge + lane: quarantine + license: BUSL-1.1 + source: fortemi-main.zip + interfaces: + - KnowledgeBaseAPI + replacement: replace-first + notes: Source-available; evaluation only. Build permissive KB-Core replacement early. +- id: skill-seekers + name: Skill Seekers + kind: repo + layer: L5-ingestion + lane: support + license: MIT + source: Skill_Seekers-development.zip + interfaces: + - Extractor + replacement: none + notes: RAG preprocessing / ingestion helpers. +- id: seomachine + name: seomachine + kind: repo + layer: L7-vertical + lane: support + license: MIT + source: seomachine-main.zip + interfaces: + - (rig) + replacement: none + notes: SEO rig (Claude Code workspace). +- id: agent-inbox + name: agent-inbox + kind: repo + layer: L7-vertical + lane: support + license: MIT + source: agent-inbox-main.zip + interfaces: + - (rig) + replacement: none + notes: Inbox rig / patterns. +- id: anus + name: ANUS + kind: repo + layer: L7-vertical + lane: support + license: Apache-2.0 + source: ANUS-main.zip + interfaces: + - (example) + replacement: none + notes: Agentic CLI example; useful as sandbox. +- id: argos + name: argos + kind: repo + layer: L0-patterns + lane: support + license: CC0-1.0 + source: argos-main.zip + interfaces: + - (patterns) + replacement: none + notes: Authz patterns reference. +- id: bmad-builder + name: bmad-builder + kind: repo + layer: L3-process-playbooks + lane: support + license: MIT + source: bmad-builder-main.zip + interfaces: + - (playbooks) + replacement: none + notes: Process/playbook builder. +- id: ace-framework + name: ACE Framework + kind: repo + layer: L3-process-playbooks + lane: support + license: MIT + source: ACE_Framework-main.zip + interfaces: + - (playbooks) + replacement: none + notes: Principles/process pack. +- id: full-small-app-workflow + name: Full Small App Workflow + kind: repo + layer: L3-process-playbooks + lane: support + license: MIT + source: Full-Small-App-Workflow-main.zip + interfaces: + - (playbooks) + replacement: none + notes: Workflow template. +- id: rappy-lobster + name: rappy-lobster + kind: repo + layer: L7-vertical + lane: blocked + license: AMBIGUOUS (MIT-like LICENSE text; package.json=UNLICENSED) + source: rappy-lobster-main.zip + interfaces: + - (unknown) + replacement: none + notes: Do not ship/use until license contradiction resolved. +- id: gastown + name: Gastown + kind: external + layer: L3-orchestration + lane: core + license: MIT + source: external + interfaces: + - OrchestratorAPI + replacement: none + notes: Multi-agent workspace orchestrator. +- id: opencode + name: OpenCode + kind: external + layer: L2-executor + lane: core + license: MIT + source: external + interfaces: + - ExecutorAPI + replacement: none + notes: Terminal executor. +- id: goose + name: Goose + kind: external + layer: L2-executor + lane: core + license: Apache-2.0 + source: external + interfaces: + - ExecutorAPI + replacement: none + notes: Alternate executor. +- id: aider + name: Aider + kind: external + layer: L2-executor + lane: support + license: Apache-2.0 + source: external + interfaces: + - ExecutorAPI + replacement: none + notes: Patch-centric executor. +- id: continue + name: Continue + kind: external + layer: L2-executor + lane: support + license: Apache-2.0 + source: external + interfaces: + - ExecutorAPI + replacement: none + notes: IDE executor/review. +- id: stagehand + name: Stagehand + kind: external + layer: L4-browser-ops + lane: core + license: MIT + source: external + interfaces: + - BrowserOpsAPI + replacement: none + notes: Primary browser automation driver. +- id: tabby + name: TabbyML Tabby + kind: external + layer: L1-devx + lane: support + license: Apache-2.0 (ee/ separate) + source: external + interfaces: + - (assist) + replacement: none + notes: Self-hosted coding assistant. Keep EE boundary strict. +- id: mem0 + name: Mem0 + kind: external + layer: L5-memory + lane: core + license: Apache-2.0 + source: external + interfaces: + - MemoryAPI + replacement: none + notes: Primary memory service. +- id: ad4m + name: AD4M + kind: external + layer: L5-meaning-graph + lane: boxed + license: CAL-1.0 (upstream) + source: external + interfaces: + - MeaningGraphAPI + replacement: planned + notes: Use behind MeaningGraphAPI; build MG-Core replacement for portability. +- id: ontogpt + name: OntoGPT + kind: external + layer: L5-extraction + lane: support + license: BSD-3-Clause + source: external + interfaces: + - Extractor + replacement: none + notes: Ontology-grounded extraction. +- id: vlmrun + name: VLM Run + kind: external + layer: L5-extraction + lane: support + license: Apache-2.0 + source: external + interfaces: + - Extractor + replacement: none + notes: Schema hub + runners. +- id: subconscious + name: Subconscious Systems + kind: external + layer: L8-experimental + lane: boxed + license: VERIFY_PER_REPO + source: external + interfaces: + - (optional) + replacement: none + notes: Optional external engine. Keep API-only until licensing clarified. +- id: zed + name: Zed + kind: external + layer: L1-devx + lane: boxed + license: GPL/AGPL (verify) + source: external + interfaces: + - (tool) + replacement: none + notes: Developer editor. Do not embed into OS distro without compliance plan. +- id: warp + name: Warp + kind: external + layer: L1-devx + lane: boxed + license: Proprietary + source: external + interfaces: + - (tool) + replacement: none + notes: Optional terminal UX only. diff --git a/agentos-spine/agentos-spine/scripts/ingest_archives.py b/agentos-spine/agentos-spine/scripts/ingest_archives.py new file mode 100755 index 0000000..dc3b95a --- /dev/null +++ b/agentos-spine/agentos-spine/scripts/ingest_archives.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 +"""Extract a spine archive into `spine/` with safe defaults. + +- Normalizes folder names (strip suffixes like -main) +- Removes __MACOSX, .DS_Store +- Strips nested .git directories from zip snapshots +- Optionally scrubs venv/__pycache__/*.pyc + +Usage: + python3 scripts/ingest_archives.py --archive _archives/Archive.zip +""" + +import argparse +import os +import shutil +import zipfile +from pathlib import Path + +NORMALIZE = { + "SourceOS-main": "sourceos", + "TriTRPC-main": "tritrpc", + "socios-main": "socios", + "sociosphere-main": "sociosphere", + "agentplane": "agentplane", + "tritfabric_repo_fresh": "tritfabric", + "socioprophet-standards-storage": "standards-storage", + "socioprophet-standards-knowledge": "standards-knowledge", + "global-devsecops-intelligence": "global-devsecops-intelligence", +} + +SCRUB_DIRS = {".venv", "venv", "env", "__pycache__", ".git"} + +def rm_tree(path: Path): + if path.is_symlink() or path.is_file(): + path.unlink(missing_ok=True) + elif path.is_dir(): + shutil.rmtree(path, ignore_errors=True) + +def scrub(root: Path): + # Remove OS junk files + for p in root.rglob(".DS_Store"): + p.unlink(missing_ok=True) + + # Remove scrub dirs and pyc files + for p in list(root.rglob("*")): + if p.is_dir() and p.name in SCRUB_DIRS: + rm_tree(p) + elif p.is_file() and p.suffix == ".pyc": + p.unlink(missing_ok=True) + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument("--archive", required=True, help="Path to Archive.zip") + ap.add_argument("--out", default="spine", help="Output dir (default: spine)") + ap.add_argument("--no-scrub", action="store_true", help="Do not scrub .git/.venv/__pycache__/pyc/.DS_Store") + args = ap.parse_args() + + archive = Path(args.archive) + out = Path(args.out) + out.mkdir(parents=True, exist_ok=True) + + tmp = out / "_tmp_extract" + rm_tree(tmp) + tmp.mkdir(parents=True, exist_ok=True) + + with zipfile.ZipFile(archive) as z: + z.extractall(tmp) + + # Remove __MACOSX + rm_tree(tmp / "__MACOSX") + + # Move normalized dirs + for src_name, dest_name in NORMALIZE.items(): + src = tmp / src_name + dest = out / dest_name + if not src.exists(): + continue + rm_tree(dest) + shutil.move(str(src), str(dest)) + + rm_tree(tmp) + + if not args.no_scrub: + scrub(out) + + print(f"Extracted spine into: {out.resolve()}") + print("Contents:") + for p in sorted(out.iterdir()): + if p.is_dir() and not p.name.startswith('_'): + print(f" - {p.name}") + +if __name__ == "__main__": + main() diff --git a/agentos-spine/agentos-spine/scripts/validate_spine.py b/agentos-spine/agentos-spine/scripts/validate_spine.py new file mode 100755 index 0000000..167e73f --- /dev/null +++ b/agentos-spine/agentos-spine/scripts/validate_spine.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python3 +"""Validate hygiene + license posture for extracted spine repos in `spine/`. + +Fail-fast conditions (default): +- missing LICENSE/COPYING in any spine repo +- presence of .DS_Store, nested .git, venv dirs, __pycache__, *.pyc + +Usage: + python3 scripts/validate_spine.py +""" + +import argparse +from pathlib import Path +import sys + +BAD_FILES = {".DS_Store"} +BAD_DIRS = {".git", ".venv", "venv", "env", "__pycache__"} +BAD_SUFFIXES = {".pyc"} + +LICENSE_NAMES = ("LICENSE", "LICENSE.txt", "LICENSE.md", "COPYING", "COPYING.txt") + +def has_license(repo: Path) -> bool: + for name in LICENSE_NAMES: + if (repo / name).exists(): + return True + # also allow LICENSE.* patterns at root + for p in repo.glob("LICENSE*"): + if p.is_file(): + return True + return False + +def scan(repo: Path): + issues = [] + for p in repo.rglob("*"): + if p.is_file(): + if p.name in BAD_FILES: + issues.append(f"bad file: {p}") + if p.suffix in BAD_SUFFIXES: + issues.append(f"bad file: {p}") + if p.is_dir() and p.name in BAD_DIRS: + issues.append(f"bad dir: {p}") + return issues + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument("--spine", default="spine", help="Spine directory (default: spine)") + ap.add_argument("--allow-missing-license", action="store_true", help="Do not fail on missing license") + args = ap.parse_args() + + spine = Path(args.spine) + if not spine.exists(): + print(f"ERROR: spine directory not found: {spine}") + sys.exit(2) + + repos = [p for p in spine.iterdir() if p.is_dir() and not p.name.startswith('_')] + repos.sort(key=lambda p: p.name.lower()) + + failed = False + print("=== Spine validation ===") + for repo in repos: + repo_failed = False + lic_ok = has_license(repo) + issues = scan(repo) + + if not lic_ok and not args.allow_missing_license: + repo_failed = True + print(f"[FAIL] {repo.name}: missing LICENSE/COPYING") + else: + print(f"[ OK ] {repo.name}: license={'yes' if lic_ok else 'missing (allowed)'}") + + if issues: + repo_failed = True + print(f" hygiene issues ({len(issues)}):") + for line in issues[:25]: + print(f" - {line}") + if len(issues) > 25: + print(f" ... {len(issues)-25} more") + + if repo_failed: + failed = True + + if failed: + print("\nValidation failed. Fix hygiene/license issues before integrating into the OS base.") + sys.exit(1) + + print("\nValidation passed.") + sys.exit(0) + +if __name__ == "__main__": + main() diff --git a/scripts/pr.sh b/scripts/pr.sh new file mode 100755 index 0000000..5d36571 --- /dev/null +++ b/scripts/pr.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +set -euo pipefail +cd "$(dirname "$0")/.." + +BRANCH="${1:-}" +MSG="${2:-}" +if [[ -z "${BRANCH}" || -z "${MSG}" ]]; then + echo "usage: scripts/pr.sh " >&2 + exit 2 +fi + +./scripts/hygiene.sh + +git checkout -b "${BRANCH}" +git add -A +git commit -m "${MSG}" +git push -u origin "${BRANCH}" + +gh pr create --repo SocioProphet/agentplane --base main --head "${BRANCH}" --title "${MSG}" --body "${MSG}"