speccore 8.3.276 → 8.3.278

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.en.md CHANGED
@@ -117,6 +117,7 @@ Can't remember 60 commands? These are the ones that matter:
117
117
  | `run` | named pipeline entry (preset / range) |
118
118
  | `ask` | natural-language entry (auto-orchestration) |
119
119
  | `doc2spec` | import PRD → SpecCore MD |
120
+ | `unitize` | split requirement doc → feature units (formerly doc2spec --split) |
120
121
  | `req-doc` | one-liner requirement → PRD doc |
121
122
  | `analyze` | AI requirement analysis |
122
123
  | `taskify` | split requirements into dev tasks |
@@ -140,6 +141,10 @@ speccore ask "deploy for me" # → run --preset deploy
140
141
  speccore ask "from analyze to develop" # → run --from analyze --to execute
141
142
  ```
142
143
 
144
+ ### ⚡ spec-once single-session end-to-end
145
+
146
+ One "spec once" phrase packs the whole requirement-to-deploy chain into a single session: entry (feature units / doc path / one-liner) → clarify → analyze → taskify → execute → local smoke → deploy verification. **Dual mode**: interactive by default (pauses at every node); say "full-auto / don't stop" to switch to auto mode (pauses only at three safety points: scope confirmation, quality-gate failure, smoke failure). Unsatisfied with a step? **Roll back and rerun**: re-analyze (`analyze --unit` overwrite + backup), re-taskify (`taskify --modules`), re-execute (`execute` single task), re-unitize (`unitize --on-duplicate`). Best for a few feature units (≤3); larger scope goes through `speccore run`.
147
+
143
148
  ### 🧠 Knowledge graph & code graph
144
149
 
145
150
  ```bash
package/README.md CHANGED
@@ -117,6 +117,7 @@ settings:
117
117
  | `run` | 命名流水线入口(preset / 起止点) |
118
118
  | `ask` | 自然语言入口(说人话,自动编排) |
119
119
  | `doc2spec` | 导入 PRD → SpecCore MD |
120
+ | `unitize` | 切分需求文档 → 功能单元(原 doc2spec --split) |
120
121
  | `req-doc` | 一句话需求 → PRD 文档 |
121
122
  | `analyze` | AI 需求分析 |
122
123
  | `taskify` | 拆分需求为开发任务 |
@@ -141,6 +142,10 @@ speccore ask "从分析到开发" # → run --from analyze --to e
141
142
  speccore ask "分析本迭代需求,跳过澄清" # → analyze --skip-clarify
