GenerateTelosSummary: `parseProjects` collapses a flat-bullet `## Projects` section into a single entry
メンテナーはふだん 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**: textbullets; 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 を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
danielmiessler/LifeOS のほかの issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 80/100
danielmiessler/LifeOS#2622 ·
メンテナーはふだん 9 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
danielmiessler/LifeOS#2620 ·
メンテナーはふだん 9 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
danielmiessler/LifeOS#2616 ·
メンテナーはふだん 9 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
danielmiessler/LifeOS#2612 ·
メンテナーはふだん 9 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
danielmiessler/LifeOS#2606 ·
メンテナーはふだん 9 日以内に返信
danielmiessler/LifeOS の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
transitmatters/shutdown-tracker#155 ·
メンテナーはふだん 2 日以内に返信
-
Popping out a single panel leaves its always render overlay in the main window, blocking clicksオープンbug triaged
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
メンテナーはふだん 1 日以内に返信
-
"Claude Code request is missing its initial user message" when the prompt starts with an image pathオープン
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
earendil-works/pi-claude-code#31 ·
メンテナーはふだん 8 日以内に返信
-
bug pending triage
難易度 1/5 1時間未満 初心者へのやさしさ 92/100
privatenumber/cleye#48 ·