Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/design/stages/stage-01-style-governance.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@
- チャート: `components.chart.palette` を優先し、系列ごとの `color_hex` がない場合に使用。
- 画像・テキストボックス: `components.image` / `components.textbox` の `fallback_box` を利用。
- レイアウト固有設定(`layouts.*.placements`)がある場合はアンカー解決時に上書き。
- `pptx_generator/branding_extractor` は新スキーマへ対応させる(抽出結果を `theme` 相当へマッピング)。
- `pptx_generator/template/branding_extractor` は新スキーマへ対応させる(抽出結果を `theme` 相当へマッピング)。

## テスト計画
- `tests/test_settings.py`: 新スキーマ読み込みの正常系/異常系テストを更新。
Expand Down
2 changes: 1 addition & 1 deletion docs/notes/20250215-rm081-font-capacity-discussion.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ Plan(承認待ち):
- 既存レコード生成テストを更新し、差分確認用に追加の期待値を組み込む。

4. JobSpec 変換・テスト・サンプル更新
- `src/pptx_generator/spec_loader.py` と `src/pptx_generator/generate_ready.py` で `text_capacity` を取り扱うようにし、Scaffold→JobSpec 変換時に SlideTextbox へ伝播。
- `src/pptx_generator/template/spec_loader.py` と `src/pptx_generator/pipeline/generate_ready.py` で `text_capacity` を取り扱うようにし、Scaffold→JobSpec 変換時に SlideTextbox へ伝播。
- `tests/template_audit/test_template_extractor_jobspec_output.py` や `tests/layout_validation/*` など関連テスト、サンプル JSON を更新。
- ドキュメント(requirements/design/roadmap/ToDo メモ)に実装結果・利用方法を反映。

Expand Down
2 changes: 1 addition & 1 deletion docs/notes/20251105-jobspec-scaffold-validation.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,6 @@ feat/047-draft-structuring での調査結果
2. もしくはテンプレ抽出成果物と compose 入力スキーマ統合に向けたロードマップ項目の起票。

## 2025-11-08 更新
- `pptx_generator.spec_loader.load_jobspec_from_path` を導入し、テンプレ抽出 `jobspec.json` を読み込んだ際に `JobSpecScaffold` を `JobSpec` へ自動変換する処理を追加。
- `pptx_generator.template.load_jobspec_from_path` を導入し、テンプレ抽出 `jobspec.json` を読み込んだ際に `JobSpecScaffold` を `JobSpec` へ自動変換する処理を追加。
- 変換時はテンプレプレースホルダから `Slide.textboxes` を生成し、タイトル/サブタイトルの初期値や非テキスト要素の要約を `notes` に残す。
- CLI (`pptx compose` / `pptx mapping`) は従来どおり `_load_jobspec` を経由するため、テンプレ抽出直後の `jobspec.json` でもバリデーションエラーなく実行できる。
2 changes: 1 addition & 1 deletion docs/todo/20260107-rm098-accuracy-improvement.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
目的: 動的・静的テンプレート対応を含む精度改善
roadmap_item: RM-098 精度改善
関連ブランチ: feat/rm098-accuracy-improvement
関連Issue:
関連Issue: #527
期限:
---

