gpu-container 0.1.2__tar.gz → 0.1.4__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.
- gpu_container-0.1.4/.claude/hooks/pre-tool-use.mjs +30 -0
- gpu_container-0.1.4/.claude/role-os/tool-contracts.json +639 -0
- gpu_container-0.1.4/.claude/settings.json +15 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/.github/workflows/release.yml +14 -1
- {gpu_container-0.1.2 → gpu_container-0.1.4}/CHANGELOG.md +17 -1
- {gpu_container-0.1.2 → gpu_container-0.1.4}/PKG-INFO +1 -1
- {gpu_container-0.1.2 → gpu_container-0.1.4}/gpu_container/__init__.py +1 -1
- {gpu_container-0.1.2 → gpu_container-0.1.4}/npm/bin/gpu-container.js +4 -4
- {gpu_container-0.1.2 → gpu_container-0.1.4}/npm/package.json +3 -2
- {gpu_container-0.1.2 → gpu_container-0.1.4}/pyproject.toml +1 -1
- {gpu_container-0.1.2 → gpu_container-0.1.4}/.dockerignore +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/.github/workflows/ci.yml +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/.github/workflows/pages.yml +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/.gitignore +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/Dockerfile +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/LICENSE +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/README.es.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/README.fr.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/README.hi.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/README.it.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/README.ja.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/README.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/README.pt-BR.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/README.zh.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/RELEASE_ASSESSMENT.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/SCORECARD.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/SECURITY.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/SHIP_GATE.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/assets/logo.png +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/docs/architecture.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/docs/cli.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/docs/constraints.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/docs/decisions/0001-per-expert-cache-build-vs-upstream.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/docs/derisk-concentration.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/docs/feasibility.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/docs/features.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/docs/moe-lane-architecture.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/docs/prior-art.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/docs/quickstart.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/gpu_container/__main__.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/gpu_container/errors.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/gpu_container/planner/__init__.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/gpu_container/planner/activation.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/gpu_container/planner/calibration.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/gpu_container/planner/calibration_seed.json +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/gpu_container/planner/cli.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/gpu_container/planner/concentration_cli.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/gpu_container/planner/placement.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/gpu_container/planner/receipt.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/gpu_container/planner/receipt_cli.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/gpu_container/profiler/__init__.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/gpu_container/profiler/baseline.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/gpu_container/profiler/cli.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/gpu_container/profiler/cuda_bench.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/gpu_container/profiler/hardware.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/gpu_container/profiler/model.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/gpu_container/profiler/nvme_bench.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/gpu_container/profiler/schema.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/gpu_container/watchdog.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/npm/LICENSE +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/npm/README.es.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/npm/README.fr.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/npm/README.hi.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/npm/README.it.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/npm/README.ja.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/npm/README.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/npm/README.pt-BR.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/npm/README.zh.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/scripts/gen_calibration_seed.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/scripts/ingest_sweep.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/scripts/verify.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/site/astro.config.mjs +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/site/package-lock.json +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/site/package.json +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/site/src/content/docs/handbook/cli.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/site/src/content/docs/handbook/derisk.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/site/src/content/docs/handbook/getting-started.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/site/src/content/docs/handbook/index.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/site/src/content/docs/handbook/moe-lane.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/site/src/content/docs/handbook/reference.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/site/src/content/docs/handbook/safety.md +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/site/src/content.config.ts +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/site/src/pages/index.astro +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/site/src/site-config.ts +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/site/src/styles/global.css +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/site/src/styles/starlight-custom.css +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/site/tsconfig.json +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/tests/test_activation.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/tests/test_calibration.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/tests/test_concentration_cli.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/tests/test_dispatch.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/tests/test_errors.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/tests/test_measure.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/tests/test_planner.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/tests/test_profiler.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/tests/test_receipt_trace.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/tests/test_watchdog.py +0 -0
- {gpu_container-0.1.2 → gpu_container-0.1.4}/watchdog.example.json +0 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Wedge #1 PreToolUse hook — Tool-Call Conformance ADVISORY (deterministic floor; advisory + fail-open).
|
|
4
|
+
* gpu-container is a Python repo with no role-os dependency, so the floor is imported from the sibling
|
|
5
|
+
* role-os checkout by ABSOLUTE path (rig-specific: E:/AI/role-os). This reads
|
|
6
|
+
* .claude/role-os/tool-contracts.json from the session cwd, runs the schema + computable contract floor
|
|
7
|
+
* against the proposed call, and — only when the floor PROVES a violation — injects an advisory into context
|
|
8
|
+
* via the Claude Code hook protocol ({hookSpecificOutput:{hookEventName:"PreToolUse", additionalContext}}).
|
|
9
|
+
* It NEVER blocks (always exit 0) and NEVER throws — any error (incl. a missing role-os checkout) is a
|
|
10
|
+
* silent no-op, because a hook must not break a tool call.
|
|
11
|
+
*/
|
|
12
|
+
import { readFileSync } from "node:fs";
|
|
13
|
+
import { pathToFileURL } from "node:url";
|
|
14
|
+
|
|
15
|
+
const ROLE_OS_HOOKS = "E:/AI/role-os/src/hooks.mjs"; // rig-specific sibling checkout
|
|
16
|
+
|
|
17
|
+
let input = {};
|
|
18
|
+
try { input = JSON.parse(readFileSync(0, "utf-8").toString() || "{}"); } catch { /* no stdin */ }
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
const { conformanceAdvisory } = await import(pathToFileURL(ROLE_OS_HOOKS).href);
|
|
22
|
+
const note = conformanceAdvisory(input.cwd || process.cwd(), input.tool_name || "", input.tool_input);
|
|
23
|
+
if (note) {
|
|
24
|
+
console.log(JSON.stringify({
|
|
25
|
+
hookSpecificOutput: { hookEventName: "PreToolUse", additionalContext: note },
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
28
|
+
} catch { /* role-os checkout not present, or internal error -> no-op (never block a tool call) */ }
|
|
29
|
+
|
|
30
|
+
process.exit(0);
|
|
@@ -0,0 +1,639 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Read": {
|
|
3
|
+
"contract": "Read a file from the local filesystem. file_path must be an absolute path. 'limit' is the number of lines to read and must be a positive integer (> 0). 'offset' is the 0-based line to start reading from and must be non-negative (>= 0).",
|
|
4
|
+
"params": [
|
|
5
|
+
{
|
|
6
|
+
"name": "file_path",
|
|
7
|
+
"type": "string",
|
|
8
|
+
"required": true
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"name": "limit",
|
|
12
|
+
"type": "number",
|
|
13
|
+
"required": false
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"name": "offset",
|
|
17
|
+
"type": "number",
|
|
18
|
+
"required": false
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"name": "pages",
|
|
22
|
+
"type": "string",
|
|
23
|
+
"required": false
|
|
24
|
+
}
|
|
25
|
+
],
|
|
26
|
+
"constraints": [
|
|
27
|
+
{
|
|
28
|
+
"kind": "cmp",
|
|
29
|
+
"op": "gt",
|
|
30
|
+
"left": "limit",
|
|
31
|
+
"right": 0
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"kind": "cmp",
|
|
35
|
+
"op": "ge",
|
|
36
|
+
"left": "offset",
|
|
37
|
+
"right": 0
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
},
|
|
41
|
+
"Edit": {
|
|
42
|
+
"contract": "Exact string replacement in a file. file_path, old_string, and new_string are all required strings. old_string must be DIFFERENT from new_string (replacing a string with itself is a no-op and is rejected). replace_all is an optional boolean.",
|
|
43
|
+
"params": [
|
|
44
|
+
{
|
|
45
|
+
"name": "file_path",
|
|
46
|
+
"type": "string",
|
|
47
|
+
"required": true
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"name": "old_string",
|
|
51
|
+
"type": "string",
|
|
52
|
+
"required": true
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"name": "new_string",
|
|
56
|
+
"type": "string",
|
|
57
|
+
"required": true
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"name": "replace_all",
|
|
61
|
+
"type": "boolean",
|
|
62
|
+
"required": false
|
|
63
|
+
}
|
|
64
|
+
],
|
|
65
|
+
"constraints": [
|
|
66
|
+
{
|
|
67
|
+
"kind": "cmp",
|
|
68
|
+
"op": "ne",
|
|
69
|
+
"left": "old_string",
|
|
70
|
+
"right": {
|
|
71
|
+
"field": "new_string"
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
]
|
|
75
|
+
},
|
|
76
|
+
"Write": {
|
|
77
|
+
"contract": "Write (overwrite) a file on the local filesystem. Both file_path (an absolute path) and content are required strings. No computable relational contract beyond the schema floor.",
|
|
78
|
+
"params": [
|
|
79
|
+
{
|
|
80
|
+
"name": "file_path",
|
|
81
|
+
"type": "string",
|
|
82
|
+
"required": true
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"name": "content",
|
|
86
|
+
"type": "string",
|
|
87
|
+
"required": true
|
|
88
|
+
}
|
|
89
|
+
],
|
|
90
|
+
"constraints": []
|
|
91
|
+
},
|
|
92
|
+
"Bash": {
|
|
93
|
+
"contract": "Execute a bash command. 'command' is required. 'timeout' is in milliseconds and must not exceed 600000 (10 minutes); it must also be non-negative. run_in_background and dangerouslyDisableSandbox are optional booleans.",
|
|
94
|
+
"params": [
|
|
95
|
+
{
|
|
96
|
+
"name": "command",
|
|
97
|
+
"type": "string",
|
|
98
|
+
"required": true
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"name": "description",
|
|
102
|
+
"type": "string",
|
|
103
|
+
"required": false
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"name": "timeout",
|
|
107
|
+
"type": "number",
|
|
108
|
+
"required": false,
|
|
109
|
+
"max": 600000
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"name": "run_in_background",
|
|
113
|
+
"type": "boolean",
|
|
114
|
+
"required": false
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"name": "dangerouslyDisableSandbox",
|
|
118
|
+
"type": "boolean",
|
|
119
|
+
"required": false
|
|
120
|
+
}
|
|
121
|
+
],
|
|
122
|
+
"constraints": [
|
|
123
|
+
{
|
|
124
|
+
"kind": "cmp",
|
|
125
|
+
"op": "ge",
|
|
126
|
+
"left": "timeout",
|
|
127
|
+
"right": 0
|
|
128
|
+
}
|
|
129
|
+
]
|
|
130
|
+
},
|
|
131
|
+
"PowerShell": {
|
|
132
|
+
"contract": "Execute a PowerShell command. 'command' is required. 'timeout' is in milliseconds and must not exceed 600000 (10 minutes); it must also be non-negative. run_in_background and dangerouslyDisableSandbox are optional booleans.",
|
|
133
|
+
"params": [
|
|
134
|
+
{
|
|
135
|
+
"name": "command",
|
|
136
|
+
"type": "string",
|
|
137
|
+
"required": true
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
"name": "description",
|
|
141
|
+
"type": "string",
|
|
142
|
+
"required": false
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"name": "timeout",
|
|
146
|
+
"type": "number",
|
|
147
|
+
"required": false,
|
|
148
|
+
"max": 600000
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
"name": "run_in_background",
|
|
152
|
+
"type": "boolean",
|
|
153
|
+
"required": false
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"name": "dangerouslyDisableSandbox",
|
|
157
|
+
"type": "boolean",
|
|
158
|
+
"required": false
|
|
159
|
+
}
|
|
160
|
+
],
|
|
161
|
+
"constraints": [
|
|
162
|
+
{
|
|
163
|
+
"kind": "cmp",
|
|
164
|
+
"op": "ge",
|
|
165
|
+
"left": "timeout",
|
|
166
|
+
"right": 0
|
|
167
|
+
}
|
|
168
|
+
]
|
|
169
|
+
},
|
|
170
|
+
"Grep": {
|
|
171
|
+
"contract": "ripgrep content search. 'pattern' is required. 'output_mode' must be one of content|files_with_matches|count. The numeric context fields -A, -B, -C, and context are line counts and must be non-negative (>= 0). head_limit and offset are also non-negative integers (>= 0).",
|
|
172
|
+
"params": [
|
|
173
|
+
{
|
|
174
|
+
"name": "pattern",
|
|
175
|
+
"type": "string",
|
|
176
|
+
"required": true
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"name": "path",
|
|
180
|
+
"type": "string",
|
|
181
|
+
"required": false
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
"name": "glob",
|
|
185
|
+
"type": "string",
|
|
186
|
+
"required": false
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
"name": "type",
|
|
190
|
+
"type": "string",
|
|
191
|
+
"required": false
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
"name": "output_mode",
|
|
195
|
+
"type": "string",
|
|
196
|
+
"required": false,
|
|
197
|
+
"enum": [
|
|
198
|
+
"content",
|
|
199
|
+
"files_with_matches",
|
|
200
|
+
"count"
|
|
201
|
+
]
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
"name": "-A",
|
|
205
|
+
"type": "number",
|
|
206
|
+
"required": false
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
"name": "-B",
|
|
210
|
+
"type": "number",
|
|
211
|
+
"required": false
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
"name": "-C",
|
|
215
|
+
"type": "number",
|
|
216
|
+
"required": false
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
"name": "-n",
|
|
220
|
+
"type": "boolean",
|
|
221
|
+
"required": false
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
"name": "-i",
|
|
225
|
+
"type": "boolean",
|
|
226
|
+
"required": false
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
"name": "-o",
|
|
230
|
+
"type": "boolean",
|
|
231
|
+
"required": false
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
"name": "multiline",
|
|
235
|
+
"type": "boolean",
|
|
236
|
+
"required": false
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
"name": "head_limit",
|
|
240
|
+
"type": "number",
|
|
241
|
+
"required": false
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
"name": "offset",
|
|
245
|
+
"type": "number",
|
|
246
|
+
"required": false
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
"name": "context",
|
|
250
|
+
"type": "number",
|
|
251
|
+
"required": false
|
|
252
|
+
}
|
|
253
|
+
],
|
|
254
|
+
"constraints": [
|
|
255
|
+
{
|
|
256
|
+
"kind": "cmp",
|
|
257
|
+
"op": "ge",
|
|
258
|
+
"left": "-A",
|
|
259
|
+
"right": 0
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
"kind": "cmp",
|
|
263
|
+
"op": "ge",
|
|
264
|
+
"left": "-B",
|
|
265
|
+
"right": 0
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
"kind": "cmp",
|
|
269
|
+
"op": "ge",
|
|
270
|
+
"left": "-C",
|
|
271
|
+
"right": 0
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
"kind": "cmp",
|
|
275
|
+
"op": "ge",
|
|
276
|
+
"left": "context",
|
|
277
|
+
"right": 0
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
"kind": "cmp",
|
|
281
|
+
"op": "ge",
|
|
282
|
+
"left": "head_limit",
|
|
283
|
+
"right": 0
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
"kind": "cmp",
|
|
287
|
+
"op": "ge",
|
|
288
|
+
"left": "offset",
|
|
289
|
+
"right": 0
|
|
290
|
+
}
|
|
291
|
+
]
|
|
292
|
+
},
|
|
293
|
+
"Glob": {
|
|
294
|
+
"contract": "Fast file pattern matching. 'pattern' is required (e.g. **/*.ts). 'path' is an optional directory to search in. No computable relational contract beyond the schema floor.",
|
|
295
|
+
"params": [
|
|
296
|
+
{
|
|
297
|
+
"name": "pattern",
|
|
298
|
+
"type": "string",
|
|
299
|
+
"required": true
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
"name": "path",
|
|
303
|
+
"type": "string",
|
|
304
|
+
"required": false
|
|
305
|
+
}
|
|
306
|
+
],
|
|
307
|
+
"constraints": []
|
|
308
|
+
},
|
|
309
|
+
"AskUserQuestion": {
|
|
310
|
+
"contract": "Ask the user between 1 and 4 questions. 'questions' is a required array whose length must be >= 1 and <= 4.",
|
|
311
|
+
"params": [
|
|
312
|
+
{
|
|
313
|
+
"name": "questions",
|
|
314
|
+
"type": "array",
|
|
315
|
+
"required": true
|
|
316
|
+
}
|
|
317
|
+
],
|
|
318
|
+
"constraints": [
|
|
319
|
+
{
|
|
320
|
+
"kind": "cmp",
|
|
321
|
+
"op": "ge",
|
|
322
|
+
"left": {
|
|
323
|
+
"len": "questions"
|
|
324
|
+
},
|
|
325
|
+
"right": 1
|
|
326
|
+
},
|
|
327
|
+
{
|
|
328
|
+
"kind": "cmp",
|
|
329
|
+
"op": "le",
|
|
330
|
+
"left": {
|
|
331
|
+
"len": "questions"
|
|
332
|
+
},
|
|
333
|
+
"right": 4
|
|
334
|
+
}
|
|
335
|
+
]
|
|
336
|
+
},
|
|
337
|
+
"ToolSearch": {
|
|
338
|
+
"contract": "Fetch deferred tool schemas. 'query' is required. 'max_results' is an optional result-count hint (the real schema enforces no min/integer bound). No computable relational contract beyond the schema floor.",
|
|
339
|
+
"params": [
|
|
340
|
+
{
|
|
341
|
+
"name": "query",
|
|
342
|
+
"type": "string",
|
|
343
|
+
"required": true
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
"name": "max_results",
|
|
347
|
+
"type": "number",
|
|
348
|
+
"required": false
|
|
349
|
+
}
|
|
350
|
+
],
|
|
351
|
+
"constraints": []
|
|
352
|
+
},
|
|
353
|
+
"Skill": {
|
|
354
|
+
"contract": "Invoke a skill by exact name. 'skill' is required. 'args' is optional. No computable relational contract beyond the schema floor.",
|
|
355
|
+
"params": [
|
|
356
|
+
{
|
|
357
|
+
"name": "skill",
|
|
358
|
+
"type": "string",
|
|
359
|
+
"required": true
|
|
360
|
+
},
|
|
361
|
+
{
|
|
362
|
+
"name": "args",
|
|
363
|
+
"type": "string",
|
|
364
|
+
"required": false
|
|
365
|
+
}
|
|
366
|
+
],
|
|
367
|
+
"constraints": []
|
|
368
|
+
},
|
|
369
|
+
"Agent": {
|
|
370
|
+
"contract": "Launch a subagent. description, prompt, and subagent_type are required. 'model' (when provided) must be one of sonnet|opus|haiku. 'isolation' (when provided) must be 'worktree'. IMPORTANT: subagent_type is an OPEN set — custom agent types are allowed — so do NOT add a membership constraint on subagent_type; that is genuinely-semantic, not computable.",
|
|
371
|
+
"params": [
|
|
372
|
+
{
|
|
373
|
+
"name": "description",
|
|
374
|
+
"type": "string",
|
|
375
|
+
"required": true
|
|
376
|
+
},
|
|
377
|
+
{
|
|
378
|
+
"name": "prompt",
|
|
379
|
+
"type": "string",
|
|
380
|
+
"required": true
|
|
381
|
+
},
|
|
382
|
+
{
|
|
383
|
+
"name": "subagent_type",
|
|
384
|
+
"type": "string",
|
|
385
|
+
"required": true
|
|
386
|
+
},
|
|
387
|
+
{
|
|
388
|
+
"name": "model",
|
|
389
|
+
"type": "string",
|
|
390
|
+
"required": false,
|
|
391
|
+
"enum": [
|
|
392
|
+
"sonnet",
|
|
393
|
+
"opus",
|
|
394
|
+
"haiku"
|
|
395
|
+
]
|
|
396
|
+
},
|
|
397
|
+
{
|
|
398
|
+
"name": "isolation",
|
|
399
|
+
"type": "string",
|
|
400
|
+
"required": false,
|
|
401
|
+
"enum": [
|
|
402
|
+
"worktree"
|
|
403
|
+
]
|
|
404
|
+
},
|
|
405
|
+
{
|
|
406
|
+
"name": "run_in_background",
|
|
407
|
+
"type": "boolean",
|
|
408
|
+
"required": false
|
|
409
|
+
}
|
|
410
|
+
],
|
|
411
|
+
"constraints": []
|
|
412
|
+
},
|
|
413
|
+
"mcp__ollama-intern__ollama_chat": {
|
|
414
|
+
"contract": "Chat with the local model. 'messages' is a required, NON-EMPTY array of {role,content} (length >= 1). model and system are optional strings.",
|
|
415
|
+
"params": [
|
|
416
|
+
{
|
|
417
|
+
"name": "messages",
|
|
418
|
+
"type": "array",
|
|
419
|
+
"required": true
|
|
420
|
+
},
|
|
421
|
+
{
|
|
422
|
+
"name": "model",
|
|
423
|
+
"type": "string",
|
|
424
|
+
"required": false
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
"name": "system",
|
|
428
|
+
"type": "string",
|
|
429
|
+
"required": false
|
|
430
|
+
}
|
|
431
|
+
],
|
|
432
|
+
"constraints": [
|
|
433
|
+
{
|
|
434
|
+
"kind": "cmp",
|
|
435
|
+
"op": "ge",
|
|
436
|
+
"left": {
|
|
437
|
+
"len": "messages"
|
|
438
|
+
},
|
|
439
|
+
"right": 1
|
|
440
|
+
}
|
|
441
|
+
]
|
|
442
|
+
},
|
|
443
|
+
"mcp__ollama-intern__ollama_classify": {
|
|
444
|
+
"contract": "Single-label classification. 'labels' is required. Provide EXACTLY ONE of 'text', 'source_path', or 'items' (the input source — exactly one must be present). 'threshold' is a confidence floor in [0,1]. 'per_file_max_chars' is in [1000,200000]. allow_none, frame, model are optional.",
|
|
445
|
+
"params": [
|
|
446
|
+
{
|
|
447
|
+
"name": "labels",
|
|
448
|
+
"required": true
|
|
449
|
+
},
|
|
450
|
+
{
|
|
451
|
+
"name": "text",
|
|
452
|
+
"type": "string",
|
|
453
|
+
"required": false
|
|
454
|
+
},
|
|
455
|
+
{
|
|
456
|
+
"name": "source_path",
|
|
457
|
+
"type": "string",
|
|
458
|
+
"required": false
|
|
459
|
+
},
|
|
460
|
+
{
|
|
461
|
+
"name": "items",
|
|
462
|
+
"type": "array",
|
|
463
|
+
"required": false
|
|
464
|
+
},
|
|
465
|
+
{
|
|
466
|
+
"name": "threshold",
|
|
467
|
+
"type": "number",
|
|
468
|
+
"required": false
|
|
469
|
+
},
|
|
470
|
+
{
|
|
471
|
+
"name": "allow_none",
|
|
472
|
+
"type": "boolean",
|
|
473
|
+
"required": false
|
|
474
|
+
},
|
|
475
|
+
{
|
|
476
|
+
"name": "frame",
|
|
477
|
+
"type": "string",
|
|
478
|
+
"required": false
|
|
479
|
+
},
|
|
480
|
+
{
|
|
481
|
+
"name": "model",
|
|
482
|
+
"type": "string",
|
|
483
|
+
"required": false
|
|
484
|
+
},
|
|
485
|
+
{
|
|
486
|
+
"name": "per_file_max_chars",
|
|
487
|
+
"type": "integer",
|
|
488
|
+
"required": false
|
|
489
|
+
}
|
|
490
|
+
],
|
|
491
|
+
"constraints": [
|
|
492
|
+
{
|
|
493
|
+
"kind": "present",
|
|
494
|
+
"fields": [
|
|
495
|
+
"text",
|
|
496
|
+
"source_path",
|
|
497
|
+
"items"
|
|
498
|
+
],
|
|
499
|
+
"count": 1
|
|
500
|
+
},
|
|
501
|
+
{
|
|
502
|
+
"kind": "cmp",
|
|
503
|
+
"op": "ge",
|
|
504
|
+
"left": "threshold",
|
|
505
|
+
"right": 0
|
|
506
|
+
},
|
|
507
|
+
{
|
|
508
|
+
"kind": "cmp",
|
|
509
|
+
"op": "le",
|
|
510
|
+
"left": "threshold",
|
|
511
|
+
"right": 1
|
|
512
|
+
},
|
|
513
|
+
{
|
|
514
|
+
"kind": "cmp",
|
|
515
|
+
"op": "ge",
|
|
516
|
+
"left": "per_file_max_chars",
|
|
517
|
+
"right": 1000
|
|
518
|
+
},
|
|
519
|
+
{
|
|
520
|
+
"kind": "cmp",
|
|
521
|
+
"op": "le",
|
|
522
|
+
"left": "per_file_max_chars",
|
|
523
|
+
"right": 200000
|
|
524
|
+
}
|
|
525
|
+
]
|
|
526
|
+
},
|
|
527
|
+
"mcp__ollama-intern__ollama_corpus_search": {
|
|
528
|
+
"contract": "Concept search over a named corpus. 'corpus' and 'query' are required strings. 'mode' (when provided) must be one of semantic|lexical|hybrid|fact|title_path. 'top_k' is an integer in [1,100]. 'preview_chars' is an integer in [0,500].",
|
|
529
|
+
"params": [
|
|
530
|
+
{
|
|
531
|
+
"name": "corpus",
|
|
532
|
+
"type": "string",
|
|
533
|
+
"required": true
|
|
534
|
+
},
|
|
535
|
+
{
|
|
536
|
+
"name": "query",
|
|
537
|
+
"type": "string",
|
|
538
|
+
"required": true
|
|
539
|
+
},
|
|
540
|
+
{
|
|
541
|
+
"name": "mode",
|
|
542
|
+
"type": "string",
|
|
543
|
+
"required": false,
|
|
544
|
+
"enum": [
|
|
545
|
+
"semantic",
|
|
546
|
+
"lexical",
|
|
547
|
+
"hybrid",
|
|
548
|
+
"fact",
|
|
549
|
+
"title_path"
|
|
550
|
+
]
|
|
551
|
+
},
|
|
552
|
+
{
|
|
553
|
+
"name": "top_k",
|
|
554
|
+
"type": "integer",
|
|
555
|
+
"required": false
|
|
556
|
+
},
|
|
557
|
+
{
|
|
558
|
+
"name": "preview_chars",
|
|
559
|
+
"type": "integer",
|
|
560
|
+
"required": false
|
|
561
|
+
},
|
|
562
|
+
{
|
|
563
|
+
"name": "explain",
|
|
564
|
+
"type": "boolean",
|
|
565
|
+
"required": false
|
|
566
|
+
},
|
|
567
|
+
{
|
|
568
|
+
"name": "filter",
|
|
569
|
+
"type": "object",
|
|
570
|
+
"required": false
|
|
571
|
+
}
|
|
572
|
+
],
|
|
573
|
+
"constraints": [
|
|
574
|
+
{
|
|
575
|
+
"kind": "cmp",
|
|
576
|
+
"op": "ge",
|
|
577
|
+
"left": "top_k",
|
|
578
|
+
"right": 1
|
|
579
|
+
},
|
|
580
|
+
{
|
|
581
|
+
"kind": "cmp",
|
|
582
|
+
"op": "le",
|
|
583
|
+
"left": "top_k",
|
|
584
|
+
"right": 100
|
|
585
|
+
},
|
|
586
|
+
{
|
|
587
|
+
"kind": "cmp",
|
|
588
|
+
"op": "ge",
|
|
589
|
+
"left": "preview_chars",
|
|
590
|
+
"right": 0
|
|
591
|
+
},
|
|
592
|
+
{
|
|
593
|
+
"kind": "cmp",
|
|
594
|
+
"op": "le",
|
|
595
|
+
"left": "preview_chars",
|
|
596
|
+
"right": 500
|
|
597
|
+
}
|
|
598
|
+
]
|
|
599
|
+
},
|
|
600
|
+
"mcp__ollama-intern__ollama_summarize_fast": {
|
|
601
|
+
"contract": "Summarize short text. 'text' is required. 'max_words' is the target length and is an integer in [10,400]. frame and model are optional.",
|
|
602
|
+
"params": [
|
|
603
|
+
{
|
|
604
|
+
"name": "text",
|
|
605
|
+
"type": "string",
|
|
606
|
+
"required": true
|
|
607
|
+
},
|
|
608
|
+
{
|
|
609
|
+
"name": "max_words",
|
|
610
|
+
"type": "integer",
|
|
611
|
+
"required": false
|
|
612
|
+
},
|
|
613
|
+
{
|
|
614
|
+
"name": "frame",
|
|
615
|
+
"type": "string",
|
|
616
|
+
"required": false
|
|
617
|
+
},
|
|
618
|
+
{
|
|
619
|
+
"name": "model",
|
|
620
|
+
"type": "string",
|
|
621
|
+
"required": false
|
|
622
|
+
}
|
|
623
|
+
],
|
|
624
|
+
"constraints": [
|
|
625
|
+
{
|
|
626
|
+
"kind": "cmp",
|
|
627
|
+
"op": "ge",
|
|
628
|
+
"left": "max_words",
|
|
629
|
+
"right": 10
|
|
630
|
+
},
|
|
631
|
+
{
|
|
632
|
+
"kind": "cmp",
|
|
633
|
+
"op": "le",
|
|
634
|
+
"left": "max_words",
|
|
635
|
+
"right": 400
|
|
636
|
+
}
|
|
637
|
+
]
|
|
638
|
+
}
|
|
639
|
+
}
|
|
@@ -118,7 +118,8 @@ jobs:
|
|
|
118
118
|
- uses: actions/download-artifact@v4
|
|
119
119
|
with:
|
|
120
120
|
path: artifacts
|
|
121
|
-
|
|
121
|
+
pattern: binary-* # only the PyInstaller binaries — NOT the docker job's
|
|
122
|
+
merge-multiple: true # .dockerbuild build-record artifact (which would pollute the release)
|
|
122
123
|
|
|
123
124
|
- name: Generate checksums
|
|
124
125
|
shell: bash
|
|
@@ -151,6 +152,18 @@ jobs:
|
|
|
151
152
|
echo "::error::release tag ${TAG} does not match npm/package.json version ${PKG}"
|
|
152
153
|
exit 1
|
|
153
154
|
fi
|
|
155
|
+
# The launcher bin pins the version + tag it downloads binaries for. Gate it too:
|
|
156
|
+
# without this, a version bump that forgets bin/gpu-container.js would publish a
|
|
157
|
+
# launcher that fetches the PREVIOUS release's binaries/checksums while every other
|
|
158
|
+
# gate stays green (npm/package.json already matches the tag). Caught in v0.1.4 preflight.
|
|
159
|
+
if ! grep -q "version: \"${TAG}\"" npm/bin/gpu-container.js; then
|
|
160
|
+
echo "::error::npm/bin/gpu-container.js version literal does not match ${TAG}"
|
|
161
|
+
exit 1
|
|
162
|
+
fi
|
|
163
|
+
if ! grep -q "tag: \"v${TAG}\"" npm/bin/gpu-container.js; then
|
|
164
|
+
echo "::error::npm/bin/gpu-container.js tag literal does not match v${TAG}"
|
|
165
|
+
exit 1
|
|
166
|
+
fi
|
|
154
167
|
|
|
155
168
|
- uses: actions/setup-node@v4
|
|
156
169
|
with:
|
|
@@ -5,10 +5,26 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/).
|
|
7
7
|
|
|
8
|
+
## [0.1.4] - 2026-06-08
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
- **npm provenance source link** now resolves to the launcher's `npm/` subdirectory — added `repository.directory: "npm"` to the launcher `package.json`. Cosmetic only: the 0.1.3 attestation was already valid (`npm audit signatures` passes); this points npm's provenance "source" link at the real package folder instead of the repo root.
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
- **Release pipeline** now verifies the launcher's pinned binary `version` + `tag` (`npm/bin/gpu-container.js`) match the release tag before publishing — closing a gap where bumping the package version alone could publish a launcher that downloads the *previous* release's binaries (CI stayed green because it only gated `pyproject.toml` + `npm/package.json`).
|
|
15
|
+
|
|
16
|
+
## [0.1.3] - 2026-06-04
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
- **Release pipeline:** `release-binaries` downloaded *all* run artifacts, which since the Docker job emits a `.dockerbuild` build-record meant it tried (and reliably failed) to download that artifact — blocking the binary upload + the npm publish in 0.1.2. Now scoped to `pattern: binary-*`. First release on the fixed pipeline; carries the first-class npm README from 0.1.2.
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
- **npm package README** is now first-class — logo, badges, full content, and 8-language translations (it was a thin stub through 0.1.1).
|
|
23
|
+
|
|
8
24
|
## [0.1.2] - 2026-06-04
|
|
9
25
|
|
|
10
26
|
### Changed
|
|
11
|
-
- **npm package README**
|
|
27
|
+
- **npm package README** rewritten (logo, badges, content, translations). *Pipeline note: PyPI + Docker published, but the binary-upload + npm jobs were blocked by the `.dockerbuild` artifact-download bug above; superseded by 0.1.3.*
|
|
12
28
|
|
|
13
29
|
## [0.1.1] - 2026-06-04
|
|
14
30
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gpu-container
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.4
|
|
4
4
|
Summary: Model-aware inference memory-placement planner for single-GPU rigs — profile, plan, prove.
|
|
5
5
|
Author-email: mcp-tool-shop <64996768+mcp-tool-shop@users.noreply.github.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -5,14 +5,14 @@
|
|
|
5
5
|
// the release-asset names from convention, downloads the platform binary from the gpu-container
|
|
6
6
|
// GitHub Release, verifies its SHA256 against checksums-<version>.txt, caches it, and runs it with
|
|
7
7
|
// full arg passthrough.
|
|
8
|
-
// binary: gpu-container-0.1.
|
|
9
|
-
// checksums: checksums-0.1.
|
|
8
|
+
// binary: gpu-container-0.1.4-linux-x64
|
|
9
|
+
// checksums: checksums-0.1.4.txt
|
|
10
10
|
process.env.MCPTOOLSHOP_LAUNCH_CONFIG = JSON.stringify({
|
|
11
11
|
toolName: "gpu-container",
|
|
12
12
|
owner: "mcp-tool-shop-org",
|
|
13
13
|
repo: "gpu-container",
|
|
14
|
-
version: "0.1.
|
|
15
|
-
tag: "v0.1.
|
|
14
|
+
version: "0.1.4",
|
|
15
|
+
tag: "v0.1.4",
|
|
16
16
|
});
|
|
17
17
|
|
|
18
18
|
require("@mcptoolshop/npm-launcher/bin/mcptoolshop-launch.js");
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gpu-container",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "gpu-container — model-aware inference memory-placement planner for single-GPU rigs. Zero-prerequisite npx install via a verified binary launcher.",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"license": "MIT",
|
|
@@ -32,7 +32,8 @@
|
|
|
32
32
|
"author": "mcp-tool-shop",
|
|
33
33
|
"repository": {
|
|
34
34
|
"type": "git",
|
|
35
|
-
"url": "git+https://github.com/mcp-tool-shop-org/gpu-container.git"
|
|
35
|
+
"url": "git+https://github.com/mcp-tool-shop-org/gpu-container.git",
|
|
36
|
+
"directory": "npm"
|
|
36
37
|
},
|
|
37
38
|
"homepage": "https://github.com/mcp-tool-shop-org/gpu-container"
|
|
38
39
|
}
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "gpu-container"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.4"
|
|
8
8
|
description = "Model-aware inference memory-placement planner for single-GPU rigs — profile, plan, prove."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gpu_container-0.1.2 → gpu_container-0.1.4}/site/src/content/docs/handbook/getting-started.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|