ctxr-cli 0.36.0 → 0.38.0
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/LICENSE +21 -201
- package/README.md +28 -12
- package/dist/commands/land.d.ts +5 -0
- package/dist/commands/land.d.ts.map +1 -1
- package/dist/commands/land.js +12 -3
- package/dist/commands/land.js.map +1 -1
- package/dist/commands/plugin-build.d.ts +21 -11
- package/dist/commands/plugin-build.d.ts.map +1 -1
- package/dist/commands/plugin-build.js +45 -24
- package/dist/commands/plugin-build.js.map +1 -1
- package/dist/commands/review-list.d.ts +5 -1
- package/dist/commands/review-list.d.ts.map +1 -1
- package/dist/commands/review-list.js +2 -2
- package/dist/commands/review-list.js.map +1 -1
- package/dist/commands/second-opinion.d.ts +6 -2
- package/dist/commands/second-opinion.d.ts.map +1 -1
- package/dist/commands/second-opinion.js.map +1 -1
- package/dist/commands/serve.d.ts +2 -0
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +1 -1
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/session-list.d.ts +2 -0
- package/dist/commands/session-list.d.ts.map +1 -1
- package/dist/commands/session-list.js +1 -1
- package/dist/commands/session-list.js.map +1 -1
- package/dist/commands/session-start.d.ts.map +1 -1
- package/dist/commands/session-start.js +2 -1
- package/dist/commands/session-start.js.map +1 -1
- package/dist/commands/session-submit.d.ts +9 -1
- package/dist/commands/session-submit.d.ts.map +1 -1
- package/dist/commands/session-submit.js +1 -1
- package/dist/commands/session-submit.js.map +1 -1
- package/dist/commands/shared-stores-status.d.ts +9 -1
- package/dist/commands/shared-stores-status.d.ts.map +1 -1
- package/dist/commands/shared-stores-status.js +13 -7
- package/dist/commands/shared-stores-status.js.map +1 -1
- package/dist/commands/shared-stores-sync.d.ts +13 -0
- package/dist/commands/shared-stores-sync.d.ts.map +1 -1
- package/dist/commands/shared-stores-sync.js +60 -13
- package/dist/commands/shared-stores-sync.js.map +1 -1
- package/dist/commands/sync.d.ts +3 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +9 -7
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +8 -5
- package/dist/commands/update.js.map +1 -1
- package/dist/core/approval/session-group.d.ts +10 -1
- package/dist/core/approval/session-group.d.ts.map +1 -1
- package/dist/core/approval/session-group.js +4 -0
- package/dist/core/approval/session-group.js.map +1 -1
- package/dist/core/command.d.ts +5 -3
- package/dist/core/command.d.ts.map +1 -1
- package/dist/core/errors.d.ts +9 -0
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +11 -0
- package/dist/core/errors.js.map +1 -1
- package/dist/core/forge/credentials.d.ts +23 -3
- package/dist/core/forge/credentials.d.ts.map +1 -1
- package/dist/core/forge/credentials.js +99 -5
- package/dist/core/forge/credentials.js.map +1 -1
- package/dist/core/forge/github.d.ts +2 -0
- package/dist/core/forge/github.d.ts.map +1 -1
- package/dist/core/forge/github.js +1 -0
- package/dist/core/forge/github.js.map +1 -1
- package/dist/core/git/worktree.d.ts +6 -1
- package/dist/core/git/worktree.d.ts.map +1 -1
- package/dist/core/git/worktree.js +7 -2
- package/dist/core/git/worktree.js.map +1 -1
- package/dist/core/mcp/surface.js +1 -1
- package/dist/core/mcp/surface.js.map +1 -1
- package/dist/core/mcp/sync.d.ts +4 -1
- package/dist/core/mcp/sync.d.ts.map +1 -1
- package/dist/core/mcp/sync.js +6 -5
- package/dist/core/mcp/sync.js.map +1 -1
- package/dist/core/mcp/tool-map.d.ts +25 -12
- package/dist/core/mcp/tool-map.d.ts.map +1 -1
- package/dist/core/mcp/tool-map.js +28 -11
- package/dist/core/mcp/tool-map.js.map +1 -1
- package/dist/core/mcp/tools/cli.d.ts +6 -0
- package/dist/core/mcp/tools/cli.d.ts.map +1 -1
- package/dist/core/mcp/tools/cli.js +77 -4
- package/dist/core/mcp/tools/cli.js.map +1 -1
- package/dist/core/mcp/tools/gather.d.ts.map +1 -1
- package/dist/core/mcp/tools/gather.js +5 -4
- package/dist/core/mcp/tools/gather.js.map +1 -1
- package/dist/core/mcp/tools/index.d.ts +11 -1
- package/dist/core/mcp/tools/index.d.ts.map +1 -1
- package/dist/core/mcp/tools/index.js +21 -4
- package/dist/core/mcp/tools/index.js.map +1 -1
- package/dist/core/plugin/build.d.ts +53 -26
- package/dist/core/plugin/build.d.ts.map +1 -1
- package/dist/core/plugin/build.js +153 -50
- package/dist/core/plugin/build.js.map +1 -1
- package/dist/core/plugin/commands.d.ts +11 -0
- package/dist/core/plugin/commands.d.ts.map +1 -0
- package/dist/core/plugin/commands.js +25 -0
- package/dist/core/plugin/commands.js.map +1 -0
- package/dist/core/plugin/routes.d.ts +11 -7
- package/dist/core/plugin/routes.d.ts.map +1 -1
- package/dist/core/plugin/routes.js +27 -24
- package/dist/core/plugin/routes.js.map +1 -1
- package/dist/core/second-opinion/confine.d.ts +50 -0
- package/dist/core/second-opinion/confine.d.ts.map +1 -0
- package/dist/core/second-opinion/confine.js +162 -0
- package/dist/core/second-opinion/confine.js.map +1 -0
- package/dist/core/second-opinion/launch.d.ts +6 -1
- package/dist/core/second-opinion/launch.d.ts.map +1 -1
- package/dist/core/second-opinion/launch.js +31 -3
- package/dist/core/second-opinion/launch.js.map +1 -1
- package/dist/core/second-opinion/lineup.d.ts +11 -0
- package/dist/core/second-opinion/lineup.d.ts.map +1 -1
- package/dist/core/second-opinion/lineup.js +15 -0
- package/dist/core/second-opinion/lineup.js.map +1 -1
- package/dist/core/second-opinion/modes.d.ts +19 -2
- package/dist/core/second-opinion/modes.d.ts.map +1 -1
- package/dist/core/second-opinion/modes.js +103 -29
- package/dist/core/second-opinion/modes.js.map +1 -1
- package/dist/core/session/start.d.ts +2 -2
- package/dist/core/session/submit.d.ts.map +1 -1
- package/dist/core/session/submit.js +6 -3
- package/dist/core/session/submit.js.map +1 -1
- package/dist/core/shared-stores.d.ts +5 -0
- package/dist/core/shared-stores.d.ts.map +1 -1
- package/dist/core/shared-stores.js +10 -0
- package/dist/core/shared-stores.js.map +1 -1
- package/dist/core/skill-placeholders.d.ts +51 -0
- package/dist/core/skill-placeholders.d.ts.map +1 -0
- package/dist/core/skill-placeholders.js +55 -0
- package/dist/core/skill-placeholders.js.map +1 -0
- package/dist/core/skills.d.ts +38 -14
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +81 -91
- package/dist/core/skills.js.map +1 -1
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +29 -7
- package/dist/run.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -2
- package/templates/mcp/ctxr.md +1 -0
- package/templates/mcp/server-instructions.md +16 -0
- package/templates/plugin/README.md +30 -8
- package/templates/plugin/chatgpt-README.md +16 -0
- package/templates/plugin/claude-plugin.json +9 -1
- package/templates/plugin/command.md +7 -0
- package/templates/plugin/page.html +19 -8
- package/templates/second-opinion/critic-contract.md +2 -1
- package/templates/skills/_surfaces.md +30 -0
- package/templates/skills/ctxr-placement.md +1 -1
- package/templates/skills/ctxr-second-opinion.md +34 -13
- package/templates/skills/ctxr-session-lifecycle.md +6 -5
- package/templates/skills/mcp/_layer-step.md +18 -0
- package/templates/skills/mcp/_relation-grouping-step.md +5 -0
- package/templates/plugin/claude-mcp.json +0 -8
- package/templates/skills/mcp/_preamble.md +0 -44
|
@@ -1,23 +1,35 @@
|
|
|
1
1
|
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { readdir, readFile } from 'node:fs/promises';
|
|
2
3
|
import path from 'node:path';
|
|
3
4
|
import { fileURLToPath } from 'node:url';
|
|
4
5
|
import { escapeHtml } from '../browse/render.js';
|
|
5
6
|
import { SKILL_FILE_NAME } from '../conventions.js';
|
|
6
7
|
import { ContextureError } from '../errors.js';
|
|
7
8
|
import { ExitCode } from '../exit-codes.js';
|
|
8
|
-
import {
|
|
9
|
+
import { renderMcpSkills } from '../skills.js';
|
|
10
|
+
import { commandMapProblems, PLUGIN_COMMANDS } from './commands.js';
|
|
9
11
|
import { createZip } from './zip.js';
|
|
10
12
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* what it returns to disk and the server answers with it from memory.
|
|
13
|
+
* The one builder behind `ctxr plugin build`, `npm run plugin` and serve's
|
|
14
|
+
* `/plugin/` page. It does no I/O of its own beyond reading the packaged
|
|
15
|
+
* templates, so the command writes what it returns to disk and the server
|
|
16
|
+
* answers with it from memory.
|
|
16
17
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
18
|
+
* publish-one-contexture-plugin D1 (harness-portability spec, *contexture
|
|
19
|
+
* publishes one plugin for every store*): the Claude plugin is contexture's,
|
|
20
|
+
* not a store's. It is the MCP render of the owned skills, which takes no
|
|
21
|
+
* configuration, with a README and contexture's license, and no MCP server
|
|
22
|
+
* entry: each member adds their store's connector once, by its `/mcp` address.
|
|
23
|
+
* Its version is the CLI's, so a member's marketplace installs a new copy
|
|
24
|
+
* exactly at a release (D3). The repository commits it under `plugins/contexture/`.
|
|
25
|
+
*
|
|
26
|
+
* The ChatGPT plugin stays the store's (serve-the-session-lifecycle-to-chat-apps
|
|
27
|
+
* D7): ChatGPT has no marketplace on a personal plan, so it is the store's zip
|
|
28
|
+
* from `/plugin/`, carrying the same skills and one remote MCP server entry at
|
|
29
|
+
* `serve.base_url` + `/mcp`.
|
|
30
|
+
*
|
|
31
|
+
* Neither carries a credential (sign-in is the server's own OAuth with dynamic
|
|
32
|
+
* client registration), a variable in an address, a hook, a local server or a
|
|
21
33
|
* top-level `bin/` directory: the trees below are the whole of what is written.
|
|
22
34
|
*/
|
|
23
35
|
export const PLUGIN_TARGETS = ['claude', 'chatgpt'];
|
|
@@ -25,13 +37,17 @@ export const PLUGIN_TARGETS = ['claude', 'chatgpt'];
|
|
|
25
37
|
export const MAX_NAME_LENGTH = 64;
|
|
26
38
|
export const MAX_DESCRIPTION_LENGTH = 1024;
|
|
27
39
|
const NAME_PREFIX = 'contexture-';
|
|
28
|
-
/** The
|
|
40
|
+
/** The general Claude plugin's name (D5, revision 11: `contexture`, the product's name as plugins conventionally are, so its commands read `/contexture:submit`), and the marketplace in contexture's repository that lists it (D1). */
|
|
41
|
+
export const CLAUDE_PLUGIN_NAME = 'contexture';
|
|
42
|
+
export const CLAUDE_PLUGIN_DISPLAY_NAME = 'contexture';
|
|
43
|
+
export const PLUGIN_MARKETPLACE = 'ayxuerui/contexture';
|
|
44
|
+
/** The configuration error a store without the MCP surface gets for its ChatGPT plugin: there is no server for it to name. */
|
|
29
45
|
export class PluginWithoutMcpError extends ContextureError {
|
|
30
46
|
constructor() {
|
|
31
47
|
super(ExitCode.Usage, {
|
|
32
48
|
code: 'plugin.mcp_not_declared',
|
|
33
49
|
severity: 'error',
|
|
34
|
-
message: 'This store declares no mcp block in contexture.yaml, so there is no MCP server for a
|
|
50
|
+
message: 'This store declares no mcp block in contexture.yaml, so there is no MCP server for a ChatGPT plugin to connect to. Declare mcp (which needs change_approval and serve.base_url) first.',
|
|
35
51
|
});
|
|
36
52
|
}
|
|
37
53
|
}
|
|
@@ -48,6 +64,10 @@ function pluginTemplate(file) {
|
|
|
48
64
|
}
|
|
49
65
|
return text;
|
|
50
66
|
}
|
|
67
|
+
/** A file at the package root (LICENSE, package.json), which npm ships with every install. */
|
|
68
|
+
function packageFile(file) {
|
|
69
|
+
return readFileSync(fileURLToPath(new URL(`../../../${file}`, import.meta.url)), 'utf8');
|
|
70
|
+
}
|
|
51
71
|
const asJsonString = (value) => JSON.stringify(value).slice(1, -1);
|
|
52
72
|
const asIs = (value) => value;
|
|
53
73
|
/** One pass, so a substituted value that happens to contain a token is never substituted again. */
|
|
@@ -88,7 +108,82 @@ function checkSkillFrontmatter(folder, content) {
|
|
|
88
108
|
if (description.length === 0 || description.length > MAX_DESCRIPTION_LENGTH)
|
|
89
109
|
throw new Error(`skill ${folder}'s description is not 1 to ${MAX_DESCRIPTION_LENGTH} characters`);
|
|
90
110
|
}
|
|
91
|
-
|
|
111
|
+
/** A rendered skill's text below its frontmatter: what a command opening it carries. */
|
|
112
|
+
export function skillBody(content) {
|
|
113
|
+
const match = /^---\n[^]*?\n---\n\n?/.exec(content);
|
|
114
|
+
if (match === null)
|
|
115
|
+
throw new Error('a rendered skill carries no frontmatter');
|
|
116
|
+
return content.slice(match[0].length).replace(/\n+$/, '');
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* publish-one-contexture-plugin D5: `commands/<name>.md` for each entry of the
|
|
120
|
+
* command map, from `templates/plugin/command.md`: a `description` worded as a
|
|
121
|
+
* typed shortcut and nothing else in the frontmatter, then the whole MCP render
|
|
122
|
+
* of the skill, then the person's `$ARGUMENTS`. Whichever of the two Claude
|
|
123
|
+
* loads, it has the whole procedure. A command whose skill the plugin does not
|
|
124
|
+
* carry fails the build.
|
|
125
|
+
*/
|
|
126
|
+
function commandFiles(skills, commands = PLUGIN_COMMANDS) {
|
|
127
|
+
const problems = commandMapProblems(commands, skills.map((skill) => skill.file));
|
|
128
|
+
if (problems.length > 0)
|
|
129
|
+
throw new Error(problems.join('; '));
|
|
130
|
+
const files = new Map();
|
|
131
|
+
for (const [command, skill] of Object.entries(commands)) {
|
|
132
|
+
const content = skills.find((s) => s.file === skill).content;
|
|
133
|
+
files.set(`commands/${command}.md`, fillPluginTemplate('command.md', { PLUGIN: CLAUDE_PLUGIN_NAME, COMMAND: command, SKILL: skill, BODY: skillBody(content) }));
|
|
134
|
+
}
|
|
135
|
+
return files;
|
|
136
|
+
}
|
|
137
|
+
/** The MCP render's skills, as plugin files: the same text in both plugins and for every store. */
|
|
138
|
+
function skillFiles() {
|
|
139
|
+
const skills = renderMcpSkills();
|
|
140
|
+
const files = new Map();
|
|
141
|
+
for (const skill of skills) {
|
|
142
|
+
checkSkillFrontmatter(skill.file, skill.content);
|
|
143
|
+
files.set(`skills/${skill.file}/${SKILL_FILE_NAME}`, skill.content);
|
|
144
|
+
for (const [rel, content] of skill.supportingFiles)
|
|
145
|
+
files.set(`skills/${skill.file}/${rel}`, content);
|
|
146
|
+
}
|
|
147
|
+
return { skills: skills.map((skill) => skill.file), files };
|
|
148
|
+
}
|
|
149
|
+
function finish(target, name, version, skills, files, archiveName) {
|
|
150
|
+
for (const file of files.keys()) {
|
|
151
|
+
// A Claude plugin with a top-level bin/ is refused at upload, and neither app runs a hook from a plugin we ship.
|
|
152
|
+
if (file === 'bin' || file.startsWith('bin/') || file.startsWith('hooks/') || file === '.mcp.json')
|
|
153
|
+
throw new Error(`plugin file ${file} is one this plugin may not carry`);
|
|
154
|
+
}
|
|
155
|
+
// Sorted by path, so the archive and a directory comparison never depend on insertion order.
|
|
156
|
+
const sorted = new Map([...files].sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)));
|
|
157
|
+
return {
|
|
158
|
+
target,
|
|
159
|
+
name,
|
|
160
|
+
version,
|
|
161
|
+
files: sorted,
|
|
162
|
+
skills,
|
|
163
|
+
archiveName,
|
|
164
|
+
archive: createZip([...sorted].map(([file, content]) => ({ path: file, data: Buffer.from(content, 'utf8') }))),
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* publish-one-contexture-plugin D1, D3: contexture's Claude plugin, read from
|
|
169
|
+
* nothing but the package. `cliVersion` is the version it carries, the CLI's.
|
|
170
|
+
*/
|
|
171
|
+
export function buildClaudePlugin(cliVersion) {
|
|
172
|
+
const license = JSON.parse(packageFile('package.json')).license;
|
|
173
|
+
const values = { NAME: CLAUDE_PLUGIN_NAME, DISPLAY_NAME: CLAUDE_PLUGIN_DISPLAY_NAME, VERSION: cliVersion, LICENSE: license, MARKETPLACE: PLUGIN_MARKETPLACE };
|
|
174
|
+
const { skills, files } = skillFiles();
|
|
175
|
+
const commands = Object.entries(PLUGIN_COMMANDS).map(([command, skill]) => `- \`/${CLAUDE_PLUGIN_NAME}:${command}\` opens \`${skill}\``);
|
|
176
|
+
const tree = new Map([
|
|
177
|
+
['.claude-plugin/plugin.json', jsonDocument('claude-plugin.json', values)],
|
|
178
|
+
['README.md', fillPluginTemplate('README.md', { ...values, COMMANDS: commands.join('\n') })],
|
|
179
|
+
['LICENSE', packageFile('LICENSE')],
|
|
180
|
+
...files,
|
|
181
|
+
...commandFiles(renderMcpSkills()),
|
|
182
|
+
]);
|
|
183
|
+
return finish('claude', CLAUDE_PLUGIN_NAME, cliVersion, skills, tree, `${CLAUDE_PLUGIN_NAME}-claude.zip`);
|
|
184
|
+
}
|
|
185
|
+
/** The store's ChatGPT plugin, with its connector: refused for a store that declares no `mcp` block. */
|
|
186
|
+
export function buildChatgptPlugin(input) {
|
|
92
187
|
const { config } = input;
|
|
93
188
|
const baseUrl = config.serve?.base_url;
|
|
94
189
|
if (config.mcp === undefined || baseUrl === undefined)
|
|
@@ -99,44 +194,52 @@ export function buildPlugins(input) {
|
|
|
99
194
|
const version = pluginVersion(input.cliVersion, input.commit);
|
|
100
195
|
const displayName = `${input.storeName} (contexture)`;
|
|
101
196
|
const values = { NAME: name, DISPLAY_NAME: displayName, VERSION: version, STORE_NAME: input.storeName, MCP_URL: mcpUrl, BASE_URL: origin };
|
|
102
|
-
const skills =
|
|
103
|
-
const
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
197
|
+
const { skills, files } = skillFiles();
|
|
198
|
+
const tree = new Map([
|
|
199
|
+
['plugin.json', jsonDocument('chatgpt-plugin.json', values)],
|
|
200
|
+
['mcp.json', jsonDocument('chatgpt-mcp.json', values)],
|
|
201
|
+
['README.md', fillPluginTemplate('chatgpt-README.md', values)],
|
|
202
|
+
...files,
|
|
203
|
+
]);
|
|
204
|
+
return { ...finish('chatgpt', name, version, skills, tree, `${name}-chatgpt.zip`), storeName: input.storeName, displayName, mcpUrl };
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* publish-one-contexture-plugin D3 (harness-portability spec, *The committed
|
|
208
|
+
* plugin is checked against the render*): the first path at which a plugin
|
|
209
|
+
* directory on disk differs from a build, or null when every file matches
|
|
210
|
+
* byte for byte and the directory holds nothing else.
|
|
211
|
+
*/
|
|
212
|
+
export async function firstDifference(plugin, dir) {
|
|
213
|
+
const onDisk = await listFiles(dir);
|
|
214
|
+
const paths = [...new Set([...plugin.files.keys(), ...onDisk])].sort();
|
|
215
|
+
for (const file of paths) {
|
|
216
|
+
const wanted = plugin.files.get(file);
|
|
217
|
+
if (wanted === undefined)
|
|
218
|
+
return `${file}: on disk, but not in the build`;
|
|
219
|
+
if (!onDisk.includes(file))
|
|
220
|
+
return `${file}: in the build, but missing on disk`;
|
|
221
|
+
if (!(await readFile(path.join(dir, ...file.split('/')))).equals(Buffer.from(wanted, 'utf8')))
|
|
222
|
+
return `${file}: differs from the build`;
|
|
109
223
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
if (file === 'bin' || file.startsWith('bin/') || file.startsWith('hooks/'))
|
|
130
|
-
throw new Error(`plugin file ${file} is one neither app may be shipped`);
|
|
131
|
-
}
|
|
132
|
-
return {
|
|
133
|
-
target,
|
|
134
|
-
files,
|
|
135
|
-
archiveName: `${name}-${target}.zip`,
|
|
136
|
-
archive: createZip([...files].map(([file, content]) => ({ path: file, data: Buffer.from(content, 'utf8') }))),
|
|
137
|
-
};
|
|
138
|
-
});
|
|
139
|
-
return { storeName: input.storeName, name, displayName, version, mcpUrl, skills: skills.map((skill) => skill.file), plugins };
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
async function listFiles(dir, sub = '') {
|
|
227
|
+
let entries;
|
|
228
|
+
try {
|
|
229
|
+
entries = await readdir(path.join(dir, sub), { withFileTypes: true });
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
return [];
|
|
233
|
+
}
|
|
234
|
+
const out = [];
|
|
235
|
+
for (const entry of entries) {
|
|
236
|
+
const rel = sub === '' ? entry.name : `${sub}/${entry.name}`;
|
|
237
|
+
if (entry.isDirectory())
|
|
238
|
+
out.push(...(await listFiles(dir, rel)));
|
|
239
|
+
else
|
|
240
|
+
out.push(rel);
|
|
241
|
+
}
|
|
242
|
+
return out;
|
|
140
243
|
}
|
|
141
244
|
/**
|
|
142
245
|
* The store's name: its directory in the canonical clone, so a build run from
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/core/plugin/build.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/core/plugin/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* publish-one-contexture-plugin D5 (harness-portability spec, *The plugin's
|
|
3
|
+
* commands open its skills*): the plugin's typed commands, each mapped by
|
|
4
|
+
* name to the skill it opens. Declared here, never derived from a skill's
|
|
5
|
+
* name, so `/contexture:session` can open `ctxr-session-lifecycle` and a skill
|
|
6
|
+
* without a command stays without one.
|
|
7
|
+
*/
|
|
8
|
+
export declare const PLUGIN_COMMANDS: Readonly<Record<string, string>>;
|
|
9
|
+
/** Each command whose skill the plugin does not carry, named with the skill it asks for. */
|
|
10
|
+
export declare function commandMapProblems(commands: Readonly<Record<string, string>>, carried: readonly string[]): string[];
|
|
11
|
+
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../src/core/plugin/commands.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAU5D,CAAC;AAEF,4FAA4F;AAC5F,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAInH"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* publish-one-contexture-plugin D5 (harness-portability spec, *The plugin's
|
|
3
|
+
* commands open its skills*): the plugin's typed commands, each mapped by
|
|
4
|
+
* name to the skill it opens. Declared here, never derived from a skill's
|
|
5
|
+
* name, so `/contexture:session` can open `ctxr-session-lifecycle` and a skill
|
|
6
|
+
* without a command stays without one.
|
|
7
|
+
*/
|
|
8
|
+
export const PLUGIN_COMMANDS = {
|
|
9
|
+
capture: 'ctxr-capture',
|
|
10
|
+
ingest: 'ctxr-ingest-orchestration',
|
|
11
|
+
research: 'ctxr-research',
|
|
12
|
+
rollup: 'ctxr-rollup',
|
|
13
|
+
mission: 'ctxr-mission',
|
|
14
|
+
session: 'ctxr-session-lifecycle',
|
|
15
|
+
submit: 'ctxr-submit',
|
|
16
|
+
// serve-the-second-opinion-to-chat-apps: the skill drives `ctxr second-opinion`, so the command takes its name.
|
|
17
|
+
'second-opinion': 'ctxr-second-opinion',
|
|
18
|
+
};
|
|
19
|
+
/** Each command whose skill the plugin does not carry, named with the skill it asks for. */
|
|
20
|
+
export function commandMapProblems(commands, carried) {
|
|
21
|
+
return Object.entries(commands)
|
|
22
|
+
.filter(([, skill]) => !carried.includes(skill))
|
|
23
|
+
.map(([command, skill]) => `command ${command} opens ${skill}, which the plugin does not carry`);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../src/core/plugin/commands.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAAqC;IAC/D,OAAO,EAAE,cAAc;IACvB,MAAM,EAAE,2BAA2B;IACnC,QAAQ,EAAE,eAAe;IACzB,MAAM,EAAE,aAAa;IACrB,OAAO,EAAE,cAAc;IACvB,OAAO,EAAE,wBAAwB;IACjC,MAAM,EAAE,aAAa;IACrB,gHAAgH;IAChH,gBAAgB,EAAE,qBAAqB;CACxC,CAAC;AAEF,4FAA4F;AAC5F,MAAM,UAAU,kBAAkB,CAAC,QAA0C,EAAE,OAA0B;IACvG,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;SAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;SAC/C,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,WAAW,OAAO,UAAU,KAAK,mCAAmC,CAAC,CAAC;AACrG,CAAC"}
|
|
@@ -3,11 +3,15 @@ import type { ApprovalServer } from '../browse/approve.js';
|
|
|
3
3
|
import type { GitRunner } from '../git/exec.js';
|
|
4
4
|
import type { Store } from '../store.js';
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
6
|
+
* publish-one-contexture-plugin D4 (remote-access spec, *The server's connect
|
|
7
|
+
* page tells a member how to add the plugin and this store's connector*):
|
|
8
|
+
* `GET /plugin/` is the store's connect page. It names contexture's
|
|
9
|
+
* marketplace and plugin for Claude, this store's connector address and how
|
|
10
|
+
* to add it in each app, and links the store's ChatGPT plugin. There is no
|
|
11
|
+
* Claude archive any more: Claude's plugin is contexture's, installed from its
|
|
12
|
+
* marketplace. `GET /plugin/<name>-chatgpt.zip` is the ChatGPT archive, built
|
|
13
|
+
* in memory by the builder `ctxr plugin build` uses, from the configuration
|
|
14
|
+
* the server last loaded (serve-the-session-lifecycle-to-chat-apps D7).
|
|
11
15
|
*
|
|
12
16
|
* The routes exist only while the MCP surface is configured, and every one
|
|
13
17
|
* needs the verified identity assertion the approval routes need, so they are
|
|
@@ -25,11 +29,11 @@ export interface PluginReply {
|
|
|
25
29
|
}
|
|
26
30
|
export declare class PluginDownloads {
|
|
27
31
|
private readonly git;
|
|
28
|
-
/** The last
|
|
32
|
+
/** The last ChatGPT plugin built, keyed by the commit and the configuration it was built from. */
|
|
29
33
|
private cached;
|
|
30
34
|
private storeName;
|
|
31
35
|
constructor(git: GitRunner);
|
|
32
|
-
private
|
|
36
|
+
private chatgptFor;
|
|
33
37
|
handle(store: Store, approval: ApprovalServer | null, approvalError: string | null, req: IncomingMessage, pathname: string): Promise<PluginReply>;
|
|
34
38
|
}
|
|
35
39
|
//# sourceMappingURL=routes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/core/plugin/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAIzC
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/core/plugin/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAIzC;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,YAAY,aAAa,CAAC;AAEvC,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAID,qBAAa,eAAe;IAKd,OAAO,CAAC,QAAQ,CAAC,GAAG;IAJhC,kGAAkG;IAClG,OAAO,CAAC,MAAM,CAAqD;IACnE,OAAO,CAAC,SAAS,CAA8B;IAE/C,YAA6B,GAAG,EAAE,SAAS,EAAI;YAEjC,UAAU;IAUlB,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA+BtJ;CACF"}
|
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import { configStamp } from '../browse/memo.js';
|
|
2
2
|
import { scopesFor } from '../mcp/members.js';
|
|
3
3
|
import { CLI_VERSION } from '../../version.js';
|
|
4
|
-
import {
|
|
4
|
+
import { buildChatgptPlugin, CLAUDE_PLUGIN_NAME, fillPluginTemplate, PLUGIN_MARKETPLACE, renderedCommit, storeNameFor } from './build.js';
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
6
|
+
* publish-one-contexture-plugin D4 (remote-access spec, *The server's connect
|
|
7
|
+
* page tells a member how to add the plugin and this store's connector*):
|
|
8
|
+
* `GET /plugin/` is the store's connect page. It names contexture's
|
|
9
|
+
* marketplace and plugin for Claude, this store's connector address and how
|
|
10
|
+
* to add it in each app, and links the store's ChatGPT plugin. There is no
|
|
11
|
+
* Claude archive any more: Claude's plugin is contexture's, installed from its
|
|
12
|
+
* marketplace. `GET /plugin/<name>-chatgpt.zip` is the ChatGPT archive, built
|
|
13
|
+
* in memory by the builder `ctxr plugin build` uses, from the configuration
|
|
14
|
+
* the server last loaded (serve-the-session-lifecycle-to-chat-apps D7).
|
|
11
15
|
*
|
|
12
16
|
* The routes exist only while the MCP surface is configured, and every one
|
|
13
17
|
* needs the verified identity assertion the approval routes need, so they are
|
|
@@ -22,55 +26,54 @@ export function isPluginPath(pathname) {
|
|
|
22
26
|
const text = (status, message) => ({ status, contentType: 'text/plain; charset=utf-8', body: `${message}\n`, headers: { 'Cache-Control': 'no-store' } });
|
|
23
27
|
export class PluginDownloads {
|
|
24
28
|
git;
|
|
25
|
-
/** The last
|
|
29
|
+
/** The last ChatGPT plugin built, keyed by the commit and the configuration it was built from. */
|
|
26
30
|
cached = null;
|
|
27
31
|
storeName;
|
|
28
32
|
constructor(git) {
|
|
29
33
|
this.git = git;
|
|
30
34
|
}
|
|
31
|
-
async
|
|
35
|
+
async chatgptFor(store) {
|
|
32
36
|
const commit = await renderedCommit(this.git, store.root);
|
|
33
37
|
const key = `${commit ?? 'none'}:${configStamp(store.config)}`;
|
|
34
38
|
if (this.cached?.key === key)
|
|
35
|
-
return this.cached.
|
|
39
|
+
return this.cached.plugin;
|
|
36
40
|
this.storeName ??= storeNameFor(this.git, store.root);
|
|
37
|
-
const
|
|
38
|
-
this.cached = { key,
|
|
39
|
-
return
|
|
41
|
+
const plugin = buildChatgptPlugin({ config: store.config, storeName: await this.storeName, cliVersion: CLI_VERSION, commit });
|
|
42
|
+
this.cached = { key, plugin };
|
|
43
|
+
return plugin;
|
|
40
44
|
}
|
|
41
45
|
async handle(store, approval, approvalError, req, pathname) {
|
|
42
46
|
// Without the block these paths are no different from any unknown path.
|
|
43
47
|
if (store.config.mcp === undefined)
|
|
44
48
|
return text(404, 'not found');
|
|
45
49
|
if (approval === null)
|
|
46
|
-
return approvalError === null ? text(404, 'not found') : text(503, `the
|
|
50
|
+
return approvalError === null ? text(404, 'not found') : text(503, `the connect page is unavailable: ${approvalError}`);
|
|
47
51
|
const verified = await approval.verifier.verify(req.headers[approval.approval.identity.header.toLowerCase()]);
|
|
48
52
|
if (!verified.ok)
|
|
49
53
|
return text(401, 'a verified identity assertion is required');
|
|
50
54
|
if (scopesFor(verified.email, store.config.mcp).length === 0)
|
|
51
55
|
return text(403, `${verified.email} may not connect apps to this store. Ask whoever runs it to add you.`);
|
|
52
|
-
const
|
|
56
|
+
const chatgpt = await this.chatgptFor(store);
|
|
53
57
|
if (pathname === '/plugin' || pathname === PLUGIN_ROUTE) {
|
|
54
|
-
const [claude, chatgpt] = bundle.plugins;
|
|
55
58
|
const page = fillPluginTemplate('page.html', {
|
|
56
|
-
STORE_NAME:
|
|
57
|
-
MCP_URL:
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
STORE_NAME: chatgpt.storeName,
|
|
60
|
+
MCP_URL: chatgpt.mcpUrl,
|
|
61
|
+
MARKETPLACE: PLUGIN_MARKETPLACE,
|
|
62
|
+
PLUGIN_NAME: CLAUDE_PLUGIN_NAME,
|
|
63
|
+
OLD_PLUGIN_NAME: chatgpt.name,
|
|
64
|
+
VERSION: chatgpt.version,
|
|
61
65
|
CHATGPT_ARCHIVE: chatgpt.archiveName,
|
|
62
66
|
CHATGPT_HREF: `${PLUGIN_ROUTE}${encodeURIComponent(chatgpt.archiveName)}`,
|
|
63
67
|
});
|
|
64
68
|
return { status: 200, contentType: 'text/html; charset=utf-8', body: page, headers: { 'Cache-Control': 'no-store' } };
|
|
65
69
|
}
|
|
66
|
-
|
|
67
|
-
if (plugin === undefined)
|
|
70
|
+
if (pathname !== `${PLUGIN_ROUTE}${chatgpt.archiveName}`)
|
|
68
71
|
return text(404, 'not found');
|
|
69
72
|
return {
|
|
70
73
|
status: 200,
|
|
71
74
|
contentType: 'application/zip',
|
|
72
|
-
body:
|
|
73
|
-
headers: { 'Content-Disposition': `attachment; filename="${
|
|
75
|
+
body: chatgpt.archive,
|
|
76
|
+
headers: { 'Content-Disposition': `attachment; filename="${chatgpt.archiveName}"`, 'Cache-Control': 'no-store' },
|
|
74
77
|
};
|
|
75
78
|
}
|
|
76
79
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/core/plugin/routes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/core/plugin/routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* serve-the-second-opinion-to-chat-apps D1: each model CLI runs from a fresh
|
|
3
|
+
* folder that is its `HOME` and its working directory, seeded with a copy of
|
|
4
|
+
* its own login and nothing else, and wrapped in `setpriv`'s Landlock rules so
|
|
5
|
+
* the kernel lets it read only the system paths, its own install directory and
|
|
6
|
+
* that folder. Landlock needs no privilege and no user namespace, which
|
|
7
|
+
* Docker's default seccomp profile refuses; `setpriv` has it from util-linux
|
|
8
|
+
* 2.40. Where it is missing the run stays as before and says so.
|
|
9
|
+
*/
|
|
10
|
+
/** Whether runs on this machine can be confined, and if not, why. */
|
|
11
|
+
export type Confinement = {
|
|
12
|
+
confined: true;
|
|
13
|
+
setpriv: string;
|
|
14
|
+
} | {
|
|
15
|
+
confined: false;
|
|
16
|
+
reason: string;
|
|
17
|
+
};
|
|
18
|
+
/** What one confined run needs beyond its argument vector. */
|
|
19
|
+
export interface ConfinedRun {
|
|
20
|
+
setpriv: string;
|
|
21
|
+
/** The real home the logins are copied from and back to. */
|
|
22
|
+
sourceHome: string;
|
|
23
|
+
/** The CLI's login files, relative to a home. */
|
|
24
|
+
logins: readonly string[];
|
|
25
|
+
/** How many directories above the binary's own the install directory is; 0 allows the binary file alone. */
|
|
26
|
+
installLevels: number;
|
|
27
|
+
}
|
|
28
|
+
/** The executable a bare command name resolves to on a search path, or null. */
|
|
29
|
+
export declare function onPath(cmd: string, searchPath: string | undefined): string | null;
|
|
30
|
+
/**
|
|
31
|
+
* `setpriv`'s arguments, ending in the binary and its own: the system paths
|
|
32
|
+
* and the install directory readable, the folder fully usable, nothing else.
|
|
33
|
+
*/
|
|
34
|
+
export declare function landlockArgs(binary: string, args: readonly string[], folder: string, run: ConfinedRun, env: Record<string, string>): string[];
|
|
35
|
+
export interface SeededLogin {
|
|
36
|
+
source: string;
|
|
37
|
+
copy: string;
|
|
38
|
+
sourceHash: string;
|
|
39
|
+
}
|
|
40
|
+
/** Copies each login present in the real home into the folder, recording what was copied. */
|
|
41
|
+
export declare function seedLogins(run: ConfinedRun, folder: string): SeededLogin[];
|
|
42
|
+
/**
|
|
43
|
+
* A login the run refreshed goes back over the original, unless the original
|
|
44
|
+
* changed meanwhile: Codex rotates its refresh token, so dropping the copy
|
|
45
|
+
* would break the real login, and overwriting a newer original would too.
|
|
46
|
+
*/
|
|
47
|
+
export declare function returnLogins(seeded: readonly SeededLogin[]): void;
|
|
48
|
+
/** The fresh folder's environment: it is the home, and temporary files stay inside it. */
|
|
49
|
+
export declare function confinedEnv(env: Record<string, string>, folder: string): Record<string, string>;
|
|
50
|
+
//# sourceMappingURL=confine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confine.d.ts","sourceRoot":"","sources":["../../../src/core/second-opinion/confine.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,qEAAqE;AACrE,MAAM,MAAM,WAAW,GAAG;IAAE,QAAQ,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,QAAQ,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpG,8DAA8D;AAC9D,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,4GAA4G;IAC5G,aAAa,EAAE,MAAM,CAAC;CACvB;AAgCD,gFAAgF;AAChF,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAWjF;AAyCD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,CAgB7I;AAUD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,6FAA6F;AAC7F,wBAAgB,UAAU,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,EAAE,CAa1E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,IAAI,CAUjE;AAED,0FAA0F;AAC1F,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAI/F"}
|