Bobにプロンプトで指示せず指示内容をIssueに記録します
■Gitlab-Issue作成
[計画]-[作業アイテム]-[新しいアイテム]
| ラベル | 値 |
|---|---|
| タイプ | Issue |
| タイトル | FFRPGへの変換とテストスクリプト作成 |
| 担当 | 自分 |
説明
以下の実行計画を立ててコメントに記載してください
*RENRITSU.RPGをFRENRITU.FFRPGに変換
*FRENRITU.FFRPGをRPGUnitでテストコード作成
[Issueを作成]
作成したIssueのURLをブラウザのURLから取得します
例) https://{Gitサーバ}/ibmi/renritsu/-/work_items/4
■BobへIssue読込指示
◯1回目
プロンプトに以下を入力
glabコマンドでhttps://{Gitサーバ}/ibmi/renritsu/-/work_items/4
を読み込んで指示に従ってください
その後表示される[一度だけ承認]は毎回OK
…[タスクに対して承認]で毎回入力不要にしてもよい
◯2回目
実行計画がIssueにコメントとして追加されました
しかしブランチがmasterのままで、FFRPG化を作成するブランチを分けていないことに気づきました
コメントに以下を追記
実行計画実施前にmasterブランチから feature/FFRPG化(#4) ブランチを作成して、
そのブランチに切り替えてください
プロンプトに以下を入力
https\://{Gitサーバ}/ibmi/renritsu/-/work_items/4#note_523 の指示に従ってください
…以後繰り返し
※RPGUnitのテストPG作成は0から作成したらコインを多くつかった(30コインぐらい)
サンプルを提示する方が効果的です
■Issueの記録
Gitlab-IssueをQiitaで再現するに、作業者の指示は緑に、Bobの書込みは黄色にしました
FFRPGへの変換とテストスクリプト作成
以下の実行計画を立ててコメントに記載してください
*RENRITSU.RPGをFRENRITU.FFRPGに変換
*FRENRITU.FFRPGをRPGUnitでテストコード作成
実行計画
1. RENRITSU.RPG を FRENRITU.FFRPG に変換
対象ファイルの概要
QRPGSRC/RENRITSU.RPG : OPM RPG3 プログラム(二次方程式 AX²+BX+C=0 の解を求める)
QDSPSRC/RENRITSU.DSPF : 入力画面(FMT11)・応答画面(FMT12) の2レコード構成
変換方針
| 区分 | RPG3 | FFRPG |
|---|---|---|
| ファイル仕様 | FRENRITSUCF E WORKSTN | DCL-F RENRITSU WORKSTN |
| 主処理ループ | DO *HIVAL / ENDDO | DOW *ON; / ENDDO; |
| 画面 EXFMT | EXFMT FMT11 | EXFMT FMT11; |
| 条件分岐 | IFEQ / ELSE / ENDIF | IF / ELSE / ENDIF; |
| 演算 MULT/DIV | MULT / DIV | * / / 演算子 |
| SQRT | SQRT W#HANB W#T5 | %SQRT(W#HANB) |
| サブルーチン | BEGSR / ENDSR | DCL-PROC または BEGSR (インライン) |
| 変数宣言 | 演算仕様の作業フィールド定義 | DCL-S で宣言 |
| インジケータ | *IN60 *IN70 等 | DCL-S IN60 IND 等、または直接論理変数 |
変換後のファイル
・配置先: QRPGSRC/FRENRITU.FFRPG
・拡張子 .FFRPG = Free-form RPG (ILE RPG) のソースタイプ
・ファイル名は Work Item の指定通り FRENRITU(8文字制約対応)
Rules.mk への追記
FRENRITU.PGM: FRENRITU.FFRPG RENRITSU.FILE
2. FRENRITU.FFRPG を RPGUnit でテストコード作成
テスト対象ロジック
サブルーチン SR@KSN の計算ロジック(FFRPG 変換後はプロシージャとして切り出す)
| テストケース | A | B | C | 期待結果 |
|---|---|---|---|---|
| 実数解2つ (判別式>0) | 1 | -3 | 2 | ANS1=2.00, ANS2=1.00 |
| 重解 (判別式=0) | 1 | -2 | 1 | ANS1=1.00, ANS2=1.00 |
| 実数解なし (判別式<0) | 1 | 0 | 1 | IN60=*ON |
| 二次方程式でない (A=0) | 0 | 2 | 1 | IN61=*ON |
テストファイル構成
・配置先: QRPGSRC/TFRENITR.FFRPG(RPGUnit テストモジュール、8文字制約)
・TESTCASE プロシージャを4本作成
・RPGUnit の ssert / ssertEqual / ssertOn / ssertOff を使用
Rules.mk への追記
TFRENITR.MODULE: TFRENITR.FFRPG
作業順序
- QRPGSRC/FRENRITU.FFRPG を作成(RPG3 → FFRPG 変換)
- QRPGSRC/Rules.mk に FRENRITU.PGM ビルドルールを追加
- QRPGSRC/TFRENITR.FFRPG を作成(RPGUnit テストコード)
- QRPGSRC/Rules.mk に TFRENITR.MODULE ビルドルールを追加
- ビルド確認(IBM i 実機 SSH 経由)
実行計画実施前にmasterブランチから feature/FFRPG化(#4) ブランチを作成して、そのブランチに切り替えてください
Bobでブランチが feature/FFRPG化(#4) に切り替わったことを確認しました
実行計画を進めて、結果をここにコメントで記載してください
#4 (comment 530)
が文字化けしています。修正してください
実行計画 完了報告
以下3点の作業を feature/FFRPG化(#4) ブランチに対して実施・プッシュしました。
1. QRPGSRC/FRENRITU.FFRPG を作成
RENRITSU.RPG(RPG3/OPM)を ILE RPG 完全自由形式(**FREE)に変換。
主な変換内容:
・F仕様 → DCL-F RENRITSU WORKSTN;
・作業フィールド → DCL-S で宣言(PACKED(5:2))
・DO *HIVAL → DOW *ON;
・EXFMT / IF / ELSE / ENDIF → セミコロン付き自由形式
・MULT / DIV / SUB / ADD → * / - + 演算子
・SQRT W#HANB W#T5 → W#T5 = %SQRT(W#HANB);
・BEGSR / ENDSR はインライン形式で保持
2. QRPGSRC/TFRENITR.FFRPG を作成
RPGUnit テストモジュール(CTL-OPT NOMAIN;)。
計算ロジック(CALC_KSN プロシージャ)を呼び出す4テストケースを実装。
| プロシージャ名 | A | B | C | 検証内容 |
|---|---|---|---|---|
| TEST_JITSUSU2 | 1 | -3 | 2 | ANS1=2.00, ANS2=1.00 |
| TEST_JUUKAI | 1 | -2 | 1 | ANS1=1.00, ANS2=1.00(重解) |
| TEST_MUKAI | 1 | 0 | 1 | IN60=*ON(実数解なし) |
| TEST_HITSUJI | 0 | 2 | 1 | IN61=*ON(二次方程式でない) |
3. QRPGSRC/Rules.mk にビルドルール追加
FRENRITU.PGM: FRENRITU.FFRPG RENRITSU.FILE
TFRENITR.MODULE: TFRENITR.FFRPG
コミット: c48ae9e ブランチ: feature/FFRPG化(#4)
gitlabにfeature/FFRPG化(#4)ブランチがpushされていることを確認しました
FRENRITUとTFRENITRをコンパイルしてください
BobがFRENRITUは拡張子がFFRPGではNGと判断しRPGLEに変更。コンパイル成功
mentioned in commit 617bf521 xx時間前
[メモ]TFRENITRのコンパイルが通らず延々と終わらないので中止した
RPGUNITのインストールができていなかったらしい
Bobの拡張機能からインストールではなく、https://rpgunit.sourceforge.net/tutorial.htmlからインストールした
(手動でRun Buildを実行しソースコードでエラーメッセージを確認した)
TFRENITRのコンパイルでエラーになる
The name or indicator ASSERTOFF is not defiened
のエラーメッセージの原因を調べてください
ここからBobは原因を調べコードを修正しはじめた
コミット→プッシュ→コンパイル→エラーで修正を繰り返した
その間作業者はBobで作業内容に[OK]で許可を与え続けた
mentioned in commit 4a4af3c3 xx時間前
mentioned in commit 0d5b29a3 xx時間前
mentioned in commit 3b7bf754 xx時間前
mentioned in commit 071b4e16 xx時間前
mentioned in commit e8510f1f xx時間前
mentioned in commit b159b71d xx時間前
mentioned in commit 4a41f294 xx時間前
コンパイル完了報告
feature/FFRPG化(#4) ブランチ、pvs (TAKAMILIB) でのビルド結果です。
結果
| オブジェクト | 結果 |
|---|---|
| TAKAMILIB/FRENRITU.PGM | 成功 |
| TAKAMILIB/TFRENITR.MODULE | 成功 |
note_536 のエラー原因と修正内容
原因: ASSERTOFF is not defined エラーは2つの問題が重なっていた。
-
/COPY RPGUNIT1,TESTCASE の参照先が間違っていた
・誤: RPGUNIT1 ライブラリ(存在しない)
・正: RPGUNIT ライブラリ内の RPGUNIT1.FILE
・このバージョンのRPGUnitが提供するAPIは assert / iEqual / fail / aEqual のみ
assertOn / assertOff / assertEqual は存在しない。 -
RPGUNIT1.FILE/TESTCASE.MBR は固定形式(RPG3)のプロトタイプ定義で、**FREE ソースと混在させると RNF0604 エラーになる。
修正内容 (TFRENITR.RPGLE)
・/COPY を廃止し、assert/iEqual/fail のプロトタイプをソース内に直接定義
・テストコードを **FREE 形式で統一
・アサーションメッセージ文字列をASCII英語に変更(EBCDIC TGTCCSID(5035)での文字化け回避)
・%not を IND = *OFF 比較に変更(コンパイラ互換性)
.bob/tmpを.gitignoreに追加してください
Bobが .gitignoreを変更しコミットとプッシュ
mentioned in commit 4d5c4ddd xx時間前
mentioned in commit ced84095 xx時間前
.gitignoreの変更内容がコメントされていないので指示
note 544(コンパイル完了報告)以後の変更をコメントに書き込んでください
コンパイル成功した TFRENITR.RPGLE を実行してテスト結果をコメントに記載してください
Bobがテスト実行のためのbashスクリプトを作成しコミットとプッシュ
mentioned in commit c0ba6d27 xx時間前
TFRENITR テスト実行結果
Success. 4 test cases, 14 assertions, 0 failure, 0 error.
*** Tests of TFRENITR *** Date : 2026-07-24 / 12:29:44 Job :
372442/QSECOFR_NC/QP0ZSPWT User : TAKAMI iRPGUnit :
v6.0.0.v IBM i : V7R6M0 Cur. library: TAKAMILIB Library list:
TAKAMILIB / QGPL / QTEMP / FLIB Success.
4 test cases, 14 assertions, 0 failure, 0 error.
| テストケース | 内容 | 結果 |
|---|---|---|
| TEST_JITSUSU2 | 1X^2 - 3X + 2 = 0 => X=2, X=1 | PASS |
| TEST_JUUKAI | 1X^2 - 2X + 1 = 0 => X=1(重解) | PASS |
| TEST_MUKAI | 1X^2 + 0X + 1 = 0 => 実数解なし | PASS |
| TEST_HITSUJI | A=0 => 二次方程式でない | PASS |
テスト実行前の修正 (MCH1202 対応)
iEqual(200 : %int(ANS1 * 100)) で MCH1202 - Decimal data error が発生したため、assert(ANS1 = 2 : ...) による直接比較に変更。コミット c0ba6d2。
これでFFRPGのコードが自動生成されコンパイル、自動テストが通りました
この後は手動でテストをしてOKなら、マージリクエストを出してレビューを受け、masterにマージすることになります
BobがGitlabと連携することでAIとのやり取りが記録に残るだけではなく、自律的に解決まで進むようになりました
Bob開発にはGitサーバが必須ではないでしょうか?
