@petercjl/taobao-ai-ops 0.1.2 → 0.2.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
@@ -25,10 +25,25 @@ SealSeek 用户改用 --agent sealseek。目标有歧义时通过 SEALSEEK_SKILL
25
25
  - @petercjl/tbcli:淘宝数据与 NAS 数据库工具,含其独立 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
+ - @petercjl/procli:项目 SOP、任务依赖与成果归档,配套 `project-management` Skill。任务卡组织工作,项目 Wiki 积累可复用的证据与结论。
28
29
  - taobao-ai-operations:套件自带的管理与业务路由 Skill。
29
30
 
30
31
  yccli 为取数时按需准备的外部工具,可用 TAOBAO_AI_OPS_YCCLI 指定;Excel 分析不需要 NAS、VPN 或平台登录。账号与授权留在包外,安装不会获得服务权限。
31
32
 
33
+ ## 项目主线与知识复用
34
+
35
+ procli 是跨业务节点的公共能力:先读取项目的任务与已编译 Wiki,确定本次研究问题,再调用对应的独立研究工具;用户授权归档后,通过 `task publish` 将完整成果关联到指定项目和任务,供下一阶段读取。
36
+
37
+ 任务卡保存工作说明、责任人、依赖、状态和验收要求;钉钉文档与可选 HTML 面向人;完整报告 Wiki 与节点累计知识面向 Agent,保留数据口径、观察窗口、来源、分歧和待验证问题。普通 `task update` 只编辑任务字段;成果发布需要内容包与独立授权,报告完成也不等于任务已审批。
38
+
39
+ ```sh
40
+ taobao-ai-ops skill source --name project-management --json
41
+ taobao-ai-ops tool run procli directory list --json
42
+ taobao-ai-ops component run procli knowledge index --project "项目名称" --json
43
+ ```
44
+
45
+ 向 Agent 明确说“用 procli”,并指定项目、任务及读取或归档目标。按当前 `project-management` Skill 解析真实名称和目标环境。项目读写需项目服务授权;发布钉钉文档还需官方 dws 与对应权限。服务不可访问时报告原目标错误并停止该操作,已有 Excel 研究可独立进行。套件不自动创建所有 SOP 任务、执行整条业务链或向项目写入研究结果;现有项目的真实 SOP 与依赖以 procli 读取结果为准。
46
+
32
47
  ## 调用与开发
33
48
 
