create-yss-spec 3.5.5 → 3.5.6

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
@@ -191,6 +191,8 @@ npm pack --dry-run
191
191
 
192
192
  ## 固定计划实例迁移
193
193
 
194
+ 创建实例时默认安装 `yss-harness-upgrade`;已有实例执行 `sync` 时自动补齐该技能、已选择运行时的投影和升级协议,并更新技能锁与分发登记。`sync --dry-run` 只预览,不安装。补装保留原有技能、运行时和阶段选择。
195
+
194
196
  `migrate plan --target-dir <项目绝对路径> --output <项目外新计划.json>` 生成项目只读计划;`migrate apply --plan <计划>` 执行固定候选并保存持久归档。计划后输入变化必须重新规划。需要旧布局迁移或安全退出分发清理时,规划阶段显式加入 `--migrate-layout` / `--prune`。
195
197
 
196
198
  `migrate status` 查看状态;`migrate recover` 预览中断恢复,`migrate rollback` 预览最近一次成功迁移的整体回退,均需显式 `--apply` 才写入。后续修改、跨家族、未知基线及损坏归档阻断,禁止用 force 绕过。所有新接口支持 `--json`。
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "sourceRepository": "https://github.com/iloveZzz/yss-spec-project-template.git",
4
- "sourceRevision": "b98bafda74fc60c2b41c6020e3d41d84a4f1b1b7",
4
+ "sourceRevision": "dd58fc3929b3958579ac8a426f06f087682f2f6c",
5
5
  "sourceState": "committed",
6
6
  "sourcePath": ".template-source/cli-core",
7
7
  "coreVersion": "0.2.0",
@@ -84,7 +84,7 @@
84
84
  "mode": 420
85
85
  },
86
86
  "tests/package-contract.mjs": {
87
- "digest": "812129d3c327515269ed2aff08fec97049aa306b65f752d47a3cd004a168be72",
87
+ "digest": "ce8fcaa4e4f4498e2f4f49e86c9ab455b54c9ce386fe0911396ffe8f5eb6ff49",
88
88
  "mode": 420
89
89
  },
90
90
  "transaction.mjs": {
@@ -112,7 +112,7 @@
112
112
  "mode": 420
113
113
  }
114
114
  },
