@idevelopers/agentlock 0.1.3 → 0.1.5
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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/codex-plugin/plugin.json +1 -1
- package/dist/index.js +1 -1
- package/docs/ENTERPRISE_READINESS.md +1 -1
- package/docs/PRODUCTION_REPLICATION_PLAYBOOK.md +19 -2
- package/docs/THREAT_MODEL.md +1 -1
- package/package.json +2 -1
- package/scripts/public-package-smoke.mjs +128 -0
- package/skills/agentlock-workflow/SKILL.md +1 -1
package/codex-plugin/plugin.json
CHANGED
package/dist/index.js
CHANGED
|
@@ -37,7 +37,7 @@ AgentLock is live and production-validated. It is not yet independently security
|
|
|
37
37
|
## Certification Path
|
|
38
38
|
|
|
39
39
|
1. Run the CI matrix on every release branch.
|
|
40
|
-
2. Keep `npm audit
|
|
40
|
+
2. Keep full `npm audit` clean before publish.
|
|
41
41
|
3. Add signed release provenance and npm provenance publishing.
|
|
42
42
|
4. Commission an independent security review focused on MCP boundaries, command execution, redaction, license enforcement, and policy bypasses.
|
|
43
43
|
5. Add a public vulnerability disclosure channel.
|
|
@@ -75,6 +75,23 @@ Validation results:
|
|
|
75
75
|
- A fresh unlicensed temp HOME remained blocked from Pro tools.
|
|
76
76
|
- After subscription revoke and full refund, the same key returned `tier=free` in a fresh temp HOME and Pro tools were blocked.
|
|
77
77
|
|
|
78
|
+
## Enterprise Readiness Hardening
|
|
79
|
+
|
|
80
|
+
Completed on 2026-08-29 and published as public npm version `0.1.5`:
|
|
81
|
+
|
|
82
|
+
- added `SECURITY.md`
|
|
83
|
+
- added `docs/THREAT_MODEL.md`
|
|
84
|
+
- added `docs/ENTERPRISE_READINESS.md`
|
|
85
|
+
- added `docs/CROSS_PLATFORM_VALIDATION.md`
|
|
86
|
+
- added GitHub Actions CI for Ubuntu, macOS, and Windows on Node 20, 22, and 24
|
|
87
|
+
- added `npm run audit:security`
|
|
88
|
+
- added `npm run validate`
|
|
89
|
+
- added `npm run smoke:public`
|
|
90
|
+
- updated the public package tarball to include the security and readiness docs
|
|
91
|
+
- refreshed dependencies and confirmed `npm audit` reports 0 vulnerabilities
|
|
92
|
+
- confirmed `@idevelopers/agentlock@latest` resolves to `0.1.5`
|
|
93
|
+
- confirmed public npm smoke against `@idevelopers/agentlock@latest`
|
|
94
|
+
|
|
78
95
|
## Validation Checklist
|
|
79
96
|
|
|
80
97
|
Local source:
|
|
@@ -105,8 +122,8 @@ Sandbox payment:
|
|
|
105
122
|
Live payment:
|
|
106
123
|
|
|
107
124
|
1. Create AgentLock live product and checkout. Completed 2026-08-29.
|
|
108
|
-
2. Publish `@idevelopers/agentlock`. Completed 2026-08-29 with version `0.1.2`.
|
|
109
|
-
3. Install from a clean temp environment. Completed 2026-08-29 against public npm
|
|
125
|
+
2. Publish `@idevelopers/agentlock`. Completed 2026-08-29 with version `0.1.2`; hardening docs and CI published as `0.1.5`.
|
|
126
|
+
3. Install from a clean temp environment. Completed 2026-08-29 against public npm versions `0.1.2`, `0.1.3`, `0.1.4`, and `0.1.5`.
|
|
110
127
|
4. Buy the lowest paid recurring tier with a real test purchase. Completed 2026-08-29.
|
|
111
128
|
5. Activate the issued key locally without pasting it into chat or docs. Completed 2026-08-29.
|
|
112
129
|
6. Confirm Pro behavior works from public npm. Completed 2026-08-29.
|
package/docs/THREAT_MODEL.md
CHANGED
|
@@ -45,4 +45,4 @@ AgentLock protects local developer workflows where AI coding agents can request
|
|
|
45
45
|
|
|
46
46
|
## Validation Evidence
|
|
47
47
|
|
|
48
|
-
The production runbook records the live purchase, Pro activation, public npm smoke, refund, subscription cancellation, and revoked-license validation for AgentLock `0.1.2`.
|
|
48
|
+
The production runbook records the live purchase, Pro activation, public npm smoke, refund, subscription cancellation, and revoked-license validation for AgentLock `0.1.2`. The enterprise-readiness docs, CI matrix, audit gate, and public smoke script are published in AgentLock `0.1.5`.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@idevelopers/agentlock",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "Local permission firewall for AI coding agents and MCP tools.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
"README.md",
|
|
20
20
|
"SECURITY.md",
|
|
21
21
|
"docs",
|
|
22
|
+
"scripts/public-package-smoke.mjs",
|
|
22
23
|
"agentlock.policy.example.json",
|
|
23
24
|
".mcp.json",
|
|
24
25
|
".claude-plugin",
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { mkdtemp, rm } from "node:fs/promises";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { spawn } from "node:child_process";
|
|
6
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
7
|
+
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
8
|
+
|
|
9
|
+
const packageSpec = process.argv[2] ?? "@idevelopers/agentlock@latest";
|
|
10
|
+
const npmCli = process.env.npm_execpath;
|
|
11
|
+
const installDir = await mkdtemp(path.join(os.tmpdir(), "agentlock-smoke-install-"));
|
|
12
|
+
const homeDir = await mkdtemp(path.join(os.tmpdir(), "agentlock-smoke-home-"));
|
|
13
|
+
|
|
14
|
+
try {
|
|
15
|
+
await runNpm(["install", "--prefix", installDir, packageSpec, "--prefer-online"]);
|
|
16
|
+
|
|
17
|
+
const client = new Client({ name: "agentlock-public-smoke", version: "0.0.0" });
|
|
18
|
+
const agentlockEntrypoint = path.join(
|
|
19
|
+
installDir,
|
|
20
|
+
"node_modules",
|
|
21
|
+
"@idevelopers",
|
|
22
|
+
"agentlock",
|
|
23
|
+
"dist",
|
|
24
|
+
"index.js",
|
|
25
|
+
);
|
|
26
|
+
const transport = new StdioClientTransport({
|
|
27
|
+
command: process.execPath,
|
|
28
|
+
args: [agentlockEntrypoint],
|
|
29
|
+
env: {
|
|
30
|
+
...process.env,
|
|
31
|
+
HOME: homeDir,
|
|
32
|
+
USERPROFILE: homeDir,
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
await client.connect(transport);
|
|
37
|
+
try {
|
|
38
|
+
const tools = await client.listTools();
|
|
39
|
+
const toolNames = tools.tools.map((tool) => tool.name).sort();
|
|
40
|
+
assertIncludes(toolNames, "agentlock_scan_environment");
|
|
41
|
+
assertIncludes(toolNames, "agentlock_generate_policy");
|
|
42
|
+
assertIncludes(toolNames, "agentlock_check_action");
|
|
43
|
+
assertIncludes(toolNames, "agentlock_run_guarded_command");
|
|
44
|
+
assertIncludes(toolNames, "agentlock_audit_log");
|
|
45
|
+
assertIncludes(toolNames, "agentlock_activate_license");
|
|
46
|
+
|
|
47
|
+
const scan = await client.callTool({
|
|
48
|
+
name: "agentlock_scan_environment",
|
|
49
|
+
arguments: {},
|
|
50
|
+
});
|
|
51
|
+
if (scan.isError) {
|
|
52
|
+
throw new Error("agentlock_scan_environment returned an error");
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const policy = await client.callTool({
|
|
56
|
+
name: "agentlock_generate_policy",
|
|
57
|
+
arguments: {},
|
|
58
|
+
});
|
|
59
|
+
if (policy.isError) {
|
|
60
|
+
throw new Error("agentlock_generate_policy returned an error");
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const proGate = await client.callTool({
|
|
64
|
+
name: "agentlock_check_action",
|
|
65
|
+
arguments: {
|
|
66
|
+
type: "command",
|
|
67
|
+
command: "node",
|
|
68
|
+
args: [],
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
const proGateText = proGate.content?.[0]?.text ?? "";
|
|
72
|
+
if (!proGate.isError || !/Pro license required/.test(proGateText) || !/buy\.polar\.sh/.test(proGateText)) {
|
|
73
|
+
throw new Error("unlicensed Pro gate did not block with checkout guidance");
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
console.log(
|
|
77
|
+
JSON.stringify(
|
|
78
|
+
{
|
|
79
|
+
packageSpec,
|
|
80
|
+
platform: process.platform,
|
|
81
|
+
node: process.version,
|
|
82
|
+
toolCount: toolNames.length,
|
|
83
|
+
freeToolsOk: true,
|
|
84
|
+
unlicensedProGateOk: true,
|
|
85
|
+
},
|
|
86
|
+
null,
|
|
87
|
+
2,
|
|
88
|
+
),
|
|
89
|
+
);
|
|
90
|
+
} finally {
|
|
91
|
+
await client.close();
|
|
92
|
+
}
|
|
93
|
+
} finally {
|
|
94
|
+
await rm(installDir, { force: true, recursive: true });
|
|
95
|
+
await rm(homeDir, { force: true, recursive: true });
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function assertIncludes(values, expected) {
|
|
99
|
+
if (!values.includes(expected)) {
|
|
100
|
+
throw new Error(`Missing expected tool: ${expected}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function runNpm(args) {
|
|
105
|
+
if (npmCli) {
|
|
106
|
+
return run(process.execPath, [npmCli, ...args]);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const command = process.platform === "win32" ? "npm.cmd" : "npm";
|
|
110
|
+
return run(command, args, { shell: process.platform === "win32" });
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function run(command, args, options = {}) {
|
|
114
|
+
return new Promise((resolve, reject) => {
|
|
115
|
+
const child = spawn(command, args, {
|
|
116
|
+
stdio: "inherit",
|
|
117
|
+
shell: options.shell ?? false,
|
|
118
|
+
});
|
|
119
|
+
child.on("error", reject);
|
|
120
|
+
child.on("close", (code) => {
|
|
121
|
+
if (code === 0) {
|
|
122
|
+
resolve();
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
reject(new Error(`${command} ${args.join(" ")} exited with ${code}`));
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
}
|