34
49
  ```sh
@@ -44,3 +59,9 @@ taobao-ai-ops tool run tbcli capabilities --json
44
59
  Node >=20。Python 研究依赖通过稳定解释器准备;TAOBAO_AI_OPS_PYTHON 可指定已配置解释器。脚本和报告模板来自实际组件目录。原生图片理解由当前 Agent 提供;缺失时报告而非缩减流程。
45
60
 
46
61
  本地 macOS 确定性安装、更新与恢复测试单独记录;Windows/SealSeek 的真实宿主安装和端到端行为尚待验证。CI 发布前须先有可安装的类目独立包;所有发布通过 GitHub Actions OIDC。
62
+
63
+ ## Audio production
64
+
65
+ 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.
66
+
67
+ Before every audio component invocation, the suite checks stable latest, installs a newer component into a separate generation and synchronizes registered managed Skill targets. Configuration and task history remain in user directories. Registry/install failures retain the previous version. Local development checkouts remain Git-managed. `TAOBAO_AI_OPS_AUTO_UPDATE=0` pins the installed set for a specific run. Other components keep their declared update policy. The suite owns installation and invocation; the audio package owns provider integration, validation, authentication, generation and recovery. Prompts and output acceptance belong to the caller.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@petercjl/taobao-ai-ops",
3
- "version": "0.1.2",
3
+ "version": "0.2.1",
4
4
  "description": "Independent Taobao AI operations SOP skills with a managed suite lifecycle",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: taobao-ai-operations
3
- description: Route a Taobao operator's research request to independently usable category-opportunity and search-product research nodes, preserve evidence handoffs, and track a multi-node research run.
3
+ description: Route Taobao research to independent tools, preserve evidence handoffs, and use procli for explicitly requested project SOP, task context and cumulative knowledge publication.
4
4
  ---
5
5
 
6
6
  # Taobao AI operations
@@ -10,6 +10,7 @@ Input: an operator's goal, supplied workbooks or authorized data sources, option
10
10
  ## Main line
11
11
 
12
12
  1. Resolve the requested business result with `taobao-ai-ops nodes list --json`. A category/monthly market question uses `category-research`; a search-result workbook and concrete research object use `product-research`. Existing product scope can enter product research directly. If no supported node covers the request, report the missing node.
13
+ An explicit request to use `procli` for project/task information, SOP progression, knowledge reuse or result publication uses `project-management`. Preserve this child's explicit-trigger contract; offering project integration does not authorize service reads or writes. For an authorized project-backed research request, resolve the project and read its task context and compiled Wiki before selecting the business research node. Preserve the target profile, exact project/task identities, observation windows, provenance and unresolved questions in the handoff.
13
14
  A supplied analysis or compatible ViewModel requiring a reusable HTML report uses `html-report`, whose exact Skill is `compact-commerce-ui`. It supplies reporting methods, not business conclusions; existing category/product outputs keep their own declared contracts.
14
15
  2. Run `taobao-ai-ops doctor --node NODE --mode excel --json` for local workbooks, or `--mode nas` for live category data. Doctor checks deterministic resources; verify any listed native capabilities in the active Agent before their stage. A missing dependency ends the affected node with its exact error.
15
16
  3. Resolve the exact child Skill with `taobao-ai-ops skill source --name SKILL --json`. Read its complete current SKILL.md, load its platform adapter, then follow only the child node's current reference routes. The logical dependencies are `yuce-category-opportunity-report` (method contract `yuce-category-opportunity@2.0`) and `taobao-search-product-form` (imported method `0.1.1`). Their returned artifacts and source hashes are the handoff; resolution or contract failure stops with CAPABILITY_UNAVAILABLE or OUTPUT_CONTRACT_FAILED. Return here at step 4 after the child completes. Naming a Skill alone is not execution.
@@ -17,6 +18,14 @@ Input: an operator's goal, supplied workbooks or authorized data sources, option
17
18
  5. For category-to-product handoff, obtain the selected full category path and explicit search query. Use `taobao-ai-ops handoff create --node category-research --input ANALYSIS.json --candidate FULL_PATH --query QUERY --out NEW_HANDOFF.json`. It preserves the selected evidence and its source hash. Request or obtain an authorized search-result workbook before running product research. Category growth retains its category/time grain; it is not a product-growth fact.
18
19
  6. Deliver the complete child result and the current next research question. A handoff with missing input is needs_input; a plan or resource probe is not verified business output.
19
20
 
21
+ ## Project continuity through procli
22
+
23
+ The registered component `procli` owns the exact `project-management` Skill and its live CLI contracts. Resolve it with `taobao-ai-ops skill source --name project-management --json`, read its complete current instructions, capabilities and active-platform adapter, then delegate through `taobao-ai-ops component run procli ...` or `taobao-ai-ops tool run procli ...`. Resolve its live version/capabilities. Contract: project intent plus exact resolved context and optional full research artifacts in; verified task/knowledge results and source-linked next questions out. Resolution, authentication or service failure ends only the affected project operation; report the selected target without switching profiles. Return to main-line step 4 after project reads or step 6 after publication.
24
+
25
+ Tasks organize SOP work, dependencies, responsibility and acceptance; Wiki preserves reusable knowledge across independent tools. Read compiled knowledge through the child's `knowledge index/query` flow; use `--reports` for full evidence tables, with compilation/freshness limits reported. Task metadata is not a substitute for knowledge. A next-stage request should carry the project/task, research question, evidence periods and known gaps rather than requiring the employee to repeat prior conclusions.
26
+
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
+
20
29
  ## Execution and branches
21
30
 
22
31
  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.
@@ -34,3 +43,9 @@ Missing native image observation stops product visual analysis; an unverified su
34
43
  ## QA and maintenance
35
44
 
36
45
  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
+
47
+ ## Audio production
48
+
49
+ 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.
50
+
51
+ Before every audio component invocation, the suite checks stable latest, installs a newer component into a separate generation and synchronizes registered managed Skill targets. Configuration and task history remain in user directories. Registry/install failures retain the previous version. Local development checkouts remain Git-managed. `TAOBAO_AI_OPS_AUTO_UPDATE=0` pins the installed set for a specific run. Other components keep their declared update policy. The suite owns installation and invocation; the audio package owns provider integration, validation, authentication, generation and recovery. Prompts and output acceptance belong to the caller.
package/src/cli.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import path from 'node:path';
2
2
  import {spawnSync} from 'node:child_process';
3
3
  import {MANIFEST,PACKAGE,nodeFor,source,nodeVersion,fileHashes,digest,fail,componentRecords,componentRecord} from './core.mjs';
4
- import {checkComponents,installComponents,registerComponent} from './components.mjs';
4
+ import {checkComponents,installComponents,registerComponent,prepareComponentRun} from './components.mjs';
5
5
  import {targetRoot,status,install} from './skill-manager.mjs';
6
6
  import {runScript,doctor,toolEntry} from './runtime.mjs';
7
7
  import {plan,workflowStatus,createHandoff} from './workflow.mjs';
@@ -14,10 +14,12 @@ export async function main(argv){
14
14
  if(['version','--version'].includes(command))return console.log(PACKAGE.version);
15
15
  if(command==='script')return runScript(action,rest[0],rest.slice(1));
16
16
  if(command==='component'&&action==='run'){
17
- 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'}});if(r.error)throw fail('EXECUTION_FAILED',r.error.message);process.exitCode=r.status??1;return;
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
19
  }
19
20
  if(command==='tool'&&action==='run'){
20
- 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'}});if(r.error)throw fail('CAPABILITY_UNAVAILABLE',r.error.message);process.exitCode=r.status??1;return;
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;
21
23
  }
22
24
  if(command==='nodes'&&action==='list')return print(MANIFEST.nodes);
23
25
  if(command==='node'&&action==='show')return print(nodeFor(rest[0]));
@@ -15,9 +15,13 @@ 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'}});
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'}});
19
19
  if(r.status!==0)throw fail('COMPONENT_SOURCE_FAILED',r.stderr||id);
20
- const result=JSON.parse(r.stdout);const s=result.source||(result.skills||[]).find(s=>s.skill===skill)?.source;
20
+ const envelope=JSON.parse(r.stdout);
21
+ if(envelope.ok===false)throw fail('COMPONENT_SOURCE_FAILED',id, envelope.error);
22
+ const result=envelope.data??envelope;
23
+ if(result.skill&&result.skill!==skill)throw fail('SKILL_IDENTITY_MISMATCH',skill);
24
+ const s=result.source||(result.skills||[]).find(s=>s.skill===skill)?.source;
21
25
  if(!s||!path.resolve(s).startsWith(path.resolve(root)+path.sep))throw fail('INVALID_COMPONENT_SOURCE',skill);
22
26
  const text=await fs.readFile(path.join(s,'SKILL.md'),'utf8');
23
27
  if(!new RegExp(`^name: ${skill}\\s*$`,'m').test(text))throw fail('SKILL_IDENTITY_MISMATCH',skill);
@@ -71,3 +75,42 @@ export async function installComponents(opts,services={}){
71
75
  }catch(e){await save(old);throw e;}
72
76
  });
73
77
  }
78
+
79
+ // Only components declaring this policy update on invocation; other lifecycle stays explicit.
80
+ export async function prepareComponentRun(id,services={}){
81
+ if(!MANIFEST.components[id]?.automatic_update || process.env.TAOBAO_AI_OPS_AUTO_UPDATE==='0')return;
82
+ if(componentRecords()[id]?.development)return;
83
+ return locked(async()=>{
84
+ const old=componentRecords(),c=MANIFEST.components[id];
85
+ let latest;
86
+ try{
87
+ const r=await (services.registry||fetch)(`https://registry.npmjs.org/${encodeURIComponent(c.package)}/latest`,{signal:AbortSignal.timeout(8000)});
88
+ if(!r.ok)throw Error('registry');const p=await r.json();
89
+ if(p.name!==c.package||!/^\d+\.\d+\.\d+$/.test(p.version))throw Error('version');latest=p.version;
90
+ }catch{if(!old[id])throw fail('COMPONENT_NOT_INSTALLED','Install components while online');console.error('[taobao-ai-ops] Update check unavailable; using installed audio component.');return;}
91
+ const newer=(a,b)=>{const x=a.split('.').map(Number),y=b.split('.').map(Number);for(let i=0;i<3;i++)if(x[i]!==y[i])return x[i]>y[i];return false;};
92
+ if(old[id]&&!newer(latest,old[id].version))return;
93
+ const generation=path.join(stateRoot(),'component-generations',randomUUID());await fs.mkdir(generation,{recursive:true});
94
+ await fs.writeFile(path.join(generation,'previous-components.json'),JSON.stringify(old),{flag:'wx'});
95
+ const roots=[];
96
+ for(const name of await fs.readdir(path.join(stateRoot(),'skill-targets')).catch(()=>[])){
97
+ const info=JSON.parse(await fs.readFile(path.join(stateRoot(),'skill-targets',name),'utf8'));
98
+ const owner=JSON.parse(await fs.readFile(path.join(info.root,'.taobao-ai-ops-managed.json'),'utf8').catch(()=>'{}'));
99
+ if(c.skills.some(skill=>owner.skills?.[skill]))roots.push(info.root);
100
+ }
101
+ const synced=[];
102
+ try{
103
+ await (services.npm||npm)(['install','--prefix',generation,'--no-audit','--no-fund','--ignore-scripts',`${c.package}@${latest}`]);
104
+ const record=await inspectComponent(id,path.join(generation,'node_modules',...c.package.split('/')));
105
+ if(record.version!==latest)throw fail('COMPONENT_VERSION_MISMATCH',id);
106
+ await save({...old,[id]:record});
107
+ for(const targetDir of roots){await install({targetDir,name:c.skills[0]});synced.push(targetDir);}
108
+ console.error(`[taobao-ai-ops] ${id} updated to ${latest}.`);
109
+ }catch(e){
110
+ await save(old);
111
+ for(const targetDir of synced)await install({targetDir,name:c.skills[0]});
112
+ if(!old[id])throw e;
113
+ console.error(`[taobao-ai-ops] ${e.code||'UPDATE_FAILED'}; using previous audio component.`);
114
+ }
115
+ });
116
+ }
package/src/runtime.mjs CHANGED
@@ -46,6 +46,19 @@ export async function doctor(id,mode='excel'){
46
46
  let detail;try{detail=JSON.parse(result.stdout||result.stderr);}catch{detail={message:result.stderr||'Unparseable component doctor'};}
47
47
  checks.push({id:'html-component-runtime',ok:result.status===0,value:detail});
48
48
  }