Expand Down
2 changes: 1 addition & 1 deletion docs/todo/archive/20251102-rm049-pptx-gen-scope.md
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ roadmap_item: RM-049 pptx gen スコープ最適化
## メモ
**主変更点**
- `src/pptx_generator/cli.py`: `pptx gen` を `generate_ready.json` 専用入力へ統一し、テンプレートパス欠落時にエラーを返す。`pptx mapping` は `--template` 指定を必須化し、監査メタ `mapping_meta` に `template_path` を確実に記録。
- `src/pptx_generator/pipeline/mapping.py`、`src/pptx_generator/generate_ready.py`: `GenerateReadyDocument.meta.template_path` を埋め込み、`mapping_meta` と監査ログにテンプレート情報を反映。
- `src/pptx_generator/pipeline/mapping.py`、`src/pptx_generator/pipeline/generate_ready.py`: `GenerateReadyDocument.meta.template_path` を埋め込み、`mapping_meta` と監査ログにテンプレート情報を反映。
- `tests/test_cli_integration.py` / `tests/test_cli_cheatsheet_flow.py` / `tests/test_mapping_step.py`: generate_ready 専用フローに合わせてテンプレート必須化と新エラーハンドリングを検証。
- README・`docs/design/cli/cli-command-reference.md`・`docs/runbooks/story-outline-ops.md` ほか関連ドキュメントを更新し、`pptx gen` の入力仕様と `--template` 必須化を明記。
- `docs/notes/20251109-generate-ready-meta.md`: Prepare 正規化後も generate_ready メタ方針を維持する旨を追記。
Expand Down
4 changes: 2 additions & 2 deletions docs/todo/archive/20251104-rm047-draft-structuring.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ roadmap_item: RM-047 テンプレ統合構成生成AI連携
- `docs/roadmap/roadmap.md` の RM-047 セクションを進行中へ更新し、新設ドキュメントへのリンクを追加する。
3. **モデル・ユーティリティ追加**
- `src/pptx_generator/models.py` に `GenerateReadyDocument` 系モデルを追加し、旧 `Draft*`/`RenderingReady` 系に依存しない構造へ刷新する。
- `src/pptx_generator/generate_ready.py` を新規実装し、`generate_ready_to_jobspec` など Stage5 で必要な変換ユーティリティを提供する。
- `src/pptx_generator/pipeline/generate_ready.py` を新規実装し、`generate_ready_to_jobspec` など Stage5 で必要な変換ユーティリティを提供する。
4. **stage 4 パイプライン実装**
- `pipeline/draft_structuring.py` を `prepare_card.json` と `jobspec.json` の突合前提に書き換え、カード単位の割当結果を `GenerateReadyDocument` へ連携できるようにする。
- `pipeline/prepare_normalization.py`・`pipeline/mapping.py` を含む CLI パイプラインを全面刷新し、`draft_*`/`rendering_ready` 出力を廃止。`generate_ready.json` を唯一の後続入力として扱う。
Expand All @@ -34,7 +34,7 @@ roadmap_item: RM-047 テンプレ統合構成生成AI連携
8. **フォローアップ**
- stage 2 から追加で必要となった情報があれば docs/notes と ToDo メモに記録し、ユーザーへ報告する。
- スコープ: stage 4 全体を `generate_ready` 基盤へ全面置換し、既存 `draft_*` および `rendering_ready` 系の入出力は廃止する。後方互換の考慮は不要、完全新規置換で進める。
- 想定影響ファイル: `docs/design/stages/stage-03-compose.md`、`docs/design/design.md`、`docs/requirements/stages/stage-03-compose.md`、`docs/roadmap/roadmap.md`、`src/pptx_generator/models.py`、`src/pptx_generator/cli.py`、`src/pptx_generator/generate_ready.py`(新規)、`src/pptx_generator/pipeline/prepare_normalization.py`、`src/pptx_generator/pipeline/draft_structuring.py`、`src/pptx_generator/pipeline/mapping.py`、該当テストファイル。
- 想定影響ファイル: `docs/design/stages/stage-03-compose.md`、`docs/design/design.md`、`docs/requirements/stages/stage-03-compose.md`、`docs/roadmap/roadmap.md`、`src/pptx_generator/models.py`、`src/pptx_generator/cli.py`、`src/pptx_generator/pipeline/generate_ready.py`(新規)、`src/pptx_generator/pipeline/prepare_normalization.py`、`src/pptx_generator/pipeline/draft_structuring.py`、`src/pptx_generator/pipeline/mapping.py`、該当テストファイル。
- リスク: PrepareCard 仕様変更の波及、AI 推薦精度の不確実性による再調整、CLI 引数廃止に伴うドキュメント更新漏れ。
- テスト方針: 上記テスト更新に加え、`uv run --extra dev pytest` を実行して全体整合を確認する。
- ロールバック方法: 変更・追加した Markdown および Python ファイルを個別に戻すことで復旧可能。
Expand Down
2 changes: 1 addition & 1 deletion docs/todo/archive/20251124-rm081-text-capacity.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ roadmap_item: RM-081 文字数許容量算出とスキーマ反映
- Renderer (`src/pptx_generator/pipeline/renderer.py`): タイトル・本文・箇条書きのフォント適用、段落スタイル、テーブル/チャートの配色、アンカー未指定時のフォールバック座標を `TemplateStyle` のデフォルト値から解決している。
- Analyzer (`_build_analyzer_options`)・Refiner (`_build_refiner_options`): `TemplateStyle` の body フォントおよびカラーを既定値として取り込み、フォントサイズしきい値やカラー調整の初期値を決定している。
- 設定ファイル・テスト: `settings.BrandingConfig` はテンプレ抽出結果を `TemplateStyle` に変換するための互換レイヤとして残存。ユニットテスト(`tests/config/test_settings_loading.py`)は引き続き旧スキーマ検証を担う。
- テンプレートスタイル抽出: `src/pptx_generator/template_style.py` で `BrandingExtractionResult` を `TemplateStyle`/アーティファクトへ変換する。今後は `branding_extractor` 依存を段階的に薄め、テンプレ由来メタに一本化する。
- テンプレートスタイル抽出: `src/pptx_generator/template/template_style.py` で `BrandingExtractionResult` を `TemplateStyle`/アーティファクトへ変換する。今後は `template/branding_extractor` 依存を段階的に薄め、テンプレ由来メタに一本化する。
- 移行論点:
- Slide.title / subtitle には現状フォント情報が載らないため、テンプレ抽出時に `SlideTextbox` へ転記するか `generate_ready.meta` 側でヘッダ用スタイルを保持する仕組みが必要。
- 監査ログ (`audit_log.json`) では `template_style.source` にテンプレパスと抽出エラーを記録している。BrandingConfig 廃止後もテンプレ由来スタイルと抽出エラー情報を保持できるよう新メタ形式を用意する。
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ roadmap_item: RM-058 プレペア骨子内製化
- 対象整理(スコープ、対象ファイル、前提): 章テンプレート資産 (`config/chapter_templates/`)、CLI `outline`/`compose` のテンプレ関連オプション、Draft structuring / layout 評価のテンプレ依存ロジック、関連テスト・ドキュメントを削除または更新する。
- ドキュメント/コード修正方針: CLI オプションとハンドラロジックを撤廃し、テンプレ適合率に依存するメタ項目を整備し直す。対応する単体テスト・統合テストを更新し、ドキュメントの記述も改訂する。
- 確認・共有方法(レビュー、ToDo 更新など): ToDo に進捗を記録し、作業完了後にドラフト PR でまとめて共有する。
- 想定影響ファイル: `config/chapter_templates/**/*`, `src/pptx_generator/cli_commands/outline.py`, `compose.py`, `cli_handlers/outline.py`, `compose.py`, `draft_intel.py`, draft structuring系 (`pipeline/draft_structuring/*`), テスト群, 関連 docs。
- 想定影響ファイル: `config/chapter_templates/**/*`, `src/pptx_generator/cli_commands/outline.py`, `compose.py`, `cli_handlers/outline.py`, `compose.py`, `draft/draft_intel.py`, draft structuring系 (`pipeline/draft_structuring/*`), テスト群, 関連 docs。
- リスク: 章テンプレ基盤を利用しているワークフローがあれば後方互換がなくなる。`layout_score_detail` などテンプレ由来のログ項目の整理漏れに注意。
- テスト方針: `uv run --extra dev pytest` 全体実行。特に `tests/cli/test_cli_outline_generation.py` など章テンプレ依存テストの更新確認。
- ロールバック方法: 章テンプレ削除コミットを revert し、`config/chapter_templates` と CLI オプションを復旧する。
Expand Down
8 changes: 5 additions & 3 deletions samples/input/sample_spec.md
Original file line number Diff line number Diff line change
Expand Up @@ -2048,14 +2048,16 @@ async def generate_pptx(spec: GenerateRequest):
### Python API 利用例

