diff --git a/.claude/skills/nabledge-1.2/SKILL.md b/.claude/skills/nabledge-1.2/SKILL.md new file mode 100644 index 00000000..cdd55d67 --- /dev/null +++ b/.claude/skills/nabledge-1.2/SKILL.md @@ -0,0 +1,74 @@ +--- +name: nabledge-1.2 +description: Provides Nablarch 1.2 framework knowledge and code analysis capabilities. Use when developing Nablarch applications, implementing features, reviewing code, or answering questions about Nablarch 1.2. +user-invocable: false +disable-model-invocation: true +--- + +# Nabledge-1.2: Nablarch 1.2 Knowledge Base + +Knowledge base and code analysis tool for Nablarch 1.2 framework. + +## Usage + +**Interactive mode**: +``` +nabledge-1.2 +``` + +**Direct knowledge search**: +``` +nabledge-1.2 "" +``` + +**Direct code analysis**: +``` +nabledge-1.2 code-analysis +``` + +## Execution Instructions + +### Step 0: Determine Workflow + +**No arguments** (`nabledge-1.2`): +- Show greeting +- Ask user to choose: Knowledge Search or Code Analysis + +**Text argument** (`nabledge-1.2 ""`): +- Execute `workflows/qa.md` to answer question +- This workflow orchestrates _knowledge-search pipeline + +**"code-analysis" argument** (`nabledge-1.2 code-analysis`): +- Execute `workflows/code-analysis.md` to analyze user's code + +## Critical Constraints + +**Knowledge files only**: Answer using ONLY information in `knowledge/*.json`. DO NOT use external knowledge or LLM training data. + +**When knowledge is missing**: +- Output: "この情報は知識ファイルに含まれていません" +- List related available knowledge from `knowledge/index.toon` +- DO NOT answer from external knowledge + +## Error Handling + +**Knowledge not found** (Knowledge Search): +- Message: "この情報は知識ファイルに含まれていません" +- List related entries from index.toon + +**Target code not found** (Code Analysis): +- Message: "指定されたコードが見つかりませんでした" +- Show search patterns used +- Ask for clarification + +**Workflow execution failure**: +- Inform which step failed +- Show error details +- Suggest retry or alternative + +## Knowledge Structure + +**Files**: `knowledge/features/`, `knowledge/checks/`, `knowledge/releases/` +**Index**: `knowledge/index.toon` (all entries with search hints) +**Schemas**: `schemas/*.json` (JSON validation schemas) +**Scripts**: `scripts/*.sh` (pre-built processing scripts) diff --git a/.claude/skills/nabledge-1.2/plugin/CHANGELOG.md b/.claude/skills/nabledge-1.2/plugin/CHANGELOG.md new file mode 100644 index 00000000..489a9594 --- /dev/null +++ b/.claude/skills/nabledge-1.2/plugin/CHANGELOG.md @@ -0,0 +1,7 @@ +# 変更履歴 + +nabledge-1.2プラグインの主な変更内容を記録しています。 + +フォーマットは [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) に基づいています。 + +## [Unreleased] diff --git a/.claude/skills/nabledge-1.2/plugin/plugin.json b/.claude/skills/nabledge-1.2/plugin/plugin.json new file mode 100644 index 00000000..7d67a07e --- /dev/null +++ b/.claude/skills/nabledge-1.2/plugin/plugin.json @@ -0,0 +1,13 @@ +{ + "name": "nabledge-1.2", + "version": "0.1", + "description": "Nablarch 1.2 skill for AI-assisted development", + "author": { + "name": "Nablarch" + }, + "license": "Apache-2.0", + "repository": "https://github.com/nablarch/nabledge", + "keywords": [ + "nablarch" + ] +} diff --git a/.claude/skills/nabledge-1.3/SKILL.md b/.claude/skills/nabledge-1.3/SKILL.md new file mode 100644 index 00000000..b69572e5 --- /dev/null +++ b/.claude/skills/nabledge-1.3/SKILL.md @@ -0,0 +1,74 @@ +--- +name: nabledge-1.3 +description: Provides Nablarch 1.3 framework knowledge and code analysis capabilities. Use when developing Nablarch applications, implementing features, reviewing code, or answering questions about Nablarch 1.3. +user-invocable: false +disable-model-invocation: true +--- + +# Nabledge-1.3: Nablarch 1.3 Knowledge Base + +Knowledge base and code analysis tool for Nablarch 1.3 framework. + +## Usage + +**Interactive mode**: +``` +nabledge-1.3 +``` + +**Direct knowledge search**: +``` +nabledge-1.3 "" +``` + +**Direct code analysis**: +``` +nabledge-1.3 code-analysis +``` + +## Execution Instructions + +### Step 0: Determine Workflow + +**No arguments** (`nabledge-1.3`): +- Show greeting +- Ask user to choose: Knowledge Search or Code Analysis + +**Text argument** (`nabledge-1.3 ""`): +- Execute `workflows/qa.md` to answer question +- This workflow orchestrates _knowledge-search pipeline + +**"code-analysis" argument** (`nabledge-1.3 code-analysis`): +- Execute `workflows/code-analysis.md` to analyze user's code + +## Critical Constraints + +**Knowledge files only**: Answer using ONLY information in `knowledge/*.json`. DO NOT use external knowledge or LLM training data. + +**When knowledge is missing**: +- Output: "この情報は知識ファイルに含まれていません" +- List related available knowledge from `knowledge/index.toon` +- DO NOT answer from external knowledge + +## Error Handling + +**Knowledge not found** (Knowledge Search): +- Message: "この情報は知識ファイルに含まれていません" +- List related entries from index.toon + +**Target code not found** (Code Analysis): +- Message: "指定されたコードが見つかりませんでした" +- Show search patterns used +- Ask for clarification + +**Workflow execution failure**: +- Inform which step failed +- Show error details +- Suggest retry or alternative + +## Knowledge Structure + +**Files**: `knowledge/features/`, `knowledge/checks/`, `knowledge/releases/` +**Index**: `knowledge/index.toon` (all entries with search hints) +**Schemas**: `schemas/*.json` (JSON validation schemas) +**Scripts**: `scripts/*.sh` (pre-built processing scripts) diff --git a/.claude/skills/nabledge-1.3/plugin/CHANGELOG.md b/.claude/skills/nabledge-1.3/plugin/CHANGELOG.md new file mode 100644 index 00000000..950f45f8 --- /dev/null +++ b/.claude/skills/nabledge-1.3/plugin/CHANGELOG.md @@ -0,0 +1,7 @@ +# 変更履歴 + +nabledge-1.3プラグインの主な変更内容を記録しています。 + +フォーマットは [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) に基づいています。 + +## [Unreleased] diff --git a/.claude/skills/nabledge-1.3/plugin/plugin.json b/.claude/skills/nabledge-1.3/plugin/plugin.json new file mode 100644 index 00000000..c9c65208 --- /dev/null +++ b/.claude/skills/nabledge-1.3/plugin/plugin.json @@ -0,0 +1,13 @@ +{ + "name": "nabledge-1.3", + "version": "0.1", + "description": "Nablarch 1.3 skill for AI-assisted development", + "author": { + "name": "Nablarch" + }, + "license": "Apache-2.0", + "repository": "https://github.com/nablarch/nabledge", + "keywords": [ + "nablarch" + ] +} diff --git a/.claude/skills/nabledge-1.4/SKILL.md b/.claude/skills/nabledge-1.4/SKILL.md new file mode 100644 index 00000000..84709348 --- /dev/null +++ b/.claude/skills/nabledge-1.4/SKILL.md @@ -0,0 +1,74 @@ +--- +name: nabledge-1.4 +description: Provides Nablarch 1.4 framework knowledge and code analysis capabilities. Use when developing Nablarch applications, implementing features, reviewing code, or answering questions about Nablarch 1.4. +user-invocable: false +disable-model-invocation: true +--- + +# Nabledge-1.4: Nablarch 1.4 Knowledge Base + +Knowledge base and code analysis tool for Nablarch 1.4 framework. + +## Usage + +**Interactive mode**: +``` +nabledge-1.4 +``` + +**Direct knowledge search**: +``` +nabledge-1.4 "" +``` + +**Direct code analysis**: +``` +nabledge-1.4 code-analysis +``` + +## Execution Instructions + +### Step 0: Determine Workflow + +**No arguments** (`nabledge-1.4`): +- Show greeting +- Ask user to choose: Knowledge Search or Code Analysis + +**Text argument** (`nabledge-1.4 ""`): +- Execute `workflows/qa.md` to answer question +- This workflow orchestrates _knowledge-search pipeline + +**"code-analysis" argument** (`nabledge-1.4 code-analysis`): +- Execute `workflows/code-analysis.md` to analyze user's code + +## Critical Constraints + +**Knowledge files only**: Answer using ONLY information in `knowledge/*.json`. DO NOT use external knowledge or LLM training data. + +**When knowledge is missing**: +- Output: "この情報は知識ファイルに含まれていません" +- List related available knowledge from `knowledge/index.toon` +- DO NOT answer from external knowledge + +## Error Handling + +**Knowledge not found** (Knowledge Search): +- Message: "この情報は知識ファイルに含まれていません" +- List related entries from index.toon + +**Target code not found** (Code Analysis): +- Message: "指定されたコードが見つかりませんでした" +- Show search patterns used +- Ask for clarification + +**Workflow execution failure**: +- Inform which step failed +- Show error details +- Suggest retry or alternative + +## Knowledge Structure + +**Files**: `knowledge/features/`, `knowledge/checks/`, `knowledge/releases/` +**Index**: `knowledge/index.toon` (all entries with search hints) +**Schemas**: `schemas/*.json` (JSON validation schemas) +**Scripts**: `scripts/*.sh` (pre-built processing scripts) diff --git a/.claude/skills/nabledge-1.4/docs/README.md b/.claude/skills/nabledge-1.4/docs/README.md new file mode 100644 index 00000000..d41e20ad --- /dev/null +++ b/.claude/skills/nabledge-1.4/docs/README.md @@ -0,0 +1,3 @@ +# Nablarch 6 ドキュメント + +0 ページ diff --git a/.claude/skills/nabledge-1.4/knowledge/index.toon b/.claude/skills/nabledge-1.4/knowledge/index.toon new file mode 100644 index 00000000..979304c0 --- /dev/null +++ b/.claude/skills/nabledge-1.4/knowledge/index.toon @@ -0,0 +1,3 @@ +# Nabledge-1.4 Knowledge Index + +files[0,]{title,type,category,processing_patterns,path}: diff --git a/.claude/skills/nabledge-1.4/plugin/CHANGELOG.md b/.claude/skills/nabledge-1.4/plugin/CHANGELOG.md new file mode 100644 index 00000000..e9c561bd --- /dev/null +++ b/.claude/skills/nabledge-1.4/plugin/CHANGELOG.md @@ -0,0 +1,7 @@ +# 変更履歴 + +nabledge-1.4プラグインの主な変更内容を記録しています。 + +フォーマットは [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) に基づいています。 + +## [Unreleased] diff --git a/.claude/skills/nabledge-1.4/plugin/plugin.json b/.claude/skills/nabledge-1.4/plugin/plugin.json new file mode 100644 index 00000000..6d5999e2 --- /dev/null +++ b/.claude/skills/nabledge-1.4/plugin/plugin.json @@ -0,0 +1,13 @@ +{ + "name": "nabledge-1.4", + "version": "0.1", + "description": "Nablarch 1.4 skill for AI-assisted development", + "author": { + "name": "Nablarch" + }, + "license": "Apache-2.0", + "repository": "https://github.com/nablarch/nabledge", + "keywords": [ + "nablarch" + ] +} diff --git a/.pr/00189/review-by-qa-engineer.md b/.pr/00189/review-by-qa-engineer.md new file mode 100644 index 00000000..1ed3ef2d --- /dev/null +++ b/.pr/00189/review-by-qa-engineer.md @@ -0,0 +1,56 @@ +# Expert Review: QA Engineer + +**Date**: 2026-03-13 +**Reviewer**: AI Agent as QA Engineer +**Files Reviewed**: 1 file + +## Overall Assessment + +**Rating**: 4/5 +**Summary**: `TestV1xVersions` is well-structured and consistent with existing test patterns. Tests are clear, focused, and exercise correct routing logic for all three v1.x versions. + +## Key Issues + +### Medium Priority + +1. **Missing `--resume` coverage for v1.x gen** + - Description: `TestGenCommand` has `test_gen_resume_skips_clean` for v6 but no equivalent for v1.x. + - Suggestion: Add parametrized `test_gen_v1x_resume_skips_clean` asserting 1 command with `scripts/run.py`. + - Decision: **Implement Now** — added `test_gen_v1x_resume_skips_clean` test. + - Reasoning: Closes a real behavioral gap with minimal effort. + +2. **regen/fix tests don't assert `scripts/run.py`** + - Description: Assertions check flags but not which script is called, unlike gen test. + - Suggestion: Add `assert "scripts/run.py" in lines[0]` to regen and fix tests. + - Decision: **Implement Now** — added to both tests. + - Reasoning: Tightens routing verification consistently with gen test. + +### Low Priority + +3. **Split dual assertion in test_gen_v1x_calls_clean_then_run** + - Description: Single `and`-joined assertion makes failure messages less specific. + - Suggestion: Split into two separate assertions. + - Decision: **Defer** — correct behavior, style preference only. + - Reasoning: Low value change; existing test pattern uses same style. + +4. **No `returncode` assertion in success cases** + - Description: Tests pass even if kc.sh exits with error after printing CMD lines. + - Suggestion: Add `assert result.returncode == 0` — ideally backported to whole file. + - Decision: **Defer** — whole-file refactor; follow-up. + - Reasoning: Existing tests have same gap; out of scope for this PR. + +## Positive Aspects + +- Parametrize approach efficiently covers all three versions without duplication. +- Version argument assertion in regen/fix is an improvement over existing v6 tests. +- New class is self-contained and doesn't interfere with existing classes. +- Test naming follows established `test_{command}_{context}_{behavior}` convention. +- Failure message in gen test includes version for clear parametrized failure diagnosis. + +## Recommendations + +- Add `returncode` assertions as a follow-up for the whole file. + +## Files Reviewed + +- `tools/knowledge-creator/tests/ut/test_kc_sh.py` (tests) diff --git a/.pr/00189/review-by-software-engineer.md b/.pr/00189/review-by-software-engineer.md new file mode 100644 index 00000000..52c22afb --- /dev/null +++ b/.pr/00189/review-by-software-engineer.md @@ -0,0 +1,61 @@ +# Expert Review: Software Engineer + +**Date**: 2026-03-13 +**Reviewer**: AI Agent as Software Engineer +**Files Reviewed**: 5 files + +## Overall Assessment + +**Rating**: 4/5 +**Summary**: Changes correctly add infrastructure for Nablarch v1.x with a well-designed fallback path strategy. Core logic is sound, backward-compatible, and avoids invasive refactoring. + +## Key Issues + +### Medium Priority + +1. **`--version all` silently excludes v1.x** + - Description: `run.py` and `clean.py` expand `all` to only `["6", "5"]`. Help text now lists 1.4/1.3/1.2 as valid choices alongside `all`, which could mislead users into thinking `all` processes everything. + - Suggestion: Add documentation to help text clarifying `all` covers v5 and v6 only. + - Decision: **Implement Now** — updated help text in both `run.py` and `clean.py`. + - Reasoning: Prevents user confusion at no implementation cost. + +2. **Path style inconsistency between step1 and generate_expected** + - Description: `step1_list_sources.py` uses f-strings while `generate_expected.py` uses `os.path.join` for equivalent logic. + - Suggestion: Align styles across both files. + - Decision: **Defer** — cosmetic, no bug risk on Linux; these files have always had divergent styles. + - Reasoning: Low risk, not worth churn in this PR. + +### Low Priority + +3. **No warning when neither RST path exists** + - Description: When docs aren't cloned, both paths fail silently with 0 sources and no user feedback. + - Suggestion: Add `logger.warning` when neither path resolves. + - Decision: **Implement Now** — added `else` branch with descriptive warning. + - Reasoning: Surfaces setup errors early for v1.x users. + +4. **No unit test for fallback path logic** + - Description: The `{version}_maintain` fallback in `step1_list_sources.py` isn't directly tested. + - Suggestion: Add a focused unit test using a temporary directory. + - Decision: **Defer to Future** — requires temp directory scaffolding; follow-up issue. + - Reasoning: Covered indirectly by E2E when docs are present; adequate for this PR. + +## Positive Aspects + +- The two-step fallback design preserves full backward compatibility for v5/v6. +- `releases_dir` derived from `rst_base` is the correct fix — old code would silently mismatch. +- Regex in `generate_expected.py` generalizes to any `*_maintain` directory pattern. +- `generate_expected.py` and `step1_list_sources.py` implement identical fallback logic. +- Symlink creation in `setup.sh` is idempotent and uses relative symlink target. +- Mapping files are in place, completing a coherent feature. + +## Recommendations + +- Add unit test for fallback path logic in a follow-up issue. + +## Files Reviewed + +- `tools/knowledge-creator/scripts/run.py` (source code) +- `tools/knowledge-creator/scripts/clean.py` (source code) +- `tools/knowledge-creator/scripts/step1_list_sources.py` (source code) +- `tools/knowledge-creator/tests/e2e/generate_expected.py` (source code) +- `setup.sh` (configuration/script) diff --git a/README.md b/README.md index 972952ec..9ae1204a 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,24 @@ cp .env.example .env # .env を編集して認証情報を設定する ``` +### Nablarch 1.x ドキュメントのセットアップ + +`setup.sh` は Nablarch 1.4、1.3、1.2 用のドキュメントを自動クローンします。クローン後、各バージョンのディレクトリに `{version}_maintain` シンボリックリンクが作成されます: + +``` +.lw/nab-official/v1.4/ + nablarch-document/ # クローンされたドキュメント + 1.4_maintain -> nablarch-document # シンボリックリンク(自動作成) +``` + +手動でシンボリックリンクを作成する場合: + +```bash +ln -sf nablarch-document .lw/nab-official/v1.4/1.4_maintain +ln -sf nablarch-document .lw/nab-official/v1.3/1.3_maintain +ln -sf nablarch-document .lw/nab-official/v1.2/1.2_maintain +``` + ## 使い方 ```bash diff --git a/setup.sh b/setup.sh index 4f87109f..7ff8c06c 100755 --- a/setup.sh +++ b/setup.sh @@ -295,9 +295,12 @@ print_header "9. Cloning Nablarch Official Repositories" NAB_OFFICIAL_V6_DIR=".lw/nab-official/v6" NAB_OFFICIAL_V5_DIR=".lw/nab-official/v5" +NAB_OFFICIAL_V14_DIR=".lw/nab-official/v1.4" +NAB_OFFICIAL_V13_DIR=".lw/nab-official/v1.3" +NAB_OFFICIAL_V12_DIR=".lw/nab-official/v1.2" # Create directories -for dir in "$NAB_OFFICIAL_V6_DIR" "$NAB_OFFICIAL_V5_DIR" ".lw/research"; do +for dir in "$NAB_OFFICIAL_V6_DIR" "$NAB_OFFICIAL_V5_DIR" "$NAB_OFFICIAL_V14_DIR" "$NAB_OFFICIAL_V13_DIR" "$NAB_OFFICIAL_V12_DIR" ".lw/research"; do if [ ! -d "$dir" ]; then print_status info "Creating $dir directory..." mkdir -p "$dir" @@ -362,6 +365,21 @@ clone_repos_from_meta() { clone_repos_from_meta "6" "$NAB_OFFICIAL_V6_DIR" clone_repos_from_meta "5" "$NAB_OFFICIAL_V5_DIR" +clone_repos_from_meta "1.4" "$NAB_OFFICIAL_V14_DIR" +clone_repos_from_meta "1.3" "$NAB_OFFICIAL_V13_DIR" +clone_repos_from_meta "1.2" "$NAB_OFFICIAL_V12_DIR" + +# Create version-named symlinks for v1.x (e.g. 1.4_maintain -> nablarch-document) +# This allows both nablarch-document/ and 1.4_maintain/ path conventions to work. +for ver in "1.4" "1.3" "1.2"; do + ver_dir=".lw/nab-official/v${ver}" + symlink_name="${ver}_maintain" + if [ -d "${ver_dir}/nablarch-document" ] && [ ! -e "${ver_dir}/${symlink_name}" ]; then + print_status info "Creating symlink ${ver_dir}/${symlink_name} -> nablarch-document" + ln -sf nablarch-document "${ver_dir}/${symlink_name}" + print_status ok "Symlink created" + fi +done # Final summary print_header "Setup Completed Successfully!" diff --git a/tools/knowledge-creator/.cache/v1.2/catalog.json b/tools/knowledge-creator/.cache/v1.2/catalog.json new file mode 100644 index 00000000..c4b8a512 --- /dev/null +++ b/tools/knowledge-creator/.cache/v1.2/catalog.json @@ -0,0 +1,11 @@ +{ + "version": "1.2", + "sources": [ + { + "repo": "https://github.com/nablarch/nablarch-document", + "branch": "1.2_maintain", + "commit": "" + } + ], + "files": [] +} diff --git a/tools/knowledge-creator/.cache/v1.3/catalog.json b/tools/knowledge-creator/.cache/v1.3/catalog.json new file mode 100644 index 00000000..07655e84 --- /dev/null +++ b/tools/knowledge-creator/.cache/v1.3/catalog.json @@ -0,0 +1,11 @@ +{ + "version": "1.3", + "sources": [ + { + "repo": "https://github.com/nablarch/nablarch-document", + "branch": "1.3_maintain", + "commit": "" + } + ], + "files": [] +} diff --git a/tools/knowledge-creator/.cache/v1.4/catalog.json b/tools/knowledge-creator/.cache/v1.4/catalog.json new file mode 100644 index 00000000..e6cd0838 --- /dev/null +++ b/tools/knowledge-creator/.cache/v1.4/catalog.json @@ -0,0 +1,12 @@ +{ + "version": "1.4", + "sources": [ + { + "repo": "https://github.com/nablarch/nablarch-document", + "branch": "1.4_maintain", + "commit": "" + } + ], + "files": [], + "generated_at": "2026-03-13T15:39:45+09:00" +} \ No newline at end of file diff --git a/tools/knowledge-creator/mappings/v1.2.json b/tools/knowledge-creator/mappings/v1.2.json new file mode 100644 index 00000000..9dc60844 --- /dev/null +++ b/tools/knowledge-creator/mappings/v1.2.json @@ -0,0 +1,48 @@ +{ + "rst": [ + {"pattern": "extension_components/etl/", "type": "extension", "category": "etl"}, + {"pattern": "extension_components/report/", "type": "extension", "category": "report"}, + {"pattern": "extension_components/workflow/", "type": "extension", "category": "workflow"}, + {"pattern": "extension_components/", "type": "about", "category": "about-nablarch"}, + {"pattern": "application_framework/application_framework/batch/nablarch_batch", "type": "processing-pattern", "category": "nablarch-batch"}, + {"pattern": "application_framework/application_framework/batch/jsr352", "type": "processing-pattern", "category": "jakarta-batch"}, + {"pattern": "application_framework/application_framework/batch/", "type": "processing-pattern", "category": "nablarch-batch"}, + {"pattern": "application_framework/application_framework/web_service/rest", "type": "processing-pattern", "category": "restful-web-service"}, + {"pattern": "application_framework/application_framework/web_service/http_messaging", "type": "processing-pattern", "category": "http-messaging"}, + {"pattern": "application_framework/application_framework/web_service/", "type": "processing-pattern", "category": "restful-web-service"}, + {"pattern": "application_framework/application_framework/web/", "type": "processing-pattern", "category": "web-application"}, + {"pattern": "application_framework/application_framework/messaging/mom", "type": "processing-pattern", "category": "mom-messaging"}, + {"pattern": "application_framework/application_framework/messaging/db", "type": "processing-pattern", "category": "db-messaging"}, + {"pattern": "application_framework/application_framework/handlers/", "type": "component", "category": "handlers"}, + {"pattern": "application_framework/application_framework/batch/jBatchHandler", "type": "component", "category": "handlers"}, + {"pattern": "application_framework/application_framework/libraries/", "type": "component", "category": "libraries"}, + {"pattern": "application_framework/adaptors/", "type": "component", "category": "adapters"}, + {"pattern": "development_tools/testing_framework/", "type": "development-tools", "category": "testing-framework"}, + {"pattern": "development_tools/toolbox/", "type": "development-tools", "category": "toolbox"}, + {"pattern": "development_tools/java_static_analysis/", "type": "development-tools", "category": "java-static-analysis"}, + {"pattern": "application_framework/application_framework/blank_project/", "type": "setup", "category": "blank-project"}, + {"pattern": "application_framework/application_framework/configuration/", "type": "setup", "category": "configuration"}, + {"pattern": "application_framework/setting_guide/", "type": "setup", "category": "setting-guide"}, + {"pattern": "application_framework/application_framework/cloud_native/", "type": "setup", "category": "cloud-native"}, + {"pattern": "about_nablarch/", "type": "about", "category": "about-nablarch"}, + {"pattern": "application_framework/application_framework/nablarch_architecture/", "type": "about", "category": "about-nablarch"}, + {"pattern": "application_framework/application_framework/nablarch/", "type": "about", "category": "about-nablarch"}, + {"pattern": "migration/", "type": "about", "category": "migration"}, + {"pattern": "release_notes/", "type": "about", "category": "release-notes"}, + {"pattern": "biz_samples/", "type": "guide", "category": "biz-samples"}, + {"pattern": "application_framework/application_framework/messaging/", "type": "processing-pattern", "category": "db-messaging"}, + {"pattern": "examples/", "type": "about", "category": "about-nablarch"}, + {"pattern": "external_contents/", "type": "about", "category": "about-nablarch"}, + {"pattern": "inquiry/", "type": "about", "category": "about-nablarch"}, + {"pattern": "jakarta_ee/", "type": "about", "category": "about-nablarch"}, + {"pattern": "nablarch_api/", "type": "about", "category": "about-nablarch"}, + {"pattern": "releases/", "type": "about", "category": "release-notes"}, + {"pattern": "terms_of_use/", "type": "about", "category": "about-nablarch"}, + {"pattern": "application_framework/application_framework/", "type": "about", "category": "about-nablarch"}, + {"pattern": "application_framework/", "type": "about", "category": "about-nablarch"}, + {"pattern": "development_tools/", "type": "development-tools", "category": "testing-framework"} + ], + "md": {}, + "xlsx": {}, + "xlsx_patterns": [] +} diff --git a/tools/knowledge-creator/mappings/v1.3.json b/tools/knowledge-creator/mappings/v1.3.json new file mode 100644 index 00000000..9dc60844 --- /dev/null +++ b/tools/knowledge-creator/mappings/v1.3.json @@ -0,0 +1,48 @@ +{ + "rst": [ + {"pattern": "extension_components/etl/", "type": "extension", "category": "etl"}, + {"pattern": "extension_components/report/", "type": "extension", "category": "report"}, + {"pattern": "extension_components/workflow/", "type": "extension", "category": "workflow"}, + {"pattern": "extension_components/", "type": "about", "category": "about-nablarch"}, + {"pattern": "application_framework/application_framework/batch/nablarch_batch", "type": "processing-pattern", "category": "nablarch-batch"}, + {"pattern": "application_framework/application_framework/batch/jsr352", "type": "processing-pattern", "category": "jakarta-batch"}, + {"pattern": "application_framework/application_framework/batch/", "type": "processing-pattern", "category": "nablarch-batch"}, + {"pattern": "application_framework/application_framework/web_service/rest", "type": "processing-pattern", "category": "restful-web-service"}, + {"pattern": "application_framework/application_framework/web_service/http_messaging", "type": "processing-pattern", "category": "http-messaging"}, + {"pattern": "application_framework/application_framework/web_service/", "type": "processing-pattern", "category": "restful-web-service"}, + {"pattern": "application_framework/application_framework/web/", "type": "processing-pattern", "category": "web-application"}, + {"pattern": "application_framework/application_framework/messaging/mom", "type": "processing-pattern", "category": "mom-messaging"}, + {"pattern": "application_framework/application_framework/messaging/db", "type": "processing-pattern", "category": "db-messaging"}, + {"pattern": "application_framework/application_framework/handlers/", "type": "component", "category": "handlers"}, + {"pattern": "application_framework/application_framework/batch/jBatchHandler", "type": "component", "category": "handlers"}, + {"pattern": "application_framework/application_framework/libraries/", "type": "component", "category": "libraries"}, + {"pattern": "application_framework/adaptors/", "type": "component", "category": "adapters"}, + {"pattern": "development_tools/testing_framework/", "type": "development-tools", "category": "testing-framework"}, + {"pattern": "development_tools/toolbox/", "type": "development-tools", "category": "toolbox"}, + {"pattern": "development_tools/java_static_analysis/", "type": "development-tools", "category": "java-static-analysis"}, + {"pattern": "application_framework/application_framework/blank_project/", "type": "setup", "category": "blank-project"}, + {"pattern": "application_framework/application_framework/configuration/", "type": "setup", "category": "configuration"}, + {"pattern": "application_framework/setting_guide/", "type": "setup", "category": "setting-guide"}, + {"pattern": "application_framework/application_framework/cloud_native/", "type": "setup", "category": "cloud-native"}, + {"pattern": "about_nablarch/", "type": "about", "category": "about-nablarch"}, + {"pattern": "application_framework/application_framework/nablarch_architecture/", "type": "about", "category": "about-nablarch"}, + {"pattern": "application_framework/application_framework/nablarch/", "type": "about", "category": "about-nablarch"}, + {"pattern": "migration/", "type": "about", "category": "migration"}, + {"pattern": "release_notes/", "type": "about", "category": "release-notes"}, + {"pattern": "biz_samples/", "type": "guide", "category": "biz-samples"}, + {"pattern": "application_framework/application_framework/messaging/", "type": "processing-pattern", "category": "db-messaging"}, + {"pattern": "examples/", "type": "about", "category": "about-nablarch"}, + {"pattern": "external_contents/", "type": "about", "category": "about-nablarch"}, + {"pattern": "inquiry/", "type": "about", "category": "about-nablarch"}, + {"pattern": "jakarta_ee/", "type": "about", "category": "about-nablarch"}, + {"pattern": "nablarch_api/", "type": "about", "category": "about-nablarch"}, + {"pattern": "releases/", "type": "about", "category": "release-notes"}, + {"pattern": "terms_of_use/", "type": "about", "category": "about-nablarch"}, + {"pattern": "application_framework/application_framework/", "type": "about", "category": "about-nablarch"}, + {"pattern": "application_framework/", "type": "about", "category": "about-nablarch"}, + {"pattern": "development_tools/", "type": "development-tools", "category": "testing-framework"} + ], + "md": {}, + "xlsx": {}, + "xlsx_patterns": [] +} diff --git a/tools/knowledge-creator/mappings/v1.4.json b/tools/knowledge-creator/mappings/v1.4.json new file mode 100644 index 00000000..9dc60844 --- /dev/null +++ b/tools/knowledge-creator/mappings/v1.4.json @@ -0,0 +1,48 @@ +{ + "rst": [ + {"pattern": "extension_components/etl/", "type": "extension", "category": "etl"}, + {"pattern": "extension_components/report/", "type": "extension", "category": "report"}, + {"pattern": "extension_components/workflow/", "type": "extension", "category": "workflow"}, + {"pattern": "extension_components/", "type": "about", "category": "about-nablarch"}, + {"pattern": "application_framework/application_framework/batch/nablarch_batch", "type": "processing-pattern", "category": "nablarch-batch"}, + {"pattern": "application_framework/application_framework/batch/jsr352", "type": "processing-pattern", "category": "jakarta-batch"}, + {"pattern": "application_framework/application_framework/batch/", "type": "processing-pattern", "category": "nablarch-batch"}, + {"pattern": "application_framework/application_framework/web_service/rest", "type": "processing-pattern", "category": "restful-web-service"}, + {"pattern": "application_framework/application_framework/web_service/http_messaging", "type": "processing-pattern", "category": "http-messaging"}, + {"pattern": "application_framework/application_framework/web_service/", "type": "processing-pattern", "category": "restful-web-service"}, + {"pattern": "application_framework/application_framework/web/", "type": "processing-pattern", "category": "web-application"}, + {"pattern": "application_framework/application_framework/messaging/mom", "type": "processing-pattern", "category": "mom-messaging"}, + {"pattern": "application_framework/application_framework/messaging/db", "type": "processing-pattern", "category": "db-messaging"}, + {"pattern": "application_framework/application_framework/handlers/", "type": "component", "category": "handlers"}, + {"pattern": "application_framework/application_framework/batch/jBatchHandler", "type": "component", "category": "handlers"}, + {"pattern": "application_framework/application_framework/libraries/", "type": "component", "category": "libraries"}, + {"pattern": "application_framework/adaptors/", "type": "component", "category": "adapters"}, + {"pattern": "development_tools/testing_framework/", "type": "development-tools", "category": "testing-framework"}, + {"pattern": "development_tools/toolbox/", "type": "development-tools", "category": "toolbox"}, + {"pattern": "development_tools/java_static_analysis/", "type": "development-tools", "category": "java-static-analysis"}, + {"pattern": "application_framework/application_framework/blank_project/", "type": "setup", "category": "blank-project"}, + {"pattern": "application_framework/application_framework/configuration/", "type": "setup", "category": "configuration"}, + {"pattern": "application_framework/setting_guide/", "type": "setup", "category": "setting-guide"}, + {"pattern": "application_framework/application_framework/cloud_native/", "type": "setup", "category": "cloud-native"}, + {"pattern": "about_nablarch/", "type": "about", "category": "about-nablarch"}, + {"pattern": "application_framework/application_framework/nablarch_architecture/", "type": "about", "category": "about-nablarch"}, + {"pattern": "application_framework/application_framework/nablarch/", "type": "about", "category": "about-nablarch"}, + {"pattern": "migration/", "type": "about", "category": "migration"}, + {"pattern": "release_notes/", "type": "about", "category": "release-notes"}, + {"pattern": "biz_samples/", "type": "guide", "category": "biz-samples"}, + {"pattern": "application_framework/application_framework/messaging/", "type": "processing-pattern", "category": "db-messaging"}, + {"pattern": "examples/", "type": "about", "category": "about-nablarch"}, + {"pattern": "external_contents/", "type": "about", "category": "about-nablarch"}, + {"pattern": "inquiry/", "type": "about", "category": "about-nablarch"}, + {"pattern": "jakarta_ee/", "type": "about", "category": "about-nablarch"}, + {"pattern": "nablarch_api/", "type": "about", "category": "about-nablarch"}, + {"pattern": "releases/", "type": "about", "category": "release-notes"}, + {"pattern": "terms_of_use/", "type": "about", "category": "about-nablarch"}, + {"pattern": "application_framework/application_framework/", "type": "about", "category": "about-nablarch"}, + {"pattern": "application_framework/", "type": "about", "category": "about-nablarch"}, + {"pattern": "development_tools/", "type": "development-tools", "category": "testing-framework"} + ], + "md": {}, + "xlsx": {}, + "xlsx_patterns": [] +} diff --git a/tools/knowledge-creator/scripts/clean.py b/tools/knowledge-creator/scripts/clean.py index 31292eeb..8dd14a7e 100755 --- a/tools/knowledge-creator/scripts/clean.py +++ b/tools/knowledge-creator/scripts/clean.py @@ -104,8 +104,8 @@ def main(): parser.add_argument( "--version", required=True, - choices=["6", "5", "all"], - help="Version to clean (6, 5, or all)" + choices=["6", "5", "1.4", "1.3", "1.2", "all"], + help="Version to clean (6, 5, 1.4, 1.3, 1.2, or all). 'all' cleans v6 and v5 only." ) parser.add_argument("--yes", action="store_true", help="Skip confirmation prompt") diff --git a/tools/knowledge-creator/scripts/run.py b/tools/knowledge-creator/scripts/run.py index c7734d3c..e37273d8 100755 --- a/tools/knowledge-creator/scripts/run.py +++ b/tools/knowledge-creator/scripts/run.py @@ -115,7 +115,8 @@ def main(): parser = argparse.ArgumentParser( description="Knowledge Creator - Convert Nablarch documentation to AI-ready JSON" ) - parser.add_argument("--version", required=True, choices=["6", "5", "all"]) + parser.add_argument("--version", required=True, choices=["6", "5", "1.4", "1.3", "1.2", "all"], + help="Version to process. 'all' processes v6 and v5 only (not v1.x).") parser.add_argument("--phase", type=str, default=None, help="Phases to run (e.g. 'B', 'CD', 'BCDEF'). Default: all") parser.add_argument("--concurrency", type=int, default=4) diff --git a/tools/knowledge-creator/scripts/step1_list_sources.py b/tools/knowledge-creator/scripts/step1_list_sources.py index 34330fa0..9c144d15 100644 --- a/tools/knowledge-creator/scripts/step1_list_sources.py +++ b/tools/knowledge-creator/scripts/step1_list_sources.py @@ -19,7 +19,10 @@ def run(self): sources = [] # 1. Official documentation (RST) + # Try nablarch-document first (v5/v6 pattern), then {version}_maintain (v1.x symlink pattern) rst_base = f"{self.ctx.repo}/.lw/nab-official/v{self.ctx.version}/nablarch-document/ja/" + if not os.path.exists(rst_base): + rst_base = f"{self.ctx.repo}/.lw/nab-official/v{self.ctx.version}/{self.ctx.version}_maintain/ja/" if os.path.exists(rst_base): for root, dirs, files in os.walk(rst_base): dirs[:] = [d for d in dirs if not d.startswith("_")] @@ -27,6 +30,13 @@ def run(self): if f.endswith(".rst"): rel_path = os.path.relpath(os.path.join(root, f), self.ctx.repo) sources.append({"path": rel_path, "format": "rst", "filename": f}) + else: + self.logger.warning( + f"RST source directory not found for version {self.ctx.version}. " + f"Run setup.sh or manually create a symlink at " + f".lw/nab-official/v{self.ctx.version}/nablarch-document or " + f".lw/nab-official/v{self.ctx.version}/{self.ctx.version}_maintain" + ) # 2. Pattern documents (MD) pattern_dir = ( @@ -57,9 +67,9 @@ def run(self): "filename": "Nablarch機能のセキュリティ対応表.xlsx" }) - # 4. Release notes (Excel) - scan releases directory - releases_dir = f"{self.ctx.repo}/.lw/nab-official/v{self.ctx.version}/nablarch-document/ja/releases/" - if os.path.exists(releases_dir): + # 4. Release notes (Excel) - scan releases directory (derive from rst_base) + releases_dir = os.path.join(rst_base, "releases/") if os.path.exists(rst_base) else "" + if releases_dir and os.path.exists(releases_dir): for f in os.listdir(releases_dir): if f.endswith(".xlsx"): rel_path = os.path.relpath(os.path.join(releases_dir, f), self.ctx.repo) diff --git a/tools/knowledge-creator/tests/e2e/generate_expected.py b/tools/knowledge-creator/tests/e2e/generate_expected.py index 4162593a..33bb346d 100644 --- a/tools/knowledge-creator/tests/e2e/generate_expected.py +++ b/tools/knowledge-creator/tests/e2e/generate_expected.py @@ -62,7 +62,10 @@ def list_sources(repo: str, version: str) -> list: sources = [] # RST + # Try nablarch-document first (v5/v6 pattern), then {version}_maintain (v1.x symlink pattern) rst_base = os.path.join(repo, f".lw/nab-official/v{version}/nablarch-document/ja/") + if not os.path.exists(rst_base): + rst_base = os.path.join(repo, f".lw/nab-official/v{version}/{version}_maintain/ja/") if os.path.exists(rst_base): for root, dirs, files in os.walk(rst_base): dirs[:] = [d for d in dirs if not d.startswith("_")] @@ -88,9 +91,9 @@ def list_sources(repo: str, version: str) -> list: sources.append({"path": os.path.relpath(xlsx_path, repo), "format": "xlsx", "filename": "Nablarch機能のセキュリティ対応表.xlsx"}) - # Release notes Excel - releases_dir = os.path.join(repo, f".lw/nab-official/v{version}/nablarch-document/ja/releases/") - if os.path.exists(releases_dir): + # Release notes Excel (derive from rst_base) + releases_dir = os.path.join(rst_base, "releases/") if os.path.exists(rst_base) else "" + if releases_dir and os.path.exists(releases_dir): for f in sorted(os.listdir(releases_dir)): if f.endswith(".xlsx"): sources.append({"path": os.path.relpath(os.path.join(releases_dir, f), repo), @@ -104,11 +107,11 @@ def list_sources(repo: str, version: str) -> list: # ============================================================ def classify_rst(path: str, rst_mapping: list): - marker = "nablarch-document/ja/" - idx = path.find(marker) - if idx < 0: + # Match either nablarch-document/ja/ or {anything}_maintain/ja/ + m = re.search(r'/(?:nablarch-document|[^/]+_maintain)/ja/', path) + if not m: return None, None, None - rel_path = path[idx + len(marker):] + rel_path = path[m.end():] if rel_path == "index.rst": return "about", "about-nablarch", "" @@ -145,10 +148,10 @@ def generate_id(filename: str, format: str, category: str = None, base_name = filename if base_name == "index" and source_path and matched_pattern is not None: - marker = "nablarch-document/ja/" - marker_idx = source_path.find(marker) - if marker_idx >= 0: - rst_rel = source_path[marker_idx + len(marker):] + # Match either nablarch-document/ja/ or {anything}_maintain/ja/ + m = re.search(r'/(?:nablarch-document|[^/]+_maintain)/ja/', source_path) + if m: + rst_rel = source_path[m.end():] pattern_clean = matched_pattern.rstrip("/") if not pattern_clean: base_name = "top" diff --git a/tools/knowledge-creator/tests/ut/test_kc_sh.py b/tools/knowledge-creator/tests/ut/test_kc_sh.py index e0d9a895..35983aad 100644 --- a/tools/knowledge-creator/tests/ut/test_kc_sh.py +++ b/tools/knowledge-creator/tests/ut/test_kc_sh.py @@ -89,6 +89,43 @@ def test_fix_with_target_passes_target(self, stub_env): assert "--target test-id" in lines[0] +class TestV1xVersions: + + @pytest.mark.parametrize("version", ["1.4", "1.3", "1.2"]) + def test_gen_v1x_calls_clean_then_run(self, stub_env, version): + result = _run_nc(["gen", version], stub_env) + lines = [l for l in result.stdout.splitlines() if l.startswith("CMD:")] + assert len(lines) == 2, f"Expected 2 commands for version {version}, got: {lines}" + assert "scripts/clean.py" in lines[0] and f"--version {version}" in lines[0] + assert "scripts/run.py" in lines[1] and f"--version {version}" in lines[1] + + @pytest.mark.parametrize("version", ["1.4", "1.3", "1.2"]) + def test_gen_v1x_resume_skips_clean(self, stub_env, version): + result = _run_nc(["gen", version, "--resume"], stub_env) + lines = [l for l in result.stdout.splitlines() if l.startswith("CMD:")] + assert len(lines) == 1, f"Expected 1 command for version {version} --resume, got: {lines}" + assert "scripts/run.py" in lines[0] + assert f"--version {version}" in lines[0] + + @pytest.mark.parametrize("version", ["1.4", "1.3", "1.2"]) + def test_regen_v1x_uses_command_regen(self, stub_env, version): + result = _run_nc(["regen", version], stub_env) + lines = [l for l in result.stdout.splitlines() if l.startswith("CMD:")] + assert len(lines) == 1 + assert "scripts/run.py" in lines[0] + assert "--command regen" in lines[0] + assert f"--version {version}" in lines[0] + + @pytest.mark.parametrize("version", ["1.4", "1.3", "1.2"]) + def test_fix_v1x_uses_command_fix(self, stub_env, version): + result = _run_nc(["fix", version], stub_env) + lines = [l for l in result.stdout.splitlines() if l.startswith("CMD:")] + assert len(lines) == 1 + assert "scripts/run.py" in lines[0] + assert "--command fix" in lines[0] + assert f"--version {version}" in lines[0] + + class TestErrorHandling: def test_unknown_command_exits_nonzero(self, stub_env):