49
+ if(n.component==='procli'){
50
+ const record=componentRecord(n.component);
51
+ const result=spawnSync(process.execPath,[record.entry,'--version'],{encoding:'utf8',timeout:15000});
52
+ let version;try{const data=JSON.parse(result.stdout);version=(data.data??data).version;}catch{}
53
+ checks.push({id:'procli-runtime',ok:result.status===0&&version===record.version,value:version});
54
+ checks.push({id:'procli-contract',ok:fs.existsSync(path.join(source(n),'capabilities.json'))});
55
+ }
56
+ if(n.component==='seedaudiocli'){
57
+ const record=componentRecord(n.component);
58
+ const result=spawnSync(process.execPath,[record.entry,'doctor','--json'],{encoding:'utf8',timeout:30000,env:{...pythonEnvironment(),SEEDAUDIO_AUTO_UPDATE:'0'}});
59
+ let detail;try{detail=JSON.parse(result.stdout);}catch{detail={code:'COMPONENT_DOCTOR_FAILED'};}
60
+ checks.push({id:'seedaudio-runtime-and-config',ok:result.status===0,value:detail});
61
+ }
49
62
  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)))});
50
63
  if(n.id==='product-research'){
51
64
  const componentRequire=createRequire(path.join(componentRecord(n.component).root,'package.json'));
@@ -54,5 +67,5 @@ export async function doctor(id,mode='excel'){
54
67
  }
55
68
  if(!['excel','nas'].includes(mode))throw fail('USAGE','Doctor mode must be excel or nas');
56
69
  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});}}
