@petercjl/taobao-ai-ops 0.3.0 → 0.3.1

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/README.md CHANGED
@@ -26,6 +26,7 @@ SealSeek 用户改用 --agent sealseek。目标有歧义时通过 SEALSEEK_SKILL
26
26
  - @petercjl/sycmcli:店铺经营数据工具,含其独立 Skill。
27
27
  - @petercjl/commerce-ui:通用 HTML 报告 Skill、模板、渲染与校验。调用 `taobao-ai-ops component run html-report ...`;Python 依赖不足时通过该入口执行 `runtime install --yes`。
28
28
  - @petercjl/procli:项目 SOP、任务依赖与成果归档,配套 `project-management` Skill。任务卡组织工作,项目 Wiki 积累可复用的证据与结论。
29
+ - @petercjl/sealseek-media-cli:生图、生视频、已有素材贴入及画板操作,配套 `sealseek-media` Skill。应用层负责素材选择与布局;接入不修改宿主的默认生图生视频路由。该组件需要 Node.js >=22。
29
30
  - taobao-ai-operations:套件自带的管理与业务路由 Skill。
30
31
 
31
32
  yccli 为取数时按需准备的外部工具,可用 TAOBAO_AI_OPS_YCCLI 指定;Excel 分析不需要 NAS、VPN 或平台登录。账号与授权留在包外,安装不会获得服务权限。
@@ -52,6 +53,8 @@ taobao-ai-ops components check --json
52
53
  taobao-ai-ops skill source --name yuce-category-opportunity-report --json
53
54
  taobao-ai-ops script category-research build_report.py --help
54
55
  taobao-ai-ops tool run tbcli capabilities --json