115
- "digest": "f5199dba3f9dc94a9b2e92a8b4d65d0633a5a3dfc489d88d30cb461204b8d63d",
115
+ "digest": "9a4cfce884a706efa91ae8dd8dc2fc82cd7d17e8a84f633bdb049ea531436ae1",
116
116
  "upgradeResources": {
117
117
  "SKILL.md": {
118
118
  "digest": "40495ca033ebd0345363714e45571ee77258a435ea1523ae716dc2402ced0487",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-yss-spec",
3
- "version": "3.5.5",
3
+ "version": "3.5.6",
4
4
  "description": "Initialize a YSS spec project template repository",
5
5
  "main": "src/api/index.js",
6
6
  "repository": {
@@ -244,7 +244,9 @@ function assetPaths(root, distribution) {
244
244
  for (const ref of bundle.files || []) addFile(root, result, ref);
245
245
  for (const ref of bundle.scripts || []) moduleClosure(root, result, ref, selectedSkills);
246
246
  }
247
- for (const skill of distribution.resourceSkills || []) skillReferences(root, result, skill, selectedSkills);
247
+ const resourceSkills = new Set(distribution.resourceSkills || []);
248
+ if (selectedSkills.has("yss-harness-upgrade")) resourceSkills.add("yss-harness-upgrade");
249
+ for (const skill of resourceSkills) skillReferences(root, result, skill, selectedSkills);
248
250
  return result;
249
251
  }
250
252
 
@@ -275,7 +275,9 @@ function buildSyncVariables(metadata) {
275
275
  variables.includeExampleDocs === undefined
276
276
  ? !(metadata.metadataSchemaVersion >= 3)
277
277
  : Boolean(variables.includeExampleDocs),
278
- distribution: metadata.metadataSchemaVersion >= 3 ? metadata.distribution : { mode: "legacy-all" },
278
+ distribution: metadata.metadataSchemaVersion >= 3 && metadata.distribution?.mode === "selected"
279
+ ? { ...metadata.distribution, installedSkills: [...new Set([...metadata.distribution.installedSkills, "yss-harness-upgrade"])] }
280
+ : metadata.metadataSchemaVersion >= 3 ? metadata.distribution : { mode: "legacy-all" },
279
281
  };
280
282
  }
281
283
 
@@ -495,7 +497,7 @@ function buildNextSyncMetadata(metadata, syncPlan, {
495
497
  return {
496
498
  ...metadata,
497
499
  metadataSchemaVersion: METADATA_SCHEMA_VERSION,
498
- distribution: metadata.metadataSchemaVersion >= 3 ? metadata.distribution : { mode: "legacy-all" },
500
+ distribution: buildSyncVariables(metadata).distribution,
499
501
  templateName: PACKAGE_MANIFEST.name,
500
502
  cliVersion: PACKAGE_MANIFEST.version,
501
503
  templateVersion: PACKAGE_MANIFEST.version,
@@ -3,8 +3,8 @@
3
3
  "templateName": "yss-spec-project-template",
4
4
  "templateSource": "github:iloveZzz/yss-spec-project-template",
5
5
  "templateRepository": "https://github.com/iloveZzz/yss-spec-project-template.git",
6
- "requestedRef": "b98bafda74fc60c2b41c6020e3d41d84a4f1b1b7",
7
- "templateCommit": "b98bafda74fc60c2b41c6020e3d41d84a4f1b1b7",
6
+ "requestedRef": "dd58fc3929b3958579ac8a426f06f087682f2f6c",
7
+ "templateCommit": "dd58fc3929b3958579ac8a426f06f087682f2f6c",
8
8
  "sourceState": "committed",
9
9
  "manifestHash": "544e8ae01c49ef451a784237b06772137876f8e8d6b5334094827e2ca2fe0f13",
10
10
  "encodedPaths": {
@@ -17,5 +17,5 @@
17
17
  ".pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/.gitignore": ".pi/skills/yss-frontend-scaffold-generator/assets/data-quality-v1/__yss_dotfile__.gitignore"
18
18
  },
19
19
  "snapshotHash": "e97773b2461a3bb7a35551a1f97371af689b94f281bbdb7a635e687d5239b405",
20
- "generatedAt": "2026-10-01T14:00:46.523Z"
20
+ "generatedAt": "2026-10-01T15:17:35.092Z"
21
21
  }
@@ -27,6 +27,19 @@ export function packageContract(root) {
27
27
  verifyCore(root);loadBundle(root);
28
28
  success(run('init',[...init,'--dry-run']));assert.equal(fs.existsSync(target),false);
29
29
  success(run('init',init));
30
+ const upgrade='yss-harness-upgrade',protocol='.template-spec/process/harness-upgrade.md';
31
+ const checkUpgrade=()=>{
32
+ const lock=JSON.parse(fs.readFileSync(path.join(target,'skills-lock.json')));
33
+ assert.ok(lock.skills.shared[upgrade]);
34
+ for(const base of ['.agents/skills',...lock.projectionRoots])for(const ref of ['SKILL.md','references/cli-families.md'])assert.ok(fs.existsSync(path.join(target,base,upgrade,ref)));
35
+ assert.ok(fs.existsSync(path.join(target,protocol)));
36
+ };
37
+ checkUpgrade();
38
+ // Reproduce an older instance whose managed baseline did not include this skill.
39
+ const oldMeta=JSON.parse(fs.readFileSync(path.join(target,family.metadataFile)));
40
+ for(const ref of Object.keys(oldMeta.managedFiles))if(ref.includes('/'+upgrade+'/')||ref===protocol){fs.rmSync(path.join(target,ref),{force:true});delete oldMeta.managedFiles[ref];}
41
+ oldMeta.baselineDigest=hash(JSON.stringify(oldMeta.managedFiles));fs.writeFileSync(path.join(target,family.metadataFile),JSON.stringify(oldMeta,null,2)+'\n');
42
+ const oldLock=JSON.parse(fs.readFileSync(path.join(target,'skills-lock.json')));delete oldLock.skills.shared[upgrade];fs.writeFileSync(path.join(target,'skills-lock.json'),JSON.stringify(oldLock,null,2)+'\n');
30
43
  const readme=path.join(target,'README.md'),context=path.join(target,'CONTEXT.md'),metadata=path.join(target,family.metadataFile);
31
44
  fs.writeFileSync(readme,'# 用户文档\n');
32
45
  const contextBefore=fs.readFileSync(context);
@@ -36,6 +49,7 @@ export function packageContract(root) {
36
49
  success(run('sync',['--plan','--prune']));
37
50
  assert.deepEqual(fs.readFileSync(metadata),before);assert.equal(journalCount(),count);
38
51
  success(run('sync',['--apply','--prune']));
52
+ checkUpgrade();
39
53
  assert.equal(fs.readFileSync(readme,'utf8'),'# 用户文档\n');assert.deepEqual(fs.readFileSync(context),contextBefore);
40
54
  before=fs.readFileSync(metadata);success(run('sync',['--apply']));assert.deepEqual(fs.readFileSync(metadata),before);
41
55
  if(family.side==='design') {