57
- 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'?'not-probed':'not-required'};
70
+ 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'?'not-probed':'not-required'};
58
71
  }
@@ -1,7 +1,7 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import os from 'node:os';
4
- import {randomUUID} from 'node:crypto';
4
+ import {randomUUID,createHash} from 'node:crypto';
5
5
  import {PACKAGE,source,nodeVersion,closure,json,stat,fileHashes,digest,fail,stateRoot} from './core.mjs';
6
6
 
7
7
  const OWNER='.taobao-ai-ops-managed.json';
@@ -79,6 +79,9 @@ export async function install(opts,options={}){
79
79
  const ownerPath=path.join(root,OWNER);if(await stat(ownerPath))await fs.copyFile(ownerPath,path.join(transaction,'previous-owner.json'));
80
80
  await fs.writeFile(path.join(transaction,'transaction.json'),JSON.stringify({package:PACKAGE.name,root,results},null,2),{flag:'wx'});
81
81
  const pending=path.join(root,`${OWNER}.${randomUUID()}.pending`);await fs.writeFile(pending,JSON.stringify(old,null,2),{flag:'wx'});await fs.rename(pending,ownerPath);
82
+ const registry=path.join(stateRoot(),'skill-targets');await fs.mkdir(registry,{recursive:true});
83
+ const registration=path.join(registry,createHash('sha256').update(root).digest('hex')+'.json');
84
+ if(!await stat(registration))await fs.writeFile(registration,JSON.stringify({root}),{flag:'wx'});
82
85
  return {ok:true,package:PACKAGE.name,version:PACKAGE.version,targetRoot:root,transaction,skills:results};
83
86
  }catch(e){for(const item of changed.reverse()){if(item.backup)await restore(item.backup,item.dest,item.inPlace);else if(await stat(item.dest))await fs.rm(item.dest,{recursive:true,force:true});}throw e;}
