@idevelopers/agentlock 0.1.4 → 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/PRODUCTION_REPLICATION_PLAYBOOK.md +4 -4
- 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
|
@@ -77,7 +77,7 @@ Validation results:
|
|
|
77
77
|
|
|
78
78
|
## Enterprise Readiness Hardening
|
|
79
79
|
|
|
80
|
-
Completed on 2026-08-29 and published as public npm version `0.1.
|
|
80
|
+
Completed on 2026-08-29 and published as public npm version `0.1.5`:
|
|
81
81
|
|
|
82
82
|
- added `SECURITY.md`
|
|
83
83
|
- added `docs/THREAT_MODEL.md`
|
|
@@ -89,7 +89,7 @@ Completed on 2026-08-29 and published as public npm version `0.1.4`:
|
|
|
89
89
|
- added `npm run smoke:public`
|
|
90
90
|
- updated the public package tarball to include the security and readiness docs
|
|
91
91
|
- refreshed dependencies and confirmed `npm audit` reports 0 vulnerabilities
|
|
92
|
-
- confirmed `@idevelopers/agentlock@latest` resolves to `0.1.
|
|
92
|
+
- confirmed `@idevelopers/agentlock@latest` resolves to `0.1.5`
|
|
93
93
|
- confirmed public npm smoke against `@idevelopers/agentlock@latest`
|
|
94
94
|
|
|
95
95
|
## Validation Checklist
|
|
@@ -122,8 +122,8 @@ Sandbox payment:
|
|
|
122
122
|
Live payment:
|
|
123
123
|
|
|
124
124
|
1. Create AgentLock live product and checkout. Completed 2026-08-29.
|
|
125
|
-
2. Publish `@idevelopers/agentlock`. Completed 2026-08-29 with version `0.1.2`; hardening docs and CI published as `0.1.
|
|
126
|
-
3. Install from a clean temp environment. Completed 2026-08-29 against public npm versions `0.1.2`, `0.1.3`, and `0.1.
|
|
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`.
|
|
127
127
|
4. Buy the lowest paid recurring tier with a real test purchase. Completed 2026-08-29.
|
|
128
128
|
5. Activate the issued key locally without pasting it into chat or docs. Completed 2026-08-29.
|
|
129
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`. The enterprise-readiness docs, CI matrix, audit gate, and public smoke script are published in AgentLock `0.1.
|
|
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
|
+
}
|