```python
from pathlib import Path

from pptx_generator.pipeline.renderer import Renderer
from pptx_generator.spec_loader import load_spec
from pptx_generator.template import load_jobspec_from_path

# JSON 仕様を読み込み
spec = load_spec("samples/json/sample_spec.json")
spec = load_jobspec_from_path(Path("samples/json/sample_spec.json"))

# テンプレートを指定してレンダリング
renderer = Renderer(template_path="samples/templates/templates.pptx")
renderer = Renderer(template_path=Path("samples/templates/templates.pptx"))
prs = renderer.render(spec)

# PPTX を保存
Expand Down
5 changes: 1 addition & 4 deletions scripts/branding_extract.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,7 @@
import sys
from pathlib import Path

from pptx_generator.branding_extractor import (
BrandingExtractionError,
extract_branding_config,
)
from pptx_generator.template import BrandingExtractionError, extract_branding_config


def parse_args() -> argparse.Namespace:
Expand Down
4 changes: 2 additions & 2 deletions src/pptx_generator/cli_handlers/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@

from pydantic import BaseModel

from pptx_generator.config_manager import ConfigManager
from pptx_generator.config import ConfigManager
from pptx_generator.llm import log_provider_resolution, resolve_llm_provider
from pptx_generator.logging import LOG_FORMAT, ensure_rotating_file_handler, ensure_stream_handler
from pptx_generator.models import JobSpec
from pptx_generator.spec_loader import load_jobspec_from_path
from pptx_generator.template import load_jobspec_from_path

logger = logging.getLogger(__name__)

Expand Down
2 changes: 1 addition & 1 deletion src/pptx_generator/cli_handlers/compose.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from pathlib import Path
from typing import Optional

from pptx_generator.config_manager import ConfigManager
from pptx_generator.config import ConfigManager
from pptx_generator.pipeline import (
DraftStructuringError,
DraftStructuringOptions,
Expand Down
6 changes: 3 additions & 3 deletions src/pptx_generator/cli_handlers/mapping.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@

import click

from pptx_generator.config_manager import ConfigManager, ResolvedConfig
from pptx_generator.generate_ready import generate_ready_to_jobspec
from pptx_generator.config import ConfigManager, ResolvedConfig
from pptx_generator.pipeline.generate_ready import generate_ready_to_jobspec
from pptx_generator.models import (
GenerateReadyDocument,
JobMeta,
Expand Down Expand Up @@ -109,7 +109,7 @@ def _should_enforce_layouts() -> bool:


def prepare_template_style(template: Path) -> TemplateStylePayload:
from pptx_generator.template_style import extract_template_style
from pptx_generator.template import extract_template_style

style, artifact = extract_template_style(template)
if artifact.get("source", {}).get("type") == "default":
Expand Down
2 changes: 1 addition & 1 deletion src/pptx_generator/cli_handlers/prepare_static.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
from pptx_generator.content_import import ContentImportService
from pptx_generator.prepare import PrepareDocument
from pptx_generator.prepare.source import PrepareSourceDocument
from pptx_generator.spec_loader import load_jobspec_from_path
from pptx_generator.template import load_jobspec_from_path

from .prepare_errors import PrepareCommandError

Expand Down
4 changes: 2 additions & 2 deletions src/pptx_generator/cli_handlers/rendering.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

import click

from pptx_generator.generate_ready import generate_ready_to_jobspec
from pptx_generator.pipeline.generate_ready import generate_ready_to_jobspec
from pptx_generator.models import GenerateReadyDocument, TemplateStyle
from pptx_generator.pipeline import (
AnalyzerOptions,
Expand All @@ -35,7 +35,7 @@
from pptx_generator.settings import RulesConfig
from pptx_generator.settings.loader import load_rules_config
from pptx_generator.settings.paths import find_config_path
from pptx_generator.template_style import extract_template_style
from pptx_generator.template import extract_template_style
from .trace_utils import record_stage_trace

logger = logging.getLogger(__name__)
Expand Down
2 changes: 1 addition & 1 deletion src/pptx_generator/cli_handlers/template_extraction.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from pptx import Presentation
from pptx.enum.shapes import MSO_SHAPE_TYPE, PP_PLACEHOLDER

from pptx_generator.branding_extractor import extract_branding_config
from pptx_generator.template import extract_branding_config
from pptx_generator.cli_handlers.prepare import (
PROMPT_TEMPLATE_FILENAME_PATTERN,
PROMPT_USER_SECTION_END,
Expand Down
2 changes: 1 addition & 1 deletion src/pptx_generator/cli_handlers/template_release.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
build_template_release,
load_template_release,
)
from pptx_generator.template_style import extract_template_style
from pptx_generator.template import extract_template_style
from pptx_generator.models import (
TemplateRelease,
TemplateReleaseDiagnostics,
Expand Down
6 changes: 4 additions & 2 deletions src/pptx_generator/config/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
"""Default configuration assets bundled with the package."""
"""設定関連のエントリーポイント。"""

from __future__ import annotations

__all__ = []
from .config_manager import ConfigManager, ResolvedConfig

__all__ = ["ConfigManager", "ResolvedConfig"]
45 changes: 45 additions & 0 deletions src/pptx_generator/draft/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
"""ドラフト関連ユーティリティ。"""

from __future__ import annotations

from .draft_intel import (
ChapterTemplate,
ChapterTemplateEvaluation,
ChapterTemplateSection,
ReturnReasonTemplate,
clamp_score_detail,
compute_analyzer_support,
evaluate_chapter_template,
find_chapter_template_path,
find_template_by_structure,
load_analysis_summary,
load_chapter_template,
load_return_reasons,
summarize_analyzer_counts,
)
from .draft_recommender import (
CardLayoutRecommender,
CardLayoutRecommenderConfig,
LayoutProfile,
RecommendationResult,
)

__all__ = [
"CardLayoutRecommender",
"CardLayoutRecommenderConfig",
"ChapterTemplate",
"ChapterTemplateEvaluation",
"ChapterTemplateSection",
"LayoutProfile",
"RecommendationResult",
"ReturnReasonTemplate",
"clamp_score_detail",
"compute_analyzer_support",
"evaluate_chapter_template",
"find_chapter_template_path",
"find_template_by_structure",
"load_analysis_summary",
"load_chapter_template",
"load_return_reasons",
"summarize_analyzer_counts",
]
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@
from pathlib import Path
from typing import Iterable, Mapping

from .models import (DraftAnalyzerSummary, DraftLayoutScoreDetail,
DraftTemplateMismatch)
from ..models import DraftAnalyzerSummary, DraftLayoutScoreDetail, DraftTemplateMismatch


logger = logging.getLogger(__name__)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,22 @@
from typing import Iterable, Sequence, Tuple

from .draft_intel import clamp_score_detail, compute_analyzer_support
from .layout_ai import (LayoutAIPolicy, LayoutAIRequest, LayoutAIResponse,
create_layout_ai_client, load_layout_policy_set)
from .layout_ai.client import LayoutAIClient, LayoutAIClientConfigurationError
from .layout_ai.policy import LayoutAIPolicyError, LayoutAIPolicySet
from .models import (ContentSlide, DraftAnalyzerSummary, DraftLayoutCandidate,
DraftLayoutScoreDetail)
from .utils.usage_tags import (CANONICAL_USAGE_TAGS, get_usage_tag_catalog,
normalize_usage_tag_value,
normalize_usage_tags_with_unknown)
from ..layout_ai import (
LayoutAIPolicy,
LayoutAIRequest,
LayoutAIResponse,
create_layout_ai_client,
load_layout_policy_set,
)
from ..layout_ai.client import LayoutAIClient, LayoutAIClientConfigurationError
from ..layout_ai.policy import LayoutAIPolicyError, LayoutAIPolicySet
from ..models import ContentSlide, DraftAnalyzerSummary, DraftLayoutCandidate, DraftLayoutScoreDetail
from ..utils.usage_tags import (
CANONICAL_USAGE_TAGS,
get_usage_tag_catalog,
normalize_usage_tag_value,
normalize_usage_tags_with_unknown,
)

logger = logging.getLogger(__name__)

Expand Down
2 changes: 1 addition & 1 deletion src/pptx_generator/pipeline/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from typing import Any, Iterable, Iterator, MutableMapping, Protocol
from uuid import uuid4

from ..config_manager import ResolvedConfig
from ..config import ResolvedConfig
from ..models import JobSpec
from ..runtime.job_context import get_current_job
from ..logging import set_current_stage
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
from collections import Counter, defaultdict
from typing import Any, Mapping, Sequence

from ...draft_intel import summarize_analyzer_counts
from ...draft_recommender import CardLayoutRecommender, LayoutProfile
from ...draft.draft_intel import summarize_analyzer_counts
from ...draft.draft_recommender import CardLayoutRecommender, LayoutProfile
from ...models import (
ContentApprovalDocument,
ContentSlide,
Expand Down
Loading
Loading