84
87
  finally{await fs.rmdir(lock);}
@@ -8,7 +8,9 @@
8
8
  "product-research",
9
9
  "tbcli-tools",
10
10
  "sycmcli-tools",
11
- "html-report"
11
+ "html-report",
12
+ "project-management",
13
+ "seedaudio-tools"
12
14
  ]
13
15
  },
14
16
  "nodes": [
@@ -19,9 +21,13 @@
19
21
  "stage": "shared-reporting",
20
22
  "method_version": "commerce-ui-template-pack@1",
21
23
  "requires_skills": [],
22
- "python_imports": ["jsonschema"],
24
+ "python_imports": [
25
+ "jsonschema"
26
+ ],
23
27
  "scripts": [],
24
- "native_requirements": ["browser.report.inspect"]
28
+ "native_requirements": [
29
+ "browser.report.inspect"
30
+ ]
25
31
  },
26
32
  {
27
33
  "id": "operations",
@@ -96,6 +102,20 @@
96
102
  ],
97
103
  "component": "product-research"
98
104
  },
105
+ {
106
+ "id": "project-management",
107
+ "skill": "project-management",
108
+ "component": "procli",
109
+ "stage": "shared-project-knowledge",
110
+ "method_version": "procli-task-publish-bundle@1",
111
+ "requires_skills": [],
112
+ "python_imports": [],
113
+ "scripts": [],
114
+ "native_requirements": [],
115
+ "optional_tools": [
116
+ "dws"
117
+ ]
118
+ },
99
119
  {
100
120
  "id": "tbcli-tools",
101
121
  "skill": "tbcli",
@@ -115,9 +135,24 @@
115
135
  "python_imports": [],
116
136
  "scripts": [],
117
137
  "native_requirements": []
138
+ },
139
+ {
140
+ "id": "seedaudio-tools",
141
+ "skill": "seedaudiocli",
142
+ "component": "seedaudiocli",
143
+ "stage": "visual-production-audio",
144
+ "requires_skills": [],
145
+ "python_imports": [],
146
+ "scripts": [],
147
+ "native_requirements": []
118
148
  }
119
149
  ],
120
150
  "tools": {
151
+ "procli": {
152
+ "package": "@petercjl/procli",
153
+ "component": "procli",
154
+ "role": "project SOP, task dependencies, research publication and cumulative Agent Wiki"
155
+ },
121
156
  "commerce-ui": {
122
157
  "package": "@petercjl/commerce-ui",
123
158
  "component": "html-report",
@@ -140,6 +175,11 @@
140
175
  "minimum_version": "0.5.0",
141
176
  "executable_env": "TAOBAO_AI_OPS_YCCLI",
142
177
  "role": "authorized Yuce monthly collection; optional for supplied Excel"
178
+ },
179
+ "seedaudiocli": {
180
+ "package": "@petercjl/seedaudiocli",
181
+ "component": "seedaudiocli",
182
+ "role": "audio generation, reference voices, image-conditioned audio and task recovery"
143
183
  }
144
184
  },
145
185
  "targets": {
@@ -153,13 +193,25 @@
153
193
  "during_run": "installed-component-set",
154
194
  "automatic_install": false,
155
195
  "offline": "keep-current",
156
- "source_checkout": "git-managed"
196
+ "source_checkout": "git-managed",
197
+ "automatic_components": [
198
+ "seedaudiocli"
199
+ ]
157
200
  },
158
201
  "components": {
202
+ "procli": {
203
+ "package": "@petercjl/procli",
204
+ "bin": "procli",
205
+ "skills": [
206
+ "project-management"
207
+ ]
208
+ },
159
209
  "html-report": {
160
210
  "package": "@petercjl/commerce-ui",
161
211
  "bin": "commerce-ui",
162
- "skills": ["compact-commerce-ui"]
212
+ "skills": [
213
+ "compact-commerce-ui"
214
+ ]
163
215
  },
164
216
  "category-research": {
165
217
  "package": "@petercjl/yuce-category-opportunity-report",
@@ -188,6 +240,14 @@
188
240
  "skills": [
189
241
  "sycmcli"
190
242
  ]
243
+ },
244
+ "seedaudiocli": {
245
+ "package": "@petercjl/seedaudiocli",
246
+ "bin": "seedaudiocli",
247
+ "skills": [
248
+ "seedaudiocli"
249
+ ],
250
+ "automatic_update": true
191
251
  }
192
252
  }
193
253
  }