Skip to content
Merged
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 .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
{
"name": "ndf",
"source": "./plugins/ndf",
"description": "Claude Code plugin (v10.18.0): 8 specialized agents (plus 1 worker agent for the 3-layer workflow) and 48 focused NDF skills for PR/review workflows, cross-review, implementation planning, plan-to-spec, Docker container access, statusline, external AI delegation (Codex/agy), transcript retention guard, and optional Slack notifications.",
"description": "Claude Code plugin (v10.19.0-dev.1): 8 specialized agents (plus 1 worker agent for the 3-layer workflow) and 48 focused NDF skills for PR/review workflows, cross-review, implementation planning, plan-to-spec, Docker container access, statusline, external AI delegation (Codex/agy), transcript retention guard, and optional Slack notifications.",
"policy": {
"installation": "AVAILABLE",
"authentication": "ON_INSTALL"
Expand Down
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,13 @@
**開発版(接尾辞の付いた版)は載せない。** `9.8.0` は `9.8.0-dev.1` までしか出ておらず、
その内容は `10.0.0` で届いている。

## [ndf 10.19.0] - 2026-10-18

- ndf の release Skill に、スライドの汎用テンプレートが入りました。ページの枠組みに沿って生成スクリプトから pptx を作り、トーン&マナーを差し替えられます。台本はノートになり、台本から発表の尺を計算できます(#2069)(#2070)
- スライドの生成は生成スクリプトの 1 経路です。構成メモと台本を用意し、生成スクリプトで作ります(#2069)(#2070)
- Google Slides の全ページのサムネイルを取るスクリプトで、変換後の体裁を画像で確かめられます。pptx の変換と差し替えに使う gws のコマンドは対応表から引けます(#2069)(#2070)
- 既知の失敗に、pptx で差し替えた Google スライドの書体が Arial になる場合と、その確かめ方を載せています(#2069)(#2070)

## [ndf 10.18.0] - 2026-10-16

- Update: Bump actions/setup-python from 5 to 7(#1387)
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ Claude Code では `/ndf:<Skill 名>` と打って呼びます。**Skill** は

| プラグイン名 | バージョン | できること | 詳細 |
| --- | --- | --- | --- |
| **ndf** | 10.18.0 | 開発の作業手順(Skill)と専門のサブエージェント。4 つの AI ツールへ同じ名前で入る | [README](./plugins/ndf/README.md) |
| **ndf** | 10.19.0-dev.1 | 開発の作業手順(Skill)と専門のサブエージェント。4 つの AI ツールへ同じ名前で入る | [README](./plugins/ndf/README.md) |
| **playwright-kit** | 3.0.1 | Playwright による E2E テストの計画・スクリプト作成・証跡のレポート | [README](./plugins/playwright-kit/README.md) |

外部サービスへつなぐ MCP サーバーの設定のプラグインが 10 個あります(Claude Code / Codex / Kiro CLI 向け)。
Expand All @@ -88,7 +88,7 @@ Claude Code では `/ndf:<Skill 名>` と打って呼びます。**Skill** は

### NDF プラグインの Skill の一覧

**NDFプラグイン v10.18.0** に入る Skill の数は、AI ツールごとに違います。
**NDFプラグイン v10.19.0-dev.1** に入る Skill の数は、AI ツールごとに違います。
Claude Code向け core 48個、Kiro向け core 45個、Codex向け core 44個、agy向け core 44個です。
元Skills(48個)の内訳は次のとおりです。
- Pull Request とレビュー (7): pr, pr-tests, fix, pr-review, cherry-pick-pr, deploy, merged
Expand Down
12 changes: 6 additions & 6 deletions docs/versioning-and-distribution.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,15 +57,15 @@ semver の順序で除外されるのは、プラグイン間の依存解決(`

| 版 | 形 | 意味 |
| --- | --- | --- |
| 正式版 | `10.18.0` | 利用者が常用してよい |
| 開発版 | `10.19.0-dev.1` | 検証中。入れたくない利用者は取得を控えられる |
| 公開前の確認版 | `10.19.0-rc.1` | 正式版の候補。残るのは確認だけ |
| 正式版 | `10.19.0` | 利用者が常用してよい |
| 開発版 | `10.20.0-dev.1` | 検証中。入れたくない利用者は取得を控えられる |
| 公開前の確認版 | `10.20.0-rc.1` | 正式版の候補。残るのは確認だけ |

- 接尾辞は**次に出す正式版の版数へ付ける**。`10.18.0` の次を開発するなら `10.19.0-dev.1`
- 接尾辞は**次に出す正式版の版数へ付ける**。`10.19.0` の次を開発するなら `10.20.0-dev.1`
- 連番は開発版を出すたびに増やす。**同じ版数で中身を差し替えない**。差し替えると、利用者の
手元にある版と `main` の版が同じ番号で別物になり、何を確かめたのかが分からなくなる
- **正式版を出すときは接尾辞を外す。** `10.19.0-dev.3` の次は `10.19.0`
- 順序は semver に従い `10.19.0-dev.1` < `10.19.0-rc.1` < `10.19.0` になる
- **正式版を出すときは接尾辞を外す。** `10.20.0-dev.3` の次は `10.20.0`
- 順序は semver に従い `10.20.0-dev.1` < `10.20.0-rc.1` < `10.20.0` になる

## ランタイムごとの取得と導入

Expand Down
4 changes: 2 additions & 2 deletions plugins/ndf/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "ndf",
"version": "10.18.0",
"description": "Claude Code plugin (v10.18.0): 8 specialized agents (plus 2 supervisor agents and 1 worker agent for the 3-layer workflow) and 48 focused NDF skills for PR/review workflows, cross-review, implementation planning, plan-to-spec, Docker container access, statusline, external AI delegation (Codex/agy), transcript retention guard, and optional Slack notifications.",
"version": "10.19.0-dev.1",
"description": "Claude Code plugin (v10.19.0-dev.1): 8 specialized agents (plus 2 supervisor agents and 1 worker agent for the 3-layer workflow) and 48 focused NDF skills for PR/review workflows, cross-review, implementation planning, plan-to-spec, Docker container access, statusline, external AI delegation (Codex/agy), transcript retention guard, and optional Slack notifications.",
"author": {
"name": "takemi-ohama",
"url": "https://github.com/takemi-ohama"
Expand Down
4 changes: 2 additions & 2 deletions plugins/ndf/.codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "ndf",
"version": "10.18.0",
"description": "Codex plugin (v10.18.0): 44 focused NDF skills for PR/review workflows, cross-review, implementation planning, plan-to-spec, Docker container access, external AI delegation (Codex/agy), and optional Slack completion notifications.",
"version": "10.19.0-dev.1",
"description": "Codex plugin (v10.19.0-dev.1): 44 focused NDF skills for PR/review workflows, cross-review, implementation planning, plan-to-spec, Docker container access, external AI delegation (Codex/agy), and optional Slack completion notifications.",
"skills": [
"./skills/cherry-pick-pr",
"./skills/cross-refactoring",
Expand Down
8 changes: 4 additions & 4 deletions plugins/ndf/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ bash plugins/ndf/dev.kiro/install.sh --dry-run

```bash
python3 -c "import json;print(json.load(open('.kiro/agents/ndf.json'))['description'])"
# => NDF統合開発エージェント(Kiro CLI用 / v10.18.0)
# => NDF統合開発エージェント(Kiro CLI用 / v10.19.0-dev.1)
```

### agy
Expand Down Expand Up @@ -412,7 +412,7 @@ agy models # 認証確認

```text
# 動く: 実体パスを示して読ませる
~/.codex/plugins/cache/ai-plugins/ndf/10.18.0/skills/deploy/SKILL.md を読んで、その手順どおりに qa/staging へ deploy PR を作成してください。
~/.codex/plugins/cache/ai-plugins/ndf/10.19.0-dev.1/skills/deploy/SKILL.md を読んで、その手順どおりに qa/staging へ deploy PR を作成してください。

# 動かない: 明示起動 ($ は展開されない)
$deploy qa/staging
Expand All @@ -434,14 +434,14 @@ marketplace 経由でインストールした場合、Skill の実体は **ワ
```text
$CODEX_HOME/plugins/cache/<marketplace>/<plugin>/<version>/skills/<skill>/SKILL.md
# 既定 ($CODEX_HOME=~/.codex) の例:
# ~/.codex/plugins/cache/ai-plugins/ndf/10.18.0/skills/deploy/SKILL.md
# ~/.codex/plugins/cache/ai-plugins/ndf/10.19.0-dev.1/skills/deploy/SKILL.md
```

そのため「`deploy` の SKILL.md を探して読んで」のような曖昧な依頼は、Codex のファイル探索がワークスペース内に限られる状況では失敗しえます。**抑止した Skill は `$<skill 名>` が展開されない**ので、`codex plugin list` で実体パスを確認し、絶対パスを渡してください。

```bash
codex plugin list | grep 'ndf@ai-plugins'
# => ndf@ai-plugins installed, enabled 10.18.0 <path>
# => ndf@ai-plugins installed, enabled 10.19.0-dev.1 <path>
```

抑止していない Skill(`markdown-writing` など)はキャッシュ配下でも `$<skill 名>` で解決するため、そちらは `$` 起動が使えます。
Expand Down
4 changes: 2 additions & 2 deletions plugins/ndf/dev.agy/plugin.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "ndf",
"version": "10.18.0",
"description": "Antigravity CLI plugin (v10.18.0): 44 focused NDF skills for PR/review workflows, cross-review, implementation planning, plan-to-spec, Docker container access, external AI delegation, and worktree guidance hooks."
"version": "10.19.0-dev.1",
"description": "Antigravity CLI plugin (v10.19.0-dev.1): 44 focused NDF skills for PR/review workflows, cross-review, implementation planning, plan-to-spec, Docker container access, external AI delegation, and worktree guidance hooks."
}
33 changes: 1 addition & 32 deletions plugins/ndf/scripts/release-steps.py
Original file line number Diff line number Diff line change
Expand Up @@ -327,37 +327,6 @@ def base_version(root, pdir, ref):
return None


def bump_versioning_doc(ed):
"""docs/versioning-and-distribution.md の「版の付け方と開発版の配布」章の正式版の版数。"""
doc = ed.root / "docs" / "versioning-and-distribution.md"
rel = "docs/versioning-and-distribution.md"
ob, nb = base_of(ed.old), base_of(ed.new)
if ob == nb:
return
if not doc.is_file():
ed.manual.append(f"{rel} が無い(この章は手で直す)")
return
lines = ed.lines(doc)
targets = [
(re.compile(r"^\| 正式版 \| `([^`]+)` \|"), "正式版の表の行"),
(re.compile(r"`([^`]+)` の次を開発するなら"), "接尾辞の例"),
]
for rx, what in targets:
hits = [i for i, l in enumerate(lines) if rx.search(l)]
if len(hits) != 1:
ed.manual.append(f"{rel}: 「版の付け方と開発版の配布」章の{what}が特定できない(この章は手で直す)")
continue
i = hits[0]
cur = rx.search(lines[i]).group(1)
if cur == nb:
continue
if cur != ob:
ed.manual.append(f"{rel}: {what}の版が {cur} で旧版 {ob} と違う(この章は手で直す)")
continue
esc = bump.braces(lines[i])
ed.place(doc, [i], esc.replace(f"`{ob}`", f"`{bump.CUR_BASE}`", 1), esc.replace(f"`{ob}`", f"`{bump.NEW_BASE}`", 1), what)


def plan_bump(root, pdir, plugin, old, new):
"""`plugin` の版を `old` から `new` へ上げる箇所を集めた `BumpPlan` を返す(まだ書き換えない)。"""
ed = bump.BumpPlan(root, old, new)
Expand Down Expand Up @@ -396,7 +365,7 @@ def plan_bump(root, pdir, plugin, old, new):
ed.sub(nr, r"(Kiro CLI用 / v", "plugins/ndf/README.md の Kiro の確認例")
ed.sub(nr, r"/plugins/cache/ai-plugins/ndf/", "plugins/ndf/README.md の Codex のパス例", count=2)
ed.sub(nr, r"ndf@ai-plugins\s+installed", "plugins/ndf/README.md の codex plugin list の出力例")
bump_versioning_doc(ed)
bump.versioning_doc(ed)

return ed

Expand Down
75 changes: 74 additions & 1 deletion plugins/ndf/scripts/release_lib/bump.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,9 @@
import tempfile
from pathlib import Path

import md
import versions
from step_result import EXIT_PRECONDITION, StepError, plugin_dir
from step_result import EXIT_PRECONDITION, StepError, base_of, plugin_dir


def ver_pat(v):
Expand Down Expand Up @@ -154,3 +155,75 @@ def require_bumped(root, plugin, ver):
raise StepError(f"plugin.json の版を読めない: {e}", EXIT_PRECONDITION)
if got != ver:
raise StepError(f"{plugin} の plugin.json の版が {got} で、今回の版 {ver} でない(bump が通っていない)", EXIT_PRECONDITION)


def _ver_key(v):
return tuple(int(x) for x in v.split("."))


def versioning_doc(ed):
"""docs/versioning-and-distribution.md の「版の付け方と開発版の配布」章の正式版の版数。

正式版の行が開発版・公開前の確認版の例の基底に追いついたら、例(表の 2 行・次の開発の例・接尾辞を外す例・
順序の例)の基底を次の MINOR へ進める(check-doc-staleness.py の「正式版の行より新しい版」を保つ)。
"""
doc = ed.root / "docs" / "versioning-and-distribution.md"
rel = "docs/versioning-and-distribution.md"
ob, nb = base_of(ed.old), base_of(ed.new)
if ob == nb:
return
if not doc.is_file():
ed.manual.append(f"{rel} が無い(この章は手で直す)")
return
lines = ed.lines(doc)
fenced = md.fenced_lines("\n".join(lines))
head = next((i for i, l in enumerate(lines) if l.startswith("## 版の付け方と開発版の配布")), None)
if head is None:
ed.manual.append(f"{rel}: 「版の付け方と開発版の配布」章が無い(この章は手で直す)")
return
tail = next((i for i in range(head + 1, len(lines)) if lines[i].startswith("## ")), len(lines))
dev_rows = [l for l in lines[head:tail] if re.match(r"^\| 開発版 \| `", l)]
m = re.search(r"`(\d+\.\d+\.\d+)-dev\.\d+`", dev_rows[0]) if len(dev_rows) == 1 else None
example = m.group(1) if m else None
advance = None
if example is None:
ed.manual.append(f"{rel}: 「版の付け方と開発版の配布」章の開発版の行が特定できない(この章は手で直す)")
elif _ver_key(example) <= _ver_key(nb):
if example == ob:
ed.manual.append(f"{rel}: 開発版の例の基底 {example} が旧版と同じ(この章は手で直す)")
else:
major, minor, _ = _ver_key(nb)
nxt = f"{major}.{minor + 1}.0"
ex_rx = re.compile(r"`" + re.escape(example) + r"((?:-(?:dev|rc)\.\d+)?)`")
advance = (ex_rx, nxt)

def advanced(line):
return advance[0].sub(lambda mm: f"`{advance[1]}{mm.group(1)}`", line) if advance else line

targets = [
(re.compile(r"^\| 正式版 \| `([^`]+)` \|"), "正式版の表の行"),
(re.compile(r"`([^`]+)` の次を開発するなら"), "接尾辞の例"),
]
done = set()
for rx, what in targets:
hits = [i for i in range(head, tail) if rx.search(lines[i])]
if len(hits) != 1:
ed.manual.append(f"{rel}: 「版の付け方と開発版の配布」章の{what}が特定できない(この章は手で直す)")
continue
i = hits[0]
done.add(i)
cur = rx.search(lines[i]).group(1)
if cur == nb:
continue
if cur != ob:
ed.manual.append(f"{rel}: {what}の版が {cur} で旧版 {ob} と違う(この章は手で直す)")
continue
esc = braces(lines[i])
to = braces(advanced(lines[i]))
ed.place(doc, [i], esc.replace(f"`{ob}`", f"`{CUR_BASE}`", 1), to.replace(f"`{ob}`", f"`{NEW_BASE}`", 1), what)
if advance is None:
return
for i in range(head, tail):
if i in done or advanced(lines[i]) == lines[i] or (i < len(fenced) and fenced[i]):
continue
ed.place(doc, [i], braces(lines[i]), braces(advanced(lines[i])), "開発版の例")
Loading