@petercjl/cloud-hug-style-transfer 0.0.0-bootstrap.0 → 0.1.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/LICENSE +3 -0
- package/README.md +28 -2
- package/capabilities.json +54 -0
- package/npm/cli.mjs +37 -0
- package/npm/integrity.json +68 -0
- package/npm/runtime.mjs +6 -0
- package/npm/skills.mjs +89 -0
- package/npm/update.mjs +84 -0
- package/package.json +24 -8
- package/skills/cloud-hug-style-transfer/SKILL.md +114 -0
- package/skills/cloud-hug-style-transfer/adapters/codex.json +46 -0
- package/skills/cloud-hug-style-transfer/adapters/sealseek.json +52 -0
- package/skills/cloud-hug-style-transfer/adapters/workbuddy.json +52 -0
- package/skills/cloud-hug-style-transfer/agents/openai.yaml +13 -0
- package/skills/cloud-hug-style-transfer/assets/approved/all-colors-user-finish.webp +0 -0
- package/skills/cloud-hug-style-transfer/assets/approved/brand-kv-user-finish-20261012.png +0 -0
- package/skills/cloud-hug-style-transfer/assets/approved/detail-final-20261016/01.jpg +0 -0
- package/skills/cloud-hug-style-transfer/assets/approved/detail-final-20261016/02.jpg +0 -0
- package/skills/cloud-hug-style-transfer/assets/approved/detail-final-20261016/03.jpg +0 -0
- package/skills/cloud-hug-style-transfer/assets/approved/detail-final-20261016/04.jpg +0 -0
- package/skills/cloud-hug-style-transfer/assets/approved/detail-final-20261016/05.jpg +0 -0
- package/skills/cloud-hug-style-transfer/assets/approved/detail-final-20261016/06.jpg +0 -0
- package/skills/cloud-hug-style-transfer/assets/approved/detail-final-20261016/07.jpg +0 -0
- package/skills/cloud-hug-style-transfer/assets/approved/detail-final-20261016/08.jpg +0 -0
- package/skills/cloud-hug-style-transfer/assets/approved/detail-final-20261016/09.jpg +0 -0
- package/skills/cloud-hug-style-transfer/assets/approved/detail-final-20261016/10.jpg +0 -0
- package/skills/cloud-hug-style-transfer/assets/approved/detail-final-20261016/11.jpg +0 -0
- package/skills/cloud-hug-style-transfer/assets/approved/detail-final-20261016/12.jpg +0 -0
- package/skills/cloud-hug-style-transfer/assets/approved/detail-final-20261016/13.jpg +0 -0
- package/skills/cloud-hug-style-transfer/assets/approved/detail-final-20261016/14.jpg +0 -0
- package/skills/cloud-hug-style-transfer/assets/approved/detail-final-20261016/15.jpg +0 -0
- package/skills/cloud-hug-style-transfer/assets/approved/detail-final-20261016/16.jpg +0 -0
- package/skills/cloud-hug-style-transfer/assets/approved/detail-final-20261016/17.jpg +0 -0
- package/skills/cloud-hug-style-transfer/assets/approved/detail-final-20261016/18.jpg +0 -0
- package/skills/cloud-hug-style-transfer/assets/approved/detail-final-20261016/19.jpg +0 -0
- package/skills/cloud-hug-style-transfer/assets/approved/detail-final-20261016/sources.json +198 -0
- package/skills/cloud-hug-style-transfer/assets/approved/dog-detail.webp +0 -0
- package/skills/cloud-hug-style-transfer/assets/approved/hippo-detail.webp +0 -0
- package/skills/cloud-hug-style-transfer/assets/approved/overhead-breathing-user-finish.png +0 -0
- package/skills/cloud-hug-style-transfer/assets/approved/quiet-prone-user-finish.webp +0 -0
- package/skills/cloud-hug-style-transfer/assets/approved/rabbit-detail.webp +0 -0
- package/skills/cloud-hug-style-transfer/assets/brand/layout-reference.jpg +0 -0
- package/skills/cloud-hug-style-transfer/assets/brand/logo-blue.png +0 -0
- package/skills/cloud-hug-style-transfer/assets/brand/main-kv-dog-rest.webp +0 -0
- package/skills/cloud-hug-style-transfer/assets/brand/main-kv-lounge.webp +0 -0
- package/skills/cloud-hug-style-transfer/assets/brand/main-kv-seated-hug.webp +0 -0
- package/skills/cloud-hug-style-transfer/assets/brand/main-kv-sleep.webp +0 -0
- package/skills/cloud-hug-style-transfer/assets/icon.svg +8 -0
- package/skills/cloud-hug-style-transfer/assets/model/character-sheet-approved-20261019.png +0 -0
- package/skills/cloud-hug-style-transfer/assets/products/bear.jpg +0 -0
- package/skills/cloud-hug-style-transfer/assets/products/dog.jpg +0 -0
- package/skills/cloud-hug-style-transfer/assets/products/hippo.jpg +0 -0
- package/skills/cloud-hug-style-transfer/assets/products/rabbit.jpg +0 -0
- package/skills/cloud-hug-style-transfer/assets/products/six-variants.webp +0 -0
- package/skills/cloud-hug-style-transfer/assets/references/kv-layout-source-20261012.webp +0 -0
- package/skills/cloud-hug-style-transfer/assets/references/kv-old-long-20261012.webp +0 -0
- package/skills/cloud-hug-style-transfer/assets/references/kv-photo-source-20261012.webp +0 -0
- package/skills/cloud-hug-style-transfer/assets/references/overhead-cushion-source.webp +0 -0
- package/skills/cloud-hug-style-transfer/assets/references/prone-pile-source.webp +0 -0
- package/skills/cloud-hug-style-transfer/assets/rejected/all-colors-b.webp +0 -0
- package/skills/cloud-hug-style-transfer/assets/rejected/brand-kv-a2-20261012.webp +0 -0
- package/skills/cloud-hug-style-transfer/assets/rejected/brand-kv-b2-20261012.webp +0 -0
- package/skills/cloud-hug-style-transfer/assets/rejected/brand-kv-c2-20261012.webp +0 -0
- package/skills/cloud-hug-style-transfer/assets/rejected/overhead-rest-b.webp +0 -0
- package/skills/cloud-hug-style-transfer/assets/rejected/prone-pile-a.webp +0 -0
- package/skills/cloud-hug-style-transfer/capabilities.json +77 -0
- package/skills/cloud-hug-style-transfer/references/assets.md +37 -0
- package/skills/cloud-hug-style-transfer/references/brand-layout.md +55 -0
- package/skills/cloud-hug-style-transfer/references/cases.md +60 -0
- package/skills/cloud-hug-style-transfer/references/detail-final-20261016.md +51 -0
- package/skills/cloud-hug-style-transfer/references/kv-layout-case-20261012.md +43 -0
- package/skills/cloud-hug-style-transfer/references/model-generation.json +19 -0
- package/skills/cloud-hug-style-transfer/references/model.md +43 -0
- package/skills/cloud-hug-style-transfer/references/page-patterns.md +39 -0
- package/skills/cloud-hug-style-transfer/references/products.md +29 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
Copyright (c) 2026. All rights reserved.
|
|
2
|
+
|
|
3
|
+
This package includes proprietary brand methods and visual reference assets. Public registry availability does not grant trademark ownership or permission to redistribute bundled assets independently. Use requires the applicable rights to the brand and input materials.
|
package/README.md
CHANGED
|
@@ -1,3 +1,29 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 抱抱云朵社风格转换
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
将旧详情页、产品摄影、主 KV 或 SKU 转换为抱抱云朵社品牌视觉,保留当次商品事实、文案与用途。包内包含完整 19 页定稿、品牌标识、人物设定与摄影排版方法,约 41 MB 素材。
|
|
4
|
+
|
|
5
|
+
支持 Codex、SealSeek、WorkBuddy 的技能目录安装。Node.js 22+ 为安装与管理前提;实际生图还需要宿主支持看图、多参考图编辑及结果交付。包不附带生成额度或服务账号。SealSeek 与 WorkBuddy 的生图适配依据当前宿主合同实现,尚待实际任务验证。WorkBuddy 需要内置 Miora 图片场景及相应能力 Skill;SealSeek 需要当前会话提供参考图生成和上传能力。
|
|
6
|
+
|
|
7
|
+
安装:将下列提示词发送给目标 Agent。
|
|
8
|
+
|
|
9
|
+
> 请安装 npm 包 @petercjl/cloud-hug-style-transfer。
|
|
10
|
+
|
|
11
|
+
使用:附上待转换图片;关键商品结构不清楚时补充实拍。
|
|
12
|
+
|
|
13
|
+
> 用抱抱云朵社风格转换处理所附图片。
|
|
14
|
+
|
|
15
|
+
更新:
|
|
16
|
+
|
|
17
|
+
> 请更新 npm 包 @petercjl/cloud-hug-style-transfer。
|
|
18
|
+
|
|
19
|
+
检查:
|
|
20
|
+
|
|
21
|
+
> 检查 cloud-hug-style-transfer 的安装与生图能力是否可用。
|
|
22
|
+
|
|
23
|
+
故障处理:
|
|
24
|
+
|
|
25
|
+
> 请诊断并修复 cloud-hug-style-transfer 的这次报错:粘贴报错内容。
|
|
26
|
+
|
|
27
|
+
安装、更新与检查由 Agent 执行包内 CLI。包的 `skill source --json` 提供规范来源;Agent 随后调用 `skill install --agent <当前宿主>`,支持 `--root` 指定实际技能目录。普通任务不联网检查或自动更新。显式更新使用 stable latest,备份旧包并同步已登记的受管 Skill,失败时恢复旧包;离线保留当前安装。已有独立安装或本地修改将停止覆盖并报告。源码或上层工具管理的包由其拥有者更新。
|
|
28
|
+
|
|
29
|
+
兼容证据分别记录安装机制与生图效果。CI 覆盖 macOS、Windows、Linux 的包管理机制;宿主实际生成需使用各自账户独立验证。品牌与输入素材须具备相应使用权;公开 npm 分发不转让商标与素材的独立再分发权。
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"package": "@petercjl/cloud-hug-style-transfer",
|
|
3
|
+
"kind": "application-skill",
|
|
4
|
+
"skill": "cloud-hug-style-transfer",
|
|
5
|
+
"agents": [
|
|
6
|
+
"codex",
|
|
7
|
+
"sealseek",
|
|
8
|
+
"workbuddy"
|
|
9
|
+
],
|
|
10
|
+
"commands": [
|
|
11
|
+
"version",
|
|
12
|
+
"capabilities",
|
|
13
|
+
"doctor",
|
|
14
|
+
"skill source",
|
|
15
|
+
"skill status",
|
|
16
|
+
"skill install",
|
|
17
|
+
"skill update",
|
|
18
|
+
"update check",
|
|
19
|
+
"update install"
|
|
20
|
+
],
|
|
21
|
+
"requirements": {
|
|
22
|
+
"node": ">=22",
|
|
23
|
+
"nested_skills": [],
|
|
24
|
+
"generation": "Host-provided multi-reference image editing and inspection; credentials remain external.",
|
|
25
|
+
"host_capability_skills": {
|
|
26
|
+
"codex": [],
|
|
27
|
+
"sealseek": [
|
|
28
|
+
"AIGC-生图 when advertised by host as its media entry"
|
|
29
|
+
],
|
|
30
|
+
"workbuddy": [
|
|
31
|
+
"miora-creative-core",
|
|
32
|
+
"miora-image-generation"
|
|
33
|
+
]
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"authorization": {
|
|
37
|
+
"installation": "Explicit install/update request; preserve existing targets.",
|
|
38
|
+
"generation": "Current task scope and host provider policy."
|
|
39
|
+
},
|
|
40
|
+
"compatibility": {
|
|
41
|
+
"codex": {
|
|
42
|
+
"installation": "implemented",
|
|
43
|
+
"generation": "implemented-not-runtime-tested"
|
|
44
|
+
},
|
|
45
|
+
"sealseek": {
|
|
46
|
+
"installation": "implemented",
|
|
47
|
+
"generation": "implemented-not-runtime-tested"
|
|
48
|
+
},
|
|
49
|
+
"workbuddy": {
|
|
50
|
+
"installation": "implemented",
|
|
51
|
+
"generation": "implemented-not-runtime-tested"
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
package/npm/cli.mjs
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { root, pkg, fail } from './runtime.mjs';
|
|
5
|
+
import { source, targetPath, status, install, inventory } from './skills.mjs';
|
|
6
|
+
import { checkUpdate, installUpdate } from './update.mjs';
|
|
7
|
+
const args=process.argv.slice(2);
|
|
8
|
+
const option=name=>{const i=args.indexOf(name);if(i<0)return undefined;if(!args[i+1]||args[i+1].startsWith('--'))throw fail('INVALID_ARGUMENT',`${name} needs a value.`);return args[i+1];};
|
|
9
|
+
const out=value=>console.log(JSON.stringify(value,null,2));
|
|
10
|
+
try {
|
|
11
|
+
if(args[0]==='version'||args[0]==='--version') out({ok:true,name:pkg.name,version:pkg.version});
|
|
12
|
+
else if(args[0]==='capabilities') out({...JSON.parse(fs.readFileSync(path.join(root,'capabilities.json'),'utf8')),version:pkg.version});
|
|
13
|
+
else if(args[0]==='skill') {
|
|
14
|
+
const action=args[1];
|
|
15
|
+
if(action==='source')out({ok:true,package:pkg.name,version:pkg.version,source});
|
|
16
|
+
else {
|
|
17
|
+
const target=targetPath(option('--agent')||'codex',option('--root'));
|
|
18
|
+
if(action==='status')out({...status(target),record:undefined});
|
|
19
|
+
else if(['install','update'].includes(action))out(install(target));
|
|
20
|
+
else throw fail('INVALID_COMMAND','Use skill source/status/install/update.');
|
|
21
|
+
}
|
|
22
|
+
} else if(args[0]==='doctor') {
|
|
23
|
+
const files=inventory(source), expected=JSON.parse(fs.readFileSync(path.join(root,'npm','integrity.json'),'utf8'));
|
|
24
|
+
const problems=Object.entries(expected).filter(([name,hash])=>files[name]!==hash).map(([name])=>name);
|
|
25
|
+
const capabilities=JSON.parse(fs.readFileSync(path.join(root,'capabilities.json'),'utf8'));
|
|
26
|
+
const result={ok:Number(process.versions.node.split('.')[0])>=22&&problems.length===0,package:pkg.name,version:pkg.version,node:process.versions.node,source,files:Object.keys(files).length,integrity:{ok:problems.length===0,problems},installationReady:problems.length===0,hostCapabilityDependencies:capabilities.requirements.host_capability_skills,generation:{state:'requires-host-preflight',runtimeTested:false,requiredFeatures:['image-inspection','multiple-reference-edit','local-reference-input','viewable-output']}};
|
|
27
|
+
if(option('--agent'))result.installation={...status(targetPath(option('--agent'),option('--root'))),record:undefined};
|
|
28
|
+
out(result);if(!result.ok)process.exitCode=1;
|
|
29
|
+
} else if(args[0]==='update') {
|
|
30
|
+
if(!['check','install'].includes(args[1]))throw fail('INVALID_COMMAND','Use update check/install.');
|
|
31
|
+
if(args[1]==='install'&&!args.includes('--yes'))throw fail('PERMISSION_REQUIRED','Package update requires --yes.');
|
|
32
|
+
const check=await checkUpdate();
|
|
33
|
+
if(args[1]==='check'){out(check);if(!check.ok)process.exitCode=1;}
|
|
34
|
+
else {if(!check.ok)throw fail(check.code,'Registry unavailable; installed version retained.');out(check.updateAvailable?installUpdate(check):{ok:true,changed:false,version:pkg.version});}
|
|
35
|
+
} else if(!args.length||['--help','help','-h'].includes(args[0])) console.log('cloud-hug-style-transfer\nversion | capabilities --json | doctor --json [--agent AGENT]\nskill source/status/install/update [--agent codex|sealseek|workbuddy] [--root SKILLS_DIRECTORY]\nupdate check | update install --yes\nNode.js 22+. Updates are explicit; business calls never auto-update.');
|
|
36
|
+
else throw fail('INVALID_COMMAND','Unknown command; use --help.');
|
|
37
|
+
} catch(e){out({ok:false,code:e.code||'COMMAND_FAILED',message:e.message});process.exitCode=1;}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"SKILL.md": "88b2b5584f57299a8dc002ad51914e4577dc39b657e96e643b74b61911676a3f",
|
|
3
|
+
"adapters/codex.json": "c5e52102befd0bb47e114f2534ee3a2fb9a66f7338396202319aea73a3ea924a",
|
|
4
|
+
"adapters/sealseek.json": "d50e4d9f910c664c026ffa9e92ac8901776d19d2f1c8062a046af534a7cdf2ce",
|
|
5
|
+
"adapters/workbuddy.json": "4d0e1a62deb866dc6bd4c6bb7915cce20725d16863258345e93c817e7b8bdbd0",
|
|
6
|
+
"agents/openai.yaml": "8afeabba706e83f2f20d616579e8d79b6509fe93427acdc2b650ef6387049983",
|
|
7
|
+
"assets/approved/all-colors-user-finish.webp": "539c77de8ec0dd46a29793befecf813e97ce6ae66f7cbe69486846383b2ae936",
|
|
8
|
+
"assets/approved/brand-kv-user-finish-20261012.png": "cb09198481e779444696864b265c689f467207bf7de9610f7adc2b850f0be7b4",
|
|
9
|
+
"assets/approved/detail-final-20261016/01.jpg": "ecb481a422b3eadb0050b8c1080a1781e3fbd50ce4479f92e9f4a8beffd91187",
|
|
10
|
+
"assets/approved/detail-final-20261016/02.jpg": "676fdc94d3f247f370942f0d1cb1497e59f816b4aba77d551529b22a7a4ca49d",
|
|
11
|
+
"assets/approved/detail-final-20261016/03.jpg": "ec5b4f6fb3e86653ff1fff608bce322bc35f8447dfc823038fc3b245570c0461",
|
|
12
|
+
"assets/approved/detail-final-20261016/04.jpg": "0750a06d7d4c21077955e1ba991a5477efc33b0370444fc30ce885c93fe17355",
|
|
13
|
+
"assets/approved/detail-final-20261016/05.jpg": "75223e46c9ddb288498d64cbc4e8f61e00ed01733b3e5783805aa31d15c2ebd7",
|
|
14
|
+
"assets/approved/detail-final-20261016/06.jpg": "410be00a93f5be9e970554b96f950fb5cf6699e3244a2e572233e7e7bfcd8a33",
|
|
15
|
+
"assets/approved/detail-final-20261016/07.jpg": "96c2b12650a6cd326631e86f63e522c50afb84162a5d69d39fb3da67223de68a",
|
|
16
|
+
"assets/approved/detail-final-20261016/08.jpg": "f20f9a264fc81ae2b7c6e1764b8a3167d434224bed269cd96f826dcd2fd13875",
|
|
17
|
+
"assets/approved/detail-final-20261016/09.jpg": "dae56031cc673023ce882f6c9a678d43e31c18e9e7d0ca046248c3ca972cad19",
|
|
18
|
+
"assets/approved/detail-final-20261016/10.jpg": "c5ad7bfaf54fb0bd1d74e1833f6c7c1bc42c15f6449fadda0fe8daff2334121a",
|
|
19
|
+
"assets/approved/detail-final-20261016/11.jpg": "a0398cca68b2d76907e2c4656c506a4df04c9a38c7f91b160c719bf077ca016a",
|
|
20
|
+
"assets/approved/detail-final-20261016/12.jpg": "48e561a28548d4fbd712b1341dd76e3c668d376e13306b65a1ef32ac71ad7705",
|
|
21
|
+
"assets/approved/detail-final-20261016/13.jpg": "0ce9293acd81100f47cb9fc4c0064747ca911cae7c6a390da8c8c771d2df5a07",
|
|
22
|
+
"assets/approved/detail-final-20261016/14.jpg": "5f2c9dbf350e766c8064a4feaeef430611c02220f10648a099ed34b0b416bdc9",
|
|
23
|
+
"assets/approved/detail-final-20261016/15.jpg": "78c623e2c5eadfdd34aaaa7503fa6d975e1f1307016efe832b0fd9d2fd04fb8c",
|
|
24
|
+
"assets/approved/detail-final-20261016/16.jpg": "576fe80c894e221acdd7806a7e5892b4ea3922ca62b828ffecd4109c25549137",
|
|
25
|
+
"assets/approved/detail-final-20261016/17.jpg": "4cc72bd8cac12be0e8b54659daa3c2f44e8bd8e6953c127ca4adaf669e32e69e",
|
|
26
|
+
"assets/approved/detail-final-20261016/18.jpg": "88300f31dd4f1458c1b2fe927570c303a5e80a9c89abbd839d49e5fc808f3930",
|
|
27
|
+
"assets/approved/detail-final-20261016/19.jpg": "588a474405e3672e4780252c7c1cc25f558974908628b970026d42575a9d9851",
|
|
28
|
+
"assets/approved/detail-final-20261016/sources.json": "38acec5807cfec104ada2cc93a0a1771dae78960cd4402e9550f9aad77e7fd86",
|
|
29
|
+
"assets/approved/dog-detail.webp": "e9e73ae4cf35071eea7b1ce161ab7e0a5d7f4a4b8bbeb83be646e1bfec555aa0",
|
|
30
|
+
"assets/approved/hippo-detail.webp": "5f3fc742492747166666704adc1744a6859774a95d3d062ee3d17e632f3c7ee5",
|
|
31
|
+
"assets/approved/overhead-breathing-user-finish.png": "f65546328c773a5e2837b896237d9b3adcb175c3b6e565b28e7fa2353008dd3f",
|
|
32
|
+
"assets/approved/quiet-prone-user-finish.webp": "e01c02a1804a50972eb8ec2438268b89697c4903d3624246d22f1ef8e1698dbf",
|
|
33
|
+
"assets/approved/rabbit-detail.webp": "787c296639b0b4922d8aa0668f3d08760ea786f6dad4c3ca20fa5943d2456fe8",
|
|
34
|
+
"assets/brand/layout-reference.jpg": "4a100fcb461bb111a671f7051302f9be2f918bca6b3c73eeb2e9ee7f52f5eaba",
|
|
35
|
+
"assets/brand/logo-blue.png": "70010f32676c9ed93268efac3dcd5f87b9caf3b57d52932eb2a5d4f7a8a268d9",
|
|
36
|
+
"assets/brand/main-kv-dog-rest.webp": "6a237f78ac8cc839a6a7786742bb38921f6dd843313893444d4cfcf8ed257c67",
|
|
37
|
+
"assets/brand/main-kv-lounge.webp": "e6f55f9671c2aec17582b742b7ad9575d8e7b39aa8b2d8b6691caf0da86f0405",
|
|
38
|
+
"assets/brand/main-kv-seated-hug.webp": "cc7c52883e3732466079b9625110cce09ac7072337587fbb0213f9c31ff7f44b",
|
|
39
|
+
"assets/brand/main-kv-sleep.webp": "57425f54c6aa9e9d0e73fa1eb9fc2b64b09ec6f579facbb6d89178c58528953c",
|
|
40
|
+
"assets/icon.svg": "49315dda7125ec5fc77ef5f2b96126d8b2121c6e72944b4702972e90f321d3ee",
|
|
41
|
+
"assets/model/character-sheet-approved-20261019.png": "55300aa20053612fe132bf0899ba0d3ffd280a197782aeba72fd097df29f51f3",
|
|
42
|
+
"assets/products/bear.jpg": "6b182d98bf778f45bd2a498c5e428ac5698a4bfd8425c5ea0c04fbda465456e5",
|
|
43
|
+
"assets/products/dog.jpg": "14a513feb9216b04a62e0d78d9b69ca463750ff5e957725512a776de5d7f6d87",
|
|
44
|
+
"assets/products/hippo.jpg": "67da5fdaa60274d08cd545ac0c9c891c3cd9761e74dc39c75219b1c676a634af",
|
|
45
|
+
"assets/products/rabbit.jpg": "39f250512a465465190e01c25ea3e8c5a8759c12bdd82823d9efbdf11720e332",
|
|
46
|
+
"assets/products/six-variants.webp": "a15e1a38bcdcef07c4c00e4978908e8a9054bd91e2c410abea1cbd93b6106763",
|
|
47
|
+
"assets/references/kv-layout-source-20261012.webp": "ad98d1b3668080d4cca679eb5a8fd8119d90be38e04b5b1a79f29f33c406af0d",
|
|
48
|
+
"assets/references/kv-old-long-20261012.webp": "ba0402fb099bb5561d5351872bb4e63bcee159228016fc28b6c95cfea919608d",
|
|
49
|
+
"assets/references/kv-photo-source-20261012.webp": "084d267802a0acf6cd54201215ea2472ffe54f11e37d803a38dbe5e5271771c2",
|
|
50
|
+
"assets/references/overhead-cushion-source.webp": "85f7d9636e5c7a4310690027f5dde709cfafbe3abc44804094338faf62bc950d",
|
|
51
|
+
"assets/references/prone-pile-source.webp": "4e6537e322fa99e9c23599547bb60c97afc09ef61133c3bb03cd6dab5e8d1588",
|
|
52
|
+
"assets/rejected/all-colors-b.webp": "d74a8dc41d9de0f4b024f6ae8b2a02f7fdbb2c9f07d4841c47181002760266aa",
|
|
53
|
+
"assets/rejected/brand-kv-a2-20261012.webp": "276ec445939643559708f04c63292ffec384744ea4c7b517d6e1a3abd52397e9",
|
|
54
|
+
"assets/rejected/brand-kv-b2-20261012.webp": "80ec90d0b5500d9b661533ad8c59af2c24c89a76f6fc301993462f48a37a7def",
|
|
55
|
+
"assets/rejected/brand-kv-c2-20261012.webp": "88ed2de0d950ea4a34519661481877ee0899743a6dfce203a2033c0dab6a73f7",
|
|
56
|
+
"assets/rejected/overhead-rest-b.webp": "16e5e6fabdc665868ac244d556f3a8a93db826a34425fdee042e4f7a8ebf64c3",
|
|
57
|
+
"assets/rejected/prone-pile-a.webp": "d07f38bbb69fc23b30dca4ed27faa3d7ae58e2e81840a1c3d46101911c28a7a2",
|
|
58
|
+
"capabilities.json": "00a871a640cb26d1072a27318f1e99ca4d58c046917e353dc7b1d31600375751",
|
|
59
|
+
"references/assets.md": "5675ee6b395caca641e8ce56e200cd4391ad67e7afceb44fc6732f253a126926",
|
|
60
|
+
"references/brand-layout.md": "5668190c1e618a903aa1b5e859405fa43a004da2082dc7040e83ef8cfc0aae86",
|
|
61
|
+
"references/cases.md": "9d0d2d3d210e367411d5a291fc78ef6c9c733afd79c9da76451c580fcbcd4d3e",
|
|
62
|
+
"references/detail-final-20261016.md": "14acdc2f991b9db1c7d9ada32a35782603ac0aa310dcbe75f9693796a06cad83",
|
|
63
|
+
"references/kv-layout-case-20261012.md": "845b287cfc57912aabedc48e558ca661cf86bf136304ea841030205a806ef06f",
|
|
64
|
+
"references/model-generation.json": "21daa2c3bf7d2000c7ddf52ab0b980cb7ee95d6c9d345602dc59ecbc128ec147",
|
|
65
|
+
"references/model.md": "c4da688e22e2ada3f251fe0dc87effcaf5cb6ed6176f9d9c20a9661414bffab5",
|
|
66
|
+
"references/page-patterns.md": "3c126c75e9ccd5fc0b8860efcf2a0e27e9d3ba31e5cdeb407a0a683d8861a978",
|
|
67
|
+
"references/products.md": "642795ae16803669b169531240723bf72a388cb6351679a2787e67e181dca9cd"
|
|
68
|
+
}
|
package/npm/runtime.mjs
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
export const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
5
|
+
export const pkg = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8'));
|
|
6
|
+
export const fail = (code, message) => Object.assign(new Error(message), { code });
|
package/npm/skills.mjs
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import crypto from 'node:crypto';
|
|
5
|
+
import { stateRoot } from './update.mjs';
|
|
6
|
+
import { root, pkg, fail } from './runtime.mjs';
|
|
7
|
+
|
|
8
|
+
export const source = path.join(root, 'skills', 'cloud-hug-style-transfer');
|
|
9
|
+
const marker = '.cloud-hug-style-transfer-managed.json';
|
|
10
|
+
const metadata = 'agents/openai.yaml';
|
|
11
|
+
function exists(file) { try { return fs.lstatSync(file); } catch (e) { if (e.code === 'ENOENT') return null; throw e; } }
|
|
12
|
+
export function inventory(dir) {
|
|
13
|
+
const result = {};
|
|
14
|
+
function walk(at, prefix = '') {
|
|
15
|
+
for (const entry of fs.readdirSync(at, { withFileTypes: true })) {
|
|
16
|
+
if (entry.name === marker) continue;
|
|
17
|
+
const relative = prefix + entry.name;
|
|
18
|
+
if (entry.isSymbolicLink()) throw fail('SKILL_UNSAFE_TARGET', 'Skill files must not contain symlinks.');
|
|
19
|
+
if (entry.isDirectory()) walk(path.join(at, entry.name), relative + '/');
|
|
20
|
+
else result[relative] = crypto.createHash('sha256').update(fs.readFileSync(path.join(at, entry.name))).digest('hex');
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
walk(dir);
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
export function targetPath(agent, targetRoot) {
|
|
27
|
+
if (!['codex', 'sealseek', 'workbuddy'].includes(agent)) throw fail('INVALID_AGENT', 'Choose --agent codex, sealseek or workbuddy.');
|
|
28
|
+
let base = targetRoot;
|
|
29
|
+
if (!base && agent === 'codex') base = path.join(process.env.CODEX_HOME || path.join(os.homedir(), '.codex'), 'skills');
|
|
30
|
+
if (!base && agent === 'sealseek') base = process.env.SEALSEEK_SKILLS_DIR || path.join(os.homedir(), '.sealseek', 'workspaces', 'default', 'skills');
|
|
31
|
+
if (!base && agent === 'workbuddy') base = process.env.WORKBUDDY_SKILLS_DIR || path.join(os.homedir(), '.workbuddy', 'skills');
|
|
32
|
+
if (!base) throw fail('AGENT_PATH_REQUIRED', 'Provide the actual SealSeek skills directory through --root or SEALSEEK_SKILLS_DIR.');
|
|
33
|
+
return path.join(path.resolve(base), 'cloud-hug-style-transfer');
|
|
34
|
+
}
|
|
35
|
+
export function status(target) {
|
|
36
|
+
const st = exists(target);
|
|
37
|
+
if (!st) return { installed: false, managed: false, current: false, target };
|
|
38
|
+
if (st.isSymbolicLink() || !st.isDirectory()) return { installed: true, managed: false, current: false, target };
|
|
39
|
+
let record;
|
|
40
|
+
try { record = JSON.parse(fs.readFileSync(path.join(target, marker), 'utf8')); } catch { return { installed: true, managed: false, current: false, target }; }
|
|
41
|
+
if (record.package !== pkg.name || !record.files || typeof record.files !== 'object') return { installed: true, managed: false, current: false, target };
|
|
42
|
+
if (Object.keys(record.files).some(file => !file || path.isAbsolute(file) || file.includes('\\') || file.split('/').some(part => ['.', '..', ''].includes(part)))) throw fail('SKILL_UNSAFE_TARGET', 'Invalid managed-file path in Skill ownership record.');
|
|
43
|
+
const files = inventory(target);
|
|
44
|
+
const edited = Object.entries(record.files).some(([file, hash]) => file !== metadata && files[file] !== hash);
|
|
45
|
+
const expected = inventory(source);
|
|
46
|
+
const current = !edited && Object.entries(expected).every(([file, hash]) => file === metadata || files[file] === hash);
|
|
47
|
+
return { installed: true, managed: true, current, edited, target, version: record.version, record };
|
|
48
|
+
}
|
|
49
|
+
export function install(target) {
|
|
50
|
+
const state = status(target);
|
|
51
|
+
if (state.installed && !state.managed) throw fail('SKILL_UNMANAGED', 'An existing user-owned Skill occupies this target; preserve it and choose a new root or explicitly migrate it.');
|
|
52
|
+
if (state.edited) throw fail('SKILL_EDITED', 'Managed Skill files contain local edits; preserve and reconcile those edits before updating.');
|
|
53
|
+
const registry = path.join(stateRoot(), 'skill-targets');
|
|
54
|
+
fs.mkdirSync(registry, { recursive: true });
|
|
55
|
+
const registration = path.join(registry, crypto.createHash('sha256').update(target).digest('hex') + '.json');
|
|
56
|
+
if (!exists(registration)) fs.writeFileSync(registration, JSON.stringify({ target }), { flag: 'wx', mode: 0o600 });
|
|
57
|
+
if (state.current && state.version === pkg.version) return { ...state, record: undefined, ok: true, changed: false };
|
|
58
|
+
const expected = inventory(source);
|
|
59
|
+
for (const file of Object.keys(expected)) {
|
|
60
|
+
if (state.installed && exists(path.join(target, file)) && !(file in state.record.files) && file !== metadata) throw fail('SKILL_UNMANAGED_FILE', 'A new bundled file would overwrite a user-owned file.');
|
|
61
|
+
}
|
|
62
|
+
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
63
|
+
const lock = target + '.install-lock';
|
|
64
|
+
let lockfd;
|
|
65
|
+
try { lockfd = fs.openSync(lock, 'wx', 0o600); } catch (e) { if (e.code === 'EEXIST') throw fail('SKILL_BUSY', 'Another Skill installation holds the lock.'); throw e; }
|
|
66
|
+
let backup;
|
|
67
|
+
try {
|
|
68
|
+
if (state.installed) {
|
|
69
|
+
backup = path.join(stateRoot(), 'skill-backups', crypto.randomUUID());
|
|
70
|
+
fs.mkdirSync(path.dirname(backup), { recursive: true });
|
|
71
|
+
fs.cpSync(target, backup, { recursive: true, errorOnExist: true, force: false });
|
|
72
|
+
} else fs.mkdirSync(target);
|
|
73
|
+
// In-place updates support hosts holding a directory handle open. Backup is recoverable.
|
|
74
|
+
for (const file of Object.keys(expected)) {
|
|
75
|
+
if (file === metadata && exists(path.join(target, file))) continue;
|
|
76
|
+
fs.mkdirSync(path.dirname(path.join(target, file)), { recursive: true });
|
|
77
|
+
fs.copyFileSync(path.join(source, file), path.join(target, file));
|
|
78
|
+
}
|
|
79
|
+
for (const file of Object.keys(state.record?.files || {})) {
|
|
80
|
+
if (file !== metadata && !(file in expected)) fs.unlinkSync(path.join(target, file));
|
|
81
|
+
}
|
|
82
|
+
const actual = inventory(target);
|
|
83
|
+
if (Object.entries(expected).some(([file, hash]) => file !== metadata && actual[file] !== hash)) throw fail('SKILL_VERIFY_FAILED', 'Installed Skill hashes differ from the package.');
|
|
84
|
+
fs.writeFileSync(path.join(target, marker), JSON.stringify({ package: pkg.name, version: pkg.version, files: expected }, null, 2));
|
|
85
|
+
return { ok: true, installed: true, managed: true, current: true, changed: true, target, version: pkg.version, backup: backup || null };
|
|
86
|
+
} catch (e) {
|
|
87
|
+
throw fail('SKILL_INSTALL_FAILED', `Skill installation failed; ${backup ? 'restore from ' + backup : 'inspect the partial target at ' + target}.`);
|
|
88
|
+
} finally { fs.closeSync(lockfd); fs.unlinkSync(lock); }
|
|
89
|
+
}
|
package/npm/update.mjs
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import crypto from 'node:crypto';
|
|
5
|
+
import { spawnSync } from 'node:child_process';
|
|
6
|
+
import { root, pkg, fail } from './runtime.mjs';
|
|
7
|
+
|
|
8
|
+
export const stateRoot = () => process.env.CLOUD_HUG_STATE_DIR || (process.platform === 'win32' ? path.join(process.env.LOCALAPPDATA || os.homedir(), 'cloud-hug-style-transfer') : path.join(os.homedir(), '.local', 'state', 'cloud-hug-style-transfer'));
|
|
9
|
+
export function newer(a, b) {
|
|
10
|
+
if (!/^\d+\.\d+\.\d+$/.test(a)) return false;
|
|
11
|
+
const x=a.split('.').map(Number), y=b.split('.').map(Number);
|
|
12
|
+
for(let i=0;i<3;i++) { if(x[i]!==y[i]) return x[i]>y[i]; }
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
export function globalPrefix(location=root, platform=process.platform) {
|
|
16
|
+
const modules=path.dirname(path.dirname(location));
|
|
17
|
+
if(path.basename(modules)!=='node_modules' || fs.existsSync(path.join(location,'.git'))) return null;
|
|
18
|
+
if(platform==='win32') return path.dirname(modules);
|
|
19
|
+
return path.basename(path.dirname(modules))==='lib' ? path.dirname(path.dirname(modules)) : null;
|
|
20
|
+
}
|
|
21
|
+
export async function checkUpdate(registry=fetch) {
|
|
22
|
+
try {
|
|
23
|
+
const r=await registry(`https://registry.npmjs.org/${encodeURIComponent(pkg.name)}/latest`,{signal:AbortSignal.timeout(8000)});
|
|
24
|
+
if(!r.ok) throw Error('Registry unavailable');
|
|
25
|
+
const data=await r.json();
|
|
26
|
+
if(data.name!==pkg.name || !/^\d+\.\d+\.\d+$/.test(data.version)) throw Error('Invalid stable package');
|
|
27
|
+
return {ok:true,current:pkg.version,available:data.version,updateAvailable:newer(data.version,pkg.version),tag:'latest'};
|
|
28
|
+
} catch { return {ok:false,code:'REGISTRY_UNAVAILABLE',current:pkg.version,updateAvailable:false,offline:'keep-current'}; }
|
|
29
|
+
}
|
|
30
|
+
function npm(args) {
|
|
31
|
+
let cli=process.env.npm_execpath;
|
|
32
|
+
if(!cli?.endsWith('npm-cli.js')) {
|
|
33
|
+
const found=spawnSync(process.platform==='win32'?'where':'which',[process.platform==='win32'?'npm.cmd':'npm'],{encoding:'utf8',timeout:10000});
|
|
34
|
+
const launcher=found.stdout?.trim().split(/\r?\n/)[0];
|
|
35
|
+
cli=launcher && (process.platform==='win32' ? path.join(path.dirname(launcher),'node_modules','npm','bin','npm-cli.js') : fs.realpathSync(launcher));
|
|
36
|
+
}
|
|
37
|
+
if(!cli || !fs.existsSync(cli)) throw fail('NPM_UNAVAILABLE','npm is required for updates.');
|
|
38
|
+
const r=spawnSync(process.execPath,[cli,...args],{encoding:'utf8',timeout:180000});
|
|
39
|
+
if(r.status!==0) throw fail('UPDATE_FAILED','npm update failed; check npm connectivity and installation permissions.');
|
|
40
|
+
return r.stdout;
|
|
41
|
+
}
|
|
42
|
+
export function installUpdate(check, services={}) {
|
|
43
|
+
const prefix=services.prefix || globalPrefix();
|
|
44
|
+
if(!prefix) throw fail('UPDATE_OWNER_REQUIRED','This installation is managed by its source checkout or parent package.');
|
|
45
|
+
const state=stateRoot(); fs.mkdirSync(state,{recursive:true});
|
|
46
|
+
const lock=path.join(state,'update.lock');
|
|
47
|
+
try { fs.mkdirSync(lock); } catch { throw fail('UPDATE_BUSY','Another update is running. Retry this command after it finishes.'); }
|
|
48
|
+
const run=services.npm || npm, spawn=services.spawn || spawnSync;
|
|
49
|
+
const backup=path.join(state,'package-backups',crypto.randomUUID());
|
|
50
|
+
const targets=[];
|
|
51
|
+
try {
|
|
52
|
+
// Recheck the live package under the lock; another process may have updated it.
|
|
53
|
+
const live=JSON.parse(fs.readFileSync(path.join(root,'package.json'),'utf8'));
|
|
54
|
+
if(!newer(check.available,live.version)) return {ok:true,changed:false,version:live.version};
|
|
55
|
+
fs.mkdirSync(backup,{recursive:true});
|
|
56
|
+
const archive=JSON.parse(run(['pack',root,'--ignore-scripts','--pack-destination',backup,'--json']))[0];
|
|
57
|
+
const registered=path.join(state,'skill-targets');
|
|
58
|
+
const known=[path.join(process.env.CODEX_HOME || path.join(os.homedir(),'.codex'),'skills','cloud-hug-style-transfer')];
|
|
59
|
+
for(const f of (fs.existsSync(registered) ? fs.readdirSync(registered) : [])) {
|
|
60
|
+
try { known.push(JSON.parse(fs.readFileSync(path.join(registered,f),'utf8')).target); } catch { /* invalid registration */ }
|
|
61
|
+
}
|
|
62
|
+
for(const target of new Set(known)) {
|
|
63
|
+
try { if(JSON.parse(fs.readFileSync(path.join(target,'.cloud-hug-style-transfer-managed.json'),'utf8')).package===pkg.name) targets.push(target); } catch { /* unmanaged or absent */ }
|
|
64
|
+
}
|
|
65
|
+
const entry=path.join(root,'npm','cli.mjs');
|
|
66
|
+
const sync=target=>spawn(process.execPath,[entry,'skill','update','--root',path.dirname(target)],{encoding:'utf8',timeout:30000,env:{...process.env,CLOUD_HUG_AUTO_UPDATE:'0'}});
|
|
67
|
+
let mutated=false;
|
|
68
|
+
try {
|
|
69
|
+
mutated=true;
|
|
70
|
+
run(['install','--global','--prefix',prefix,'--prefer-online','--ignore-scripts','--no-audit','--no-fund',`${pkg.name}@${check.available}`]);
|
|
71
|
+
const version=JSON.parse(fs.readFileSync(path.join(root,'package.json'),'utf8')).version;
|
|
72
|
+
if(version!==check.available) throw fail('UPDATE_VERIFY_FAILED','Installed package version mismatch.');
|
|
73
|
+
for(const target of targets) if(sync(target).status!==0) throw fail('SKILL_SYNC_FAILED','A managed Skill needs reconciliation.');
|
|
74
|
+
return {ok:true,changed:true,from:pkg.version,version,backup:path.join(backup,archive.filename)};
|
|
75
|
+
} catch(e) {
|
|
76
|
+
if(mutated) {
|
|
77
|
+
try { run(['install','--global','--prefix',prefix,'--ignore-scripts',path.join(backup,archive.filename)]); }
|
|
78
|
+
catch { throw fail('ROLLBACK_REQUIRED','Automatic recovery failed; restore the package archive before running commands.'); }
|
|
79
|
+
for(const target of targets) if(sync(target).status!==0) throw fail('ROLLBACK_SYNC_REQUIRED','Package restored; reconcile edited Skill files before updating.');
|
|
80
|
+
}
|
|
81
|
+
throw e;
|
|
82
|
+
}
|
|
83
|
+
} finally { fs.rmdirSync(lock); }
|
|
84
|
+
}
|
package/package.json
CHANGED
|
@@ -1,16 +1,32 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@petercjl/cloud-hug-style-transfer",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
"url": "git+https://github.com/petercjl/cloud-hug-style-transfer.git"
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "抱抱云朵社品牌风格转换 Skill,支持 Codex、SealSeek 与 WorkBuddy",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"cloud-hug-style-transfer": "npm/cli.mjs"
|
|
9
8
|
},
|
|
10
9
|
"files": [
|
|
11
|
-
"
|
|
10
|
+
"npm/",
|
|
11
|
+
"skills/",
|
|
12
|
+
"capabilities.json",
|
|
13
|
+
"README.md",
|
|
14
|
+
"LICENSE"
|
|
12
15
|
],
|
|
16
|
+
"engines": {
|
|
17
|
+
"node": ">=22"
|
|
18
|
+
},
|
|
19
|
+
"scripts": {
|
|
20
|
+
"test": "node --test test/*.test.mjs",
|
|
21
|
+
"check": "node --check npm/cli.mjs && node --check npm/skills.mjs && node --check npm/update.mjs",
|
|
22
|
+
"prepack": "npm run check && npm test"
|
|
23
|
+
},
|
|
13
24
|
"publishConfig": {
|
|
14
25
|
"access": "public"
|
|
15
|
-
}
|
|
26
|
+
},
|
|
27
|
+
"repository": {
|
|
28
|
+
"type": "git",
|
|
29
|
+
"url": "git+https://github.com/petercjl/cloud-hug-style-transfer.git"
|
|
30
|
+
},
|
|
31
|
+
"license": "UNLICENSED"
|
|
16
32
|
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cloud-hug-style-transfer
|
|
3
|
+
description: 独立把旧详情页、产品摄影、主KV或SKU转换为抱抱云朵社的品牌视觉与同一模特。保留当次商品、有效文案参数及页面用途,产品款式与材料随新资料变化。内置完整19页定稿、LOGO、人物和摄影排版方法;无需其他个人技能、历史会话或私人素材库。用于“抱抱云朵社风格转换”、旧页品牌化、同模特延展与图文设计。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 抱抱云朵社风格转换
|
|
7
|
+
|
|
8
|
+
使用中文展示名 **抱抱云朵社风格转换**。用本目录内的方法和素材独立完成品牌转换,以当前使用者的明确要求为准;不读取其他个人技能,不依赖创建者的历史会话或私人文件权限。
|
|
9
|
+
|
|
10
|
+
## 运行合同与平台入口
|
|
11
|
+
|
|
12
|
+
输入是当前源页、商品资料和本次目标;输出是约定数量的独立成图及简短验收说明,或用户仅要求的规划。品牌方法与全部资产由本 Skill 提供,宿主负责图像查看、参考图编辑与结果交付,安装包仅管理来源和更新。
|
|
13
|
+
|
|
14
|
+
在首次查看或生成节点,读取 [能力合同](capabilities.json) 和当前宿主对应的适配: [Codex](adapters/codex.json)、[SealSeek](adapters/sealseek.json)、[WorkBuddy](adapters/workbuddy.json)。只加载当前宿主适配,通过其工具目录核验所需特性;规划仅需读取和看图。生成须支持多参考图编辑、实际传入本地资产并交付可查看结果。缺少能力时返回 `CAPABILITY_UNAVAILABLE` 或 `FEATURE_UNSUPPORTED`,说明影响与已完成内容;能力满足后回到第 5 节。适配状态和真实生成效果分别验收。
|
|
15
|
+
|
|
16
|
+
按第 1–4 节理解任务与选取依据,第 5 节执行,第 6 节实际验收;局部失败回到对应设计或执行节点。包管理采用 `cloud-hug-style-transfer` CLI 的当前 `skill source/status/install/update` 合同;源文件与素材随 npm 包提供,账户及生成服务由宿主配置。
|
|
17
|
+
|
|
18
|
+
## 1. 识别当次商品与页面任务
|
|
19
|
+
|
|
20
|
+
默认把上传的旧详情页作为**待转换源页**:其中商品就是本轮商品,保留可确认的形态、配色、材质、数量、规格、使用方式、有效卖点及文案。只有明确标为“仅借构图/竞品参考”的图片,才只借表达关系,不把它的商品或参数当成本品。
|
|
21
|
+
|
|
22
|
+
实际看图,形成简短判断:本屏让买家理解什么;原图靠什么关系成立;哪些内容须保留;品牌、人物、场景与排版如何更新。区分观察和推断,不要求使用者填长表。
|
|
23
|
+
|
|
24
|
+
| 依据 | 职责 |
|
|
25
|
+
| --- | --- |
|
|
26
|
+
| 待改源页与当次产品资料 | 商品事实、已确认文字、卖点、使用和比较关系;冲突时以明确更正为准,关键事实仍不明才询问 |
|
|
27
|
+
| 明确标注的外部参考 | 指定的机位、动作、构图或版式启发,不自动替代当前商品或品牌 |
|
|
28
|
+
| 内置最终成稿与品牌原图 | 品牌视觉、文字角色、摄影状态和连续节奏,不认证新商品的材质、尺寸、款色 |
|
|
29
|
+
| 已确认模特设定卡 | 以 `assets/model/character-sheet-approved-20261019.png` 统一模特身份与默认衣着;动作按当次用途,不继承卡片站姿 |
|
|
30
|
+
|
|
31
|
+
按 [当次产品事实](references/products.md) 处理商品。历史四款动物抱枕不是默认清单;新商品不套长条比例、六色数量、法兰绒或旧尺寸。源页足够清楚时可直接作为产品依据,不要求重复上传整套实拍;模糊、遮挡或关键结构不足时只补必要资料。不能从品牌案例补造参数。
|
|
32
|
+
|
|
33
|
+
保留原页有效的景别、视点、裁切、分区、信息密度和用途。未另定比例时沿用源页画幅,不因“详情页”自动改竖版。锁定布局时保留布局;开放转换可按同一信息职责优化图文关系,不擅自删卖点、改变产品或重排已确认屏序。品牌标识版位转换为本品牌;商品本体标签或包装换标依当次要求处理。
|
|
34
|
+
|
|
35
|
+
“先看/理解/规划”按该范围交付;要求“生成/转换/按规划做”或已经批准时完成约定数量,不逐张重复确认。只授权复盘或技能更新时不额外生图。
|
|
36
|
+
|
|
37
|
+
## 2. 按正文选择摄影或图文
|
|
38
|
+
|
|
39
|
+
| 当前依据 | 输出 |
|
|
40
|
+
| --- | --- |
|
|
41
|
+
| 明确无字 | 纯摄影,不加标题、说明、口号、LOGO或图形贴纸 |
|
|
42
|
+
| 明确要文字/排版 | 用给定内容组织完整图文;新文案标明提案,不造产品事实 |
|
|
43
|
+
| 未另说,源页有有效标题、卖点或说明正文 | 保留已确认内容与含义,转换字体、层级及图文组织 |
|
|
44
|
+
| 未另说,源页没有正文 | 默认纯摄影;“用于详情页”不自动授权加字 |
|
|
45
|
+
|
|
46
|
+
摄影署名、水印、装饰小字和孤立他牌标记不算正文,不能据此编标题。LOGO只在明确要求或源页确有品牌识别版位时使用。无字图的低信息区域属于摄影,不改成待填标题区。
|
|
47
|
+
|
|
48
|
+
图文任务读 [品牌文案与版式](references/brand-layout.md):先定确切内容、文字角色、阅读顺序与图文组织,再安排摄影。采用原 `assets/brand/logo-blue.png` 的云形、字形、比例和中英文;品牌名“抱抱云朵社”,英文“CLOUD HUG CLUB”。“让每一次拥抱,都有柔软回应”仅在确需品牌句时取用;系列名随本轮商品,不自动使用旧伴睡系列英文。
|
|
49
|
+
|
|
50
|
+
## 3. 保持品牌,按职责决定画面
|
|
51
|
+
|
|
52
|
+
以 [完整19页定稿](references/detail-final-20261016.md) 为当前品牌正向基准,按本屏用途取图。先判断本屏及所在段落要完成什么,再安排主体分量、观看距离、裁切、动作、清晰范围和文字;不把所有页面都改成安静远景。
|
|
53
|
+
|
|
54
|
+
| 品牌维度 | 落实方法与边界 |
|
|
55
|
+
| --- | --- |
|
|
56
|
+
| 空间 | 连续低信息的白/奶白/极浅中性灰概念棚景;家具是有选择的布景,按行为取床、沙发、地毯或必要承托面。避免补出门窗、墙角、踢脚线、柜体、窗帘墙、拱门、舞台阶梯和商品展台。紧景只露必要部分;概念KV可无家具、可漂浮,不推广到使用证据页。 |
|
|
57
|
+
| 色彩 | 奶白与低饱和浅蓝建立品牌联系,少量木材本色增加温度;床品与沙发沿用浅蓝或选定成稿。商品保持真实颜色,不为品牌配色把新品染成蓝白。奶白物体不等于暖黄照明。 |
|
|
58
|
+
| 光线 | 画外大面积扩散的中性白主光;明确方向,宽缓明暗塑形,适量反射保留暗面。保持体积、自然阴影和干净背景。避免硬窗格、直射光条、无动机光斑/逆光/发光轮廓和全图泛黄;明亮不等于所有面等亮或过曝。 |
|
|
59
|
+
| 景深 | 用真实物距、遮挡和自然退焦建立距离。先保护应看清的产品部位、动作接触或文字;SKU及尺寸可用更深清晰范围,触感图可紧裁,情绪收尾可柔化。不强加三层道具或全局模糊,不把虚化当构图腾空。 |
|
|
60
|
+
| 家具与道具 | 必要时选小体量、有曲面、收腰或雕塑体块的木几等,按构图决定数量和露出范围。特写、图示、抽象KV可不用家具;不堆小摆件,不让木灯染黄环境。普通靠垫、毯子是道具,不自动算本品SKU。 |
|
|
61
|
+
| 模特 | 以用户于 2026-10-19 确认的设定卡为唯一当前人物标准,读 [人物与受力](references/model.md)。默认奶白长袖家居服、宽松长裤和奶白素面棉袜,可见脚部与脚踝由袜子覆盖;旧 KV 和详情页只借摄影、动作与排版,不覆盖当前身份和衣着。行为决定视线、重心、承托和表情,不固定闭眼、微笑、全脸或卡片站姿。纯产品页可无人。 |
|
|
62
|
+
| 质感 | 皮肤保留柔和体积与自然色差,衣物、皮肤、商品有不同反光,细节密度符合景别。避免塑料肤感、全局磨皮、脏噪点、碎高光和过锐。柔软通过接触、压陷和材料表现;面料按当次商品依据,不统一改成案例绒面。 |
|
|
63
|
+
|
|
64
|
+
呼吸感来自主次、轮廓间隙、连续低信息区域与观看距离。安静远观同时控制人物、产品和床垫/毯子整组占幅;只缩小脸却让承托面铺满仍不成立。亲密堆抱可较满,尺度展示可站立,比较页可完整展示;不规定留白百分比、每张小主体或固定产品数量。白衣、白产品和密集褶皱仍是实体信息,不能按白色像素算留白。
|
|
65
|
+
|
|
66
|
+
用一句可见安排说明设计:从何处观察、注意中心是哪处关系、承托面怎样出现、哪些区域退后。柔光、模特、蓝白木齐全只是材料条件,画面仍须完成本屏目的。
|
|
67
|
+
|
|
68
|
+
## 4. 只读取本轮需要的内置方法与原图
|
|
69
|
+
|
|
70
|
+
所有路径相对本技能根目录。先看源页,再看职责最接近的品牌正例;已看过且未变化的图不用重复读,不一次加载或传入整个图库。
|
|
71
|
+
|
|
72
|
+
| 本轮决定 | 阅读与看图入口 |
|
|
73
|
+
| --- | --- |
|
|
74
|
+
| 选品牌参考、查素材位置 | [素材索引](references/assets.md) |
|
|
75
|
+
| 整页节奏、比较段、近远动静及信息页 | [完整定稿与逐页职责](references/detail-final-20261016.md),按需看相关页及邻屏 |
|
|
76
|
+
| 页面转换、三案差异 | [单屏与连续页面方法](references/page-patterns.md) |
|
|
77
|
+
| 当次商品事实、旧款是否适用 | [产品依据](references/products.md),仅确认同款时调用历史实拍 |
|
|
78
|
+
| 人物身份、衣着、接触受力 | [人物方法](references/model.md);核对当前设定卡版本时才读 [确认记录](references/model-generation.json) |
|
|
79
|
+
| 文字角色、字体与图像组织 | [品牌文案与版式](references/brand-layout.md) |
|
|
80
|
+
| 房景、拥挤、摆拍或擅加字 | [正反案例](references/cases.md) |
|
|
81
|
+
| 主KV排版或三案趋同 | [首屏图文对照](references/kv-layout-case-20261012.md) |
|
|
82
|
+
|
|
83
|
+
素材随本技能提供;缺失时先核对相对路径和随附文件,再请当前使用者补足必要素材或重新取得完整技能包。不要求访问创建者的账号、历史会话或私人来源,不用反例顶替正向原图。
|
|
84
|
+
|
|
85
|
+
## 5. 将决定与原图实际传入生成
|
|
86
|
+
|
|
87
|
+
生成前形成简短执行依据:**本屏职责;事实与保留范围;第一眼的观看/阅读关系;原图职责;成图须出现什么才算做到。**这是内部工作依据,不增加审批表单。
|
|
88
|
+
|
|
89
|
+
按当前工具实际支持的输入机制与数量组织图片,不沿用旧工具固定上限。必要输入通常包括源页/设计参考、当次产品依据、有可见人物时的已确认设定卡、匹配的品牌正例;确需标识才加原LOGO。当前设定卡必须实际传入,不用旧案例人物代替。一图可兼多职,但必须看清对应信息;不能为凑数量假称模糊图足以约束身份或材料。
|
|
90
|
+
|
|
91
|
+
先省重复氛围、重复角度与无关历史案例,保护当前商品、人物和设计依据。无人图不用人物卡,无字图不用独立LOGO。内置图存在不等于已传入生成器;核对实际输入顺序、来源和职责,不只在文字里写文件名,不默认拼接参考总图。
|
|
92
|
+
|
|
93
|
+
- **纯摄影说明**:目的与画幅 → 原图职责 → 与用途相符的棚景、主次和观看距离 → 光线、清晰范围 → 行为、承托和接触 → 产品参考锁定。
|
|
94
|
+
- **完整图文说明**:目的、画幅与必要邻屏关系 → 原图职责 → 准确文案、文字角色、层级与图文组织 → 配合的品牌摄影与图形 → 人物、产品及资产保留项。
|
|
95
|
+
|
|
96
|
+
以原图锁定全部可见商品结构、比例、部件位置、材质、颜色、文字、标识和连接关系;提示词主要描述场景、机位、光线、动作与用途,由原图承载商品细节。
|
|
97
|
+
|
|
98
|
+
查实际说明有无相反要求:无字却夹带标题;安睡却强求笑容露全脸;亲密近景却一律缩小主体;尺寸展示却遮挡关键轮廓;柔软品牌却全套粗圆字。修正具体冲突,不靠末尾追加“自然、高级、有呼吸感”抵消。
|
|
99
|
+
|
|
100
|
+
调用已核验的 `media.image.edit` 能力直接制作;工具不可用时如实说明,只完成可做的规划,不伪称出图,不擅换外部模型或程序合成。保留精简实际调用记录,使用当前可用路径,不向使用者倾倒完整日志。
|
|
101
|
+
|
|
102
|
+
分别要三张就交三张独立成稿,已授权数量连续完成,不自行拼成方案墙。创意备选应有真实观看或图文关系差异;比较型延展可保留同一骨架。一大两小、同构与否取决于页面,而非出图张数。
|
|
103
|
+
|
|
104
|
+
## 6. 按本屏职责验收,再连同邻屏看
|
|
105
|
+
|
|
106
|
+
实际看成图,先整幅看第一眼、品牌、人物状态、图文关系与空间,再放大查事实和细节。与承担同类职责的品牌正例比较,不能只读提示词判断通过。
|
|
107
|
+
|
|
108
|
+
1. **内容与输出**:商品有没有被换成旧款?用途、数量、比例、有无正文及LOGO符合本轮依据吗?已确认文案、参数与使用关系有没有改变?
|
|
109
|
+
2. **整体关系**:主次、景别、裁切、密度与清晰范围是否完成用途?近景不因较满就判错,情绪收尾不按SKU锐度验收;远观休息也不能因闭眼柔光就放过拥挤。图文看字形角色、阅读路线及文字与摄影的联系。
|
|
110
|
+
3. **品牌与人物**:棚景、蓝白关系、中性柔光、材料及身份是否一致?人物是否匹配当前已确认设定卡,默认衣着与素面棉袜是否一致,可见脚部及脚踝有无裸露?衣服相同不等于身份一致;动作是否有可持续支点,重量是否有承托,接触与压陷是否可信?活动与明确展示按对应行为判断。
|
|
111
|
+
4. **产品与文字**:结构、颜色、面料、比例、数量是否有当前依据?逐字检查正文、单位、原标识和可读性;艺术认可不抵消商品错误。
|
|
112
|
+
5. **连续阅读与备选**:比较段的重复是否帮助比较,跨段变化是否推进内容;三案是否真正提供选择。摄影变清晰或产品基本准确,不能替代整体设计成立。
|
|
113
|
+
|
|
114
|
+
整体成立时定向修局部;空间、状态或设计关系失败时调整对应关系,不锁住失败构图只修部件。遵守允许修改范围和数量,不默认额外跑多轮。交付如实说明仍有的关键问题;规则和规划检查不能证明实际生成效果已达标。
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "portable-skill-adapter",
|
|
3
|
+
"schema_version": "1.0.0",
|
|
4
|
+
"platform": "codex",
|
|
5
|
+
"mappings": [
|
|
6
|
+
{
|
|
7
|
+
"capability_id": "media.image.inspect",
|
|
8
|
+
"status": "implemented",
|
|
9
|
+
"features": [
|
|
10
|
+
"local-image",
|
|
11
|
+
"visual-inspection"
|
|
12
|
+
],
|
|
13
|
+
"implementation": {
|
|
14
|
+
"type": "agent-native",
|
|
15
|
+
"discovery": "Inspect the current host tool catalog and schemas; verify reference input and result delivery before invoking.",
|
|
16
|
+
"invocation": "Use native image viewing. Use the built-in image generation tool with referenced_image_paths for local references; inspect files before editing. Follow current host schema. API keys are not the default route.",
|
|
17
|
+
"configuration": "Host-managed account and provider authorization; no credentials bundled."
|
|
18
|
+
},
|
|
19
|
+
"normalization": "Success: {ok:true,artifacts:[],metadata:{},task_id:null,cost:null,warnings:[]}; failure: {ok:false,code,message,capability_id}.",
|
|
20
|
+
"evidence": []
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"capability_id": "media.image.edit",
|
|
24
|
+
"status": "implemented",
|
|
25
|
+
"features": [
|
|
26
|
+
"multiple-references",
|
|
27
|
+
"reference-image-edit",
|
|
28
|
+
"local-reference-input",
|
|
29
|
+
"viewable-output"
|
|
30
|
+
],
|
|
31
|
+
"implementation": {
|
|
32
|
+
"type": "agent-native",
|
|
33
|
+
"discovery": "Inspect the current host tool catalog and schemas; verify reference input and result delivery before invoking.",
|
|
34
|
+
"invocation": "Use native image viewing. Use the built-in image generation tool with referenced_image_paths for local references; inspect files before editing. Follow current host schema. API keys are not the default route.",
|
|
35
|
+
"configuration": "Host-managed account and provider authorization; no credentials bundled."
|
|
36
|
+
},
|
|
37
|
+
"normalization": "Success: {ok:true,artifacts:[],metadata:{},task_id:null,cost:null,warnings:[]}; failure: {ok:false,code,message,capability_id}.",
|
|
38
|
+
"evidence": []
|
|
39
|
+
}
|
|
40
|
+
],
|
|
41
|
+
"operating_systems": {
|
|
42
|
+
"macos": "implemented",
|
|
43
|
+
"windows": "implemented"
|
|
44
|
+
},
|
|
45
|
+
"notes": "Installer support and host generation capability are independent. Unresolved native capabilities must be verified on the executing host before generation."
|
|
46
|
+
}
|