@seanyao/roll 3.613.1 → 3.613.2

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/CHANGELOG.md CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## v3.613.2 — 2026-06-13
6
+
7
+ ### 稳定性
8
+
9
+ - `roll loop go` 的预算与运行上限改为每次启动显式设定:只取本次调用的 `--budget`/`--max-cycles`/`--for`,省略即本轮不设限,不再沿用上一次会话持久化的旧值(此前 flagless 连跑会继承几天前设的预算与单周期上限,一个 idle 周期即 budget_limited 收摊、整轮零产出);scope/review 仍按需沿用(FIX-279) `[loop]`
10
+ <!-- evidence: .roll/features/goal-mode/FIX-279/latest/FIX-279-report.html -->
11
+
12
+ - `roll index --rebuild` 不再把已合并故事页降级:delivered 判定补离线 git 合并真相(提交标题点名故事 id,或 `(#N)` PR 合并提交引用它),rebuild 无实时 PR 快照时也保住已合并卡的"已合主干·已验收"横幅与交付脊柱;选择器可提升但不再抹掉 git 证明已合的卡,Done 闸防止 Todo 卡被误提升(FIX-278) `[dossier]`
13
+ <!-- evidence: .roll/features/delivery-dossier/FIX-278/latest/FIX-278-report.html -->
14
+
5
15
  ## v3.613.1 — 2026-06-13
6
16
 
7
17
  ### 稳定性
package/dist/roll.mjs CHANGED
@@ -8859,9 +8859,10 @@ function collectDossier(projectPath3, opts = {}) {
8859
8859
  }
8860
8860
  const status2 = backlogStatus.get(id);
8861
8861
  const rawStatus = backlogRawStatus.get(id);
8862
+ const merged = opts.mergeEvidence?.(id) ?? false;
8862
8863
  const storyTruth = rawStatus !== void 0 ? storyTruthFromBacklog(id, rawStatus, { prEvidence: opts.prEvidence?.[id], nowSec: opts.nowSec }) : void 0;
8863
8864
  if (storyTruth !== void 0)
8864
- delivered = storyTruth.delivered;
8865
+ delivered = storyTruth.delivered || status2 === "done" && merged;
8865
8866
  const legacy = delivered && !hasLatest && !existsSync6(join4(dir, "ac-map.json"));
8866
8867
  const story = {
8867
8868
  id,
@@ -17164,6 +17165,13 @@ function factsSubjects(facts, storyId) {
17164
17165
  function factsChangedFiles(facts, storyId) {
17165
17166
  return factsCommitsFor(facts, storyId).flatMap((c2) => c2.files).map((l) => l.trim()).filter((l) => l !== "" && !l.includes(" ")).slice(0, 80);
17166
17167
  }
17168
+ function storyHasMergeEvidence(facts, storyId) {
17169
+ if (facts === null)
17170
+ return false;
17171
+ if (facts.commits.some((c2) => c2.subject.includes(storyId)))
17172
+ return true;
17173
+ return factsPrNumbers(facts, storyId).length > 0;
17174
+ }
17167
17175
  function factsPrNumbers(facts, storyId) {
17168
17176
  const nums = /* @__PURE__ */ new Set();
17169
17177
  for (const subject of factsSubjects(facts, storyId)) {
@@ -17510,9 +17518,9 @@ function generateDossierPages(cwd, rebuild) {
17510
17518
  const featuresDir = join24(cwd, ".roll", "features");
17511
17519
  if (!existsSync28(featuresDir))
17512
17520
  return 0;
17513
- const epics = collectDossier(cwd);
17514
- const inputs = /* @__PURE__ */ new Map();
17515
17521
  const runCache = buildDossierRunCache(cwd);
17522
+ const epics = collectDossier(cwd, { mergeEvidence: (id) => storyHasMergeEvidence(runCache.git, id) });
17523
+ const inputs = /* @__PURE__ */ new Map();
17516
17524
  for (const epic of epics) {
17517
17525
  for (const story of epic.stories) {
17518
17526
  try {
@@ -21596,16 +21604,15 @@ function runSummaryFromGoal(goal) {
21596
21604
  };
21597
21605
  }
21598
21606
  function applyRunOptions(goal, opts, at) {
21599
- const maxHours = opts.forSeconds !== void 0 ? opts.forSeconds / 3600 : goal.limits.maxHours;
21607
+ const { budgetUsd: _staleBudget, limits: _staleLimits, ...rest } = goal;
21600
21608
  return {
21601
- ...goal,
21609
+ ...rest,
21602
21610
  scope: opts.scopeSpecified ? opts.scope : goal.scope,
21603
21611
  ...opts.budgetUsd !== void 0 ? { budgetUsd: opts.budgetUsd } : {},
21604
21612
  review: opts.reviewModeSpecified ? { mode: opts.reviewMode } : goal.review,
21605
21613
  limits: {
21606
- ...goal.limits,
21607
21614
  ...opts.maxCycles !== void 0 ? { maxCycles: opts.maxCycles } : {},
21608
- ...maxHours !== void 0 ? { maxHours } : {}
21615
+ ...opts.forSeconds !== void 0 ? { maxHours: opts.forSeconds / 3600 } : {}
21609
21616
  },
21610
21617
  updatedAt: at
21611
21618
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seanyao/roll",
3
- "version": "3.613.1",
3
+ "version": "3.613.2",
4
4
  "description": "Roll — Roll out features with AI agents",
5
5
  "packageManager": "pnpm@11.1.3",
6
6
  "scripts": {