@aiwg/cli 2026.7.20 → 2026.7.23

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.
Files changed (62) hide show
  1. package/README.md +18 -7
  2. package/dist/src/api/index.d.ts +2 -0
  3. package/dist/src/api/index.js +2 -0
  4. package/dist/src/artifacts/browser-export.js +7 -0
  5. package/dist/src/artifacts/citation-parser.js +96 -35
  6. package/dist/src/artifacts/index-builder.js +54 -17
  7. package/dist/src/artifacts/state-transfer.js +27 -0
  8. package/dist/src/artifacts/stats.js +8 -0
  9. package/dist/src/cli/cli-extension-loader.js +73 -0
  10. package/dist/src/cli/handlers/index.js +3 -1
  11. package/dist/src/cli/handlers/sessions.js +1265 -0
  12. package/dist/src/cli/handlers/skill-lint.js +49 -45
  13. package/dist/src/cli/handlers/use.js +143 -60
  14. package/dist/src/cli/handlers/utilities.js +22 -8
  15. package/dist/src/cli/skill-usage.js +146 -24
  16. package/dist/src/config/aiwg-config.js +12 -0
  17. package/dist/src/config/cli.js +16 -3
  18. package/dist/src/extensions/commands/definitions.js +29 -0
  19. package/dist/src/extensions/manifest.js +29 -0
  20. package/dist/src/security/threat-assessment-config.js +296 -0
  21. package/dist/src/sessions/adapters/claude.js +385 -0
  22. package/dist/src/sessions/adapters/codex.js +548 -0
  23. package/dist/src/sessions/adapters/copilot.js +226 -0
  24. package/dist/src/sessions/adapters/cursor.js +528 -0
  25. package/dist/src/sessions/adapters/factory.js +386 -0
  26. package/dist/src/sessions/adapters/generic.js +225 -0
  27. package/dist/src/sessions/adapters/hermes.js +341 -0
  28. package/dist/src/sessions/adapters/openclaw.js +381 -0
  29. package/dist/src/sessions/adapters/opencode.js +454 -0
  30. package/dist/src/sessions/adapters/openhuman.js +315 -0
  31. package/dist/src/sessions/adapters/warp.js +160 -0
  32. package/dist/src/sessions/adapters/windsurf.js +212 -0
  33. package/dist/src/sessions/batch-contracts.js +121 -0
  34. package/dist/src/sessions/batch-import.js +265 -0
  35. package/dist/src/sessions/candidates.js +210 -0
  36. package/dist/src/sessions/contracts.js +337 -0
  37. package/dist/src/sessions/discovery.js +51 -0
  38. package/dist/src/sessions/fixtures.js +12 -0
  39. package/dist/src/sessions/import-lease.js +152 -0
  40. package/dist/src/sessions/importer.js +464 -0
  41. package/dist/src/sessions/index.js +31 -0
  42. package/dist/src/sessions/knowledge-shard.js +61 -0
  43. package/dist/src/sessions/optional-backends.js +238 -0
  44. package/dist/src/sessions/origin.js +117 -0
  45. package/dist/src/sessions/policy.js +192 -0
  46. package/dist/src/sessions/ports.js +2 -0
  47. package/dist/src/sessions/promotion.js +367 -0
  48. package/dist/src/sessions/readers.js +176 -0
  49. package/dist/src/sessions/repository.js +1892 -0
  50. package/dist/src/sessions/timeline.js +148 -0
  51. package/dist/src/sessions/workspace-discovery.js +319 -0
  52. package/dist/src/skills/adapters/agent-skills.js +59 -0
  53. package/dist/src/skills/adapters/local.js +19 -1
  54. package/dist/src/skills/agent-skills.js +249 -0
  55. package/dist/src/skills/cli.js +463 -7
  56. package/dist/src/skills/deployer.js +554 -0
  57. package/dist/src/skills/doctor.js +105 -0
  58. package/dist/src/skills/exporter.js +382 -0
  59. package/dist/src/skills/importer.js +921 -0
  60. package/dist/src/skills/registry.js +19 -0
  61. package/dist/src/skills/validator.js +323 -0
  62. package/package.json +2 -2
