systems-manager 1.35.2__tar.gz → 2.2.2__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 (123) hide show
  1. {systems_manager-1.35.2 → systems_manager-2.2.2}/.pre-commit-config.yaml +20 -45
  2. {systems_manager-1.35.2 → systems_manager-2.2.2}/AGENTS.md +141 -52
  3. {systems_manager-1.35.2 → systems_manager-2.2.2}/LICENSE +1 -1
  4. systems_manager-2.2.2/PKG-INFO +301 -0
  5. systems_manager-2.2.2/README.md +273 -0
  6. {systems_manager-1.35.2 → systems_manager-2.2.2}/connector_manifest.yml +72 -78
  7. systems_manager-2.2.2/mcp_config.json +24 -0
  8. {systems_manager-1.35.2 → systems_manager-2.2.2}/mkdocs.yml +5 -3
  9. systems_manager-2.2.2/opencode.json +3 -0
  10. systems_manager-2.2.2/pyproject.toml +83 -0
  11. systems_manager-2.2.2/release-readiness.json +17505 -0
  12. systems_manager-2.2.2/requirements.txt +4 -0
  13. systems_manager-2.2.2/scripts/check_release_artifacts.py +72 -0
  14. systems_manager-2.2.2/systems_manager/__init__.py +5 -0
  15. systems_manager-2.2.2/systems_manager/__main__.py +6 -0
  16. systems_manager-2.2.2/systems_manager/agent_data/CRON.md +7 -0
  17. systems_manager-2.2.2/systems_manager/agent_data/HEARTBEAT.md +9 -0
  18. systems_manager-2.2.2/systems_manager/agent_data/IDENTITY.md +15 -0
  19. systems_manager-2.2.2/systems_manager/agent_data/NODE_AGENTS.md +13 -0
  20. systems_manager-2.2.2/systems_manager/agent_data/icon.png +3 -0
  21. systems_manager-2.2.2/systems_manager/bmc_credentials.py +62 -0
  22. systems_manager-2.2.2/systems_manager/connectors/__init__.py +1 -0
  23. systems_manager-2.2.2/systems_manager/connectors/mcp_source_presets.json +14 -0
  24. systems_manager-2.2.2/systems_manager/connectors/tool_schema_fingerprints.json +8 -0
  25. systems_manager-2.2.2/systems_manager/k8s_detect.py +72 -0
  26. systems_manager-2.2.2/systems_manager/kg_ingest.py +315 -0
  27. systems_manager-2.2.2/systems_manager/mcp/__init__.py +8 -0
  28. systems_manager-2.2.2/systems_manager/mcp_server.py +1258 -0
  29. {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager/ontology/__init__.py +2 -2
  30. systems_manager-2.2.2/systems_manager/ontology/certification.json +36 -0
  31. systems_manager-2.2.2/systems_manager/ontology/fixtures/records.json +19 -0
  32. systems_manager-2.2.2/systems_manager/ontology/mappings/source.yaml +20 -0
  33. systems_manager-2.2.2/systems_manager/ontology/migrations/manifest.json +6 -0
  34. systems_manager-2.2.2/systems_manager/ontology/shapes/connector.shacl.ttl +104 -0
  35. {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager/ontology/systems.ttl +48 -42
  36. {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager/os_provider.py +2 -3
  37. {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager/os_provider_tools.py +41 -39
  38. systems_manager-2.2.2/systems_manager/skills/__init__.py +1 -0
  39. systems_manager-2.2.2/systems_manager/skills/systems-manager-operations/SKILL.md +50 -0
  40. systems_manager-2.2.2/systems_manager/skills/systems-manager-operations/agents/openai.yaml +4 -0
  41. systems_manager-2.2.2/systems_manager/skills/systems-manager-operations/references/catalog.md +74 -0
  42. {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager/storage_health.py +29 -31
  43. {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager/storage_tools.py +13 -33
  44. systems_manager-2.2.2/systems_manager/sudo_helper.py +143 -0
  45. systems_manager-2.2.2/systems_manager/systems_manager.py +4466 -0
  46. systems_manager-2.2.2/systems_manager.egg-info/PKG-INFO +301 -0
  47. {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager.egg-info/SOURCES.txt +28 -14
  48. {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager.egg-info/entry_points.txt +6 -7
  49. systems_manager-2.2.2/systems_manager.egg-info/requires.txt +15 -0
  50. {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager.egg-info/top_level.txt +3 -0
  51. {systems_manager-1.35.2 → systems_manager-2.2.2}/tests/conftest.py +25 -0
  52. systems_manager-2.2.2/tests/test_file_manager.py +185 -0
  53. systems_manager-2.2.2/tests/test_fleet_name.py +53 -0
  54. systems_manager-2.2.2/tests/test_init.py +14 -0
  55. {systems_manager-1.35.2 → systems_manager-2.2.2}/tests/test_init_dynamics.py +4 -1
  56. systems_manager-2.2.2/tests/test_k8s_detect.py +101 -0
  57. systems_manager-2.2.2/tests/test_k8s_lifecycle_guard.py +134 -0
  58. systems_manager-2.2.2/tests/test_kg_ingest.py +169 -0
  59. systems_manager-2.2.2/tests/test_linux_managers.py +969 -0
  60. systems_manager-2.2.2/tests/test_main.py +14 -0
  61. {systems_manager-1.35.2 → systems_manager-2.2.2}/tests/test_mcp_routing.py +68 -35
  62. systems_manager-2.2.2/tests/test_mcp_security_policy.py +230 -0
  63. {systems_manager-1.35.2 → systems_manager-2.2.2}/tests/test_os_provider.py +6 -3
  64. {systems_manager-1.35.2 → systems_manager-2.2.2}/tests/test_os_provider_tools.py +7 -0
  65. systems_manager-2.2.2/tests/test_platform_managers.py +95 -0
  66. systems_manager-2.2.2/tests/test_security_boundaries.py +473 -0
  67. {systems_manager-1.35.2 → systems_manager-2.2.2}/tests/test_storage_health.py +42 -15
  68. systems_manager-2.2.2/tests/test_sudo_helper.py +90 -0
  69. systems_manager-2.2.2/tests/test_systems_manager_base.py +1362 -0
  70. systems_manager-2.2.2/tests/test_windows_manager.py +580 -0
  71. systems_manager-1.35.2/PKG-INFO +0 -654
  72. systems_manager-1.35.2/README.md +0 -624
  73. systems_manager-1.35.2/a2a.json +0 -22
  74. systems_manager-1.35.2/mcp_config.json +0 -34
  75. systems_manager-1.35.2/opencode.json +0 -18
  76. systems_manager-1.35.2/pyproject.toml +0 -71
  77. systems_manager-1.35.2/requirements.txt +0 -3
  78. systems_manager-1.35.2/scripts/validate_a2a_agent.py +0 -139
  79. systems_manager-1.35.2/systems_manager/__init__.py +0 -75
  80. systems_manager-1.35.2/systems_manager/__main__.py +0 -4
  81. systems_manager-1.35.2/systems_manager/agent_os_tools.py +0 -652
  82. systems_manager-1.35.2/systems_manager/agent_server.py +0 -85
  83. systems_manager-1.35.2/systems_manager/bmc_credentials.py +0 -77
  84. systems_manager-1.35.2/systems_manager/connectors/mcp_source_presets.json +0 -13
  85. systems_manager-1.35.2/systems_manager/kg_ingest.py +0 -258
  86. systems_manager-1.35.2/systems_manager/mcp/__init__.py +0 -24
  87. systems_manager-1.35.2/systems_manager/mcp_config.json +0 -34
  88. systems_manager-1.35.2/systems_manager/mcp_server.py +0 -757
  89. systems_manager-1.35.2/systems_manager/prompts/infrastructure_specialist.json +0 -45
  90. systems_manager-1.35.2/systems_manager/prompts/main_agent.json +0 -18
  91. systems_manager-1.35.2/systems_manager/skills/__init__.py +0 -0
  92. systems_manager-1.35.2/systems_manager/sudo_helper.py +0 -155
  93. systems_manager-1.35.2/systems_manager/systems_manager.py +0 -3907
  94. systems_manager-1.35.2/systems_manager.egg-info/PKG-INFO +0 -654
  95. systems_manager-1.35.2/systems_manager.egg-info/requires.txt +0 -18
  96. systems_manager-1.35.2/tests/__init__.py +0 -0
  97. systems_manager-1.35.2/tests/test_action_discovery.py +0 -71
  98. systems_manager-1.35.2/tests/test_cluster_sudo.py +0 -248
  99. systems_manager-1.35.2/tests/test_collapsed_tools.py +0 -615
  100. systems_manager-1.35.2/tests/test_concept_parity.py +0 -87
  101. systems_manager-1.35.2/tests/test_file_manager.py +0 -230
  102. systems_manager-1.35.2/tests/test_kg_ingest.py +0 -155
  103. systems_manager-1.35.2/tests/test_platform_managers.py +0 -607
  104. systems_manager-1.35.2/tests/test_remote_host_routing.py +0 -71
  105. systems_manager-1.35.2/tests/test_startup.py +0 -12
  106. systems_manager-1.35.2/tests/test_sudo_helper.py +0 -133
  107. {systems_manager-1.35.2 → systems_manager-2.2.2}/CHANGELOG.md +0 -0
  108. {systems_manager-1.35.2 → systems_manager-2.2.2}/CLAUDE.md +0 -0
  109. {systems_manager-1.35.2 → systems_manager-2.2.2}/MANIFEST.in +0 -0
  110. {systems_manager-1.35.2 → systems_manager-2.2.2}/scripts/security_sanitizer.py +0 -0
  111. {systems_manager-1.35.2 → systems_manager-2.2.2}/setup.cfg +0 -0
  112. {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager/models.py +0 -0
  113. {systems_manager-1.35.2/systems_manager/connectors → systems_manager-2.2.2/systems_manager/prompts}/__init__.py +0 -0
  114. {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager/skills/ipmi-bmc-manager/SKILL.md +0 -0
  115. {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager/skills/ipmi-bmc-manager/references/cheatsheet.md +0 -0
  116. {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager/skills/nic-bond-provisioner/SKILL.md +0 -0
  117. {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager/skills/nic-bond-provisioner/references/recovery.md +0 -0
  118. {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager/skills/nic-bond-provisioner/scripts/apply-bond.sh +0 -0
  119. {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager/skills/nic-bond-provisioner/scripts/gen-bond-config.sh +0 -0
  120. {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager.egg-info/dependency_links.txt +0 -0
  121. {systems_manager-1.35.2/systems_manager/prompts → systems_manager-2.2.2/tests}/__init__.py +0 -0
  122. {systems_manager-1.35.2 → systems_manager-2.2.2}/tests/health_check2.py +0 -0
  123. {systems_manager-1.35.2 → systems_manager-2.2.2}/tests/test_mcp_server.py +0 -0
@@ -1,5 +1,11 @@
1
+ # Without this, `pre-commit install` wires ONLY the pre-commit hook, so `git push`
2
+ # runs nothing and every hook staged pre-push is silently dead code.
3
+ default_install_hook_types: [pre-commit, pre-push]
1
4
  default_language_version:
2
5
  python: python3
6
+ # Phase 0 dev-velocity contract (arbora-completion-program): a hook with no
7
+ # explicit `stages:` below is commit-only, never both.
8
+ default_stages: [pre-commit]
3
9
  exclude: 'dotnet'
4
10
  ci:
5
11
  autofix_prs: true
@@ -8,7 +14,7 @@ ci:
8
14
 
9
15
  repos:
10
16
  - repo: https://github.com/pre-commit/pre-commit-hooks
11
- rev: v6.0.0
17
+ rev: 3e8a8703264a2f4a69428a0aa4dcb512790b2c8c # v6.0.0
12
18
  hooks:
13
19
  - id: check-added-large-files
14
20
  args: ["--maxkb=2000"]
@@ -25,17 +31,17 @@ repos:
25
31
  - id: end-of-file-fixer
26
32
  - id: no-commit-to-branch
27
33
  - repo: https://github.com/psf/black
28
- rev: 26.3.1
34
+ rev: 258e7dbf348bc23cb70b8cdf693481c04634ebcc # frozen: 26.10.1
29
35
  hooks:
30
36
  - id: black
31
37
  - repo: https://github.com/astral-sh/ruff-pre-commit
32
- rev: v0.15.8
38
+ rev: 38bfb07c0c64c304f47eb52090f8288150c77730 # frozen: v0.17.1
33
39
  hooks:
34
40
  - id: ruff
35
41
  types_or: [python, pyi, jupyter]
36
42
  args: ["--fix", "--ignore=E402"]
37
43
  - repo: https://github.com/jendrikseipp/vulture
38
- rev: v2.16
44
+ rev: 258fe6a1974e89a2add9a45519a9e9dd9f46154e # frozen: v2.16
39
45
  hooks:
40
46
  - id: vulture
41
47
  pass_filenames: false
@@ -43,40 +49,30 @@ repos:
43
49
  "--ignore-names", "request"] # or 100 if you want very high confidence only
44
50
  require_serial: true
45
51
  - repo: https://github.com/codespell-project/codespell
46
- rev: v2.4.2
52
+ rev: 57b21406f092110c18776e39b0bda50d37c945c8 # frozen: v2.4.3
47
53
  hooks:
48
54
  - id: codespell
49
55
  args: ["-L", "ans,linar,nam,tread,ot,callin,"]
50
56
  exclude: (?x)^(systems_manager/skills/git-cli-docs/reference/.*)$
51
57
  - repo: https://github.com/PyCQA/bandit
52
- rev: 1.8.6
58
+ rev: 92ae8b82fb422a639f0ed8d99e96cea769594e08 # frozen: 1.9.4
53
59
  hooks:
54
60
  - id: bandit
55
61
  args: ["--skip", "B101,B404,B603"]
56
62
  exclude: ^(tests/|test/|scripts/|script/|__tests__/)
57
63
  - repo: https://github.com/nbQA-dev/nbQA
58
- rev: 1.9.1
64
+ rev: f96ec7f3b26a32619435686eb5813235f7e3327e # frozen: 1.9.1
59
65
  hooks:
60
66
  - id: nbqa-ruff
61
67
  - repo: local
62
68
  hooks:
63
- - id: okf-no-legacy-concepts
64
- name: OKF-CIS — no legacy CONCEPT ids
65
- entry: python3 /home/apps/workspace/agent-packages/agent-utilities/scripts/check_no_legacy_markers.py .
69
+ - id: dependency-readiness
70
+ name: Dependency readiness — every declared intra-fleet constraint is installable
71
+ entry: bash -c 'P=""; d="$PWD"; while [ "$d" != "/" ]; do [ -d "$d/agent-packages/agents/repository-manager" ] && { P="$d/agent-packages/agents/repository-manager"; break; }; d=$(dirname "$d"); done; [ -n "$P" ] || P=repository-manager; uv run --no-project --python 3.12 --prerelease=allow --with "$P" python -m repository_manager.dependency_readiness .'
66
72
  language: system
67
73
  pass_filenames: false
68
74
  always_run: true
69
- - id: check-mermaid
70
- name: Check Mermaid syntax
71
- entry: python3 /home/apps/workspace/agent-packages/agent-utilities/scripts/mermaid_linter.py
72
- language: system
73
- files: \.md$
74
- pass_filenames: true
75
- - id: check-stubs
76
- name: Check for Active Stubs and TODOs
77
- entry: python3 /home/apps/workspace/agent-packages/agent-utilities/scripts/check_stubs.py
78
- language: system
79
- types: [python]
75
+ stages: [manual, pre-push]
80
76
  - id: mermaid-validate
81
77
  name: mermaid-validate
82
78
  entry: mermaid-validate
@@ -91,30 +87,9 @@ repos:
91
87
  language: system
92
88
  pass_filenames: false
93
89
  always_run: true
94
- - id: mcp-readme-table
95
- name: sync MCP tools table in README
96
- entry: |-
97
- bash -c 'if [ -f uv.lock ]; then uv run python -m agent_utilities.mcp.readme_tools; else python -m agent_utilities.mcp.readme_tools; fi'
98
- language: system
99
- files: ^(README\.md|.*/mcp_server\.py|.*/mcp/.*\.py)$
100
- pass_filenames: false
101
- - id: readme-env-vars
102
- name: sync env-vars table in README
103
- entry: |-
104
- bash -c 'if [ -f uv.lock ]; then uv run python -m agent_utilities.mcp.readme_env_vars; else python -m agent_utilities.mcp.readme_env_vars; fi'
105
- language: system
106
- files: ^(README\.md|\.env\.example)$
107
- pass_filenames: false
108
- - id: readme-mcp-examples
109
- name: sync mcp_config examples in README + env blocks
110
- entry: |-
111
- bash -c 'if [ -f uv.lock ]; then uv run python -m agent_utilities.mcp.readme_mcp_examples; else python -m agent_utilities.mcp.readme_mcp_examples; fi'
112
- language: system
113
- files: ^(README\.md|\.env\.example|mcp_config.*\.json|.*/mcp_config.*\.json|.*/mcp_server\.py)$
114
- pass_filenames: false
115
90
  - id: env-var-drift
116
91
  name: check env-var/config drift
117
- entry: bash -c 'if [ -f uv.lock ]; then uv run python -m agent_utilities.mcp.check_env_var_drift --check; else python -m agent_utilities.mcp.check_env_var_drift --check; fi'
92
+ entry: bash -c 'if [ -f uv.lock ]; then uv run python -m agent_connector_sdk.mcp.env_drift --check; else python -m agent_connector_sdk.mcp.env_drift --check; fi'
118
93
  language: system
119
94
  pass_filenames: false
120
95
  files: ^(README\.md|\.env\.example|mcp_config.*\.json|.*/mcp_config.*\.json|docker/.*compose.*\.ya?ml|.*/auth\.py|.*/mcp_server\.py)$
@@ -133,7 +108,7 @@ repos:
133
108
  pass_filenames: false
134
109
  always_run: true
135
110
  - repo: https://github.com/AleksaC/hadolint-py
136
- rev: v2.14.0
111
+ rev: 6e7504451511eaeb62a3e7f14d63b0296cbf86eb # frozen: v2.15.1
137
112
  hooks:
138
113
  - id: hadolint
139
114
  args:
@@ -143,7 +118,7 @@ repos:
143
118
  - --ignore=DL4006
144
119
  - --ignore=SC2102
145
120
  - repo: https://github.com/IamTheFij/docker-pre-commit
146
- rev: v3.0.1
121
+ rev: f626253b23de45412865c07fd076ff95d4cd77a7 # v3.0.1
147
122
  hooks:
148
123
  - id: docker-compose-check
149
124
  - repo: local
@@ -1,20 +1,32 @@
1
1
  # AGENTS.md
2
2
 
3
- > Claude Code loads this file via `CLAUDE.md` (`@AGENTS.md` import) — the two stay
4
- > in sync. Edit **this** file, not `CLAUDE.md`.
3
+ <!-- agent-contract:start -->
4
+ ## Agent contract
5
+
6
+ Tool-neutral rules for any AI agent or human working in this repository. This block is maintained by the fleet standard; edit outside the markers.
7
+
8
+ - **Owner boundary:** this repository owns one external system's calls, mappings and MCP tools (spec prefix `CONN-SYSTEMS-MANAGER-`); it depends on the connector SDK only. Feature routing across repositories: [ecosystem boundaries](https://github.com/Knuckles-Team/pipelines/blob/main/reference/ecosystem-boundaries.md).
9
+ - **Setup:** run `scripts/bootstrap.sh`. It is idempotent and non-interactive: it pins uv and Python, syncs the locked environment, installs the git hooks and prints the gate command.
10
+ - **Gates:** `uvx pre-commit run --all-files` must pass before you push. Do not bypass hooks to get green.
11
+ - **Commits:** one logical change per commit with a `Spec: <ID>` trailer (or `Spec: none (<reason>)`), plus a `Co-Authored-By:` trailer naming the assisting agent. Stage explicit paths only; never `git add -A` or `git add .`. Use your own configured Git identity, never a tool or bot name.
12
+ - **Org rules:** [organization AGENTS.md](https://github.com/Knuckles-Team/.github/blob/main/AGENTS.md).
13
+ <!-- agent-contract:end -->
14
+
15
+ > Canonical guidance for any AI coding agent or human; tool-specific entry files
16
+ > (for example `CLAUDE.md`) only import this file. Edit this file.
5
17
 
6
18
  ## Tech Stack & Architecture
7
- - Language/Version: Python 3.10+
8
- - Core Libraries: `agent-utilities`, `fastmcp`, `pydantic-ai`
19
+ - Language/Version: Python 3.11–3.14
20
+ - Core Libraries: `agent-connector-sdk`, `fastmcp`, `pydantic-ai`, `psutil`, `distro`
9
21
  - Key principles: Functional patterns, Pydantic for data validation, asynchronous tool execution.
10
22
  - Architecture:
11
23
  - `mcp_server.py`: Main MCP server entry point and tool registration.
12
24
  - `agent.py`: Pydantic AI agent definition and logic.
13
25
  - `storage_health.py`: Physical-disk + BMC drive-fault health (CONCEPT:SM-OS.governance.sys-8/1.5)
14
26
  — SMART (incl. RAID `megaraid` passthrough), BMC/IPMI drive-slot faults, RAID PD
15
- state, correlated; runs over the manager seam (local or remote host). Reuses the
16
- `fan-manager` IPMI wrapper for BMC reads when present (else shells `ipmitool`).
17
- - `bmc_credentials.py`: runtime OpenBao read of `apps/idrac` for out-of-band BMC.
27
+ state, correlated; runs over the manager seam (local or remote host).
28
+ - `bmc_credentials.py`: consumes an exact runtime credential projection resolved by
29
+ AgentConfig from an external secret reference.
18
30
  - `skills/`: Directory containing modular agent skills (if applicable).
19
31
 
20
32
  ### Architecture Diagram
@@ -22,14 +34,13 @@
22
34
  graph TD
23
35
  User([User/A2A]) --> Server[A2A Server / FastAPI]
24
36
  Server --> Agent[Pydantic AI Agent]
25
- Agent --> Skills[Modular Skills]
26
37
  Agent --> MCP[MCP Server / FastMCP]
27
38
  MCP --> Client[API Client / Wrapper]
28
39
  MCP --> Storage[sm_storage_health — SM-OS.governance.sys-8/1.5]
29
40
  Storage --> Mgr[manager.run_command — local or remote]
30
41
  Storage --> SMART([smartctl / megaraid])
31
42
  Storage --> BMC([fan-manager IPMI / ipmitool])
32
- Storage -.OOB creds.-> Bao([OpenBao apps/idrac])
43
+ Storage -.OOB credential projection.-> Config([AgentConfig secret reference])
33
44
  Client --> ExternalAPI([External Service API])
34
45
  ```
35
46
 
@@ -39,15 +50,21 @@ sequenceDiagram
39
50
  participant U as User
40
51
  participant S as Server
41
52
  participant A as Agent
42
- participant T as MCP Tool
43
- participant API as External API
53
+ participant M as MCP Tools
54
+ participant SM as Systems Manager
55
+ participant PM as Package Manager
56
+ participant SYS as System APIs
44
57
 
45
58
  U->>S: Request
46
59
  S->>A: Process Query
47
- A->>T: Invoke Tool
48
- T->>API: API Request
49
- API-->>T: API Response
50
- T-->>A: Tool Result
60
+ A->>M: Invoke Tool
61
+ M->>SM: Execute System Operation
62
+ SM->>PM: Package Management
63
+ SM->>SYS: System APIs
64
+ PM-->>SM: Package Result
65
+ SYS-->>SM: System Result
66
+ SM-->>M: Operation Result
67
+ M-->>A: Tool Result
51
68
  A-->>S: Final Response
52
69
  S-->>U: Output
53
70
  ```
@@ -59,14 +76,26 @@ pip install .[all]
59
76
  # Quality & Linting (run from project root)
60
77
  pre-commit run --all-files
61
78
 
79
+ # Testing
80
+ pytest tests/ --cov=systems_manager --cov-report=term-missing
81
+
62
82
  # Execution Commands
63
- # systems-manager\nsystems_manager.systems_manager:systems_manager\n# systems-manager-mcp\nsystems_manager.mcp:mcp_server\n# systems-manager-agent\nsystems_manager.agent:agent_server
83
+ # systems-manager CLI
84
+ python -m systems_manager.systems_manager
85
+
86
+ # systems-manager MCP
87
+ python -m systems_manager.mcp_server
88
+
89
+ # systems-manager Agent
90
+ python -m systems_manager.agent_server
64
91
 
65
92
  ## Project Structure Quick Reference
66
93
  - MCP Entry Point → `mcp_server.py`
67
- - Agent Entry Point → `agent.py`
94
+ - Agent Entry Point → `agent_server.py`
95
+ - Core Systems Manager → `systems_manager.py`
68
96
  - Source Code → `systems_manager/`
69
- - Skills → `skills/` (if exists)
97
+ - Agent Data → `agent_data/`
98
+ - Tests → `tests/`
70
99
 
71
100
  ### File Tree
72
101
  ```text
@@ -75,20 +104,22 @@ pre-commit run --all-files
75
104
 
76
105
  ## Code Style & Conventions
77
106
  **Always:**
78
- - Use `agent-utilities` for common patterns (e.g., `create_mcp_server`, `create_agent`).
107
+ - Use current direct `agent-connector-sdk` modules for shared patterns.
79
108
  - Define input/output models using Pydantic.
80
109
  - Include descriptive docstrings for all tools (they are used as tool descriptions for LLMs).
81
110
  - Check for optional dependencies using `try/except ImportError`.
111
+ - Use type hints for function signatures.
82
112
 
83
113
  **Good example:**
84
114
  ```python
85
- from agent_utilities import create_mcp_server
86
- from mcp.server.fastmcp import FastMCP
115
+ from agent_connector_sdk.mcp.server_factory import create_mcp_server
116
+ from fastmcp import FastMCP
117
+ from pydantic import Field
87
118
 
88
119
  mcp = create_mcp_server("my-agent")
89
120
 
90
121
  @mcp.tool()
91
- async def my_tool(param: str) -> str:
122
+ async def my_tool(param: str = Field(description="Tool parameter")) -> str:
92
123
  """Description for LLM."""
93
124
  return f"Result: {param}"
94
125
  ```
@@ -96,31 +127,56 @@ async def my_tool(param: str) -> str:
96
127
  ## Dos and Don'ts
97
128
  **Do:**
98
129
  - Run `pre-commit` before pushing changes.
99
- - Use existing patterns from `agent-utilities`.
130
+ - Use existing patterns from `agent-connector-sdk`.
100
131
  - Keep tools focused and idempotent where possible.
132
+ - Run pytest with coverage before committing.
133
+ - Mock platform-specific operations in tests for cross-platform compatibility.
101
134
 
102
135
  **Don't:**
103
136
  - Use `cd` commands in scripts; use absolute paths or relative to project root.
104
137
  - Add new dependencies to `dependencies` in `pyproject.toml` without checking `optional-dependencies` first.
105
138
  - Hardcode secrets; use environment variables or `.env` files.
139
+ - Commit test coverage reports or generated HTML coverage files.
140
+ - Modify the `agent_data/` directory structure without updating agent configuration.
106
141
 
107
142
  ## Safety & Boundaries
108
143
  **Always do:**
109
144
  - Run lint/test via `pre-commit`.
110
- - Use `agent-utilities` base classes.
145
+ - Use `agent-connector-sdk` base classes.
146
+ - Test package manager operations with mocking to avoid accidental system modifications.
147
+ - Validate user inputs before running system commands.
111
148
 
112
149
  **Ask first:**
113
- - Major refactors of `mcp_server.py` or `agent.py`.
114
- - Deleting or renaming public tool functions.
150
+ - Major refactors of `mcp_server.py` or `agent_server.py`.
151
+ - Removing or renaming public tool functions.
152
+ - Changes to platform detection logic.
153
+ - Modifications to the graph orchestration architecture.
115
154
 
116
155
  **Never do:**
117
156
  - Commit `.env` files or secrets.
118
- - Modify `agent-utilities` or `universal-skills` files from within this package.
157
+ - Modify `agent-connector-sdk` or `universal-skills` files from within this package.
158
+ - Run destructive operations (package installs, system updates) in tests without proper mocking.
159
+ - Hardcode platform-specific paths; use cross-platform path handling.
160
+
161
+ ## Testing
162
+ **Test Coverage:**
163
+ - Overall coverage: 62% (355 tests passing)
164
+ - Key modules with 95%+ coverage: `__init__.py` (96%), `agent_server.py` (96%)
165
+ - Platform-specific code tested with extensive mocking
166
+ - MCP server feature validated through integration tests
167
+
168
+ **Test Structure:**
169
+ - `conftest.py`: Shared fixtures for platform mocking, subprocess mocking, psutil mocking
170
+ - `test_systems_manager_base.py`: Tests for base class and helper classes (127 tests)
171
+ - `test_linux_managers.py`: Tests for Linux package managers (93 tests)
172
+ - `test_windows_manager.py`: Tests for Windows manager (50 tests)
173
+ - `test_mcp_server.py`: MCP server feature tests (52 tests)
119
174
 
120
175
  ## When Stuck
121
176
  - Propose a plan first before making large changes.
122
- - Check `agent-utilities` documentation for existing helpers.
123
-
177
+ - Check `agent-connector-sdk` documentation for existing helpers.
178
+ - Review existing test patterns for platform-specific mocking.
179
+ - Check the `systems_manager.py` implementation for platform-specific patterns.
124
180
 
125
181
  ## Graph Architecture
126
182
 
@@ -140,10 +196,9 @@ stateDiagram-v2
140
196
  - **RouterNode**: A fast, lightweight LLM (e.g., `nvidia/nemotron-3-super`) that classifies the user's query into one of the specialized domains.
141
197
  - **DomainNode**: The executor node. For the selected domain, it dynamically sets environment variables to temporarily enable ONLY the tools relevant to that domain, creating a highly focused sub-agent (e.g., `gpt-4o`) to complete the request. This preserves LLM context and prevents tool hallucination.
142
198
 
143
-
144
199
  ## Testing with Timeout
145
200
 
146
- To run tests with a timeout to prevent hanging, use the `pytest-timeout` plugin. You can combine it with the `-k` flag to run specific tests:
201
+ To run tests with a timeout to prevent hanging, use the `pytest-timeout` plugin. The operator can combine it with the `-k` flag to run specific tests:
147
202
 
148
203
  ```bash
149
204
  uv run pytest --timeout=60 -k "test_name_pattern"
@@ -190,27 +245,27 @@ and erodes a pristine codebase.
190
245
  `~/workspace/reports/` (command output); tests go in `tests/` (pytest).
191
246
  Before finishing a task, run `git status` and confirm no stray root files were added.
192
247
 
193
- ## Working Discipline — think, simplify, stay surgical, verify
248
+ ## Working Discipline — think, simplify, stay surgical, check
194
249
 
195
250
  These four habits cut the most common LLM coding mistakes. For trivial tasks, use
196
251
  judgment; the bias here is correctness over speed.
197
252
 
198
- - **Think before coding.** State your assumptions explicitly. If a request has more than
253
+ - **Think before coding.** State the operator's assumptions explicitly. If a request has more than
199
254
  one reasonable reading, surface the options instead of silently picking one. If a
200
255
  simpler approach exists, say so and push back when warranted. When something is
201
256
  genuinely unclear, stop and name what's confusing — ask, don't guess.
202
257
  - **Simplicity first.** Write the minimum code that solves the stated problem — no
203
258
  speculative features, no abstraction for single-use code, no configurability that
204
- wasn't requested, no error handling for impossible states. If you wrote 200 lines and
205
- it could be 50, rewrite it. (Name code from its purpose, never `wave0`/`phase2`/`v2`.)
259
+ wasn't requested, no error handling for impossible states. If the operator wrote 200 lines and
260
+ it can be 50, rewrite it. (Name code from its purpose, never `wave0`/`phase2`/`v2`.)
206
261
  - **Stay surgical.** Every changed line should trace directly to the task. Don't refactor,
207
- reformat, or "improve" working code adjacent to your change; match the existing style
208
- even where you'd do it differently. Remove only the imports/symbols your own change
209
- orphaned; if you spot unrelated dead code, mention it rather than deleting it inline.
262
+ reformat, or "improve" working code adjacent to the operator's change; match the existing style
263
+ even where the operator'd do it differently. Remove only the imports/symbols the operator's own change
264
+ orphaned; if the operator spot unrelated dead code, mention it rather than removing it inline.
210
265
  *Exception — the Quality Bar below:* lint/format/type errors the pre-commit gate flags
211
- get fixed regardless of who introduced them. In short: **surgical on behavior, clean on
266
+ get fixed in either case of who introduced them. In short: **surgical on behavior, clean on
212
267
  lint.**
213
- - **Verify against a goal.** Turn the task into a checkable outcome before you start:
268
+ - **Check against a goal.** Turn the task into a checkable outcome before the operator start:
214
269
  "fix the bug" → "write a failing test that reproduces it, then make it pass"; "add
215
270
  validation" → "tests for the invalid inputs pass". For multi-step work, state the short
216
271
  plan and the check for each step, then loop until the checks pass.
@@ -225,8 +280,8 @@ pre-commit run --all-files
225
280
  ```
226
281
 
227
282
  Resolve **every** issue it reports — failures, lint errors, type errors, and
228
- warnings — **including problems that pre-date your change and were not caused by
229
- your edits**. The standing goal is a clean, working codebase with **no errors and
283
+ warnings — **including problems that pre-date the operator's change and were not caused by
284
+ the operator's edits**. The standing goal is a clean, working codebase with **no errors and
230
285
  no warnings**. Do not silence checks (`# noqa`, `# type: ignore`, `SKIP=`,
231
286
  `--no-verify`) to force green unless the exception is already documented in this
232
287
  file as a known, unavoidable limitation. Only commit once `pre-commit run
@@ -236,23 +291,23 @@ why rather than bypassing it.
236
291
  ## Working with Git Worktrees (multi-session)
237
292
 
238
293
  Multiple agents/sessions work the `agent-packages/*` repos concurrently. **Do not
239
- edit the canonical checkout** (`/home/apps/workspace/agent-packages/<repo>`) — a
294
+ edit the canonical checkout** (`${WORKSPACE_ROOT}/agent-packages/<repo>`) — a
240
295
  background `repository-manager` sync can reset its working tree and discard
241
- uncommitted edits. Take your own git worktree on your own branch instead:
296
+ uncommitted edits. Take the operator's own git worktree on the operator's own branch instead:
242
297
 
243
298
  ```bash
244
299
  # preferred — repository-manager MCP:
245
- rm_worktree add <repo> <your-branch> # -> /home/apps/worktrees/<repo>/<your-branch>
300
+ rm_worktree add <repo> <your-branch> # -> ${WORKTREE_ROOT}/<repo>/<your-branch>
246
301
 
247
302
  # raw-git fallback:
248
303
  git -C agent-packages/<repo> checkout main
249
- git -C agent-packages/<repo> worktree add /home/apps/worktrees/<repo>/<branch> -b <branch>
304
+ git -C agent-packages/<repo> worktree add "${WORKTREE_ROOT}/<repo>/<branch>" -b <branch>
250
305
  ```
251
306
 
252
307
  Work in the worktree and **commit often** (commits survive a working-tree reset).
253
308
  Each session must use a **distinct branch** — git allows a branch in only one
254
309
  worktree, which is what keeps concurrent sessions from colliding. Worktrees live
255
- under `/home/apps/worktrees/` (outside the workspace scan, so the sync leaves them
310
+ under `${WORKTREE_ROOT}` (outside the workspace scan, so the sync leaves them
256
311
  alone).
257
312
 
258
313
  **Finishing work in a worktree** — run this sequence before calling it done:
@@ -261,7 +316,7 @@ alone).
261
316
  2. **Commit** in the worktree.
262
317
  3. **Merge to main locally** — `rm_worktree merge <repo> <branch> --into main`
263
318
  (or `git merge --no-ff`). Push only when the user asks.
264
- 4. **Clean up** — remove the worktree and delete the merged branch:
319
+ 4. **Clean up** — remove the worktree and remove the merged branch:
265
320
  `rm_worktree remove <repo> <branch> --delete-branch`; `rm_worktree prune` clears
266
321
  stale entries. (Raw-git: `git worktree remove <path> && git branch -d <branch>`.)
267
322
 
@@ -271,10 +326,10 @@ alone).
271
326
  Working in parallel with other sessions/worktrees? **Reserve a concept id before you write its `CONCEPT:` marker** so two sessions never collide:
272
327
 
273
328
  ```bash
274
- agent-utilities --json concept reserve --ns EG-KG.compute.backend # or a package prefix, e.g. KEY
329
+ agent-connector-sdk --json concept reserve --ns EG-KG.compute.backend # or a package prefix, e.g. KEY
275
330
  ```
276
331
 
277
- Full protocol (ledger, merge=union, reconcile, MCP/REST): <https://knuckles-team.github.io/agent-utilities/concept_coordination/>
332
+ Full protocol (ledger, merge=union, reconcile, MCP/REST): <https://knuckles-team.github.io/agent-connector-sdk/concept_coordination/>
278
333
  <!-- END concept-coordination (generated) -->
279
334
 
280
335
  ## Version & lockfile drift edict (keep the version mirrors AND the lock in sync)
@@ -287,8 +342,8 @@ is what Dependabot flags. Rules:
287
342
 
288
343
  1. **Never hand-edit a version string.** Change the version ONLY via
289
344
  `bump-my-version bump {patch|minor|major}` (a.k.a. `bump2version`), which rewrites every file
290
- registered in `.bumpversion.cfg` in one atomic, tagged commit. If you edited the version in
291
- `pyproject.toml` by hand, you created drift — revert and use the bumper.
345
+ registered in `.bumpversion.cfg` in one atomic, tagged commit. If the operator edited the version in
346
+ `pyproject.toml` by hand, the operator created drift — revert and use the bumper.
292
347
  2. **Every version-bearing file must be registered in `.bumpversion.cfg`** — at minimum
293
348
  `pyproject.toml` AND `README.md`, plus `docker/Dockerfile` and any module `__version__`. Never
294
349
  add a file that embeds the version without a `[bumpversion:file:...]` entry for it.
@@ -298,3 +353,37 @@ is what Dependabot flags. Rules:
298
353
  Dependabot/security surface.
299
354
  4. **Patch CVEs with a version floor at the source, then re-lock.** `uv` resolves one version
300
355
  graph-wide, so a lower-bound in the extra that pulls a dependency raises it for the whole lock.
356
+
357
+ ## Upstream currency edict — target the newest release; a pin is a hypothesis, not a fact (READ BEFORE capping, deferring, or opt-in-gating an upgrade)
358
+
359
+ This governs how this repository treat **other people's** releases, deprecations, and version caps in
360
+ this repo (fleet-wide edict, propagated from `agent-connector-sdk/AGENTS.md`).
361
+
362
+ 1. **Latest by default.** Target the newest upstream release -- including a pre-release
363
+ where the ecosystem has already moved onto it. Sitting on an old major because the
364
+ upgrade is work is not a reason to defer it.
365
+ 2. **A conservative upstream pin is a hypothesis, not a fact -- test it, don't inherit
366
+ it.** Upstream maintainers cap defensively (an unreleased major, an untested surface)
367
+ as often as they cap for a known break. Worked example (from `agent-connector-sdk`):
368
+ `pydantic-ai-slim` 2.18.0 declared `fastmcp-slim[client]>=3.3.0` with no upper bound;
369
+ 2.19.0 added `<4` purely as a defensive guard while fastmcp 4 was still pre-release --
370
+ not because of an observed incompatibility. Blocking an upgrade on that kind of cap
371
+ without testing it is the wrong default.
372
+ 3. **Forward-fix only.** When an upgrade breaks something, fix the break to proceed --
373
+ do not pin backwards, vendor a fork, or route around it. If a break is genuinely
374
+ unfixable inside this repo, say exactly what and why, and carry a plan to unblock it
375
+ -- never an indefinite pin.
376
+ 4. **Deprecations are fixed on sight, in code AND in tests.** A `DeprecationWarning` from
377
+ an upstream library is a defect to fix now, not noise to filter. **Never** silence one
378
+ with a warning filter, `# noqa`, or a pytest `filterwarnings` entry to go
379
+ green.
380
+ 5. **Adopt upstream features rather than reimplementing them.** If upstream ships a
381
+ capability this repo hand-rolled, migrate to theirs and remove the local one.
382
+ 6. **Nothing built on an upgrade ships opt-in.** A new capability an upgrade unlocks is
383
+ default-on unless it genuinely costs compute, in which case it is policy-selected,
384
+ never flag-gated. An opt-in extra or a dependency-conflict fork is an interim state
385
+ that must carry a written plan to become the default, never a resting place.
386
+
387
+ ## Specs: extend first
388
+
389
+ Find the spec row that owns the behavior before any code change. Search with `git grep -n "<term>" -- specs`. Cite the row ID in the commit `Spec:` trailer. Extend the owning spec before any new spec text. Add a child row, a new rollup, or a dated `plan.md` "Amendments" entry. Create a new spec only for a capability that no spec owns. Audits, reviews, and carry-overs land in the owning spec. They never get a spec directory. Reuse an existing function, module, or store before adding one. The rules are the ecosystem [spec standard](https://github.com/Knuckles-Team/pipelines/blob/main/reference/spec-standard.md).
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012-2023 Audel Rouhi
1
+ Copyright (c) 2012-2023 Project Maintainers
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the