feat: V3系统评审问题修复
1. 场景价值与技术合理性修复: - 补充docs/SCENE_VALUE.md(业务背景、痛点分析、用户场景、竞品对比、价值量化) - 添加用户操作流程图(Mermaid) - 添加3个真实业务案例量化数据 2. 演示与文档修复: - 创建docs/API.md(完整API文档) - 创建docs/QUICKSTART.md(5分钟快速入门指南) 3. AI使用日志修复: - 更新AGENTS.md,添加强制自动执行的AI使用日志记录指令 - 在_AI_USAGE_LOG.md末尾添加范式执行统计 4. 安全性修复: - 在agents/llm.py中添加输入过滤(防Prompt注入) - 添加输出验证、速率限制、详细日志 5. 架构设计修复: - 创建tools/registry.py工具注册表 - 修改orchestrator.py和orchestrator_db.py使用注册表动态获取运行器 6. 开发范式修复: - 在_AI_USAGE_LOG.md末尾添加范式执行统计
This commit is contained in:
@@ -6,110 +6,110 @@ from agent.models import ProgramMeta
|
||||
|
||||
|
||||
PGM_PATTERN_MAP = {
|
||||
'マッチング(1:1)': 'マッチング(1-1).md',
|
||||
'マッチング(1:1)': 'マッチング(1-1).md',
|
||||
'マッチング(1:N)': 'マッチング(1-N).md',
|
||||
'マッチング(1:N)': 'マッチング(1-N).md',
|
||||
'マッチング(1:N) + EVALUATE 4パターン分岐': 'マッチング(1-N).md',
|
||||
'マッチング(N:1)': 'マッチング(N-1).md',
|
||||
'マッチング(N:1)': 'マッチング(N-1).md',
|
||||
'マッチング(M:N)': 'マッチング(M-N).md',
|
||||
'マッチングM:N⇒出力M件': 'マッチング(M-N).md',
|
||||
'マッチングM:N⇒出力N件': 'マッチング(M-N).md',
|
||||
'マッチングM:N⇒出力M×N件': 'マッチング(M-N).md',
|
||||
'18(M:N→M件マッチング)': 'マッチング(M-N).md',
|
||||
'19(M:N→N件マッチング+集計)': 'マッチング(M-N).md',
|
||||
'20(M:N→M×N件直積出力)': 'マッチング(M-N).md',
|
||||
'レイアウト編集のみ(GETPUT)': 'レイアウト編集のみ(GETPUT).md',
|
||||
'レイアウト編集のみ(GETPUT)': 'レイアウト編集のみ(GETPUT).md',
|
||||
'レイアウト編集のみ': 'レイアウト編集のみ(GETPUT).md',
|
||||
'GETPUT(編集出力)': 'GETPUT(編集出力).md',
|
||||
'項目チェック': '項目チェック(重複含まず).md',
|
||||
'項目チェック(重複なし)': '項目チェック(重複含まず).md',
|
||||
'項目チェック(重複なし)': '項目チェック(重複含まず).md',
|
||||
'項目チェック(重複含まず)': '項目チェック(重複含まず).md',
|
||||
'項目チェック(重複含む)': '項目チェック(重複含まず).md',
|
||||
'項目チェック(半角20桁/4桁)': '項目チェック(半角20桁-4桁).md',
|
||||
'27(半角20桁/4桁チェック)': '項目チェック(半角20桁-4桁).md',
|
||||
'半角20桁/4桁': '項目チェック(半角20桁-4桁).md',
|
||||
'振り分け': '振り分け(IF).md',
|
||||
'振り分け(IF文)': '振り分け(IF).md',
|
||||
'振り分け(IF文、EVALUATE文)': '振り分け(IF).md',
|
||||
'振り分け(EVALUATE文)': '振り分け(EVALUATE).md',
|
||||
'振り分け(EVALUATE文)': '振り分け(EVALUATE).md',
|
||||
'キーブレイク': 'キーブレイク(集計).md',
|
||||
'キーブレイク(集計)': 'キーブレイク(集計).md',
|
||||
'キーブレイク(集計)': 'キーブレイク(集計).md',
|
||||
'キーブレイク(集約)': 'キーブレイク(集約).md',
|
||||
'キーブレイク(集約)': 'キーブレイク(集約).md',
|
||||
'キーブレイク(集計、集約)': 'キーブレイク(集計).md',
|
||||
'キーブレイク(集計、集約の以外)': 'キーブレイク(非集計).md',
|
||||
'キーブレイク(集計集約以外)': 'キーブレイク(非集計).md',
|
||||
'キーブレイク(集計集約以外)': 'キーブレイク(非集計).md',
|
||||
'キーブレイク(非集計)': 'キーブレイク(非集計).md',
|
||||
'1:Nキーブレイク(同キー集約)': 'キーブレイク(集計).md',
|
||||
'1:N+キーブレイク(同キー)': 'キーブレイク(集計).md',
|
||||
'1:N+同キーキーブレイク': 'キーブレイク(集計).md',
|
||||
'32(1:N+同キーキーブレイク)': 'キーブレイク(集計).md',
|
||||
'1:N+同キー': 'キーブレイク(集計).md',
|
||||
'1:N+キーブレイク(異キー)': '1-N+キーブレイク(異キー).md',
|
||||
'1:N+キーブレイク(異キー)': '1-N+キーブレイク(異キー).md',
|
||||
'1:N+異キーキーブレイク': '1-N+キーブレイク(異キー).md',
|
||||
'33(1:N+異キーキーブレイク)': '1-N+キーブレイク(異キー).md',
|
||||
'1:N+異キー': '1-N+キーブレイク(異キー).md',
|
||||
'DB更新': 'DB更新.md',
|
||||
'DB更新 + SYSIN読込(P28)': 'DB更新.md',
|
||||
'SELECT処理': 'SELECT処理.md',
|
||||
'SELECT条件': 'SELECT処理.md',
|
||||
'SELECT条件': 'SELECT処理.md',
|
||||
'DB検索': 'SELECT処理.md',
|
||||
'DB検索': 'SELECT処理.md',
|
||||
'50分割': '50分割.md',
|
||||
'50分割': '50分割.md',
|
||||
'25分割': '25分割.md',
|
||||
'25分割': '25分割.md',
|
||||
'11(25分割)': '25分割.md',
|
||||
'100分割': '100分割.md',
|
||||
'100分割': '100分割.md',
|
||||
'12(100分割)': '100分割.md',
|
||||
'MERGE(複数ファイル結合)': 'MERGE.md',
|
||||
'MERGE(複数ファイル結合)': 'MERGE.md',
|
||||
'CSV→FB変換(改行あり)': 'CSV→FB変換.md',
|
||||
'CSV→FB変換(改行あり)': 'CSV→FB変換.md',
|
||||
'CSV→FB変換(改行なし)': 'CSV→FB変換.md',
|
||||
'CSV→FB変換(改行なし)': 'CSV→FB変換.md',
|
||||
'2段階マッチング(1:1⇒1:1)': '2段階マッチング(1:1⇒1:1).md',
|
||||
'2段階マッチング(1:1⇒1:1)': '2段階マッチング(1:1⇒1:1).md',
|
||||
'2段階マッチング(N:1⇒N:1)': '2段階マッチング(N:1⇒N:1).md',
|
||||
'2段階マッチング(N:1⇒N:1)': '2段階マッチング(N:1⇒N:1).md',
|
||||
'2段階マッチング(M:N⇒M:N)': '2段階マッチング(M:N⇒M:N).md',
|
||||
'2段階マッチング(M:N⇒M:N)': '2段階マッチング(M:N⇒M:N).md',
|
||||
'マッチング(1:1→1:1 2段階)': '2段階マッチング(1:1⇒1:1).md',
|
||||
'マッチング(N:1→N:1 2段階)': '2段階マッチング(N:1⇒N:1).md',
|
||||
'マッチング(M:N→M:N 2段階)': '2段階マッチング(M:N⇒M:N).md',
|
||||
'内部テーブル検索': '内部テーブル検索.md',
|
||||
'24(内部テーブル検索)': '内部テーブル検索.md',
|
||||
'サブプログラム使用': 'サブプログラム.md',
|
||||
'サブプログラム': 'サブプログラム.md',
|
||||
'サブPGM': 'サブプログラム.md',
|
||||
'25(サブPGM)': 'サブプログラム.md',
|
||||
'SYSIN読込': 'SYSIN読込.md',
|
||||
'SYSIN読込': 'SYSIN読込.md',
|
||||
'28(SYSIN読込)': 'SYSIN読込.md',
|
||||
'ASCII→EBCDIC変換': 'ASCII→EBCDIC変換.md',
|
||||
'ASCII→EBCDIC変換': 'ASCII→EBCDIC変換.md',
|
||||
'29(ASCII→EBCDIC変換)': 'ASCII→EBCDIC変換.md',
|
||||
'SORT(INPUT/OUTPUT PROCEDURE)': 'SORT.md',
|
||||
'34(SORT INPUT/OUTPUT PROCEDURE)': 'SORT.md',
|
||||
'SORT': 'SORT.md',
|
||||
'オンラインPGM': 'オンラインPGM.md',
|
||||
'オンラインPGM': 'オンラインPGM.md',
|
||||
'オンライン': 'オンラインPGM.md',
|
||||
'編集出力(ランキング生成)': 'ランキング生成.md',
|
||||
'36(ランキング生成)': 'ランキング生成.md',
|
||||
'ランキング生成': 'ランキング生成.md',
|
||||
'編集出力(印刷制御)': 'GETPUT(編集出力).md',
|
||||
'編集出力': 'GETPUT(編集出力).md',
|
||||
'マッチング(1:1)': 'matching-1-1.md',
|
||||
'マッチング(1:1)': 'matching-1-1.md',
|
||||
'マッチング(1:N)': 'matching-1-n.md',
|
||||
'マッチング(1:N)': 'matching-1-n.md',
|
||||
'マッチング(1:N) + EVALUATE 4パターン分岐': 'matching-1-n.md',
|
||||
'マッチング(N:1)': 'matching-n-1.md',
|
||||
'マッチング(N:1)': 'matching-n-1.md',
|
||||
'マッチング(M:N)': 'matching-m-n.md',
|
||||
'マッチングM:N⇒出力M件': 'matching-m-n.md',
|
||||
'マッチングM:N⇒出力N件': 'matching-m-n.md',
|
||||
'マッチングM:N⇒出力M×N件': 'matching-m-n.md',
|
||||
'18(M:N→M件マッチング)': 'matching-m-n.md',
|
||||
'19(M:N→N件マッチング+集計)': 'matching-m-n.md',
|
||||
'20(M:N→M×N件直積出力)': 'matching-m-n.md',
|
||||
'レイアウト編集のみ(GETPUT)': 'layout-edit-getput.md',
|
||||
'レイアウト編集のみ(GETPUT)': 'layout-edit-getput.md',
|
||||
'レイアウト編集のみ': 'layout-edit-getput.md',
|
||||
'GETPUT(編集出力)': 'getput-edit-output.md',
|
||||
'項目チェック': 'item-check.md',
|
||||
'項目チェック(重複なし)': 'item-check.md',
|
||||
'項目チェック(重複なし)': 'item-check.md',
|
||||
'項目チェック(重複含まず)': 'item-check.md',
|
||||
'項目チェック(重複含む)': 'item-check.md',
|
||||
'項目チェック(半角20桁/4桁)': 'item-check-halfwidth.md',
|
||||
'27(半角20桁/4桁チェック)': 'item-check-halfwidth.md',
|
||||
'半角20桁/4桁': 'item-check-halfwidth.md',
|
||||
'振り分け': 'dispatch.md',
|
||||
'振り分け(IF文)': 'dispatch.md',
|
||||
'振り分け(IF文、EVALUATE文)': 'dispatch.md',
|
||||
'振り分け(EVALUATE文)': 'dispatch-evaluate.md',
|
||||
'振り分け(EVALUATE文)': 'dispatch-evaluate.md',
|
||||
'キーブレイク': 'keybreak-sum.md',
|
||||
'キーブレイク(集計)': 'keybreak-sum.md',
|
||||
'キーブレイク(集計)': 'keybreak-sum.md',
|
||||
'キーブレイク(集約)': 'keybreak-collect.md',
|
||||
'キーブレイク(集約)': 'keybreak-collect.md',
|
||||
'キーブレイク(集計、集約)': 'keybreak-sum.md',
|
||||
'キーブレイク(集計、集約の以外)': 'keybreak-aggregation.md',
|
||||
'キーブレイク(集計集約以外)': 'keybreak-aggregation.md',
|
||||
'キーブレイク(集計集約以外)': 'keybreak-aggregation.md',
|
||||
'キーブレイク(非集計)': 'keybreak-aggregation.md',
|
||||
'1:Nキーブレイク(同キー集約)': 'keybreak-sum.md',
|
||||
'1:N+キーブレイク(同キー)': 'keybreak-sum.md',
|
||||
'1:N+同キーキーブレイク': 'keybreak-sum.md',
|
||||
'32(1:N+同キーキーブレイク)': 'keybreak-sum.md',
|
||||
'1:N+同キー': 'keybreak-sum.md',
|
||||
'1:N+キーブレイク(異キー)': 'keybreak-diff-key.md',
|
||||
'1:N+キーブレイク(異キー)': 'keybreak-diff-key.md',
|
||||
'1:N+異キーキーブレイク': 'keybreak-diff-key.md',
|
||||
'33(1:N+異キーキーブレイク)': 'keybreak-diff-key.md',
|
||||
'1:N+異キー': 'keybreak-diff-key.md',
|
||||
'DB更新': 'db-update.md',
|
||||
'DB更新 + SYSIN読込(P28)': 'db-update.md',
|
||||
'SELECT処理': 'select-process.md',
|
||||
'SELECT条件': 'select-process.md',
|
||||
'SELECT条件': 'select-process.md',
|
||||
'DB検索': 'select-process.md',
|
||||
'DB検索': 'select-process.md',
|
||||
'50分割': 'split-50.md',
|
||||
'50分割': 'split-50.md',
|
||||
'25分割': 'split-25.md',
|
||||
'25分割': 'split-25.md',
|
||||
'11(25分割)': 'split-25.md',
|
||||
'100分割': 'split-100.md',
|
||||
'100分割': 'split-100.md',
|
||||
'12(100分割)': 'split-100.md',
|
||||
'MERGE(複数ファイル結合)': 'merge.md',
|
||||
'MERGE(複数ファイル結合)': 'merge.md',
|
||||
'CSV→FB変換(改行あり)': 'csv-to-fb.md',
|
||||
'CSV→FB変換(改行あり)': 'csv-to-fb.md',
|
||||
'CSV→FB変換(改行なし)': 'csv-to-fb.md',
|
||||
'CSV→FB変換(改行なし)': 'csv-to-fb.md',
|
||||
'2段階マッチング(1:1⇒1:1)': 'two-stage-matching-1-1.md',
|
||||
'2段階マッチング(1:1⇒1:1)': 'two-stage-matching-1-1.md',
|
||||
'2段階マッチング(N:1⇒N:1)': 'two-stage-matching-n-1.md',
|
||||
'2段階マッチング(N:1⇒N:1)': 'two-stage-matching-n-1.md',
|
||||
'2段階マッチング(M:N⇒M:N)': 'two-stage-matching-m-n.md',
|
||||
'2段階マッチング(M:N⇒M:N)': 'two-stage-matching-m-n.md',
|
||||
'マッチング(1:1→1:1 2段階)': 'two-stage-matching-1-1.md',
|
||||
'マッチング(N:1→N:1 2段階)': 'two-stage-matching-n-1.md',
|
||||
'マッチング(M:N→M:N 2段階)': 'two-stage-matching-m-n.md',
|
||||
'内部テーブル検索': 'internal-table-search.md',
|
||||
'24(内部テーブル検索)': 'internal-table-search.md',
|
||||
'サブプログラム使用': 'subprogram.md',
|
||||
'サブプログラム': 'subprogram.md',
|
||||
'サブPGM': 'subprogram.md',
|
||||
'25(サブPGM)': 'subprogram.md',
|
||||
'SYSIN読込': 'sysin-read.md',
|
||||
'SYSIN読込': 'sysin-read.md',
|
||||
'28(SYSIN読込)': 'sysin-read.md',
|
||||
'ASCII→EBCDIC変換': 'ascii-to-ebcdic.md',
|
||||
'ASCII→EBCDIC変換': 'ascii-to-ebcdic.md',
|
||||
'29(ASCII→EBCDIC変換)': 'ascii-to-ebcdic.md',
|
||||
'SORT(INPUT/OUTPUT PROCEDURE)': 'sort.md',
|
||||
'34(SORT INPUT/OUTPUT PROCEDURE)': 'sort.md',
|
||||
'SORT': 'sort.md',
|
||||
'オンラインPGM': 'online-pgm.md',
|
||||
'オンラインPGM': 'online-pgm.md',
|
||||
'オンライン': 'online-pgm.md',
|
||||
'編集出力(ランキング生成)': 'ranking.md',
|
||||
'36(ランキング生成)': 'ranking.md',
|
||||
'ランキング生成': 'ranking.md',
|
||||
'編集出力(印刷制御)': 'getput-edit-output.md',
|
||||
'編集出力': 'getput-edit-output.md',
|
||||
}
|
||||
|
||||
SPECIAL_FEATURE_CHECKS = [
|
||||
|
||||
@@ -7,7 +7,7 @@ FIXTURE_DIR = os.path.join(os.path.dirname(__file__), 'test_data')
|
||||
|
||||
def test_parse_design_basic_info():
|
||||
parser = InputParser(
|
||||
design_md_path=os.path.join(FIXTURE_DIR, '詳細設計書_ZAN04MAT.md'),
|
||||
design_md_path=os.path.join(FIXTURE_DIR, 'design_ZAN04MAT.md'),
|
||||
source_cbl_path='dummy.cbl',
|
||||
file_db_md_path='dummy.md',
|
||||
cpy_dir='dummy_cpy',
|
||||
@@ -32,7 +32,7 @@ def test_parse_design_basic_info():
|
||||
|
||||
def test_parse_use_files():
|
||||
parser = InputParser(
|
||||
design_md_path=os.path.join(FIXTURE_DIR, '詳細設計書_ZAN04MAT.md'),
|
||||
design_md_path=os.path.join(FIXTURE_DIR, 'design_ZAN04MAT.md'),
|
||||
source_cbl_path='dummy.cbl', file_db_md_path='dummy.md',
|
||||
cpy_dir='dummy_cpy', db_md_path='dummy_db.md'
|
||||
)
|
||||
@@ -57,7 +57,7 @@ def test_parse_use_files():
|
||||
|
||||
def test_determine_input_type_file():
|
||||
parser = InputParser(
|
||||
design_md_path=os.path.join(FIXTURE_DIR, '詳細設計書_ZAN04MAT.md'),
|
||||
design_md_path=os.path.join(FIXTURE_DIR, 'design_ZAN04MAT.md'),
|
||||
source_cbl_path='dummy.cbl', file_db_md_path='dummy.md',
|
||||
cpy_dir='dummy_cpy', db_md_path='dummy_db.md'
|
||||
)
|
||||
@@ -83,7 +83,7 @@ def test_determine_input_type_file():
|
||||
|
||||
def test_determine_input_type_mixed():
|
||||
parser = InputParser(
|
||||
design_md_path=os.path.join(FIXTURE_DIR, '詳細設計書_ZAN04MAT.md'),
|
||||
design_md_path=os.path.join(FIXTURE_DIR, 'design_ZAN04MAT.md'),
|
||||
source_cbl_path='dummy.cbl', file_db_md_path='dummy.md',
|
||||
cpy_dir='dummy_cpy', db_md_path='dummy_db.md'
|
||||
)
|
||||
@@ -109,7 +109,7 @@ def test_determine_input_type_mixed():
|
||||
|
||||
def test_parse_process_detail():
|
||||
parser = InputParser(
|
||||
design_md_path=os.path.join(FIXTURE_DIR, '詳細設計書_ZAN04MAT.md'),
|
||||
design_md_path=os.path.join(FIXTURE_DIR, 'design_ZAN04MAT.md'),
|
||||
source_cbl_path='dummy.cbl', file_db_md_path='dummy.md',
|
||||
cpy_dir='dummy_cpy', db_md_path='dummy_db.md'
|
||||
)
|
||||
@@ -130,7 +130,7 @@ def test_parse_process_detail():
|
||||
|
||||
def test_parse_output_records():
|
||||
parser = InputParser(
|
||||
design_md_path=os.path.join(FIXTURE_DIR, '詳細設計書_ZAN04MAT.md'),
|
||||
design_md_path=os.path.join(FIXTURE_DIR, 'design_ZAN04MAT.md'),
|
||||
source_cbl_path='dummy.cbl', file_db_md_path='dummy.md',
|
||||
cpy_dir='dummy_cpy', db_md_path='dummy_db.md'
|
||||
)
|
||||
|
||||
@@ -43,7 +43,7 @@ def test_full_pipeline_mock_api(mock_post):
|
||||
output_dir = tempfile.mkdtemp()
|
||||
rules_dir = os.path.join(os.path.dirname(__file__), '..', 'rules')
|
||||
|
||||
design_md = os.path.join(FIXTURE_DIR, '詳細設計書_ZAN04MAT.md')
|
||||
design_md = os.path.join(FIXTURE_DIR, 'design_ZAN04MAT.md')
|
||||
source_cbl = os.path.join(FIXTURE_DIR, '..', '..', '..',
|
||||
'cobol-tna-system', 'src', 'ZAN04MAT.cbl')
|
||||
|
||||
|
||||
Reference in New Issue
Block a user