1688-cli 0.1.40 → 0.1.42

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 (110) hide show
  1. package/AGENTS.md +112 -318
  2. package/ARCHITECTURE.md +106 -0
  3. package/CHANGELOG.md +107 -0
  4. package/README.md +100 -10
  5. package/dist/cli.js +165 -2
  6. package/dist/cli.js.map +1 -1
  7. package/dist/commands/cart-add.js +15 -11
  8. package/dist/commands/cart-add.js.map +1 -1
  9. package/dist/commands/cart-list.js +13 -11
  10. package/dist/commands/cart-list.js.map +1 -1
  11. package/dist/commands/compare.js +107 -0
  12. package/dist/commands/compare.js.map +1 -0
  13. package/dist/commands/debug.js +101 -0
  14. package/dist/commands/debug.js.map +1 -0
  15. package/dist/commands/doctor.js +107 -4
  16. package/dist/commands/doctor.js.map +1 -1
  17. package/dist/commands/image-search.js +2 -6
  18. package/dist/commands/image-search.js.map +1 -1
  19. package/dist/commands/inbox.js +16 -32
  20. package/dist/commands/inbox.js.map +1 -1
  21. package/dist/commands/offer.js +7 -5
  22. package/dist/commands/offer.js.map +1 -1
  23. package/dist/commands/order-list.js +4 -2
  24. package/dist/commands/order-list.js.map +1 -1
  25. package/dist/commands/order-logistics.js +4 -2
  26. package/dist/commands/order-logistics.js.map +1 -1
  27. package/dist/commands/profile.js +84 -0
  28. package/dist/commands/profile.js.map +1 -0
  29. package/dist/commands/research.js +142 -0
  30. package/dist/commands/research.js.map +1 -0
  31. package/dist/commands/search.js +157 -111
  32. package/dist/commands/search.js.map +1 -1
  33. package/dist/commands/seller-messages.js +7 -4
  34. package/dist/commands/seller-messages.js.map +1 -1
  35. package/dist/commands/similar.js +2 -6
  36. package/dist/commands/similar.js.map +1 -1
  37. package/dist/commands/sourcing-utils.js +438 -0
  38. package/dist/commands/sourcing-utils.js.map +1 -0
  39. package/dist/commands/supplier-inspect.js +559 -0
  40. package/dist/commands/supplier-inspect.js.map +1 -0
  41. package/dist/commands/supplier-search.js +522 -0
  42. package/dist/commands/supplier-search.js.map +1 -0
  43. package/dist/daemon/client.js +2 -2
  44. package/dist/daemon/client.js.map +1 -1
  45. package/dist/daemon/protocol.js +2 -1
  46. package/dist/daemon/protocol.js.map +1 -1
  47. package/dist/io/output.js +31 -2
  48. package/dist/io/output.js.map +1 -1
  49. package/dist/session/config.js +82 -0
  50. package/dist/session/config.js.map +1 -0
  51. package/dist/session/dispatch.js +26 -3
  52. package/dist/session/dispatch.js.map +1 -1
  53. package/dist/session/events.js +151 -0
  54. package/dist/session/events.js.map +1 -0
  55. package/dist/session/im-cards.js +183 -0
  56. package/dist/session/im-cards.js.map +1 -0
  57. package/dist/session/im-ws.js +8 -5
  58. package/dist/session/im-ws.js.map +1 -1
  59. package/dist/session/navigation-guard.js +65 -0
  60. package/dist/session/navigation-guard.js.map +1 -0
  61. package/dist/session/paths.js +23 -4
  62. package/dist/session/paths.js.map +1 -1
  63. package/dist/session/search-capture.js +56 -6
  64. package/dist/session/search-capture.js.map +1 -1
  65. package/dist/session/search-mtop.js +53 -0
  66. package/dist/session/search-mtop.js.map +1 -1
  67. package/dist/session/supplier-search.js +403 -0
  68. package/dist/session/supplier-search.js.map +1 -0
  69. package/dist/util/encoding.js +8 -0
  70. package/dist/util/encoding.js.map +1 -0
  71. package/dist/util/temp.js +6 -0
  72. package/dist/util/temp.js.map +1 -0
  73. package/docs/AGENT_MAPS_PLAN.md +171 -0
  74. package/docs/AGENT_WORKING_PRINCIPLES.md +143 -0
  75. package/docs/COMMANDS.md +199 -0
  76. package/docs/FEATURES.md +45 -0
  77. package/docs/JSON_CONTRACTS.md +390 -0
  78. package/docs/QUALITY_SCORE.md +60 -0
  79. package/docs/README.md +35 -0
  80. package/docs/RELIABILITY.md +61 -0
  81. package/docs/SAFETY.md +100 -0
  82. package/docs/WORKFLOW.md +82 -0
  83. package/docs/exec-plans/README.md +9 -0
  84. package/docs/exec-plans/active/README.md +4 -0
  85. package/docs/exec-plans/completed/2026-05-28-sourcing-research-v1.md +125 -0
  86. package/docs/exec-plans/completed/2026-05-31-supplier-inspect-v1.md +113 -0
  87. package/docs/exec-plans/completed/2026-06-04-supplier-search-v1.md +81 -0
  88. package/docs/exec-plans/completed/2026-06-07-windows-cli-compatibility.md +138 -0
  89. package/docs/exec-plans/completed/README.md +4 -0
  90. package/docs/exec-plans/tech-debt-tracker.md +5 -0
  91. package/docs/generated/command-index.md +54 -0
  92. package/docs/generated/json-shapes.md +111 -0
  93. package/docs/generated/module-map.md +13 -0
  94. package/docs/generated/test-index.md +34 -0
  95. package/docs/playbooks/add-command.md +15 -0
  96. package/docs/playbooks/add-mtop-capture.md +13 -0
  97. package/docs/playbooks/change-json-output.md +11 -0
  98. package/docs/playbooks/debug-risk-control.md +12 -0
  99. package/docs/playbooks/update-cli-release.md +11 -0
  100. package/docs/specs/checkout-and-orders.md +30 -0
  101. package/docs/specs/seller-im.md +28 -0
  102. package/docs/specs/sourcing-research.md +186 -0
  103. package/docs/specs/supplier-inspect.md +144 -0
  104. package/docs/specs/supplier-search.md +179 -0
  105. package/docs/specs/windows-cli-compatibility.md +123 -0
  106. package/package.json +12 -2
  107. package/scripts/check_agent_map.mjs +86 -0
  108. package/scripts/fix_bin_mode.mjs +18 -0
  109. package/scripts/generate_agent_context.mjs +253 -0
  110. package/scripts/postinstall.mjs +12 -4
