command-code 1.82.2 → 1.82.3
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/CHANGELOG.md +6 -0
- package/dist/bundled/command-code-knowledge/live-models.ts +227 -0
- package/dist/bundled/command-code-knowledge/reference/models.md +1 -0
- package/dist/bundled/command-code-knowledge/reference/product-help.md +19 -18
- package/dist/bundled/mod-builder/SKILL.md +7 -5
- package/dist/bundled/mod-builder/reference/packaging.md +17 -11
- package/dist/bundled/mod-builder/reference/verify.md +9 -0
- package/dist/cli.mjs +5 -5
- package/package.json +2 -2
- package/vsix/commandcode-vscode.vsix +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The live half of the command-code-knowledge skill's model facts. reference/models.md is generated
|
|
3
|
+
* at build time, so a model the catalog launched after this release is missing from it, and the
|
|
4
|
+
* skill tells the model to "never invent a model id" — it then refuses to name the new model or pin
|
|
5
|
+
* an agent to it. On activation the skill body gains a section built from the catalog this process
|
|
6
|
+
* already holds (never a fetch): models the reference does not list, models the catalog has hidden
|
|
7
|
+
* or dropped since, and known models whose window or effort levels changed. "This build" is the
|
|
8
|
+
* catalog embedded in it, which the reference is generated from. No remote catalog, or a catalog
|
|
9
|
+
* that matches this build, adds nothing.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import {
|
|
13
|
+
getSupportedEfforts,
|
|
14
|
+
listSelectableModelIds,
|
|
15
|
+
} from '../../../config/known-models.js';
|
|
16
|
+
import {getInstalledModelCatalogManager} from '../../../model/catalog-manager.js';
|
|
17
|
+
import {
|
|
18
|
+
type EffectiveModelCatalog,
|
|
19
|
+
resolveCatalogModelStatus,
|
|
20
|
+
getSnapshotEffectiveCatalog,
|
|
21
|
+
} from '../../../model/catalog-resolution.js';
|
|
22
|
+
import type {CatalogModelV1} from '../../../model/model-catalog-wire.js';
|
|
23
|
+
import {getKnownModelContextWindow} from '../../../model/model-registry.js';
|
|
24
|
+
import type {Skill} from '../../skill-registry.js';
|
|
25
|
+
|
|
26
|
+
export const KNOWLEDGE_SKILL_NAME = 'command-code-knowledge';
|
|
27
|
+
|
|
28
|
+
interface ModelBuckets {
|
|
29
|
+
readonly added: readonly CatalogModelV1[];
|
|
30
|
+
// Shipped ids the catalog hides or no longer carries.
|
|
31
|
+
readonly hidden: readonly string[];
|
|
32
|
+
// Shipped ids the catalog now serves in a shape this build cannot run (an unknown profile).
|
|
33
|
+
readonly outdated: readonly string[];
|
|
34
|
+
readonly changed: readonly CatalogModelV1[];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// 205_000 → '205K'; 1_000_000 → '1M'; 1_050_000 → '1.05M' — the reference table's spelling.
|
|
38
|
+
function formatContext(tokens: number): string {
|
|
39
|
+
if (tokens < 1_000_000) return `${Math.round(tokens / 1000)}K`;
|
|
40
|
+
const millions = tokens / 1_000_000;
|
|
41
|
+
return `${Number.isInteger(millions) ? millions : millions.toFixed(2)}M`;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function formatEfforts(efforts: readonly string[] | null): string {
|
|
45
|
+
return efforts && efforts.length > 0 ? efforts.join(', ') : '—';
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function sameEfforts(
|
|
49
|
+
left: readonly string[] | null,
|
|
50
|
+
right: readonly string[] | null,
|
|
51
|
+
): boolean {
|
|
52
|
+
return formatEfforts(left) === formatEfforts(right);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function modelRow(model: CatalogModelV1): string {
|
|
56
|
+
return `| \`${model.id}\` | ${model.display.label} | ${formatContext(model.contextWindow)} | ${formatEfforts(model.reasoningEfforts)} |`;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function modelTable(models: readonly CatalogModelV1[]): string {
|
|
60
|
+
return [
|
|
61
|
+
'| Id (use EXACTLY this) | Name | Context | Efforts |',
|
|
62
|
+
'|---|---|---|---|',
|
|
63
|
+
...models.map(modelRow),
|
|
64
|
+
].join('\n');
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// The catalog this build ships, which the reference was generated from.
|
|
68
|
+
function builtCatalog(): EffectiveModelCatalog {
|
|
69
|
+
return getSnapshotEffectiveCatalog({remoteDisabled: false});
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// A known model whose served window or effort levels no longer match the embedded catalog the
|
|
73
|
+
// reference was generated from.
|
|
74
|
+
function changedSinceBuild(model: CatalogModelV1): boolean {
|
|
75
|
+
const built = builtCatalog();
|
|
76
|
+
const window = getKnownModelContextWindow(model.id, built);
|
|
77
|
+
if (window !== undefined && window !== model.contextWindow) return true;
|
|
78
|
+
return !sameEfforts(
|
|
79
|
+
getSupportedEfforts(model.id, built),
|
|
80
|
+
model.reasoningEfforts,
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function bucketModels(effective: EffectiveModelCatalog): ModelBuckets {
|
|
85
|
+
const known = listSelectableModelIds({catalog: builtCatalog()});
|
|
86
|
+
const knownSet = new Set(known);
|
|
87
|
+
const added: CatalogModelV1[] = [];
|
|
88
|
+
const hidden: string[] = [];
|
|
89
|
+
const changed: CatalogModelV1[] = [];
|
|
90
|
+
for (const model of effective.catalog.models) {
|
|
91
|
+
const {state} = resolveCatalogModelStatus({
|
|
92
|
+
effective,
|
|
93
|
+
modelId: model.id,
|
|
94
|
+
});
|
|
95
|
+
if (state === 'hidden' && knownSet.has(model.id)) {
|
|
96
|
+
hidden.push(model.id);
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (state !== 'selectable') continue;
|
|
100
|
+
if (!knownSet.has(model.id)) {
|
|
101
|
+
added.push(model);
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (changedSinceBuild(model)) changed.push(model);
|
|
105
|
+
}
|
|
106
|
+
// A shipped id the catalog no longer carries at all (no row, no alias), or now marks update
|
|
107
|
+
// required, is refused by /model and sub-agents too.
|
|
108
|
+
const outdated: string[] = [];
|
|
109
|
+
for (const id of known) {
|
|
110
|
+
const {state} = resolveCatalogModelStatus({
|
|
111
|
+
effective,
|
|
112
|
+
modelId: id,
|
|
113
|
+
});
|
|
114
|
+
if (state === 'not-in-catalog') hidden.push(id);
|
|
115
|
+
if (state === 'client-update-required') outdated.push(id);
|
|
116
|
+
}
|
|
117
|
+
return {added, hidden, outdated, changed};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export interface BuildLiveModelSectionParams {
|
|
121
|
+
readonly catalog?: EffectiveModelCatalog;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* The "live model catalog" section for the knowledge skill, or '' when there is no remote catalog
|
|
126
|
+
* or it differs from this build in nothing the reference covers. `catalog` defaults to the one this
|
|
127
|
+
* process's catalog manager holds.
|
|
128
|
+
*/
|
|
129
|
+
export function buildLiveModelSection(
|
|
130
|
+
params: BuildLiveModelSectionParams = {},
|
|
131
|
+
): string {
|
|
132
|
+
const effective =
|
|
133
|
+
params.catalog ?? getInstalledModelCatalogManager()?.getEffective();
|
|
134
|
+
if (!effective) return '';
|
|
135
|
+
const {added, hidden, outdated, changed} = bucketModels(effective);
|
|
136
|
+
if (added.length + hidden.length + outdated.length + changed.length === 0)
|
|
137
|
+
return '';
|
|
138
|
+
const parts = [
|
|
139
|
+
'## Live model catalog (overrides reference/models.md)',
|
|
140
|
+
'The model catalog in force now differs from the one `reference/models.md` was generated from. Where they disagree, this section wins. Prices and minimum plans for models listed here are not in the reference. Point the user at /model or https://commandcode.ai/docs for those.',
|
|
141
|
+
];
|
|
142
|
+
if (added.length > 0) {
|
|
143
|
+
parts.push(
|
|
144
|
+
`### Available models the reference does not list\nThese ids are valid for \`/model\`, \`--model\` and an agent file's \`model:\`.\n\n${modelTable(added)}`,
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
if (changed.length > 0) {
|
|
148
|
+
parts.push(
|
|
149
|
+
`### Context window or efforts changed since the reference\n${modelTable(changed)}`,
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
if (hidden.length > 0) {
|
|
153
|
+
parts.push(
|
|
154
|
+
`### No longer offered\nDo not recommend these or pin new agents to them: ${hidden
|
|
155
|
+
.map(id => `\`${id}\``)
|
|
156
|
+
.join(', ')}.`,
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
if (outdated.length > 0) {
|
|
160
|
+
parts.push(
|
|
161
|
+
`### Needs a newer Command Code\nThis version cannot run these. Do not recommend them or pin agents to them; tell the user to update Command Code to use them: ${outdated
|
|
162
|
+
.map(id => `\`${id}\``)
|
|
163
|
+
.join(', ')}.`,
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
return parts.join('\n\n');
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* The section built once per catalog `getCatalog` answers with. A session hands in its pin when the
|
|
171
|
+
* pin came from the live catalog, else the newest catalog — so every activation (the activate_skill
|
|
172
|
+
* tool, a `/command-code-knowledge` turn, an inline mention) reads the same text until a catalog
|
|
173
|
+
* lands or /model re-pins.
|
|
174
|
+
*/
|
|
175
|
+
export function createLiveModelSectionCache(
|
|
176
|
+
getCatalog: () => EffectiveModelCatalog | undefined,
|
|
177
|
+
): () => string {
|
|
178
|
+
let cached:
|
|
179
|
+
| {readonly catalog: EffectiveModelCatalog; readonly text: string}
|
|
180
|
+
| undefined;
|
|
181
|
+
return () => {
|
|
182
|
+
const catalog = getCatalog();
|
|
183
|
+
if (!catalog) return '';
|
|
184
|
+
if (cached?.catalog !== catalog) {
|
|
185
|
+
cached = {catalog, text: buildLiveModelSection({catalog})};
|
|
186
|
+
}
|
|
187
|
+
return cached.text;
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export interface AppendLiveModelSectionParams {
|
|
192
|
+
readonly body: string;
|
|
193
|
+
readonly section: string;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/** A skill body plus the live model section, when there is one. */
|
|
197
|
+
export function appendLiveModelSection(
|
|
198
|
+
params: AppendLiveModelSectionParams,
|
|
199
|
+
): string {
|
|
200
|
+
return params.section ? `${params.body}\n\n${params.section}` : params.body;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
export interface WithLiveModelSectionParams {
|
|
204
|
+
readonly skill: Skill;
|
|
205
|
+
readonly section: () => string | Promise<string>;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* The bundled knowledge skill with the live model section on its body, so every path that loads the
|
|
210
|
+
* body gets it; any other skill (a user skill of the same name included) is returned unchanged.
|
|
211
|
+
*/
|
|
212
|
+
export function withLiveModelSection(
|
|
213
|
+
params: WithLiveModelSectionParams,
|
|
214
|
+
): Skill {
|
|
215
|
+
const {skill} = params;
|
|
216
|
+
if (skill.source !== 'bundled' || skill.name !== KNOWLEDGE_SKILL_NAME) {
|
|
217
|
+
return skill;
|
|
218
|
+
}
|
|
219
|
+
return {
|
|
220
|
+
...skill,
|
|
221
|
+
loadBody: async () =>
|
|
222
|
+
appendLiveModelSection({
|
|
223
|
+
body: await skill.loadBody(),
|
|
224
|
+
section: await params.section(),
|
|
225
|
+
}),
|
|
226
|
+
};
|
|
227
|
+
}
|
|
@@ -35,6 +35,7 @@ The model catalog — every id `/model`, `--model`, `model:effort` shorthand, an
|
|
|
35
35
|
| `xiaomi/mimo-v2.5-pro` | MiMo V2.5 Pro | 1M | — | $0.435/$0.87 · cache $0.0036 | Go and above | high-capability long-context agentic coding |
|
|
36
36
|
| `xiaomi/mimo-v2.5` | MiMo V2.5 | 1M | — | $0.14/$0.28 · cache $0.0028 | Go and above | efficient long-context agentic coding |
|
|
37
37
|
| `Qwen/Qwen3.8-Omni-Flash` | Qwen 3.8 Omni Flash | 1M | low, medium, xhigh | $0.15/$0.47 · cache $0.016 | Go and above | omni-modal understanding & multimedia agentic work |
|
|
38
|
+
| `Qwen/Qwen3.8-Max-Prime` | Qwen 3.8 Max Prime | 1M | low, medium, xhigh | $4/$12 · cache $0.5 (write $5) | GOAT and above | high-speed Qwen 3.8 Max: 1.5–2× faster output |
|
|
38
39
|
| `Qwen/Qwen3.8-Max-0902` | Qwen 3.8 Max 0902 | 1M | low, medium, xhigh | $2/$6 · cache $0.25 | Go and above | upgraded Qwen 3.8 Max: stronger coding & agentic tool use |
|
|
39
40
|
| `Qwen/Qwen3.8-Max` | Qwen 3.8 Max | 1M | low, medium, xhigh | $2/$6 · cache $0.25 (write $2.5) | Go and above | autonomous long-horizon coding & professional work |
|
|
40
41
|
| `Qwen/Qwen3.8-27B` | Qwen 3.8 27B | 262K | low, medium, xhigh | $0.4/$3 · cache $0.04 | Go and above | compact vision-language coding & agentic work |
|
|
@@ -277,22 +277,20 @@ Valid model ids (the /model catalog — use these EXACT ids):
|
|
|
277
277
|
- gpt-5.4
|
|
278
278
|
- gpt-5.3-codex
|
|
279
279
|
- gpt-5.4-mini
|
|
280
|
-
- moonshotai/Kimi-K3
|
|
281
|
-
- thinkingmachines/inkling
|
|
282
|
-
- thinkingmachines/inkling-small
|
|
283
280
|
- deepseek/deepseek-v4-pro
|
|
284
281
|
- deepseek/deepseek-v4-flash
|
|
285
282
|
- deepseek/deepseek-v4-flash-vision-exp
|
|
286
283
|
- deepseek/deepseek-v4-flash-fast
|
|
287
284
|
- deepseek/deepseek-v4.1-flash
|
|
288
285
|
- deepseek/deepseek-v4.1-flash-fast
|
|
286
|
+
- moonshotai/Kimi-K3
|
|
289
287
|
- moonshotai/Kimi-K2.7-Code
|
|
290
288
|
- moonshotai/Kimi-K2.7-Code-Highspeed
|
|
291
289
|
- moonshotai/Kimi-K2.6
|
|
292
290
|
- moonshotai/Kimi-K2.5
|
|
293
|
-
- zai-org/GLM-5.3
|
|
294
291
|
- z-ai/glm-5.3-flash
|
|
295
292
|
- z-ai/glm-5.3-flashx
|
|
293
|
+
- zai-org/GLM-5.3
|
|
296
294
|
- zai-org/GLM-5.2
|
|
297
295
|
- zai-org/GLM-5.2-Fast
|
|
298
296
|
- zai-org/GLM-5.1
|
|
@@ -305,22 +303,23 @@ Valid model ids (the /model catalog — use these EXACT ids):
|
|
|
305
303
|
- xiaomi/mimo-v2.6-flash
|
|
306
304
|
- xiaomi/mimo-v2.5-pro
|
|
307
305
|
- xiaomi/mimo-v2.5
|
|
308
|
-
- Qwen/Qwen3.6-Max-Preview
|
|
309
|
-
- Qwen/Qwen3.6-Plus
|
|
310
|
-
- Qwen/Qwen3.7-Max
|
|
311
|
-
- Qwen/Qwen3.7-Plus
|
|
312
306
|
- Qwen/Qwen3.8-Omni-Flash
|
|
307
|
+
- Qwen/Qwen3.8-Max-Prime
|
|
313
308
|
- Qwen/Qwen3.8-Max-0902
|
|
314
309
|
- Qwen/Qwen3.8-Max
|
|
315
310
|
- Qwen/Qwen3.8-27B
|
|
316
311
|
- Qwen/Qwen3.8-Flash
|
|
312
|
+
- Qwen/Qwen3.7-Max
|
|
313
|
+
- Qwen/Qwen3.7-Plus
|
|
317
314
|
- Qwen/Qwen3.7-Flash
|
|
315
|
+
- Qwen/Qwen3.6-Max-Preview
|
|
316
|
+
- Qwen/Qwen3.6-Plus
|
|
318
317
|
- meituan/LongCat-2.0
|
|
319
318
|
- stepfun/Step-5-Preview
|
|
320
319
|
- stepfun/Step-3.7-Flash
|
|
321
320
|
- stepfun/Step-3.5-Flash
|
|
322
|
-
- tencent/hy4-preview
|
|
323
321
|
- tencent/hy3-paid
|
|
322
|
+
- tencent/hy4-preview
|
|
324
323
|
- google/gemini-4-argon
|
|
325
324
|
- google/gemini-3.8-flash
|
|
326
325
|
- google/gemini-3.7-flash
|
|
@@ -329,21 +328,23 @@ Valid model ids (the /model catalog — use these EXACT ids):
|
|
|
329
328
|
- google/gemini-3.5-flash-lite
|
|
330
329
|
- google/gemini-3.1-flash-lite
|
|
331
330
|
- sakana/fugu-ultra
|
|
332
|
-
-
|
|
333
|
-
-
|
|
334
|
-
-
|
|
335
|
-
-
|
|
331
|
+
- nvidia/nemotron-3-ultra-550b-a55b
|
|
332
|
+
- thinkingmachines/inkling
|
|
333
|
+
- thinkingmachines/inkling-small
|
|
334
|
+
- stealth/glyph-cluster:free
|
|
335
|
+
- poolside/laguna-s-2.1-free
|
|
336
|
+
- inclusionai/ling-3.0-flash-sante:free
|
|
337
|
+
- inclusionai/ling-3.1-flash
|
|
336
338
|
- meta/muse-spark-1.1
|
|
337
339
|
- meta/muse-spark-1.2
|
|
338
340
|
- meta/muse-spark-1.2-contributor
|
|
339
341
|
- meta/muse-spark-1.3
|
|
340
342
|
- meta/muse-spark-1.3-contributor
|
|
341
343
|
- meta/muse-wonder-1.0
|
|
342
|
-
-
|
|
343
|
-
-
|
|
344
|
-
-
|
|
345
|
-
-
|
|
346
|
-
- stealth/glyph-cluster:free
|
|
344
|
+
- xai/grok-4.5
|
|
345
|
+
- xai/grok-4.6
|
|
346
|
+
- xai/grok-4.7
|
|
347
|
+
- mistral/mistral-large-4
|
|
347
348
|
A BYO-provider id (from a configured custom provider) also works and is passed through as-is.
|
|
348
349
|
|
|
349
350
|
WHEN THE USER ASKS YOU TO CREATE AN AGENT (e.g. "make a changelog agent with a cheap model"):
|
|
@@ -116,11 +116,13 @@ run `pnpm generate:knowledge` after editing the docs under `packages/docs/src/ap
|
|
|
116
116
|
- Personal: leave it in `~/.commandcode/mods/`.
|
|
117
117
|
- A package: a `package.json` with `{"keywords": ["cmd-mod"], "commandcode": {"mods": ["./index.ts"]}}`,
|
|
118
118
|
installed via `cmd mods add npm:<name>` / `cmd mods add owner/repo` / `cmd mods add ./local-dir`.
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
119
|
+
Include the exact `cmd-mod` keyword so maintainers can discover it for review.
|
|
120
|
+
After publishing with `pnpm publish`, submit an entry to `mods/registry.json`
|
|
121
|
+
in the public `CommandCodeAI/command-code` repo. Publishing alone does not list
|
|
122
|
+
a mod on the [mods hub](https://commandcode.ai/mods). The reviewed entry supplies
|
|
123
|
+
its description and categories; `npm` enables live package metadata and monthly
|
|
124
|
+
downloads, and a GitHub `repo` enables stars. Full packaging and submission
|
|
125
|
+
detail: `reference/packaging.md`.
|
|
124
126
|
|
|
125
127
|
## Boundaries to state up front
|
|
126
128
|
|
|
@@ -54,22 +54,28 @@ A package declares what it ships via `package.json` - exact paths, directories,
|
|
|
54
54
|
}
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
`repository` pointing at GitHub adds the star count. Ship these from the start so the hub
|
|
62
|
-
lists the mod well the moment you publish, with nothing to submit.
|
|
57
|
+
Include the `cmd-mod` keyword so maintainers can find the package during review.
|
|
58
|
+
Kind keywords such as `cmd-mod-tool` and `cmd-mod-hook` help describe it, but the
|
|
59
|
+
hub's categories and summary come from its reviewed registry entry. Publishing
|
|
60
|
+
to npm does not list a package on the [mods hub](https://commandcode.ai/mods).
|
|
63
61
|
|
|
64
62
|
No manifest → the `mods/` convention directory → a root `index.ts`, in that order.
|
|
65
63
|
|
|
66
64
|
`commandcode.skills` lists skill directories the package ships beside its mods (each entry is one skill directory or a directory of skills, relative to the package root; entries escaping the root are dropped). They join skill discovery for every session the package loads in, so one `cmd mods add` brings the mods and the skills that go with them. A mod can contribute the same thing from code with `cmd.addSkillsPath`.
|
|
67
65
|
|
|
68
|
-
|
|
66
|
+
After publishing, submit an entry to the public registry for review. Listed npm
|
|
67
|
+
packages get live monthly downloads, latest version, and publish date from npm.
|
|
68
|
+
A GitHub `repo` in the registry entry adds its star count.
|
|
69
69
|
|
|
70
|
-
## Listing a
|
|
70
|
+
## Listing a mod on the hub
|
|
71
71
|
|
|
72
|
-
|
|
72
|
+
The [hub](https://commandcode.ai/mods) lists the reviewed entries in
|
|
73
|
+
`mods/registry.json` in the public
|
|
74
|
+
[`CommandCodeAI/command-code`](https://github.com/CommandCodeAI/command-code) repo.
|
|
75
|
+
Open a PR against that file for either an npm or a GitHub mod. Maintainers review
|
|
76
|
+
npm candidates before adding them to the list. The hub automatically fetches
|
|
77
|
+
GitHub entries and approved npm entries from this file within about 15 minutes
|
|
78
|
+
of a merge, without a website deployment.
|
|
73
79
|
|
|
74
80
|
```json
|
|
75
81
|
{
|
|
@@ -90,9 +96,9 @@ Two things feed [the hub](https://commandcode.ai/mods). Any npm package with the
|
|
|
90
96
|
}
|
|
91
97
|
```
|
|
92
98
|
|
|
93
|
-
`name`, `source` (what `cmd mods add <source>` takes), `description` (≤240 chars), `author.name`, and at least one `kinds` value (`tool`/`command`/`hook`/`provider`/`renderer`/`flag`) are required; `repo`, `npm`, `tags`, `official`, and `addedAt` are optional. A GitHub `repo` adds a live star count, `npm`
|
|
99
|
+
`name`, `source` (what `cmd mods add <source>` takes), `description` (≤240 chars), `author.name`, and at least one `kinds` value (`tool`/`command`/`hook`/`provider`/`renderer`/`flag`) are required; `repo`, `npm`, `tags`, `official`, and `addedAt` are optional. A GitHub `repo` adds a live star count, `npm` names the published package for live metadata and download counts, `official` marks a team-maintained mod, and a `hidden` name (a mod or an npm package) keeps spam or impersonation off the hub. The public schema is `mods/registry.schema.json`.
|
|
94
100
|
|
|
95
|
-
The
|
|
101
|
+
The reviewed list, with live npm metadata and GitHub star counts, is served at [`commandcode.ai/mods.json`](https://commandcode.ai/mods.json), CORS-open, so the CLI or any script can read the same list the hub renders.
|
|
96
102
|
|
|
97
103
|
## Filtering a source's mods
|
|
98
104
|
|
|
@@ -54,6 +54,15 @@ cmd -p "exercise the mod" --mod ./your-mod.ts
|
|
|
54
54
|
|
|
55
55
|
Print mode loads user-scope and `--mod` mods with the UI bridge degraded to deterministic defaults (confirm → false, select/input → undefined). A mod that must work in CI should behave sensibly under those defaults.
|
|
56
56
|
|
|
57
|
+
## 6. Submit the published mod for review
|
|
58
|
+
|
|
59
|
+
Include `cmd-mod` in your package's keywords so maintainers can discover it.
|
|
60
|
+
Before publishing, check `package.json` for the correct mod entrypoints,
|
|
61
|
+
description, and repository. Publish with `pnpm publish`, then open a PR adding
|
|
62
|
+
an entry to the public [`mods/registry.json`](https://github.com/CommandCodeAI/command-code/blob/main/mods/registry.json).
|
|
63
|
+
Set `source` and `npm` to the full package name for an npm mod. Publishing or
|
|
64
|
+
adding a keyword alone does not list it on the hub.
|
|
65
|
+
|
|
57
66
|
## Working from the bundled examples
|
|
58
67
|
|
|
59
68
|
Ask Command Code to build the mod you want and it starts from a bundled example rather than a blank file - see [Runnable examples](./overview.md#runnable-examples) for the list. Each one loads through the real mod loader in CI on every test run, so what you start from is proven to load.
|