GenerateTelosSummary: `parseProjects` collapses a flat-bullet `## Projects` section into a single entry

オープン 初心者向け
#2,601 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 9 日以内に返信

まだ誰も着手していません。

評価

難易度
2/5
見積もり時間
1〜3時間
初心者へのやさしさ
78/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
bun, typescript
領域
backend

調査の方向性

LIFEOS/TOOLS/GenerateTelosSummary.tsの560~582行付近、特にparseProjects()を読み、既存の見出し解析と箇条書き解析の経路を比較します。提供された箇条書き3項目の## Projectsフィクスチャで再現し、生成された「Active Projects」セクションに各プロジェクトが個別の項目として表示されることを確認します。同時に、列挙された対照ケースの動作が維持されることも確認します。

索引モデルが issue の本文から書いたものです。

説明

[!NOTE]
🤖 Numa (AI assistant) writing on behalf of Matías Barboza, who doesn't follow the technical detail and asked me to file this.

Version: 8.761.0 (LIFEOS/VERSION), Linux, bun 1.3.13.

The supplied transcript shows the generator running in a temporary HOME from the selected source tree.

What is broken

For the three contiguous flat bullets below, the extracted Active Projects section contains one entry showing the first bullet's text; the other two projects are absent from that section.

The supplied reproduction demonstrates the flat-bullet parsing failure below.

Where

LIFEOS/TOOLS/GenerateTelosSummary.ts:560-582, parseProjects(). The header regex (## PJn: / ### PJn:) doesn't match bullets, and the fallback parseItems(content, 'PJ') needs the : right after the id (- **PJ0**: text), while a bullet like - **P0 — Alpha build:** … has a title in between. Reading the code, those bullets then reach paragraphItems(), which splits on blank lines; a bullet list has none, so the whole list becomes one paragraph, truncated to one entry.

Repro against an extracted tree

FH=$(mktemp -d); mkdir -p "$FH/.claude/LIFEOS/USER/TELOS"; cp -r /path/to/extracted-8.761.0-tree/. "$FH/.claude/"
cat > "$FH/.claude/LIFEOS/USER/TELOS/TELOS.md" <<'EOF'
# TELOS

## Missions

### M0: Build things that last

## Projects

- **P0 — Alpha build:** `activo`, ships the first prototype by March.
- **P1 — Beta garden:** `pausado`, waiting on spring.
- **P2 — Gamma notes:** `activo`, weekly writing.
EOF
cd "$FH/.claude" && env -i HOME="$FH" PATH="$PATH" bun LIFEOS/TOOLS/GenerateTelosSummary.ts >/dev/null 2>&1
sed -n '/^## Active Projects/,/^## /p' "$FH/.claude/LIFEOS/USER/TELOS/PRINCIPAL_TELOS.md"

Result on 8.761.0 (3 bullets in, 1 entry out, bold markup inside the text):

## Active Projects

- **PJ0**: **P0 — Alpha build:** `activo`, ships the first prototype by March.

Controls

  • The same three projects written as ### PJ0: Alpha build / ### PJ1: … / ### PJ2: … headings give 3 entries on the unmodified tree, so the generator and the setup work; the loss is specific to this bullet shape.
  • With the proposed patch, the extracted project bullet lines are identical before and after for: the heading fixture; existing - **PJ0**: text bullets; a heading plus a - **P1 — …:** bullet; and one - **P0 — …:** bullet next to one - **PJ1**: … bullet (the new branch declines unless every bullet has the demonstrated shape, so the existing behavior for that input is unchanged, including its existing loss of the first bullet).
  • With the patch, a (sample …) placeholder bullet is still filtered.

Suggested partial fix

Add a bullet branch after the header regex, taken only when the header regex found nothing and every non-placeholder bullet has the leading-bold P<number> — title: form. Other bullet forms keep going to the existing fallback. Captured P<number> ids are normalized to PJ<number>, matching the project-prefix convention in the existing comment on parseProjects. Mixed headings and bullets remain unhandled because the branch requires zero heading matches.

+  // Flat bullets of the form `- **P0 — Title:** status prose`. ...
+  if (lines.length === 0) {
+    const bullets = content.split('\n').filter(l => /^-\s+/.test(l) && !isPlaceholder(l.replace(/^-\s+/, '')));
+    const flat = bullets.map(l => l.match(/^-\s+\*\*P(\d+)\s+[—–-]\s+(.+?):?\*\*/));
+    if (bullets.length > 0 && flat.every(m => m !== null)) {
+      for (const m of flat) lines.push(`- **PJ${m![1]}**: ${truncate(m![2].trim(), 60)}`);
+    }
+  }
+
   // Fallback: ID-less prose

With it: - **PJ0**: Alpha build, - **PJ1**: Beta garden, - **PJ2**: Gamma notes. I did not test - **P0:** … (colon inside the bold run). I can attach the full patch and the repro script (12 checks, all as expected), or open a PR.

主要言語
TypeScript
スター
19.7k
フォーク
2.5k
PR マージ指標
30日以内にマージされた PR はありません

環境構築

このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

danielmiessler/LifeOS のほかの issue

danielmiessler/LifeOS の issue をすべて見る

似ている issue

TypeScript の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。