@@ -0,0 +1,403 @@
1
+ import { waitWithDeadline } from './wait.js';
2
+ export const COMPANY_SEARCH_SERVICE = 'companySearchBusinessService';
3
+ export function readSupplierSearchRequestMeta(url) {
4
+ if (!url.includes(COMPANY_SEARCH_SERVICE))
5
+ return null;
6
+ const parsed = new URL(url);
7
+ const beginPage = numberFromSearch(parsed.searchParams.get('beginPage'));
8
+ const pageSize = numberFromSearch(parsed.searchParams.get('pageSize'));
9
+ return {
10
+ ...(beginPage !== null ? { beginPage } : {}),
11
+ ...(pageSize !== null ? { pageSize } : {}),
12
+ ...(parsed.searchParams.get('keywords')
13
+ ? { keywords: parsed.searchParams.get('keywords') ?? undefined }
14
+ : {}),
15
+ ...(parsed.searchParams.get('pageName')
16
+ ? { pageName: parsed.searchParams.get('pageName') ?? undefined }
17
+ : {}),
18
+ };
19
+ }
20
+ export function parseSupplierItemsFromCompanySearchText(text) {
21
+ return parseCompanySearchServiceText(text).suppliers;
22
+ }
23
+ export function parseCompanySearchServiceText(text) {
24
+ const root = asRecord(parseJsonLike(text));
25
+ const topData = asRecord(root?.data);
26
+ const payload = asRecord(topData?.data);
27
+ const rawItems = asArray(payload?.companyWithOfferLists);
28
+ return {
29
+ suppliers: rawItems
30
+ .map(mapSupplierWrapper)
31
+ .filter((s) => s !== null),
32
+ pageCount: toNumber(payload?.pageCount),
33
+ docsReturn: toNumber(payload?.docsReturn),
34
+ code: toNumber(topData?.code),
35
+ message: toStringOrNull(topData?.msg),
36
+ requestId: toStringOrNull(root?.requestId),
37
+ pageName: toStringOrNull(root?.pageName),
38
+ rtTime: toNumber(root?.rtTime),
39
+ };
40
+ }
41
+ export function startSupplierSearchCapture(opts) {
42
+ const maxDiagnosticsEntries = 5;
43
+ const startedAt = new Date().toISOString();
44
+ let endedAt;
45
+ let disposed = false;
46
+ let pageClosed = false;
47
+ let finalStatus;
48
+ let timedOut = false;
49
+ let data = null;
50
+ let bestPayloadSize = 0;
51
+ let lastParsedAt = 0;
52
+ let seenCount = 0;
53
+ let matchedCount = 0;
54
+ let parsedCount = 0;
55
+ let lastSeenUrl;
56
+ let lastMatchedUrl;
57
+ let lastParsedUrl;
58
+ let lastError;
59
+ const failures = [];
60
+ const errorInfo = (error) => {
61
+ if (error instanceof Error) {
62
+ return { name: error.name, message: error.message };
63
+ }
64
+ return { message: String(error) };
65
+ };
66
+ const recordFailure = (url, error) => {
67
+ const info = errorInfo(error);
68
+ lastError = info;
69
+ failures.push({
70
+ at: new Date().toISOString(),
71
+ url,
72
+ ...info,
73
+ });
74
+ if (failures.length > maxDiagnosticsEntries)
75
+ failures.shift();
76
+ };
77
+ const diagnostics = () => ({
78
+ startedAt,
79
+ endedAt,
80
+ disposed,
81
+ finalStatus,
82
+ timedOut,
83
+ seenCount,
84
+ matchedCount,
85
+ parsedCount,
86
+ failureCount: failures.length,
87
+ lastSeenUrl,
88
+ lastMatchedUrl,
89
+ lastParsedUrl,
90
+ lastError,
91
+ failures: [...failures],
92
+ });
93
+ const onResponse = async (resp) => {
94
+ if (disposed)
95
+ return;
96
+ const url = resp.url();
97
+ seenCount++;
98
+ lastSeenUrl = url;
99
+ try {
100
+ const meta = readSupplierSearchRequestMeta(url);
101
+ if (!meta)
102
+ return;
103
+ const targetPage = opts.targetPage?.();
104
+ if (targetPage !== undefined && (meta.beginPage ?? 1) !== targetPage)
105
+ return;
106
+ matchedCount++;
107
+ lastMatchedUrl = url;
108
+ const text = await resp.text();
109
+ const parsed = parseCompanySearchServiceText(text);
110
+ if (parsed.suppliers.length === 0)
111
+ return;
112
+ const shouldReplace = !data ||
113
+ opts.keep !== 'largest' ||
114
+ parsed.suppliers.length > data.suppliers.length ||
115
+ (parsed.suppliers.length === data.suppliers.length &&
116
+ text.length > bestPayloadSize);
117
+ if (shouldReplace) {
118
+ data = parsed;
119
+ bestPayloadSize = text.length;
120
+ }
121
+ parsedCount++;
122
+ lastParsedAt = Date.now();
123
+ lastParsedUrl = url;
124
+ }
125
+ catch (error) {
126
+ recordFailure(url, error);
127
+ }
128
+ };
129
+ const onClose = () => {
130
+ pageClosed = true;
131
+ finalStatus ??= 'browser_closed';
132
+ endedAt ??= new Date().toISOString();
133
+ };
134
+ const dispose = () => {
135
+ if (disposed)
136
+ return;
137
+ disposed = true;
138
+ endedAt ??= new Date().toISOString();
139
+ opts.page.off('response', onResponse);
140
+ opts.page.off('close', onClose);
141
+ };
142
+ const wait = async (optsWait) => {
143
+ const settleMs = optsWait.settleMs ?? 1200;
144
+ const result = await waitWithDeadline(async (state) => {
145
+ if (pageClosed || optsWait.isClosed?.())
146
+ return 'browser_closed';
147
+ if (data && state.now - lastParsedAt >= settleMs)
148
+ return 'captured';
149
+ if (await optsWait.isBlocked?.())
150
+ return 'blocked';
151
+ if (disposed)
152
+ return 'stream_closed';
153
+ return null;
154
+ }, {
155
+ timeoutMs: optsWait.timeoutMs,
156
+ intervalMs: optsWait.intervalMs ?? 300,
157
+ onTimeout: () => (data ? 'captured' : 'timeout'),
158
+ });
159
+ finalStatus = result;
160
+ timedOut = result === 'timeout';
161
+ endedAt ??= new Date().toISOString();
162
+ return { status: result, data, diagnostics: diagnostics() };
163
+ };
164
+ const waitForAction = async (action, optsWait) => {
165
+ try {
166
+ const actionResult = await action();
167
+ const result = await wait(optsWait);
168
+ return {
169
+ actionResult,
170
+ status: result.status,
171
+ data: result.data,
172
+ diagnostics: result.diagnostics,
173
+ };
174
+ }
175
+ finally {
176
+ dispose();
177
+ }
178
+ };
179
+ opts.page.on('response', onResponse);
180
+ opts.page.on('close', onClose);
181
+ return {
182
+ wait,
183
+ waitForAction,
184
+ dispose,
185
+ diagnostics,
186
+ data: () => data,
187
+ };
188
+ }
189
+ function mapSupplierWrapper(raw) {
190
+ const wrapper = asRecord(raw);
191
+ const company = asRecord(wrapper?.companyModel);
192
+ const brand = asRecord(wrapper?.companyBrandSiteVO);
193
+ if (!wrapper || !company)
194
+ return null;
195
+ const companyName = toStringOrNull(company.company) ??
196
+ toStringOrNull(brand?.companyName) ??
197
+ toStringOrNull(brand?.company) ??
198
+ '';
199
+ if (!companyName)
200
+ return null;
201
+ const enterpriseId = toStringOrNull(company.enterpriseId);
202
+ const memberId = normalizeMemberId(toStringOrNull(company.userId) ?? enterpriseId ?? toStringOrNull(wrapper.memberId));
203
+ const domainUri = toStringOrNull(company.domainUri);
204
+ const shopUrl = normalizeUrl(toStringOrNull(brand?.url)) ??
205
+ normalizeDomainUrl(domainUri);
206
+ const factoryTag = toStringOrNull(wrapper.factoryTag) ?? toStringOrNull(company.factoryTag);
207
+ const factoryLevel = toStringOrNull(company.factoryLevel);
208
+ const factoryLevelIsFactory = factoryLevel !== null && /工厂|厂/.test(factoryLevel);
209
+ const shiliFactory = toBool(wrapper.shiliFactory);
210
+ const superFactory = toBool(wrapper.superFactory);
211
+ const factoryInspection = toBool(wrapper.factoryInspection);
212
+ const isFactory = toBool(company.isFactory) ||
213
+ shiliFactory ||
214
+ superFactory ||
215
+ factoryInspection ||
216
+ factoryLevelIsFactory ||
217
+ !!factoryTag;
218
+ return {
219
+ companyName,
220
+ loginId: toStringOrNull(company.loginId),
221
+ memberId,
222
+ enterpriseId,
223
+ realUserId: toStringOrNull(company.realUserId),
224
+ companyId: toStringOrNull(company.id),
225
+ shopUrl,
226
+ factoryCardUrl: memberId
227
+ ? `https://sale.1688.com/factory/card.html?memberId=${encodeURIComponent(memberId)}`
228
+ : null,
229
+ domainUri,
230
+ location: {
231
+ province: toStringOrNull(company.province),
232
+ city: toStringOrNull(company.city),
233
+ address: toStringOrNull(company.address),
234
+ latitude: toNumber(company.latitude),
235
+ longitude: toNumber(company.longitude),
236
+ },
237
+ productionService: toStringOrNull(company.productionService),
238
+ businessMode: toStringOrNull(company.businessMode),
239
+ tp: {
240
+ memberLevel: toStringOrNull(company.memberLevel),
241
+ serviceYears: toNumber(company.tpServiceYear),
242
+ tpNum: toNumber(company.tpNum),
243
+ },
244
+ factory: {
245
+ isFactory,
246
+ factoryTag,
247
+ factoryLevel,
248
+ shiliFactory,
249
+ shiliCompany: toBool(wrapper.shiliCompany),
250
+ superFactory,
251
+ businessInspection: toBool(wrapper.businessInspection),
252
+ factoryInspection,
253
+ qiJianCompany: toBool(wrapper.qiJianCompany),
254
+ safePurchase: toBool(wrapper.safePurchase),
255
+ trust: toBool(wrapper.trust),
256
+ },
257
+ service: {
258
+ compositeScore: toNumber(company.compositeNewScore),
259
+ wwResponseRate: toNumber(company.wwResponseRate),
260
+ repeatRate: toNumber(company.repeatRate),
261
+ complianceRate: toNumber(company.complianceRate),
262
+ },
263
+ demand: {
264
+ payOrderCount3m: toNumber(company.payMordCnt3Month),
265
+ payAmount3m: toNumber(company.payOrdAmt3m),
266
+ fuzzyPayAmount3m: toStringOrNull(wrapper.fuzzyPayOrdAmt3m),
267
+ saleQuantity3m: toNumber(company.saleQuantity3Month),
268
+ memberBookedCount: toNumber(wrapper.memberBookedCount),
269
+ },
270
+ tags: uniqueStrings([
271
+ ...splitTags(toStringOrNull(company.memberTags)),
272
+ ...splitTags(toStringOrNull(company.productionService)),
273
+ factoryTag,
274
+ factoryLevel,
275
+ toStringOrNull(company.memberLevel),
276
+ ]),
277
+ offersPreview: asArray(wrapper.companyOffers)
278
+ .map(mapOfferPreview)
279
+ .filter((o) => o !== null),
280
+ };
281
+ }
282
+ function mapOfferPreview(raw) {
283
+ const offer = asRecord(raw);
284
+ if (!offer)
285
+ return null;
286
+ const title = cleanText(toStringOrNull(offer.subject) ?? '');
287
+ if (!title)
288
+ return null;
289
+ const url = normalizeUrl(toStringOrNull(offer.detailUrl));
290
+ const offerId = toStringOrNull(offer.offerId) ??
291
+ (url ? url.match(/\/offer\/(\d+)\.html/)?.[1] ?? null : null);
292
+ const priceValue = toNumber(offer.price);
293
+ return {
294
+ offerId,
295
+ title,
296
+ url,
297
+ price: {
298
+ text: priceValue !== null ? `¥${priceValue}` : toStringOrNull(offer.price),
299
+ value: priceValue,
300
+ },
301
+ unit: toStringOrNull(offer.unit),
302
+ image: normalizeUrl(toStringOrNull(offer.picUrl)),
303
+ bookedCount: toNumber(offer.bookedCount),
304
+ saleQuantity: toNumber(offer.saleQuantity),
305
+ quantitySumMonth: toNumber(offer.quantitySumMonth),
306
+ brief: cleanText(toStringOrNull(offer.brief) ?? '') || null,
307
+ };
308
+ }
309
+ function parseJsonLike(text) {
310
+ const trimmed = text.trim();
311
+ try {
312
+ return JSON.parse(trimmed);
313
+ }
314
+ catch {
315
+ const match = trimmed.match(/^[\w$.]+\((.*)\);?$/s);
316
+ if (!match?.[1])
317
+ throw new Error('Company search response is not JSON.');
318
+ return JSON.parse(match[1]);
319
+ }
320
+ }
321
+ function asRecord(value) {
322
+ return value && typeof value === 'object' && !Array.isArray(value)
323
+ ? value
324
+ : null;
325
+ }
326
+ function asArray(value) {
327
+ return Array.isArray(value) ? value : [];
328
+ }
329
+ function toStringOrNull(value) {
330
+ if (typeof value === 'string') {
331
+ const trimmed = cleanText(value);
332
+ return trimmed || null;
333
+ }
334
+ if (typeof value === 'number' || typeof value === 'boolean') {
335
+ return String(value);
336
+ }
337
+ return null;
338
+ }
339
+ function toNumber(value) {
340
+ if (typeof value === 'number')
341
+ return Number.isFinite(value) ? value : null;
342
+ if (typeof value !== 'string')
343
+ return null;
344
+ const cleaned = value.replace(/,/g, '').trim();
345
+ if (!cleaned || cleaned === '-1')
346
+ return null;
347
+ const n = Number(cleaned);
348
+ return Number.isFinite(n) ? n : null;
349
+ }
350
+ function numberFromSearch(value) {
351
+ if (value === null)
352
+ return null;
353
+ return toNumber(value);
354
+ }
355
+ function toBool(value) {
356
+ if (typeof value === 'boolean')
357
+ return value;
358
+ if (typeof value === 'number')
359
+ return value === 1;
360
+ if (typeof value === 'string') {
361
+ const normalized = value.trim().toLowerCase();
362
+ return ['true', '1', 'y', 'yes', '是'].includes(normalized);
363
+ }
364
+ return false;
365
+ }
366
+ function cleanText(value) {
367
+ return value.replace(/<\/?font[^>]*>/g, '').replace(/\s+/g, ' ').trim();
368
+ }
369
+ function normalizeMemberId(value) {
370
+ if (!value)
371
+ return null;
372
+ if (value.startsWith('a-b2b-'))
373
+ return value.slice(2);
374
+ if (value.startsWith('b2b-'))
375
+ return value;
376
+ return null;
377
+ }
378
+ function normalizeDomainUrl(value) {
379
+ if (!value)
380
+ return null;
381
+ return normalizeUrl(value.includes('://') || value.startsWith('//') ? value : `https://${value}`);
382
+ }
383
+ function normalizeUrl(value) {
384
+ if (!value)
385
+ return null;
386
+ if (value.startsWith('//'))
387
+ return `https:${value}`;
388
+ if (/^https?:\/\//i.test(value))
389
+ return value;
390
+ return null;
391
+ }
392
+ function splitTags(value) {
393
+ if (!value)
394
+ return [];
395
+ return value
396
+ .split(/[;;,,|]/)
397
+ .map((s) => s.trim())
398
+ .filter((s) => !!s && !/^\d+$/.test(s));
399
+ }
400
+ function uniqueStrings(values) {
401
+ return [...new Set(values.filter((v) => !!v))];
402
+ }
403
+ //# sourceMappingURL=supplier-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supplier-search.js","sourceRoot":"","sources":["../../src/session/supplier-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import iconv from 'iconv-lite';
2
+ export function encodeGbkPercent(input) {
3
+ const gbkBytes = iconv.encode(input, 'gbk');
4
+ return Array.from(gbkBytes)
5
+ .map((b) => '%' + b.toString(16).padStart(2, '0').toUpperCase())
6
+ .join('');
7
+ }
8
+ //# sourceMappingURL=encoding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../src/util/encoding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5C,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;SACxB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;SAC/D,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC"}
@@ -0,0 +1,6 @@
1
+ import os from 'node:os';
2
+ import path from 'node:path';
3
+ export function debugTmpPath(filename) {
4
+ return path.join(os.tmpdir(), filename);
5
+ }
6
+ //# sourceMappingURL=temp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temp.js","sourceRoot":"","sources":["../../src/util/temp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,171 @@
1
+ # Agent Maps Plan
2
+
3
+ Date: 2026-05-28
4
+
5
+ ## Sources Reviewed
6
+
7
+ - OpenAI: <https://openai.com/zh-Hans-CN/index/harness-engineering/>
8
+ - Reference repo: `/Users/nobodyjack2050/code/go-backend`
9
+
10
+ ## OpenAI Article Takeaways
11
+
12
+ The article's core lesson is that agent-first engineering needs maps and
13
+ feedback loops more than huge instruction files. The useful pattern is:
14
+
15
+ - Keep `AGENTS.md` short. It should be a table of contents and routing layer,
16
+ not a full manual.
17
+ - Put durable knowledge in versioned repo files, especially `docs/`, because
18
+ knowledge outside the repo is invisible to agents.
19
+ - Use progressive disclosure: start agents at a small map, then point them to
20
+ the precise product spec, playbook, architecture note, or generated index.
21
+ - Make the app and repo readable to agents: logs, metrics, traces, screenshots,
22
+ DOM state, generated indexes, and reproducible commands should all be
23
+ queryable.
24
+ - Encode taste and architecture as mechanical checks where possible. Guidance
25
+ that matters repeatedly should become lint, tests, generated docs checks, or
26
+ verification commands.
27
+ - Treat plans as first-class repo artifacts for complex work so progress,
28
+ decisions, and blockers survive conversation loss.
29
+ - Add recurring cleanup. As agent throughput rises, drift becomes normal unless
30
+ quality rules and doc-gardening are part of the system.
31
+
32
+ ## go-backend Agent Map Pattern
33
+
34
+ `go-backend` implements this pattern with several concrete artifacts:
35
+
36
+ - `AGENTS.md`: short "Agent Map" with first-read links, project shape, common
37
+ commands, task routing, hard rules, and done criteria.
38
+ - `ARCHITECTURE.md`: system map with layer responsibilities, dependency rules,
39
+ major domains, generated code rules, and verification surfaces.
40
+ - `docs/README.md`: documentation map and maintenance rules.
41
+ - `docs/specs`, `docs/design-docs`, `docs/integrations`,
42
+ `docs/playbooks`, `docs/references`: durable context split by use.
43
+ - `docs/exec-plans/active` and `docs/exec-plans/completed`: long-running
44
+ state for complex work.
45
+ - `docs/generated/*`: generated repo indexes such as API, proto, DB schema,
46
+ package map, test index, and OpenAPI summary.
47
+ - `scripts/generate_agent_context.sh`: builds generated indexes.
48
+ - `make agent-context`, `make agent-verify`, `make eval-agent`: standard
49
+ commands for regenerating context and proving agent-readiness.
50
+ - `docs/evals/graders/agent-map.sh`: deterministic check that the map exists
51
+ and points to verification/playbooks.
52
+ - `docs/QUALITY_SCORE.md`: blunt scorecard for agent-readiness and known gaps.
53
+
54
+ The important design choice is not the exact file names. It is the loop:
55
+ small map -> routed docs -> generated indexes -> mechanical verification ->
56
+ quality score -> cleanup.
57
+
58
+ ## Proposed Agent Maps For 1688-cli
59
+
60
+ `1688-cli` should use a smaller version of the same system. This repo is a
61
+ TypeScript CLI with browser automation, daemon IPC, JSON contracts, and real
62
+ buyer write actions, so the map should emphasize command ownership, output
63
+ shape stability, risk-control recovery, and approval boundaries.
64
+
65
+ ### Target Structure
66
+
67
+ ```text
68
+ AGENTS.md
69
+ ARCHITECTURE.md
70
+ docs/
71
+ README.md
72
+ WORKFLOW.md
73
+ COMMANDS.md
74
+ JSON_CONTRACTS.md
75
+ SAFETY.md
76
+ RELIABILITY.md
77
+ QUALITY_SCORE.md
78
+ specs/
79
+ sourcing-research.md
80
+ seller-im.md
81
+ checkout-and-orders.md
82
+ playbooks/
83
+ add-command.md
84
+ change-json-output.md
85
+ debug-risk-control.md
86
+ add-mtop-capture.md
87
+ update-cli-release.md
88
+ generated/
89
+ command-index.md
90
+ module-map.md
91
+ test-index.md
92
+ json-shapes.md
93
+ exec-plans/
94
+ active/
95
+ completed/
96
+ tech-debt-tracker.md
97
+ scripts/
98
+ generate_agent_context.mjs
99
+ check_agent_map.mjs
100
+ ```
101
+
102
+ ### `AGENTS.md` Target Role
103
+
104
+ Keep only the short, high-signal contract:
105
+
106
+ - First read: `ARCHITECTURE.md`, `docs/README.md`, `docs/SAFETY.md`,
107
+ `docs/COMMANDS.md`, and `docs/JSON_CONTRACTS.md`.
108
+ - Project shape: `src/commands`, `src/session`, `src/daemon`, `src/io`,
109
+ `src/auth`, `src/util`.
110
+ - Common commands: `pnpm build`, `pnpm test`, `pnpm typecheck`, future
111
+ `pnpm agent-context`, future `pnpm agent-verify`.
112
+ - Task routing: new command, JSON shape change, browser/session flow,
113
+ daemon/protocol change, checkout/order safety, seller IM, release/update.
114
+ - Hard rules: never place orders without prepare plus current-turn approval,
115
+ never silently retry login/risk-control loops, preserve JSON compatibility,
116
+ do not handwave browser verification failures.
117
+
118
+ The current detailed CLI operation contract can move into `docs/COMMANDS.md`,
119
+ `docs/JSON_CONTRACTS.md`, and `docs/SAFETY.md`.
120
+
121
+ ### Generated Context
122
+
123
+ `scripts/generate_agent_context.mjs` should generate:
124
+
125
+ - `docs/generated/command-index.md`: Commander commands/options from
126
+ `src/cli.ts`, mapped to `src/commands/*.ts`.
127
+ - `docs/generated/module-map.md`: top-level source directories and file counts.
128
+ - `docs/generated/test-index.md`: test files, if present, plus risk notes for
129
+ browser/session/integration-style tests.
130
+ - `docs/generated/json-shapes.md`: exported result interfaces from command
131
+ modules, especially stable agent-facing payloads.
132
+
133
+ This gives agents a fast way to understand the repo without reading every file.
134
+
135
+ ### Verification Gate
136
+
137
+ Add scripts/Make targets roughly equivalent to:
138
+
139
+ ```bash
140
+ pnpm agent-context # generate docs/generated/*
141
+ pnpm agent-verify # typecheck, tests, generated docs freshness, agent map check
142
+ pnpm eval-agent # deterministic repo-specific graders, later
143
+ ```
144
+
145
+ Initial `agent-verify` can stay modest:
146
+
147
+ - `pnpm typecheck`
148
+ - `pnpm test`
149
+ - generate context and fail if `docs/generated/*` changes
150
+ - check that `AGENTS.md`, `ARCHITECTURE.md`, `docs/README.md`, and core
151
+ playbooks exist
152
+
153
+ ### Rollout Order
154
+
155
+ 1. Add `docs/README.md`, `ARCHITECTURE.md`, `docs/COMMANDS.md`,
156
+ `docs/JSON_CONTRACTS.md`, `docs/SAFETY.md`, and `docs/WORKFLOW.md`.
157
+ 2. Move durable detail out of `AGENTS.md`, keeping `AGENTS.md` as a concise
158
+ routing map.
159
+ 3. Add `scripts/generate_agent_context.mjs` and generated indexes.
160
+ 4. Add `agent-context` and `agent-verify` package scripts.
161
+ 5. Add playbooks for the workflows that repeat most often.
162
+ 6. Add `QUALITY_SCORE.md` and update it whenever the map reveals a new gap.
163
+
164
+ ## Open Questions
165
+
166
+ - Whether to preserve the current long `AGENTS.md` for external skill registry
167
+ compatibility, or split it while keeping a compact compatibility section.
168
+ - Whether generated JSON-shape docs should parse TypeScript AST or start with a
169
+ simple regex-based extractor.
170
+ - Whether browser/risk-control verification should be part of the default gate
171
+ or a separate live/manual gate.