142
143
  ```
143
144
 
145
+ ### ⚡ spec-once 单会话端到端
146
+
147
+ 一句「spec once」把需求到部署整条链装进一次会话:需求入口(功能单元 / 文档地址 / 一句话需求)→ 澄清 → 分析 → 拆分任务 → 开发 → 本地冒烟 → 部署验证。**双模式**:默认人机交互(每个节点停下确认),说「全自动/别停」切全自动(仅范围确认、质量门禁失败、冒烟失败三个安全点停下)。哪一步不满意可**回退重跑**:重分析(`analyze --unit` 覆盖+备份)、重拆(`taskify --modules`)、重执行(`execute` 单任务)、重切(`unitize --on-duplicate`)。适合少量功能单元(≤3)的快速闭环,大范围走 `speccore run` 流水线。
148
+
144
149
  ### 🧠 知识图谱 & 代码图谱
145
150
 
146
151
  `speccore graph` 统一查询(知识 + 代码),`speccore knowledge` 可视化图谱:
@@ -1 +1 @@
1
- {"version":3,"file":"about.d.ts","sourceRoot":"","sources":["../../src/commands/about.ts"],"names":[],"mappings":"AAKA,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CA8KlD"}
1
+ {"version":3,"file":"about.d.ts","sourceRoot":"","sources":["../../src/commands/about.ts"],"names":[],"mappings":"AAKA,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAuLlD"}
@@ -33,9 +33,16 @@ async function aboutCommand() {
33
33
  { icon: '🚀', title: '环境驱动部署', desc: 'pipeline --env 自动 merge → build → deploy' },
34
34
  { icon: '🧪', title: '配置驱动测试', desc: 'verify --config 多环境/多页面批量测试' },
35
35
  { icon: '🔍', title: 'Spec 自审', desc: 'review 命令让 AI 自检分析文档质量并输出修订建议' },
36
+ { icon: '⚡', title: 'spec-once 单会话闭环', desc: '一句「spec once」需求到部署端到端,双模式 + 回退重跑' },
37
+ { icon: '✂️', title: 'unitize 切分', desc: '需求切功能单元(ASCII 目录名),同名三选一可回滚' },
36
38
  ];
37
39
  // 近期亮点
38
40
  const highlights = [
41
+ 'spec-once 单会话端到端 — 「spec once」一句话跑完需求→分析→拆分→开发→冒烟→部署,人机交互/全自动双模式',
42
+ '步骤回退重跑 — 重分析/重拆/重执行/重切四路径,哪一步不满意都无需推倒重来',
43
+ 'unitize 同名三选一 — skip/overwrite(时间戳备份可回滚)/rename,重切不再慌乱',
44
+ 'taskify --modules 范围重建 — 只重拆指定模块,旧任务自动备份其余保留,告别 --force 全量推倒',
45
+ '功能单元目录 ASCII 化 — 英文 slug + 拼音兜底 + LLM 英译,中文路径兼容风险归零',
39
46
  '环境驱动部署 — pipeline --env 自动读取环境配置 branch,merge → build → deploy',
40
47
  '五层环境模型 — local / dev / test / staging / production,支持任意数量自定义环境',
41
48
  '全命令 Skill 覆盖 — 26+ 命令均有 /命令 + 自然语言 快捷入口',
@@ -55,6 +62,8 @@ async function aboutCommand() {
55
62
  ];
56
63
  // 重要里程碑版本
57
64
  const milestones = [
65
+ { v: '8.3.277', date: '2026-09', desc: '拆分流健壮性加固 + 备份目录指纹隔离(五类静默失败清零)' },
66
+ { v: '8.3.275', date: '2026-09', desc: '步骤重跑体系(taskify --modules / unitize 同名三选一)+ spec-once 双模式' },
58
67
  { v: '8.3.146', date: '2026-09', desc: 'Spec 自审 + 端名动态化 + 全面清理 backend/frontend 硬编码' },
59
68
  { v: '8.3', date: '2026-09', desc: '环境驱动部署 + 全命令 Skill 覆盖 + 配置驱动测试' },
60
69
  { v: '6.8', date: '2026-08', desc: '统一检索层 + RAG 检索 + 全局知识沉淀' },
@@ -1 +1 @@
1
- {"version":3,"file":"about.js","sourceRoot":"","sources":["../../src/commands/about.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"about.js","sourceRoot":"","sources":["../../src/commands/about.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"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"}
@@ -1125,7 +1125,8 @@ async function analyzeCommand(options) {
1125
1125
  try {
1126
1126
  const featureEntries = await (0, fs_extra_2.readdir)(featuresDir, { withFileTypes: true });
1127
1127
  for (const fe of featureEntries) {
1128
- if (fe.isDirectory() && !fe.name.startsWith('.')) {
1128
+ // v8.3.277: 排除时间戳备份目录(unitize overwrite 产生的 xxx-20260924083058)
1129
+ if (fe.isDirectory() && !fe.name.startsWith('.') && !(0, task_utils_1.isTimestampBackup)(fe.name)) {
1129
1130
  const readmePath = await (0, feature_source_1.resolveUnitSourcePath)((0, path_1.join)(featuresDir, fe.name));
1130
1131
  if (await (0, fs_extra_1.pathExists)(readmePath))
1131
1132
  requirements.push(readmePath);
@@ -1241,7 +1242,8 @@ async function analyzeCommand(options) {
1241
1242
  // v8.0.0+: 骨架优先架构 — CLI 预创建所有文件,AI 只覆盖内容
1242
1243
  const iterDirForSkeleton = await (0, context_1.getIterationDir)(iterForDirs);
1243
1244
  const specDir = (0, path_1.join)(iterDirForSkeleton, '020-specs');
1244
- let platforms = await (0, spec_paths_2.parsePlatformList)();
1245
+ const allPlatforms = await (0, spec_paths_2.parsePlatformList)();
1246
+ let platforms = [...allPlatforms];
1245
1247
  const iterName = iterForDirs;
1246
1248
  // v8.3.16+: 如果指定了 --platform,只创建指定端的骨架
1247
1249
  if (options.platform) {
@@ -1259,16 +1261,31 @@ async function analyzeCommand(options) {
1259
1261
  // v8.3.21+: 按需求文档名组织(020-specs/{需求名}/)
1260
1262
  const phase = options.phase;
1261
1263
  const features = await (0, spec_paths_2.parseFeatureList)(iterDirForSkeleton);
1264
+ // v8.3.278+: 读 _matrix.md 端声明,按「单元 × 声明端」收敛骨架生成——
1265
+ // 不涉及的端不再预建空骨架(旧笛卡尔积产物由 pruneUninvolvedPlatformSkeletons 清理)
1266
+ const featurePlatforms = await (0, spec_skeleton_1.resolveFeaturePlatformMap)((0, path_1.join)(iterDirForSkeleton, '010-requirements', 'features'), features, allPlatforms);
1262
1267
  let manifest;
1263
1268
  if (features.length > 0) {
1264
- manifest = (0, spec_skeleton_1.computeFeatureBasedAnalyzeManifest)(features, platforms, phase, iterName);
1269
+ manifest = (0, spec_skeleton_1.computeFeatureBasedAnalyzeManifest)(features, platforms, phase, iterName, featurePlatforms);
1265
1270
  logger_1.logger.info(`📂 按需求文档组织: ${features.length} 个功能模块`);
1271
+ if (featurePlatforms.size > 0) {
1272
+ const declared = [...featurePlatforms.entries()].map(([f, ps]) => `${f}→[${ps.join(',')}]`).join(';');
1273
+ logger_1.logger.info(`📍 端覆盖矩阵收敛: ${declared}`);
1274
+ }
1266
1275
  }
1267
1276
  else {
1268
1277
  manifest = (0, spec_skeleton_1.computeFeatureBasedAnalyzeManifest)([], platforms, phase, iterName);
1269
1278
  logger_1.logger.info(`📂 未检测到需求文档,仅创建全局 overview/`);
1270
1279
  }
1271
1280
  const skeletonResult = await (0, spec_skeleton_1.generateSkeleton)(specDir, manifest);
1281
+ // v8.3.278+: 清理「未涉及端」的旧空骨架目录(v8.3.277 及以前的全端笛卡尔积残留)
1282
+ const pruneResult = await (0, spec_skeleton_1.pruneUninvolvedPlatformSkeletons)(specDir, features, featurePlatforms);
1283
+ if (pruneResult.removed.length > 0) {
1284
+ logger_1.logger.info(`🧹 已清理 ${pruneResult.removed.length} 个未涉及端的空骨架目录: ${pruneResult.removed.join(', ')}`);
1285
+ }
1286
+ if (pruneResult.kept.length > 0) {
1287
+ logger_1.logger.warn(`⚠️ 以下端目录不在 _matrix.md 声明中但已有真实内容,保留未删(请确认声明完整性): ${pruneResult.kept.join(', ')}`);
1288
+ }
1272
1289
  if (skeletonResult.created.length > 0) {
1273
1290
  logger_1.logger.info(`🦴 已创建 ${skeletonResult.created.length} 个文件骨架: ${skeletonResult.created.join(', ')}`);
1274
1291
  }
@@ -4907,8 +4924,11 @@ sequenceDiagram
4907
4924
  // 全局 overview/ 只含索引类),避免旧 manifest 把 overview/REQUIREMENT.md 当
4908
4925
  // 「下一个待填充」但 --apply 又按路由表拦截 → 单文档模式死锁。
4909
4926
  const features = await (0, spec_paths_2.parseFeatureList)(iterDir);
4927
+ // v8.3.278+: 进度检测同样按端声明收敛,与骨架生成口径一致,
4928
+ // 避免把不涉及端的旧骨架目录误判为「下一个待填充」
4929
+ const featurePlatforms = await (0, spec_skeleton_1.resolveFeaturePlatformMap)((0, path_1.join)(iterDir, '010-requirements', 'features'), features, platforms);
4910
4930
  const manifest = features.length > 0
4911
- ? (0, spec_skeleton_1.computeFeatureBasedAnalyzeManifest)(features, platforms, undefined, ctx.iteration)
4931
+ ? (0, spec_skeleton_1.computeFeatureBasedAnalyzeManifest)(features, platforms, undefined, ctx.iteration, featurePlatforms)
4912
4932
  : (0, spec_skeleton_1.computeAnalyzeManifest)(platforms, undefined, ctx.iteration);
4913
4933
  perDocStatus = await (0, spec_skeleton_1.detectSkeletonProgress)(specDir, manifest);
4914
4934
  if (perDocStatus.nextUnfilled) {
@@ -7090,8 +7110,13 @@ async function countPlatformSkeletons(iterDir) {
7090
7110
  return { skeleton, total };
7091
7111
  const features = await (0, spec_paths_2.parseFeatureList)(iterDir);
7092
7112
  const platforms = await (0, spec_paths_2.parsePlatformList)();
7113
+ // v8.3.278+: 统计口径与骨架生成一致——只统计声明端(未声明单元全端兜底),
7114
+ // 避免把不涉及端的旧残留目录计入骨架提示
7115
+ const featurePlatforms = await (0, spec_skeleton_1.resolveFeaturePlatformMap)((0, path_1.join)(iterDir, '010-requirements', 'features'), features, platforms);
7093
7116
  for (const feature of features) {
7094
- for (const platform of platforms) {
7117
+ const declared = featurePlatforms.get(feature);
7118
+ const unitPlatforms = declared && declared.length > 0 ? declared : platforms;
7119
+ for (const platform of unitPlatforms) {
7095
7120
  const pDir = (0, path_1.join)(specDir, feature, platform);
7096
7121
  if (!(await (0, fs_extra_1.pathExists)(pDir)))
7097
7122
  continue;