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.
- {systems_manager-1.35.2 → systems_manager-2.2.2}/.pre-commit-config.yaml +20 -45
- {systems_manager-1.35.2 → systems_manager-2.2.2}/AGENTS.md +141 -52
- {systems_manager-1.35.2 → systems_manager-2.2.2}/LICENSE +1 -1
- systems_manager-2.2.2/PKG-INFO +301 -0
- systems_manager-2.2.2/README.md +273 -0
- {systems_manager-1.35.2 → systems_manager-2.2.2}/connector_manifest.yml +72 -78
- systems_manager-2.2.2/mcp_config.json +24 -0
- {systems_manager-1.35.2 → systems_manager-2.2.2}/mkdocs.yml +5 -3
- systems_manager-2.2.2/opencode.json +3 -0
- systems_manager-2.2.2/pyproject.toml +83 -0
- systems_manager-2.2.2/release-readiness.json +17505 -0
- systems_manager-2.2.2/requirements.txt +4 -0
- systems_manager-2.2.2/scripts/check_release_artifacts.py +72 -0
- systems_manager-2.2.2/systems_manager/__init__.py +5 -0
- systems_manager-2.2.2/systems_manager/__main__.py +6 -0
- systems_manager-2.2.2/systems_manager/agent_data/CRON.md +7 -0
- systems_manager-2.2.2/systems_manager/agent_data/HEARTBEAT.md +9 -0
- systems_manager-2.2.2/systems_manager/agent_data/IDENTITY.md +15 -0
- systems_manager-2.2.2/systems_manager/agent_data/NODE_AGENTS.md +13 -0
- systems_manager-2.2.2/systems_manager/agent_data/icon.png +3 -0
- systems_manager-2.2.2/systems_manager/bmc_credentials.py +62 -0
- systems_manager-2.2.2/systems_manager/connectors/__init__.py +1 -0
- systems_manager-2.2.2/systems_manager/connectors/mcp_source_presets.json +14 -0
- systems_manager-2.2.2/systems_manager/connectors/tool_schema_fingerprints.json +8 -0
- systems_manager-2.2.2/systems_manager/k8s_detect.py +72 -0
- systems_manager-2.2.2/systems_manager/kg_ingest.py +315 -0
- systems_manager-2.2.2/systems_manager/mcp/__init__.py +8 -0
- systems_manager-2.2.2/systems_manager/mcp_server.py +1258 -0
- {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager/ontology/__init__.py +2 -2
- systems_manager-2.2.2/systems_manager/ontology/certification.json +36 -0
- systems_manager-2.2.2/systems_manager/ontology/fixtures/records.json +19 -0
- systems_manager-2.2.2/systems_manager/ontology/mappings/source.yaml +20 -0
- systems_manager-2.2.2/systems_manager/ontology/migrations/manifest.json +6 -0
- systems_manager-2.2.2/systems_manager/ontology/shapes/connector.shacl.ttl +104 -0
- {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager/ontology/systems.ttl +48 -42
- {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager/os_provider.py +2 -3
- {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager/os_provider_tools.py +41 -39
- systems_manager-2.2.2/systems_manager/skills/__init__.py +1 -0
- systems_manager-2.2.2/systems_manager/skills/systems-manager-operations/SKILL.md +50 -0
- systems_manager-2.2.2/systems_manager/skills/systems-manager-operations/agents/openai.yaml +4 -0
- systems_manager-2.2.2/systems_manager/skills/systems-manager-operations/references/catalog.md +74 -0
- {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager/storage_health.py +29 -31
- {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager/storage_tools.py +13 -33
- systems_manager-2.2.2/systems_manager/sudo_helper.py +143 -0
- systems_manager-2.2.2/systems_manager/systems_manager.py +4466 -0
- systems_manager-2.2.2/systems_manager.egg-info/PKG-INFO +301 -0
- {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager.egg-info/SOURCES.txt +28 -14
- {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager.egg-info/entry_points.txt +6 -7
- systems_manager-2.2.2/systems_manager.egg-info/requires.txt +15 -0
- {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager.egg-info/top_level.txt +3 -0
- {systems_manager-1.35.2 → systems_manager-2.2.2}/tests/conftest.py +25 -0
- systems_manager-2.2.2/tests/test_file_manager.py +185 -0
- systems_manager-2.2.2/tests/test_fleet_name.py +53 -0
- systems_manager-2.2.2/tests/test_init.py +14 -0
- {systems_manager-1.35.2 → systems_manager-2.2.2}/tests/test_init_dynamics.py +4 -1
- systems_manager-2.2.2/tests/test_k8s_detect.py +101 -0
- systems_manager-2.2.2/tests/test_k8s_lifecycle_guard.py +134 -0
- systems_manager-2.2.2/tests/test_kg_ingest.py +169 -0
- systems_manager-2.2.2/tests/test_linux_managers.py +969 -0
- systems_manager-2.2.2/tests/test_main.py +14 -0
- {systems_manager-1.35.2 → systems_manager-2.2.2}/tests/test_mcp_routing.py +68 -35
- systems_manager-2.2.2/tests/test_mcp_security_policy.py +230 -0
- {systems_manager-1.35.2 → systems_manager-2.2.2}/tests/test_os_provider.py +6 -3
- {systems_manager-1.35.2 → systems_manager-2.2.2}/tests/test_os_provider_tools.py +7 -0
- systems_manager-2.2.2/tests/test_platform_managers.py +95 -0
- systems_manager-2.2.2/tests/test_security_boundaries.py +473 -0
- {systems_manager-1.35.2 → systems_manager-2.2.2}/tests/test_storage_health.py +42 -15
- systems_manager-2.2.2/tests/test_sudo_helper.py +90 -0
- systems_manager-2.2.2/tests/test_systems_manager_base.py +1362 -0
- systems_manager-2.2.2/tests/test_windows_manager.py +580 -0
- systems_manager-1.35.2/PKG-INFO +0 -654
- systems_manager-1.35.2/README.md +0 -624
- systems_manager-1.35.2/a2a.json +0 -22
- systems_manager-1.35.2/mcp_config.json +0 -34
- systems_manager-1.35.2/opencode.json +0 -18
- systems_manager-1.35.2/pyproject.toml +0 -71
- systems_manager-1.35.2/requirements.txt +0 -3
- systems_manager-1.35.2/scripts/validate_a2a_agent.py +0 -139
- systems_manager-1.35.2/systems_manager/__init__.py +0 -75
- systems_manager-1.35.2/systems_manager/__main__.py +0 -4
- systems_manager-1.35.2/systems_manager/agent_os_tools.py +0 -652
- systems_manager-1.35.2/systems_manager/agent_server.py +0 -85
- systems_manager-1.35.2/systems_manager/bmc_credentials.py +0 -77
- systems_manager-1.35.2/systems_manager/connectors/mcp_source_presets.json +0 -13
- systems_manager-1.35.2/systems_manager/kg_ingest.py +0 -258
- systems_manager-1.35.2/systems_manager/mcp/__init__.py +0 -24
- systems_manager-1.35.2/systems_manager/mcp_config.json +0 -34
- systems_manager-1.35.2/systems_manager/mcp_server.py +0 -757
- systems_manager-1.35.2/systems_manager/prompts/infrastructure_specialist.json +0 -45
- systems_manager-1.35.2/systems_manager/prompts/main_agent.json +0 -18
- systems_manager-1.35.2/systems_manager/skills/__init__.py +0 -0
- systems_manager-1.35.2/systems_manager/sudo_helper.py +0 -155
- systems_manager-1.35.2/systems_manager/systems_manager.py +0 -3907
- systems_manager-1.35.2/systems_manager.egg-info/PKG-INFO +0 -654
- systems_manager-1.35.2/systems_manager.egg-info/requires.txt +0 -18
- systems_manager-1.35.2/tests/__init__.py +0 -0
- systems_manager-1.35.2/tests/test_action_discovery.py +0 -71
- systems_manager-1.35.2/tests/test_cluster_sudo.py +0 -248
- systems_manager-1.35.2/tests/test_collapsed_tools.py +0 -615
- systems_manager-1.35.2/tests/test_concept_parity.py +0 -87
- systems_manager-1.35.2/tests/test_file_manager.py +0 -230
- systems_manager-1.35.2/tests/test_kg_ingest.py +0 -155
- systems_manager-1.35.2/tests/test_platform_managers.py +0 -607
- systems_manager-1.35.2/tests/test_remote_host_routing.py +0 -71
- systems_manager-1.35.2/tests/test_startup.py +0 -12
- systems_manager-1.35.2/tests/test_sudo_helper.py +0 -133
- {systems_manager-1.35.2 → systems_manager-2.2.2}/CHANGELOG.md +0 -0
- {systems_manager-1.35.2 → systems_manager-2.2.2}/CLAUDE.md +0 -0
- {systems_manager-1.35.2 → systems_manager-2.2.2}/MANIFEST.in +0 -0
- {systems_manager-1.35.2 → systems_manager-2.2.2}/scripts/security_sanitizer.py +0 -0
- {systems_manager-1.35.2 → systems_manager-2.2.2}/setup.cfg +0 -0
- {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager/models.py +0 -0
- {systems_manager-1.35.2/systems_manager/connectors → systems_manager-2.2.2/systems_manager/prompts}/__init__.py +0 -0
- {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager/skills/ipmi-bmc-manager/SKILL.md +0 -0
- {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager/skills/ipmi-bmc-manager/references/cheatsheet.md +0 -0
- {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager/skills/nic-bond-provisioner/SKILL.md +0 -0
- {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager/skills/nic-bond-provisioner/references/recovery.md +0 -0
- {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager/skills/nic-bond-provisioner/scripts/apply-bond.sh +0 -0
- {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager/skills/nic-bond-provisioner/scripts/gen-bond-config.sh +0 -0
- {systems_manager-1.35.2 → systems_manager-2.2.2}/systems_manager.egg-info/dependency_links.txt +0 -0
- {systems_manager-1.35.2/systems_manager/prompts → systems_manager-2.2.2/tests}/__init__.py +0 -0
- {systems_manager-1.35.2 → systems_manager-2.2.2}/tests/health_check2.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
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:
|
|
64
|
-
name:
|
|
65
|
-
entry:
|
|
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
|
-
|
|
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
|
|
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.
|
|
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
|
-
|
|
4
|
-
|
|
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.
|
|
8
|
-
- Core Libraries: `agent-
|
|
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).
|
|
16
|
-
|
|
17
|
-
|
|
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
|
|
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
|
|
43
|
-
participant
|
|
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->>
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
|
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 → `
|
|
94
|
+
- Agent Entry Point → `agent_server.py`
|
|
95
|
+
- Core Systems Manager → `systems_manager.py`
|
|
68
96
|
- Source Code → `systems_manager/`
|
|
69
|
-
-
|
|
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-
|
|
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
|
|
86
|
-
from
|
|
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-
|
|
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-
|
|
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 `
|
|
114
|
-
-
|
|
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-
|
|
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-
|
|
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.
|
|
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,
|
|
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
|
|
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
|
|
205
|
-
it
|
|
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
|
|
208
|
-
even where
|
|
209
|
-
orphaned; if
|
|
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
|
|
266
|
+
get fixed in either case of who introduced them. In short: **surgical on behavior, clean on
|
|
212
267
|
lint.**
|
|
213
|
-
- **
|
|
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
|
|
229
|
-
|
|
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** (
|
|
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
|
|
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> # ->
|
|
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
|
|
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
|
|
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
|
|
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-
|
|
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-
|
|
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
|
|
291
|
-
`pyproject.toml` by hand,
|
|
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).
|