56
+ taobao-ai-ops skill source --name sealseek-media --json
57
+ taobao-ai-ops component run sealseek-media capabilities --json
55
58
  ```
56
59
 
57
60
  维护者分别发布各能力包的正式 latest。新增/移除组件或调整管理机制时才发布套件。源码开发可通过 components register --name ID --path CHECKOUT --yes 注册独立组件;开发记录由 Git 管理,不会被注册表更新覆盖。已安装 npm 组件的显式接入可加 --mode npm。源码套件自身通过 Git 更新。
@@ -60,6 +63,8 @@ Node >=20。Python 研究依赖通过稳定解释器准备;TAOBAO_AI_OPS_PYTHO
60
63
 
61
64
  本地 macOS 确定性安装、更新与恢复测试单独记录;Windows/SealSeek 的真实宿主安装和端到端行为尚待验证。CI 发布前须先有可安装的类目独立包;所有发布通过 GitHub Actions OIDC。
62
65
 
66
+ The independent `competitor-visual-canvas` component collects Taobao/Tmall visual media into regional SealSeek Frames. Select its node for new collection or append; it owns application layout/state and uses the registered capability dependencies. WorkBuddy accepts the same suite lifecycle through `--agent workbuddy`; host execution evidence remains separate.
67
+
63
68
  ## Audio production
64
69
 
65
70
  The `seedaudio-tools` node registers the independent `@petercjl/seedaudiocli` package and its canonical `seedaudiocli` Skill. Install with `taobao-ai-ops skill install --agent codex --name seedaudiocli` (or the actual SealSeek target). Discover its source with `taobao-ai-ops skill source --name seedaudiocli --json`, read the complete current Skill and relative resources, then invoke `taobao-ai-ops component run seedaudiocli ...` or `tool run seedaudiocli ...`. Return task IDs and output files to the caller's audio acceptance flow. A missing component requires `components install --agent AGENT --yes`; missing credentials require importing the administrator-provided file through the component CLI.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@petercjl/taobao-ai-ops",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "Independent Taobao AI operations SOP skills with a managed suite lifecycle",
5
5
  "repository": {
6
6
  "type": "git",
@@ -5,7 +5,7 @@ description: Route Taobao research to independent tools, preserve evidence hando
5
5
 
6
6
  # Taobao AI operations
7
7
 
8
- Input: an operator's goal, supplied workbooks or authorized data sources, optional existing research and run directory. Output: the selected node's full deliverables, a versioned run plan and, when requested, an evidence-bound handoff. This suite currently implements category research and product research. Supply-chain validation, content creation and operating reviews are planned extensions reported as unavailable until registered.
8
+ Input: an operator's goal, supplied workbooks or authorized data sources, optional existing research and run directory. Output: the selected node's full deliverables, a versioned run plan and, when requested, an evidence-bound handoff. This suite currently implements category research and product research, with independently registered media/canvas capability tools. Supply-chain validation, content creation and operating reviews are planned extensions reported as unavailable until registered.
9
9
 
10
10
  ## Main line
11
11
 
@@ -26,6 +26,12 @@ Tasks organize SOP work, dependencies, responsibility and acceptance; Wiki prese
26
26
 
27
27
  When the user explicitly authorizes archiving to an exact project/task, prepare the current child's publication bundle, preserving the complete report and its evidence, and use `task publish`: preview, inspect the target and coverage, then publish with the same bundle/key and verify readback. Existing sources require cumulative synthesis with source citations. The child owns DingTalk creation, optional HTML attachment, full report Wiki, cumulative node knowledge and task-card summary; the Agent owns evidence-based meaning. Handle partial/unknown writes only through the child's recovery flow. Ordinary `task update` is a field edit, and publication is separate from submission/reviewer approval. The shell neither copies these business rules into runtime code nor automatically executes every SOP node. New tools can join project workflows through these contracts while retaining independent analysis methods.
28
28
 
29
+ ## SealSeek media and canvas capability
30
+
31
+ The `sealseek-media-tools` node registers `@petercjl/sealseek-media-cli` and its canonical `sealseek-media` Skill. For an explicitly routed SealSeek media/canvas operation, resolve `taobao-ai-ops skill source --name sealseek-media --json`, read the complete current Skill and active adapter, then discover the installed child contract through `taobao-ai-ops component run sealseek-media capabilities --json`. Invoke operations through that component entry, retaining the child's arguments and authorization requirements. Node.js 22+ is required for this component; installation does not authorize access to SealSeek.
32
+
33
+ Contract: explicit prompt/references or existing-media URLs, canvas identity, placement and operation authorization in; task/element identifiers, verified writes or structured errors out. Applications own asset selection, prompts, layouts and project state; the child owns service execution, authentication, validation and recovery. Provider and model selection follow the host/user policy. Registering this component changes no image/video default routes. Ordinary component calls retain installed versions; use the shell update path for managed components. Return to main-line step 4 with the operation result, or step 6 for a direct capability request. The independently released competitor-visual application is registered as `competitor-visual-canvas`.
34
+
29
35
  ## Execution and branches
30
36
 
31
37
  Component scripts run via `taobao-ai-ops script NODE SCRIPT ...`; supplied Excel does not require platform accounts. Optional platform calls use `taobao-ai-ops tool run TOOL ...` so the shell selects the installed independent component. Accounts, warehouse access and write permissions remain external. The category child's database-consent and additive-import boundaries apply in its NAS route.
@@ -44,6 +50,10 @@ Missing native image observation stops product visual analysis; an unverified su
44
50
 
45
51
  Confirm the selected node, actual source path, method version, source hashes and full output contract. Keep every Skill's tests independent and exercise suite installation, dependency closure and handoffs separately. Suite targets are implemented, with actual Agent/OS runtime evidence recorded separately. Clean-context regression requires an explicit user request. New business nodes enter the suite registry only with an independent I → S → O, execution and QA contract.
46
52
 
53
+ ## Competitor visual collection
54
+
55
+ A request to collect product main images, main videos, SKU images and detail images into Infinite Canvas selects `competitor-visual-canvas`. Resolve `taobao-ai-ops skill source --name competitor-visual-canvas --json`, read its complete current Skill and active adapter, then follow its main line through `taobao-ai-ops component run competitor-visual-canvas ...`. The child accepts Taobao IDs or Taobao/Tmall links, owns the media manifest, four regional Frames per product, layout and append state, and returns source evidence, verified canvas URL and coverage gaps. Its exact dependencies are `tbcli` and `sealseek-media`, loaded at runtime through the child's declared tool resolver; it ships compatible npm dependency versions. Authentication, validation and writes stay with those capability packages. Missing collection or canvas capability stops the affected node with CAPABILITY_UNAVAILABLE; do not duplicate its integrations. Return to main-line step 4 for optional continuity or step 6 for delivery. Ordinary requests add to the child's selected existing canvas when asked to continue; new canvas creation follows the child's explicit user intent.
56
+
47
57
  ## Audio production
48
58
 
49
59
  The `seedaudio-tools` node registers the independent `@petercjl/seedaudiocli` package and its canonical `seedaudiocli` Skill. Install with `taobao-ai-ops skill install --agent codex --name seedaudiocli` (or the actual SealSeek target). Discover its source with `taobao-ai-ops skill source --name seedaudiocli --json`, read the complete current Skill and relative resources, then invoke `taobao-ai-ops component run seedaudiocli ...` or `tool run seedaudiocli ...`. Return task IDs and output files to the caller's audio acceptance flow. A missing component requires `components install --agent AGENT --yes`; missing credentials require importing the administrator-provided file through the component CLI.
package/src/cli.mjs CHANGED
@@ -15,11 +15,11 @@ export async function main(argv){
15
15
  if(command==='script')return runScript(action,rest[0],rest.slice(1));
16
16
  if(command==='component'&&action==='run'){
17
17
  await prepareComponentRun(rest[0]);
18
- const record=componentRecord(rest[0]);const r=spawnSync(process.execPath,[record.entry,...rest.slice(1)],{stdio:'inherit',env:{...process.env,TBCLI_UPDATE_CHECK:'0',SYCMCLI_DISABLE_AUTO_UPDATE:'1',SEEDAUDIO_AUTO_UPDATE:'0'}});if(r.error)throw fail('EXECUTION_FAILED',r.error.message);process.exitCode=r.status??1;return;
18
+ const record=componentRecord(rest[0]);const r=spawnSync(process.execPath,[record.entry,...rest.slice(1)],{stdio:'inherit',env:{...process.env,TBCLI_UPDATE_CHECK:'0',SYCMCLI_DISABLE_AUTO_UPDATE:'1',SEEDAUDIO_AUTO_UPDATE:'0',SEALSEEK_MEDIA_AUTO_UPDATE:'0',COMPETITOR_CANVAS_AUTO_UPDATE:'0'}});if(r.error)throw fail('EXECUTION_FAILED',r.error.message);process.exitCode=r.status??1;return;
19
19
  }
20
20
  if(command==='tool'&&action==='run'){
21
21
  await prepareComponentRun(MANIFEST.tools[rest[0]]?.component);
22
- const entry=toolEntry(rest[0]);const r=spawnSync(entry.command,[...entry.args,...rest.slice(1)],{stdio:'inherit',env:{...process.env,TBCLI_UPDATE_CHECK:'0',SYCMCLI_DISABLE_AUTO_UPDATE:'1',SEEDAUDIO_AUTO_UPDATE:'0'}});if(r.error)throw fail('CAPABILITY_UNAVAILABLE',r.error.message);process.exitCode=r.status??1;return;
22
+ const entry=toolEntry(rest[0]);const r=spawnSync(entry.command,[...entry.args,...rest.slice(1)],{stdio:'inherit',env:{...process.env,TBCLI_UPDATE_CHECK:'0',SYCMCLI_DISABLE_AUTO_UPDATE:'1',SEEDAUDIO_AUTO_UPDATE:'0',SEALSEEK_MEDIA_AUTO_UPDATE:'0',COMPETITOR_CANVAS_AUTO_UPDATE:'0'}});if(r.error)throw fail('CAPABILITY_UNAVAILABLE',r.error.message);process.exitCode=r.status??1;return;
23
23
  }
24
24
  if(command==='nodes'&&action==='list')return print(MANIFEST.nodes);
25
25
  if(command==='node'&&action==='show')return print(nodeFor(rest[0]));
@@ -15,7 +15,7 @@ export async function inspectComponent(id,root){
15
15
  if(!p.bin?.[c.bin]||!entry.startsWith(path.resolve(root)+path.sep))throw fail('INVALID_COMPONENT_ENTRY',id);
16
16
  const sources={};
17
17
  for(const skill of c.skills){
18
- const r=spawnSync(process.execPath,[entry,'skill','source','--json'],{encoding:'utf8',timeout:30000,env:{...process.env,TBCLI_UPDATE_CHECK:'0',SYCMCLI_DISABLE_AUTO_UPDATE:'1',SEEDAUDIO_AUTO_UPDATE:'0'}});
18
+ const r=spawnSync(process.execPath,[entry,'skill','source','--json'],{encoding:'utf8',timeout:30000,env:{...process.env,TBCLI_UPDATE_CHECK:'0',SYCMCLI_DISABLE_AUTO_UPDATE:'1',SEEDAUDIO_AUTO_UPDATE:'0',SEALSEEK_MEDIA_AUTO_UPDATE:'0',COMPETITOR_CANVAS_AUTO_UPDATE:'0'}});
19
19
  if(r.status!==0)throw fail('COMPONENT_SOURCE_FAILED',r.stderr||id);
20
20
  const envelope=JSON.parse(r.stdout);
21
21
  if(envelope.ok===false)throw fail('COMPONENT_SOURCE_FAILED',id, envelope.error);
package/src/runtime.mjs CHANGED
@@ -65,6 +65,21 @@ export async function doctor(id,mode='excel'){
65
65
  let detail;try{detail=JSON.parse(result.stdout);}catch{detail={code:'COMPONENT_DOCTOR_FAILED'};}
66
66
  checks.push({id:'seedaudio-runtime-and-config',ok:result.status===0,value:detail});
67
67
  }
68
+ if(n.component==='sealseek-media'){
69
+ const record=componentRecord(n.component);
70
+ const result=spawnSync(process.execPath,[record.entry,'version'],{encoding:'utf8',timeout:15000,env:{...process.env,SEALSEEK_MEDIA_AUTO_UPDATE:'0'}});
71
+ const version=result.stdout?.trim().replace(/^sealseek-media\s+/,'');
72
+ checks.push({id:'sealseek-media-node',ok:Number(process.versions.node.split('.')[0])>=22,value:process.version,minimum:22});
73
+ checks.push({id:'sealseek-media-runtime',ok:result.status===0&&version===record.version,value:version});
74
+ checks.push({id:'sealseek-media-contract',ok:fs.existsSync(path.join(source(n),'capabilities.json'))});
75
+ }
76
+ if(n.component==='competitor-visual-canvas'){
77
+ const record=componentRecord(n.component);
78
+ const result=spawnSync(process.execPath,[record.entry,'doctor','--json'],{encoding:'utf8',timeout:30000,env:{...process.env,COMPETITOR_CANVAS_AUTO_UPDATE:'0'}});
79
+ let detail;try{detail=JSON.parse(result.stdout||result.stderr);}catch{detail={ok:false};}
80
+ checks.push({id:'competitor-canvas-node',ok:Number(process.versions.node.split('.')[0])>=22,value:process.version,minimum:22});
81
+ checks.push({id:'competitor-canvas-contract',ok:result.status===0&&detail.ok===true,value:detail});
82
+ }
68
83
  if(n.id==='category-research')checks.push({id:'report-runtime',ok:['assets/report-template.html','assets/chart-views.js'].every(p=>fs.existsSync(path.join(source(n),p)))});
69
84
  if(n.id==='product-research'){
70
85
  const componentRequire=createRequire(path.join(componentRecord(n.component).root,'package.json'));
@@ -73,5 +88,5 @@ export async function doctor(id,mode='excel'){
73
88
  }
74
89
  if(!['excel','nas'].includes(mode))throw fail('USAGE','Doctor mode must be excel or nas');
75
90
  if(mode==='nas'&&n.id==='category-research')for(const id of ['tbcli','yccli']){try{const tool=toolEntry(id);const r=spawnSync(tool.command,[...tool.args,'--version'],{encoding:'utf8',timeout:15000,env:{...process.env,TBCLI_UPDATE_CHECK:'0'}});checks.push({id,ok:r.status===0,value:r.stdout?.trim()});}catch(e){checks.push({id,ok:false,message:e.message});}}
76
- return {ok:checks.every(c=>c.ok),package:PACKAGE.name,version:PACKAGE.version,node:n.id,mode,checks,native_requirements:n.native_requirements.map(id=>({id,status:'requires-active-agent-verification'})),service_access:mode==='nas'||n.component==='procli'||['1688cli','1688-product-sourcing','1688-opportunity-sourcing-research'].includes(n.component)?'not-probed':'not-required'};
91
+ return {ok:checks.every(c=>c.ok),package:PACKAGE.name,version:PACKAGE.version,node:n.id,mode,checks,native_requirements:n.native_requirements.map(id=>({id,status:'requires-active-agent-verification'})),service_access:mode==='nas'||['procli','sealseek-media','competitor-visual-canvas'].includes(n.component)||['1688cli','1688-product-sourcing','1688-opportunity-sourcing-research'].includes(n.component)?'not-probed':'not-required'};
77
92
  }
@@ -13,7 +13,9 @@
13
13
  "seedaudio-tools",
14
14
  "sourcing-tools",
15
15
  "product-sourcing",
16
- "opportunity-sourcing"
16
+ "opportunity-sourcing",
17
+ "sealseek-media-tools",
18
+ "competitor-visual-canvas"
17
19
  ]
18
20
  },
19
21
  "nodes": [
@@ -195,6 +197,31 @@
195
197
  "image.observe",
196
198
  "browser.report.inspect"
197
199
  ]
200
+ },
201
+ {
202
+ "id": "sealseek-media-tools",
203
+ "skill": "sealseek-media",
204
+ "component": "sealseek-media",
205
+ "stage": "tools",
206
+ "method_version": "sealseek-media-canvas-contract@1",
207
+ "requires_skills": [],
208
+ "python_imports": [],
209
+ "scripts": [],
210
+ "native_requirements": []
211
+ },
212
+ {
213
+ "id": "competitor-visual-canvas",
214
+ "skill": "competitor-visual-canvas",
215
+ "component": "competitor-visual-canvas",
216
+ "stage": "competitor-visual-research",
217
+ "method_version": "competitor-visual-canvas@1",
218
+ "requires_skills": [
219
+ "tbcli",
220
+ "sealseek-media"
221
+ ],
222
+ "python_imports": [],
223
+ "scripts": [],
224
+ "native_requirements": []
198
225
  }
199
226
  ],
200
227
  "tools": {
@@ -245,6 +272,16 @@
245
272
  "package": "@petercjl/1688-opportunity-sourcing-research",
246
273
  "component": "1688-opportunity-sourcing-research",
247
274
  "role": "opportunity-portfolio"
275
+ },
276
+ "sealseek-media": {
277
+ "package": "@petercjl/sealseek-media-cli",
278
+ "component": "sealseek-media",
279
+ "role": "explicit media generation, existing-media import and canvas operations; caller owns asset selection and layout"
280
+ },
281
+ "competitor-visual-canvas": {
282
+ "package": "@petercjl/competitor-visual-canvas",
283
+ "component": "competitor-visual-canvas",
284
+ "role": "collect ordered product media links and arrange four regional Frames per product"
248
285
  }
249
286
  },
250
287
  "targets": {
@@ -337,6 +374,20 @@
337
374
  "skills": [
338
375
  "1688-opportunity-sourcing-research"
339
376
  ]
377
+ },
378
+ "sealseek-media": {
379
+ "package": "@petercjl/sealseek-media-cli",
380
+ "bin": "sealseek-media",
381
+ "skills": [
382
+ "sealseek-media"
383
+ ]
384
+ },
385
+ "competitor-visual-canvas": {
386
+ "package": "@petercjl/competitor-visual-canvas",
387
+ "bin": "competitor-visual-canvas",
388
+ "skills": [
389
+ "competitor-visual-canvas"
390
+ ]
340
391
  }
341
392
  }
342
393
  }