@petercjl/cloud-hug-style-transfer 0.3.0 → 0.4.0
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 +2 -2
- package/capabilities.json +245 -1
- package/npm/arguments.mjs +28 -0
- package/npm/cli.mjs +29 -35
- package/npm/integrity.json +10 -8
- package/npm/metadata.mjs +18 -0
- package/npm/pack.mjs +8 -0
- package/npm/skills.mjs +29 -14
- package/npm/update.mjs +49 -34
- package/package.json +6 -3
- package/skills/cloud-hug-style-transfer/SKILL.md +14 -6
- package/skills/cloud-hug-style-transfer/agents/openai.yaml +0 -1
- package/skills/cloud-hug-style-transfer/references/assets.md +4 -4
- package/skills/cloud-hug-style-transfer/references/brand-layout.md +1 -1
- package/skills/cloud-hug-style-transfer/references/detail-final-20261016.md +2 -2
- package/skills/cloud-hug-style-transfer/references/maintenance.md +9 -0
- package/skills/cloud-hug-style-transfer/references/page-patterns.md +3 -3
- package/skills/cloud-hug-style-transfer/references/photography-method.md +267 -49
- package/skills/cloud-hug-style-transfer/references/source-page-three-variants.md +7 -0
package/npm/update.mjs
CHANGED
|
@@ -3,6 +3,8 @@ import os from 'node:os';
|
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import crypto from 'node:crypto';
|
|
5
5
|
import { spawnSync } from 'node:child_process';
|
|
6
|
+
import { packReceipt } from './pack.mjs';
|
|
7
|
+
import { source, resolveTarget, status } from './skills.mjs';
|
|
6
8
|
import { root, pkg, fail } from './runtime.mjs';
|
|
7
9
|
|
|
8
10
|
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'));
|
|
@@ -40,45 +42,58 @@ function npm(args) {
|
|
|
40
42
|
return r.stdout;
|
|
41
43
|
}
|
|
42
44
|
export function installUpdate(check, services={}) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const state=stateRoot();
|
|
45
|
+
if(!check.ok)throw fail(check.code||'REGISTRY_UNAVAILABLE','Registry check failed; installation retained.');
|
|
46
|
+
const started=performance.now(), prefix=services.prefix || globalPrefix();
|
|
47
|
+
const state=stateRoot();fs.mkdirSync(state,{recursive:true});
|
|
46
48
|
const lock=path.join(state,'update.lock');
|
|
47
|
-
try {
|
|
48
|
-
const run=services.npm
|
|
49
|
-
const
|
|
50
|
-
const
|
|
49
|
+
try {fs.mkdirSync(lock);}catch{throw fail('UPDATE_BUSY','Another update is running. Retry after it finishes.');}
|
|
50
|
+
const run=services.npm||npm, spawn=services.spawn||spawnSync;
|
|
51
|
+
const entry=path.join(root,'npm','cli.mjs'), targets=[], skills=[];
|
|
52
|
+
const sync=target=>{
|
|
53
|
+
const r=spawn(process.execPath,[entry,'skill','update','--agent',target.agent||'codex','--root',path.dirname(target.target),'--json'],{encoding:'utf8',timeout:30000,env:{...process.env,CLOUD_HUG_AUTO_UPDATE:'0'}});
|
|
54
|
+
let receipt;try{receipt=JSON.parse(r.stdout);}catch{/* malformed receipt is a failure */}
|
|
55
|
+
if(r.status!==0||!receipt?.ok||!receipt.current||!receipt.verified)throw Object.assign(fail('SKILL_SYNC_FAILED','Managed Skill reconciliation failed.'),{details:{target:target.target,result:receipt||null}});
|
|
56
|
+
return {...receipt,resolution:target};
|
|
57
|
+
};
|
|
58
|
+
let archivePath,mutated=false,version;
|
|
51
59
|
try {
|
|
52
|
-
// Recheck the live package under the lock; another process may have updated it.
|
|
53
60
|
const live=JSON.parse(fs.readFileSync(path.join(root,'package.json'),'utf8'));
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
61
|
+
const packageChanged=newer(check.available,live.version);
|
|
62
|
+
if(packageChanged&&!prefix)throw fail('UPDATE_OWNER_REQUIRED','This installation is managed by its source checkout or parent package.');
|
|
63
|
+
if(services.resolution)targets.push(services.resolution);
|
|
64
|
+
else {
|
|
65
|
+
const known=[resolveTarget('codex'),resolveTarget('sealseek'),resolveTarget('workbuddy')];
|
|
66
|
+
const registered=path.join(state,'skill-targets');
|
|
67
|
+
for(const file of fs.existsSync(registered)?fs.readdirSync(registered):[]) {
|
|
68
|
+
try{const r=JSON.parse(fs.readFileSync(path.join(registered,file),'utf8'));if(typeof r.target==='string'&&path.isAbsolute(r.target)&&path.basename(r.target)==='cloud-hug-style-transfer')known.push({target:r.target,resolvedFrom:'managed-registration'});}catch{/* invalid registration is ignored */}
|
|
69
|
+
}
|
|
70
|
+
for(const r of known)if(!targets.some(t=>t.target===r.target)&&status(r.target).managed)targets.push(r);
|
|
64
71
|
}
|
|
65
|
-
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
72
|
+
// Ownership, local edits and metadata conflicts are checked before replacing the package.
|
|
73
|
+
for(const t of targets){const s=status(t.target);if(s.installed&&!s.managed)throw fail('SKILL_UNMANAGED','Selected Skill is user-owned.');if(s.edited)throw fail('SKILL_EDITED','Managed Skill contains local edits; reconcile before updating.');}
|
|
74
|
+
const preflightMs=performance.now()-started;
|
|
75
|
+
if(packageChanged) {
|
|
76
|
+
const backup=path.join(state,'package-backups',crypto.randomUUID());fs.mkdirSync(backup,{recursive:true});
|
|
77
|
+
const archive=packReceipt(run(['pack',root,'--ignore-scripts','--pack-destination',backup,'--json']));
|
|
78
|
+
if(!archive?.filename||path.basename(archive.filename)!==archive.filename)throw fail('UPDATE_BACKUP_FAILED','Invalid package backup receipt.');
|
|
79
|
+
archivePath=path.join(backup,archive.filename);
|
|
80
|
+
if(!fs.statSync(archivePath).size)throw fail('UPDATE_BACKUP_FAILED','Package backup is empty.');
|
|
69
81
|
mutated=true;
|
|
70
82
|
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
|
}
|
|
83
|
-
|
|
84
|
+
version=JSON.parse(fs.readFileSync(path.join(root,'package.json'),'utf8')).version;
|
|
85
|
+
if(version!==(packageChanged?check.available:live.version))throw fail('UPDATE_VERIFY_FAILED','Installed package version mismatch.');
|
|
86
|
+
const packageMs=performance.now()-started-preflightMs;
|
|
87
|
+
for(const t of targets)skills.push(sync(t));
|
|
88
|
+
if(skills.some(r=>r.version!==version))throw fail('SKILL_VERIFY_FAILED','Package and Skill versions differ.');
|
|
89
|
+
return {ok:true,package:pkg.name,source,entry:{node:process.execPath,cli:entry},owner:prefix?'global-npm':'source-or-parent',from:live.version,version,packageChanged,changed:packageChanged||skills.some(r=>r.changed),skills,verified:true,backup:archivePath||null,warnings:targets.length?[]:['No managed Skill target discovered; use an explicit --agent to install one.'],timingsMs:{preflight:preflightMs,package:packageMs,skills:performance.now()-started-preflightMs-packageMs,total:performance.now()-started}};
|
|
90
|
+
} catch(e) {
|
|
91
|
+
if(mutated) {
|
|
92
|
+
try{run(['install','--global','--prefix',prefix,'--ignore-scripts',archivePath]);const restored=JSON.parse(fs.readFileSync(path.join(root,'package.json'),'utf8')).version;if(restored!==pkg.version)throw Error('Rollback version mismatch');}
|
|
93
|
+
catch{throw Object.assign(fail('ROLLBACK_REQUIRED','Restore the package archive before continuing.'),{backup:archivePath});}
|
|
94
|
+
for(const t of targets)try{sync(t);}catch{throw Object.assign(fail('ROLLBACK_SYNC_REQUIRED','Package restored; restore affected Skill backups or reconcile local edits.'),{backup:archivePath,details:{skills,cause:e.details||e.message}});}
|
|
95
|
+
}
|
|
96
|
+
if(archivePath)e.backup=archivePath;
|
|
97
|
+
throw e;
|
|
98
|
+
} finally {fs.rmdirSync(lock);}
|
|
84
99
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@petercjl/cloud-hug-style-transfer",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "抱抱云朵社品牌风格转换 Skill,支持 Codex、SealSeek 与 WorkBuddy",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
},
|
|
19
19
|
"scripts": {
|
|
20
20
|
"test": "node --test test/*.test.mjs",
|
|
21
|
-
"check": "node --check npm/cli.mjs && node --check npm/skills.mjs && node --check npm/update.mjs",
|
|
21
|
+
"check": "node --check npm/cli.mjs && node --check npm/skills.mjs && node --check npm/update.mjs && node --check npm/arguments.mjs && node --check npm/metadata.mjs && node --check npm/pack.mjs",
|
|
22
22
|
"prepack": "npm run check && npm test"
|
|
23
23
|
},
|
|
24
24
|
"publishConfig": {
|
|
@@ -28,5 +28,8 @@
|
|
|
28
28
|
"type": "git",
|
|
29
29
|
"url": "git+https://github.com/petercjl/cloud-hug-style-transfer.git"
|
|
30
30
|
},
|
|
31
|
-
"license": "UNLICENSED"
|
|
31
|
+
"license": "UNLICENSED",
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"yaml": "^2.9.1"
|
|
34
|
+
}
|
|
32
35
|
}
|
|
@@ -11,9 +11,13 @@ description: 独立把旧详情页、产品摄影、主KV或SKU转换为抱抱
|
|
|
11
11
|
|
|
12
12
|
输入是当前源页、商品资料和本次目标;输出是约定数量的独立成图、原图与成图逐行对照的无限画板及简短验收说明,或用户仅要求的规划。本 Skill 负责品牌方法、素材选择、提示词、版式和业务验收;`@petercjl/sealseek-media-cli` 负责生图服务、认证、参考图传输、任务恢复和结果下载;宿主负责命令执行、实际看图和交付。
|
|
13
13
|
|
|
14
|
+
### 维护入口:安装、更新和诊断
|
|
15
|
+
|
|
16
|
+
维护请求先执行本入口;业务规划与生图进入下面的必需依赖检查。维护只读取包合同与安装状态,按需加载 [维护说明](references/maintenance.md),无需加载品牌图片或生图服务。
|
|
17
|
+
|
|
14
18
|
### 入口:必需依赖检查
|
|
15
19
|
|
|
16
|
-
|
|
20
|
+
**每次业务任务先检查依赖,通过后才进入第 1 节;规划任务也遵守此入口。** 执行 `cloud-hug-style-transfer doctor --json`,核对 `dependencies.media.ok`。检查支持当前 npm 安装树、PATH 安装及显式配置的 `CLOUD_HUG_MEDIA_ROOT`;返回的 `dependencies.media.invocation` 是经过包身份核验的 CLI 调用入口,使用宿主当前 Node 运行时,可用于 Agent 管理的运行时或套件组件。
|
|
17
21
|
|
|
18
22
|
未检测到 `@petercjl/sealseek-media-cli` 时返回 `DEPENDENCY_MISSING` 并**暂停整个任务**,保留输入和进度,给出最简安装提示词:“请安装 npm 包 @petercjl/sealseek-media-cli。”等待安装并重新检查通过后,从本入口恢复。版本低于 0.6.1、CLI 无法执行、规范 Skill 缺失或合同不兼容同样暂停,按诊断修复后复查。不得以宿主内置生图、其他提供商或继续规划代替依赖通过;本入口不自动安装软件或提交生成。
|
|
19
23
|
|
|
@@ -40,7 +44,7 @@ description: 独立把旧详情页、产品摄影、主KV或SKU转换为抱抱
|
|
|
40
44
|
|
|
41
45
|
保留原页有效的景别、视点、裁切、分区、信息密度和用途。未另定比例时沿用源页画幅,不因“详情页”自动改竖版。锁定布局时保留布局;开放转换可按同一信息职责优化图文关系,不擅自删卖点、改变产品或重排已确认屏序。品牌标识版位转换为本品牌;商品本体标签或包装换标依当次要求处理。
|
|
42
46
|
|
|
43
|
-
|
|
47
|
+
“先看/理解/规划”按该范围交付;要求“生成/转换/按规划做”或已经批准时完成约定数量,不逐张重复确认。只授权复盘或技能更新时不额外生图。出多方案时,先提取本页的设计任务与保留项,再按 [摄影方法论](references/photography-method.md) 的同题三案规则组织备选。
|
|
44
48
|
|
|
45
49
|
## 2. 按正文选择摄影或图文
|
|
46
50
|
|
|
@@ -57,12 +61,12 @@ description: 独立把旧详情页、产品摄影、主KV或SKU转换为抱抱
|
|
|
57
61
|
|
|
58
62
|
## 3. 保持品牌,按职责决定画面
|
|
59
63
|
|
|
60
|
-
以 [完整19页定稿](references/detail-final-20261016.md)
|
|
64
|
+
以 [完整19页定稿](references/detail-final-20261016.md) 为当前品牌正向基准,按本屏用途和摄影关系选图,不按页面名称固定匹配某张案例。**摄影方向与参考选择规则(镜头任务、生活叙事方法、人物与空间调度、品牌正例匹配)统一按 [摄影方法论](references/photography-method.md) 执行。** 先判断本屏及所在段落要完成什么,再安排主体分量、观看距离、裁切、动作、清晰范围和文字;不把所有页面都改成安静远景。
|
|
61
65
|
|
|
62
66
|
| 品牌维度 | 落实方法与边界 |
|
|
63
67
|
| --- | --- |
|
|
64
|
-
| 空间 |
|
|
65
|
-
| 色彩 |
|
|
68
|
+
| 空间 | 连续低信息的白/奶白/极浅中性灰概念棚景,承托面或织物可采用低饱和浅蓝;家具是有选择的布景,按行为取床、沙发、地毯或必要承托面。避免补出门窗、墙角、踢脚线、柜体、窗帘墙、拱门、舞台阶梯和商品展台。紧景只露必要部分;概念KV可无家具、可漂浮,不推广到使用证据页。 |
|
|
69
|
+
| 色彩 | 奶白与低饱和浅蓝共同建立品牌环境,少量木材本色增加温度;浅蓝必须落实到画面内可见的承托面或织物(床面、沙发软包、床单、织物),并具有可感知的范围,不能只写在风格说明里。商品保持真实颜色,不为品牌配色把新品染成蓝白,也不让商品本色替代品牌环境色。奶白物体不等于暖黄照明。 |
|
|
66
70
|
| 光线 | 画外大面积扩散的中性白主光;明确方向,宽缓明暗塑形,适量反射保留暗面。保持体积、自然阴影和干净背景。避免硬窗格、直射光条、无动机光斑/逆光/发光轮廓和全图泛黄;明亮不等于所有面等亮或过曝。 |
|
|
67
71
|
| 景深 | 用真实物距、遮挡和自然退焦建立距离。先保护应看清的产品部位、动作接触或文字;SKU及尺寸可用更深清晰范围,触感图可紧裁,情绪收尾可柔化。不强加三层道具或全局模糊,不把虚化当构图腾空。 |
|
|
68
72
|
| 家具与道具 | 必要时选小体量、有曲面、收腰或雕塑体块的木几等,按构图决定数量和露出范围。特写、图示、抽象KV可不用家具;不堆小摆件,不让木灯染黄环境。普通靠垫、毯子是道具,不自动算本品SKU。 |
|
|
@@ -82,6 +86,7 @@ description: 独立把旧详情页、产品摄影、主KV或SKU转换为抱抱
|
|
|
82
86
|
| 选品牌参考、查素材位置 | [素材索引](references/assets.md) |
|
|
83
87
|
| 整页节奏、比较段、近远动静及信息页 | [完整定稿与逐页职责](references/detail-final-20261016.md),按需看相关页及邻屏 |
|
|
84
88
|
| 页面转换、三案差异 | [单屏与连续页面方法](references/page-patterns.md) |
|
|
89
|
+
| 源页立意提取、同题三案规划、摄影参考选择 | [摄影方法论](references/photography-method.md) |
|
|
85
90
|
| 当次商品事实、旧款是否适用 | [产品依据](references/products.md),仅确认同款时调用历史实拍 |
|
|
86
91
|
| 人物身份、衣着、接触受力 | [人物方法](references/model.md);核对当前设定卡版本时才读 [确认记录](references/model-generation.json) |
|
|
87
92
|
| 文字角色、字体与图像组织 | [品牌文案与版式](references/brand-layout.md) |
|
|
@@ -101,6 +106,7 @@ description: 独立把旧详情页、产品摄影、主KV或SKU转换为抱抱
|
|
|
101
106
|
|
|
102
107
|
- **纯摄影说明**:目的与画幅 → 原图职责 → 与用途相符的棚景、主次和观看距离 → 光线、清晰范围 → 行为、承托和接触 → 产品参考锁定。
|
|
103
108
|
- **完整图文说明**:目的、画幅与必要邻屏关系 → 原图职责 → 准确文案、文字角色、层级与图文组织 → 配合的品牌摄影与图形 → 人物、产品及资产保留项。
|
|
109
|
+
- **同题三案规划方法**:三案必须从源页提取共同设计任务(见 [摄影方法论](references/photography-method.md)),共享相同的摄影任务、景别和品牌摄影基础。差异主要来自构图与空间调度——人物与产品的组合方式、承托面与家具的组织、观察方向、前景与留白形态。不得逐案从摄影任务表中各选一种任务拼成不同摄影类型,也不得把源页改成远景、特写与产品展示三种不同任务。每案均须交代完整的摄影安排,不能只有第一案设计完整、后续方案简化凑数。
|
|
104
110
|
|
|
105
111
|
以原图锁定全部可见商品结构、比例、部件位置、材质、颜色、文字、标识和连接关系;提示词主要描述场景、机位、光线、动作与用途,由原图承载商品细节。
|
|
106
112
|
|
|
@@ -110,7 +116,9 @@ description: 独立把旧详情页、产品摄影、主KV或SKU转换为抱抱
|
|
|
110
116
|
|
|
111
117
|
调用当前适配中由 `sealseek-media-cli` 实现的 `media.image.edit`。按已加载的 `sealseek-media` 主线读取当前模型能力,用其参考图生成/编辑合同传入真实原图与精简提示词,先 `--dry-run --json`,通过后在已有生成授权范围内用 `--canvas 本轮画板ID --archive none --via sealseek --submit` 提交,成功后按对照归档合同把原图与成图实际成对插入本轮画板。模型采用媒体包当前默认值,用户明确指定时保留指定值;模型不支持本轮要求时暂停并报告,不自动换模型。保存任务 ID,按依赖合同查询、恢复、下载;提交结果不明先核对同一任务,不自动重提或增加付费生成。执行中依赖丢失或服务不可用时暂停,恢复后回到既有任务或本执行节点。保留精简实际调用记录,不向使用者倾倒完整日志。
|
|
112
118
|
|
|
113
|
-
|
|
119
|
+
分别要三张就交三张独立成稿,已授权数量连续完成,不自行拼成方案墙。创意备选应有真实观看或图文关系差异;比较型延展可保留同一骨架。一大两小、同构与否取决于页面,而非出图张数。同题三案先按 [摄影方法论](references/photography-method.md) 锁定共同命题、保留项与逐案调度,再分别生成;不得把同一源页做成远景、特写与产品展示三种不同任务。
|
|
120
|
+
|
|
121
|
+
**同题三案生成约束**:三案共享相同的摄影任务、景别和品牌摄影基础,差异来自构图与空间调度(人物组合、承托面、观察方向、前景路径、留白形态),不得切换摄影任务(中景/特写/产品展示混用)或空间风格(概念棚景/实景/纯白背景混用)。每案均须有完整的摄影安排——行为、构图、空间、光线和道具,不能只把第一案设计完整、后续方案简化凑数。生成前按 [摄影方法论](references/photography-method.md) 的核对与横向比较检查四项:任务一致、品牌基准一致、表现有别、执行充分;未通过不得调用生成工具。
|
|
114
122
|
|
|
115
123
|
## 6. 按本屏职责验收,再连同邻屏看
|
|
116
124
|
|
|
@@ -6,16 +6,16 @@
|
|
|
6
6
|
|
|
7
7
|
| 当前需要 | 内置原图与用途 |
|
|
8
8
|
| --- | --- |
|
|
9
|
-
| 当前品牌整体与完整详情页 | `assets/approved/detail-final-20261016/01.jpg` 至 `19.jpg`;按 [
|
|
9
|
+
| 当前品牌整体与完整详情页 | `assets/approved/detail-final-20261016/01.jpg` 至 `19.jpg`;按 [摄影方法论](photography-method.md) 的参考选择规则选入本屏可用的页与邻屏,不按页面名称固定匹配。完整19张是同一条连续定稿,全套视觉认可,商品事实不自动推广。 |
|
|
10
10
|
| 原版LOGO | `assets/brand/logo-blue.png`;云形、字形、比例与中英文依据,只在确需标识时使用。 |
|
|
11
11
|
| 当前模特身份与默认衣着 | `assets/model/character-sheet-approved-20261019.png`:用户确认的第一方案,奶白长袖长裤与素面棉袜;唯一当前人物标准,有人物时实际传入。详见 [人物方法](model.md)。 |
|
|
12
12
|
| 原伴睡/沙发摄影 | `assets/brand/main-kv-sleep.webp`、`assets/brand/main-kv-lounge.webp`、`assets/brand/main-kv-dog-rest.webp`、`assets/brand/main-kv-seated-hug.webp`;补充空间、行为、接触与景深,不再承担人物身份或衣着依据。 |
|
|
13
|
-
|
|
|
14
|
-
| 安静与观看距离的历史校准 | `assets/approved/quiet-prone-user-finish.webp`、`assets/approved/overhead-breathing-user-finish.png
|
|
13
|
+
| 图文版式正例 | `assets/approved/brand-kv-user-finish-20261012.png`;当需要完整图文时用于校准文字角色与图文关系,按当前任务选用,不因“首屏”自动套用,细节以当前选定成稿为准。 |
|
|
14
|
+
| 安静与观看距离的历史校准 | `assets/approved/quiet-prone-user-finish.webp`、`assets/approved/overhead-breathing-user-finish.png`;用于相同问题的对照,不覆盖活动、近景或尺度展示等承担不同职责的画面,也不作为固定模板。 |
|
|
15
15
|
| 早期单款与群像 | `assets/approved/rabbit-detail.webp`、`assets/approved/hippo-detail.webp`、`assets/approved/dog-detail.webp`、`assets/approved/all-colors-user-finish.webp`;补充对应历史案例,当前品牌阅读节奏优先看完整定稿。 |
|
|
16
16
|
| 历史四款实拍 | `assets/products/six-variants.webp`、`assets/products/rabbit.jpg`、`assets/products/bear.jpg`、`assets/products/dog.jpg`、`assets/products/hippo.jpg`;只有明确同款才按 [产品依据](products.md) 查看,不是每次必传或默认SKU。 |
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
选图按 [摄影方法论](photography-method.md) 的参考选择规则执行:先看摄影类型与空间、人物与产品关系、景别与画面组织、品牌光色与材质是否相容,页码与文件名只用于定位。人物身份与默认衣着只由当前已确认设定卡约束;旧页和旧 KV 中的人物不替代它。其他原图可兼任多个清楚可辨的形态或设计职责。情绪图不认证材料,人物卡不决定广告动作,图文样例不默认授权新任务加字。
|
|
19
19
|
|
|
20
20
|
## 保留的对照素材
|
|
21
21
|
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
|
|
43
43
|
## 三张版式的差异
|
|
44
44
|
|
|
45
|
-
先锁定当前画幅、有效文案、原标识、商品事实和品牌摄影,再分别决定焦点、阅读路线及图文图形关系。可按素材探索摄影与文字共用动势、文字区与照片形成对照、文字与形体穿插等组织方式,不把这些例子固化成每次 A/B/C
|
|
45
|
+
先锁定当前画幅、有效文案、原标识、商品事实和品牌摄影,再分别决定焦点、阅读路线及图文图形关系。可按素材探索摄影与文字共用动势、文字区与照片形成对照、文字与形体穿插等组织方式,不把这些例子固化成每次 A/B/C。三案的共同命题、保留项与逐案调度先按 [摄影方法论](photography-method.md) 锁定,再各自组织图文。
|
|
46
46
|
|
|
47
47
|
每案都能说清这样组织如何服务页面。只是把同一粗大标题左移、居中、右移,或换商品,不能算三种完整版式。用户明确只需局部移位时遵从该范围。按授权分别交独立成稿,不把三案合成方案墙;单页本身的一大两小或四格结构则可以保留。
|
|
48
48
|
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
|
|
13
13
|
| 文件 | 页面内容与职责 | 转换其他商品时学习的关系 |
|
|
14
14
|
| --- | --- | --- |
|
|
15
|
-
| `01.jpg` |
|
|
15
|
+
| `01.jpg` | 抽象失重的拥抱画面;较大斜向人物与产品组,蓝色图形、主句、轻品牌句、系列英文和云形标识分工 | 摄影、文字与图形共同建立第一眼;失重、漂浮只适用于明确需要幻想表达的任务,其历史首屏身份不能使悬浮成为所有首屏的必备条件,也不把历史商品推广给全页 |
|
|
16
16
|
| `02.jpg` | 服务与品牌识别;黑色主体文字、服务图标、细线和蓝色条带 | 将服务信息组织清楚,允许功能性黑字;条目与承诺按当前资料,不能复制历史政策 |
|
|
17
17
|
| `03.jpg` | 系列入口;大蓝色粗圆标题与较轻辅助信息,睡眠抱枕摄影承接主题 | 系列标题可以有明确分量和圆润性格;系列名称与商品随任务,不能把所有标题都套这种字形 |
|
|
18
18
|
| `04.jpg` | 高位俯看休息组合;人物与多只软物形成围合,局部蓝家具及小木件建立空间 | 以接触和整组关系传达被陪伴;比旧远观案例更近也可成立,不固定留白比例和款数 |
|
|
@@ -46,6 +46,6 @@
|
|
|
46
46
|
|
|
47
47
|
## 当前任务如何选图
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
先实际查看当前旧页,确定商品事实、页面目的、是否保留文字与有效关系。随后只查看并选入最匹配的原图,按 [摄影方法论](photography-method.md) 的参考选择规则决定:先看摄影类型与空间、人物与产品关系、景别与画面组织、品牌光色与材质是否相容,再看具体编排。上面的逐页职责表只用于定位文件与理解其承担的关系,不表示“做首屏就必选 01”“做收尾就必选 19”这类按页面名称的固定匹配;详情页中段的某张也可以作为新首屏摄影参考。多人或多产品不是自动必需。
|
|
50
50
|
|
|
51
51
|
人物身份、默认家居服及素面棉袜按当前已确认设定卡核对,商品依据来自当次资料;案例只承担摄影、行为与设计职责。生成前明确每张实际输入负责什么,避免旧人物、裸足、旧商品、旧数据或案例正文被顺带复制。遇到关键资料不可读时只补问影响该屏的缺项;不要求同事取回作者的历史会话或安装其他技能。
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# 安装与维护合同
|
|
2
|
+
|
|
3
|
+
1. 通过当前 CLI 的 `capabilities --json` 获取参数合同;用 `skill source --json` 定位规范 Skill。首次安装执行 `skill install --agent 当前宿主 --json`。
|
|
4
|
+
2. 显式更新执行 `update install --yes --json`,在默认范围核对已登记和当前宿主约定位置的受管 Skill;仅更新一个宿主时传 `--agent`。npm 已最新时仍同步旧 Skill 与可迁移元数据。源码或上层工具拥有的包由其拥有者升级;当前版本的 Skill 同步仍可执行。
|
|
5
|
+
3. 需要指定位置时,`--root` 是技能父目录,CLI 自动附加本 Skill 目录名;`doctor` 与 `update` 的 `--root` 同时要求 `--agent`。Codex 优先级为显式 root、`CODEX_SKILLS_DIR`、`CODEX_HOME/skills`、平台默认;其他宿主见实时合同及回执。读取 resolution 核对目标与来源。
|
|
6
|
+
4. 检查回执 `verified`、`packageChanged`、各 `skills` 的 `current/version/target` 和备份。完全当前即 verified no-op。未知参数报错后读取该命令的 `--help --json`;避免猜其他工具的选项。
|
|
7
|
+
5. 本地编辑或非受管目录保留原文件并报告。失败时保留回执中的 backup;先检查包版本与受管状态,再按错误恢复,避免重复升级。元数据只迁移已知不受支持的字段值,自定义展示字段保留。
|
|
8
|
+
|
|
9
|
+
`doctor --json` 同时报告安装完整性与生图依赖;媒体依赖缺失不阻止独立的 `skill` 或 `update` 维护操作。普通业务任务不自动更新。
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
| 任务 | 保留的内容关系 | 品牌化方法 |
|
|
8
8
|
| --- | --- | --- |
|
|
9
|
-
| 完整品牌开场/主 KV | 文案分工、品牌识别、情绪中心及与邻屏的区别 | 先读 [品牌文案与版式](brand-layout.md),以最新用户 KV
|
|
9
|
+
| 完整品牌开场/主 KV | 文案分工、品牌识别、情绪中心及与邻屏的区别 | 先读 [品牌文案与版式](brand-layout.md),以最新用户 KV 确定图文图形关系,再组织摄影;生活叙事首屏继续用生活摄影,抽象失重内容仅在明确要求或已确认时使用;不重复实际使用房景,不把旧长页只做等比缩小 |
|
|
10
10
|
| 无字情绪/安静休息 | 人物产品关系、主体与空白、观察距离 | 先定人物及整个承托组合的占幅、观看距离与低信息空间,再用棚景、柔光和真实承托重建;不强塞标题、全款群像或露脸笑容 |
|
|
11
11
|
| 轻快陪伴/活动 | 原图的活动意图、身体重心及人与商品关系 | 允许迈步、伸展、自然笑意等轻快状态,仍保持干净棚景、可信动作和低表演感;不踩产品,不因品牌安静而全部改成睡觉 |
|
|
12
12
|
| 亲密近景/叠抱 | 接触、体量、包围关系与亲近距离 | 可让人物和产品较大、局部出画;用明确注意中心、干净边缘与适当退焦组织主次,不一律缩小主体或强空半幅 |
|
|
@@ -24,13 +24,13 @@
|
|
|
24
24
|
|
|
25
25
|
连续定稿的第 07 至 10 屏用同一“上大图+下两图”和稳定品名位置帮助比较,原图由 `assets/approved/detail-final-20261016/07.jpg` 起,完整路径见案例索引;主体动作、视角、款色与细节各完成自己的任务。**比较段的重复骨架是有效设计**,不为求变化强行重排,也不强迫不同商品统一闭眼抱睡。同一屏的创意备选则需要实质差异,两者不要混为一条规则。
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
定稿中既有远观休息、轻快活动、近景叠抱,也有站立尺度、靠坐接触和柔化收尾:同一品牌允许观看距离、产品占幅、人物状态和清晰范围随职责变化,这些画面只提供职责变体,不设为需要复制的模板。材质与信息页要让证据清楚,收尾不因整体较软就一律锐化;近景也不因占幅大就自动判为失败。
|
|
28
28
|
|
|
29
29
|
三张备选是三张独立页面,每页可以采用一大两小;不要把“给三张”理解为只交三张分区散图。
|
|
30
30
|
|
|
31
31
|
## 方案的实质差异
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
围绕本屏需要看的关系区分机位、观看距离、主体组位置、裁切与主次。先判断距离变化是否仍完成同一任务,不把“远/中/近”当默认套餐,也不把近景限定为材质页。静谧任务保留安顿下来的状态,动态任务可以变化动作中的时刻;不靠换模特、换色温或改成真实房间制造差异。多方案数量不授权增加本次不存在的商品款色。三案是同一页位的替代选择:先按 [摄影方法论](photography-method.md) 提取源页设计任务、锁定共同命题与保留项,再逐案完成行为、机位、空间层次、清晰递进、光线与家具、页面衔接的完整安排;不得把源页改成远景、特写与产品展示三种不同任务。
|
|
34
34
|
|
|
35
35
|
完整图文的三案分别决定焦点、阅读路线、文字与摄影的关系、图形的组织作用。保留当前文案与事实,在这些关系中形成可见差异;只把同一粗大标题换到左、中、右仍是同一结构。比对 [首屏正反案例](kv-layout-case-20261012.md),不能只查人物、光线与面料就宣告三种版式完成。
|
|
36
36
|
|