@@ -0,0 +1,226 @@
1
+ import { basename, extname } from 'node:path';
2
+ import { z } from 'zod';
3
+ import { SessionContractError, assertSupportedSchemaMajor, } from '../contracts.js';
4
+ import { readBoundedJson } from '../readers.js';
5
+ export const COPILOT_ADAPTER_VERSION = '1.0.0';
6
+ export const COPILOT_EXPORT_SCHEMA_VERSION = '1.0.0';
7
+ const ResponsePartSchema = z.object({
8
+ value: z.string().optional(),
9
+ kind: z.string().optional(),
10
+ }).passthrough();
11
+ const RequestSchema = z.object({
12
+ requestId: z.string().min(1).optional(),
13
+ message: z.union([
14
+ z.string(),
15
+ z.object({ text: z.string() }).passthrough(),
16
+ ]),
17
+ response: z.union([
18
+ z.string(),
19
+ z.array(ResponsePartSchema),
20
+ ]).optional(),
21
+ timestamp: z.union([z.string(), z.number()]).optional(),
22
+ modelId: z.string().optional(),
23
+ }).passthrough();
24
+ const ExportSchema = z.object({
25
+ version: z.union([z.number().int().positive(), z.string()]),
26
+ schemaVersion: z.string().optional(),
27
+ sessionId: z.string().min(1).optional(),
28
+ creationDate: z.union([z.string(), z.number()]).optional(),
29
+ lastMessageDate: z.union([z.string(), z.number()]).optional(),
30
+ requests: z.array(RequestSchema),
31
+ requesterUsername: z.string().optional(),
32
+ responderUsername: z.string().optional(),
33
+ state: z.string().optional(),
34
+ isArchived: z.boolean().optional(),
35
+ syncStatus: z.string().optional(),
36
+ workspace: z.object({
37
+ id: z.string().optional(),
38
+ repository: z.string().optional(),
39
+ }).passthrough().optional(),
40
+ }).passthrough();
41
+ export class CopilotSessionAdapter {
42
+ limits;
43
+ provider = 'copilot';
44
+ adapterVersion = COPILOT_ADAPTER_VERSION;
45
+ disposition = 'implemented';
46
+ supportedOperations = ['inspect', 'stream'];
47
+ acquisitionModes = ['manual-export'];
48
+ constructor(limits) {
49
+ this.limits = limits;
50
+ }
51
+ async *discover(_scope) {
52
+ // Supported VS Code exports require explicit user selection. Versioned
53
+ // workspaceStorage JSON/JSONL is intentionally not treated as a stable source.
54
+ }
55
+ async inspect(source) {
56
+ const parsed = await this.readSource(source);
57
+ return {
58
+ sourceSchemaVersion: parsed.schemaVersion,
59
+ consistency: parsed.consistency,
60
+ operationalState: 'available',
61
+ };
62
+ }
63
+ async *stream(source, cursor) {
64
+ const parsed = await this.readSource(source);
65
+ const start = parseCursor(cursor?.value);
66
+ for (const record of parsed.records.slice(start))
67
+ yield record;
68
+ }
69
+ async readSource(source) {
70
+ if (source.locatorClass !== 'copilot-chat-json-export') {
71
+ throw new SessionContractError('UNSUPPORTED_OPERATION', 'Copilot workspace-store parsing is experimental and not enabled by this adapter');
72
+ }
73
+ const { value } = await readBoundedJson({
74
+ selectedPath: source.locator,
75
+ allowedRoots: source.authorizedScope.allowedRoots,
76
+ }, this.limits);
77
+ const parsed = ExportSchema.safeParse(value);
78
+ if (!parsed.success) {
79
+ throw new SessionContractError('MALFORMED_SOURCE', 'Copilot chat export is malformed');
80
+ }
81
+ const schemaVersion = declaredSchemaVersion(parsed.data);
82
+ assertSupportedSchemaMajor(schemaVersion);
83
+ return {
84
+ schemaVersion,
85
+ consistency: parsed.data.isArchived || parsed.data.state === 'archived'
86
+ || parsed.data.state === 'deleted' ? 'complete' : 'provisional',
87
+ records: normalizeExport(parsed.data, source.locator),
88
+ };
89
+ }
90
+ }
91
+ function normalizeExport(value, locator) {
92
+ const nativeSessionId = value.sessionId ?? basename(locator, extname(locator));
93
+ const lifecycle = value.isArchived || value.state === 'archived'
94
+ ? 'archived'
95
+ : value.state === 'deleted' ? 'deleted' : 'active';
96
+ const output = [];
97
+ for (const [requestIndex, request] of value.requests.entries()) {
98
+ const requestId = request.requestId ?? `request-${requestIndex}`;
99
+ output.push({
100
+ nativeSessionId,
101
+ nativeEventId: `${requestId}:request`,
102
+ sequence: requestIndex * 2,
103
+ kind: 'message',
104
+ role: 'user',
105
+ occurredAt: timestamp(request.timestamp ?? value.creationDate),
106
+ text: messageText(request),
107
+ rawReference: { locatorClass: 'copilot-chat-json-export', sequence: requestIndex },
108
+ extensions: commonExtensions(value, request, lifecycle, {
109
+ direction: 'request',
110
+ unknownFields: unknownFields(request, REQUEST_KEYS),
111
+ metadataLoss: [],
112
+ }),
113
+ });
114
+ const response = responseText(request);
115
+ if (response.text !== null) {
116
+ output.push({
117
+ nativeSessionId,
118
+ nativeEventId: `${requestId}:response`,
119
+ sequence: requestIndex * 2 + 1,
120
+ kind: 'message',
121
+ role: 'assistant',
122
+ occurredAt: timestamp(request.timestamp ?? value.lastMessageDate),
123
+ text: response.text,
124
+ rawReference: { locatorClass: 'copilot-chat-json-export', sequence: requestIndex },
125
+ extensions: commonExtensions(value, request, lifecycle, {
126
+ direction: 'response',
127
+ unknownFields: response.unknownFields,
128
+ metadataLoss: response.losses,
129
+ }),
130
+ });
131
+ }
132
+ }
133
+ return output;
134
+ }
135
+ function commonExtensions(value, request, lifecycle, event) {
136
+ return {
137
+ ...event,
138
+ lifecycle,
139
+ sync: {
140
+ status: value.syncStatus ?? 'unknown',
141
+ archiveState: value.isArchived ? 'archived' : 'not-reported',
142
+ deletionState: value.state === 'deleted' ? 'provider-reported' : 'not-reported',
143
+ },
144
+ workspace: {
145
+ id: value.workspace?.id,
146
+ repository: value.workspace?.repository,
147
+ },
148
+ model: request.modelId,
149
+ participants: {
150
+ requester: value.requesterUsername,
151
+ responder: value.responderUsername,
152
+ },
153
+ provenance: {
154
+ acquisition: 'vscode-chat-json-export',
155
+ schema: declaredSchemaVersion(value),
156
+ stableWorkspaceStoreDependency: false,
157
+ proposedApiDependency: false,
158
+ },
159
+ exportUnknownFields: unknownFields(value, EXPORT_KEYS),
160
+ };
161
+ }
162
+ function responseText(request) {
163
+ if (typeof request.response === 'string') {
164
+ return { text: request.response, losses: [], unknownFields: {} };
165
+ }
166
+ if (!request.response)
167
+ return { text: null, losses: [], unknownFields: {} };
168
+ const text = request.response
169
+ .map((part) => part.value)
170
+ .filter((part) => typeof part === 'string')
171
+ .join('\n\n');
172
+ const losses = request.response.flatMap((part, index) => (part.kind && part.kind !== 'markdownContent'
173
+ ? [{
174
+ field: `response[${index}]`,
175
+ reason: `structured ${part.kind} part flattened or retained as opaque metadata`,
176
+ }]
177
+ : []));
178
+ return {
179
+ text,
180
+ losses,
181
+ unknownFields: {
182
+ responseParts: request.response.map((part) => unknownFields(part, RESPONSE_KEYS)),
183
+ },
184
+ };
185
+ }
186
+ function messageText(request) {
187
+ return typeof request.message === 'string' ? request.message : request.message.text;
188
+ }
189
+ function declaredSchemaVersion(value) {
190
+ if (value.schemaVersion)
191
+ return value.schemaVersion;
192
+ const major = typeof value.version === 'number'
193
+ ? value.version
194
+ : Number(String(value.version).split('.')[0]);
195
+ if (!Number.isInteger(major) || major < 1) {
196
+ throw new SessionContractError('SCHEMA_DRIFT', 'invalid Copilot export version');
197
+ }
198
+ return `${major}.0.0`;
199
+ }
200
+ function timestamp(value) {
201
+ if (value === undefined)
202
+ return undefined;
203
+ const date = new Date(value);
204
+ return Number.isNaN(date.getTime()) ? undefined : date.toISOString();
205
+ }
206
+ function unknownFields(value, known) {
207
+ return Object.fromEntries(Object.entries(value).filter(([key]) => !known.has(key)).sort(([a], [b]) => a.localeCompare(b)));
208
+ }
209
+ function parseCursor(value) {
210
+ if (!value)
211
+ return 0;
212
+ if (!/^\d+$/.test(value)) {
213
+ throw new SessionContractError('SCHEMA_DRIFT', 'invalid Copilot record cursor');
214
+ }
215
+ return Number(value);
216
+ }
217
+ const EXPORT_KEYS = new Set([
218
+ 'version', 'schemaVersion', 'sessionId', 'creationDate', 'lastMessageDate',
219
+ 'requests', 'requesterUsername', 'responderUsername', 'state', 'isArchived',
220
+ 'syncStatus', 'workspace',
221
+ ]);
222
+ const REQUEST_KEYS = new Set([
223
+ 'requestId', 'message', 'response', 'timestamp', 'modelId',
224
+ ]);
225
+ const RESPONSE_KEYS = new Set(['value', 'kind']);
226
+ //# sourceMappingURL=copilot.js.map