Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
c1ab1a9
feat: add XCO_CP_I18N translation support via ZADT_VSP WebSocket
Apr 11, 2026
d769eca
fix: pass cookies to WebSocket client for browser-auth mode
ClementRingot Apr 11, 2026
69ab6e5
fix: pass cookies in remaining WebSocket callers (server.go, cli.go)
ClementRingot Apr 11, 2026
4e646c5
feat: expose i18n/translation tools via unified SAP action router
ClementRingot Apr 11, 2026
c336367
fix: use xco_i18n instead of xco_cp_i18n for custom Z* object support
ClementRingot Apr 12, 2026
e0d4e1a
feat(i18n): dual XCO API strategy - xco_cp_i18n primary with xco_i18n…
ClementRingot Apr 12, 2026
a19d62b
refactor(apc): dynamic service discovery via SEOMETAREL
ClementRingot Apr 12, 2026
7e63fe2
test(ctxcomp): update deps test for dynamic service discovery
ClementRingot Apr 12, 2026
ddda918
feat(i18n): add ListTranslatableTextsXCO tool and improve all i18n to…
ClementRingot Apr 13, 2026
89c413e
test: add unit tests for XCO i18n tools
ClementRingot Apr 13, 2026
573849d
fix(test): use expert mode and schema-level validation for i18n tests
ClementRingot Apr 13, 2026
57ea307
fix(test): restore context import needed by getRegisteredTools
ClementRingot Apr 13, 2026
d3e0fa0
fix(install): set Description and check result.Success in InstallZADTVSP
ClementRingot Apr 13, 2026
280824f
fix(deploy): reorder syntax check before lock, fix POSIX regex deprec…
ClementRingot Apr 13, 2026
9972e32
fix(install): skip AMDP on non-HANA, retry lock after create, clean p…
ClementRingot Apr 13, 2026
56f4da0
fix(install): skip I18N service on ABAP Platform < 2022 (release < 756)
ClementRingot Apr 13, 2026
e3a92cd
fix: robust InstallZADTVSP on load-balanced SAP systems
ClementRingot Apr 15, 2026
af65540
feat(i18n): add entity-level CDS description support for data_definition
ClementRingot Apr 17, 2026
92648d1
fix(i18n): detect original language from TADIR instead of hardcoding …
ClementRingot Apr 17, 2026
cd5d6cf
refactor(i18n): extract helpers, fix bugs, extend compare_translations
ClementRingot Apr 17, 2026
dc70457
feat(i18n): auto-detect ME annotation position counts from DDLX source
ClementRingot Apr 17, 2026
0559542
feat(i18n,debug): fix & encoding, add ISO language codes, auto-discov…
ClementRingot Apr 22, 2026
187492b
revert: remove debug-specific changes, keep only i18n and install fixes
ClementRingot Apr 23, 2026
286121d
fix(i18n): add SetTranslationXCO to focused mode whitelist
ClementRingot Apr 23, 2026
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
88 changes: 88 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,94 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [2.40.0] - 2026-04-13
### Bug Fixes

- **install:** Fix InstallZADTVSP silently failing - missing Description in WriteSourceOptions caused writeSourceCreate to return early without error, and result.Success was not checked
- **test:** Use expert mode and schema-level validation for i18n tests ([`909d486`](https://github.com/oisee/vibing-steampunk/commit/909d4861e274d6ef933f9c513f01c3b6af4bd868))
- **test:** Restore context import needed by getRegisteredTools ([`8916a8f`](https://github.com/oisee/vibing-steampunk/commit/8916a8fcbda4d59f52d8e397c859b795021b1e59))


### Features

- **i18n:** Add ListTranslatableTextsXCO tool and improve all i18n tool documentation ([`588fcce`](https://github.com/oisee/vibing-steampunk/commit/588fcce2d0e583e3ab3a5773f4d76442e00e3204))



## [2.39.0] - 2026-04-12
### Features

- **i18n:** Dual XCO API strategy - xco_cp_i18n primary with xco_i18n fallback ([`39765f6`](https://github.com/oisee/vibing-steampunk/commit/39765f6c1a4642d5a173b346b0878c328d713dc3))



## [2.38.5] - 2026-04-12
### Bug Fixes

- Use xco_i18n instead of xco_cp_i18n for custom Z* object support ([`7aa5c99`](https://github.com/oisee/vibing-steampunk/commit/7aa5c9966454fb6745f25dee4e73edd47d88d97a))



## [2.38.4] - 2026-04-11
### Features

- Expose i18n/translation tools via unified SAP action router ([`538228b`](https://github.com/oisee/vibing-steampunk/commit/538228b3cf0a127b09779556b6a4f40ef906a88d))



## [2.38.3] - 2026-04-11
### Bug Fixes

- Pass cookies to WebSocket client for browser-auth mode ([`0fcfbb3`](https://github.com/oisee/vibing-steampunk/commit/0fcfbb3099c39f15d3f060be955c608553dc4312))
- Pass cookies in remaining WebSocket callers (server.go, cli.go) ([`a4d018f`](https://github.com/oisee/vibing-steampunk/commit/a4d018fbe419a2b33b0efff6a7c580d2ce349270))



## [2.38.2] - 2026-04-11
### Bug Fixes

- Health tests signal now scans full package hierarchy ([`9ebc9db`](https://github.com/oisee/vibing-steampunk/commit/9ebc9db969689ce812e03218ef33dc8a84d011f0))
- Health report filename uses _ for $ prefix in package names ([`a2bccfe`](https://github.com/oisee/vibing-steampunk/commit/a2bccfe83044d360e2523a62e1edfa15a99e7fdd))
- Pad progress lines with %-40s to prevent display artifacts ([`13ebb80`](https://github.com/oisee/vibing-steampunk/commit/13ebb803704159408355b60e67a95d6f60822b4d))
- External crossings now detected + TADIR resolution batched ([`387bae1`](https://github.com/oisee/vibing-steampunk/commit/387bae1c008e3aae21520628dc3639d6b29477b9))
- Resolve more targets + deduplicate crossing entries ([`52f8743`](https://github.com/oisee/vibing-steampunk/commit/52f8743d7b935cdafedec902e672e747006a1dd2))
- EXTERNAL crossings are WARN, not OK ([`890bb77`](https://github.com/oisee/vibing-steampunk/commit/890bb77ecc9a1a6dac2744695ea9f46030121e72))
- Resolve default system from .vsp.json and fix packageExists false negatives ([`81416d3`](https://github.com/oisee/vibing-steampunk/commit/81416d3703f62dec20ffc83a29d2c769adf0579b))
- TADIR package resolution now fetches OBJECT type and validates existence ([`012db57`](https://github.com/oisee/vibing-steampunk/commit/012db578dc1798013b7a15675f53df2f2af25a89))
- Two-pass package resolution (TADIR + TFDIR) and what-package debug command ([`b0e37c6`](https://github.com/oisee/vibing-steampunk/commit/b0e37c6eee215aae291d6d691b23a41744068e2d))
- What-package command now resolves FMs via TFDIR fallback ([`3a191b6`](https://github.com/oisee/vibing-steampunk/commit/3a191b6a95ad40f8bc960f658e94632b5d26ecc1))
- TADIR batch size reduced to 5 to stay under SAP 255-char query limit ([`1e8b239`](https://github.com/oisee/vibing-steampunk/commit/1e8b2393b4828d05c9f2bf9adf650b25980b7538))
- Never fail silently — add WARN stderr logging for all resolve/query errors ([`7687d38`](https://github.com/oisee/vibing-steampunk/commit/7687d386c53293981e89584c119433266e4d9a31))
- Batch all SAP IN-clause queries to 5 items (255-char limit) ([`5049e07`](https://github.com/oisee/vibing-steampunk/commit/5049e0769ed7dec932737f0c944d3286b1f9a6e6))
- Fixed wrong parameter ([`c736611`](https://github.com/oisee/vibing-steampunk/commit/c736611ed6677c1c690cb817ccd130775668996c))
- Fix GetDependencyZip ([`7870cae`](https://github.com/oisee/vibing-steampunk/commit/7870caef7fdcae6acfbad928a8b19738242962c0))
- Fixed APIGetReleaseState ([`5fa30ff`](https://github.com/oisee/vibing-steampunk/commit/5fa30ff162f6f9799ff64f26b6704044a8331c13))
- Correct releaseState bug and update tests for C0-C4 API structure ([`a66bcd5`](https://github.com/oisee/vibing-steampunk/commit/a66bcd5f5bafd876fa9d0f090daaf45f821b40b8))


### Features

- Health --details, --format md/html, --report for file output ([`bf36bce`](https://github.com/oisee/vibing-steampunk/commit/bf36bce900d41b263568a4679bbd482f0e1621d7))
- Health report groups tests by parent object, shows alert details ([`b5061a1`](https://github.com/oisee/vibing-steampunk/commit/b5061a15812ffd3f2e2fdd498607ed421c4148ca))
- Directional package boundary crossing analysis ([`53fb790`](https://github.com/oisee/vibing-steampunk/commit/53fb790d4b31d084abfbd2a54231af3f564a67f8))
- Standalone vsp boundaries command + crossing details in health reports ([`2dff9a2`](https://github.com/oisee/vibing-steampunk/commit/2dff9a23ab3aeeeefd856415828346accbd87147))
- Crossing entries show edge kind, ref detail, and object types ([`698884e`](https://github.com/oisee/vibing-steampunk/commit/698884e4cb3ea43c5088bd3e46ed2cca64a93489))
- Separate columns in crossing reports + package name guesser ([`952be05`](https://github.com/oisee/vibing-steampunk/commit/952be05dac54fb9cec5e9becdc35aec351c5ec91))
- Mermaid graph output with package subgraphs and edge coloring ([`8a60b62`](https://github.com/oisee/vibing-steampunk/commit/8a60b62641f2cbe395fe745d9f861860b9c3350c))
- Extract CALL TRANSACTION, CALL TRANSFORMATION, LEAVE TO TRANSACTION ([`8254536`](https://github.com/oisee/vibing-steampunk/commit/82545360f0d27954f27e37c979f85749de0bc263))
- Side effect extraction + LUW classification (Phase 1) ([`11c2253`](https://github.com/oisee/vibing-steampunk/commit/11c2253aee103a6b402a4a9454d7b6636276636f))
- Graph export formats — DOT, PlantUML, GraphML ([`91b49f1`](https://github.com/oisee/vibing-steampunk/commit/91b49f105cc8f1b7e5859669e88a5bf2fd275180))
- Cache config support in .vsp.json and env vars ([`7c8dfbc`](https://github.com/oisee/vibing-steampunk/commit/7c8dfbc114518488fb74ef52e0617c1e3b59a4cf))
- CR-level co-change expansion via E070A transport attributes ([`ade71be`](https://github.com/oisee/vibing-steampunk/commit/ade71be48a6253d56952c3a35da1cb0f9d7dad82))
- CO_TRANSPORTED edge kind for weaker co-change impact signals ([`8565769`](https://github.com/oisee/vibing-steampunk/commit/8565769f352145179bc310d757237c0adef2f6d3))
- Tr-boundaries, cr-boundaries, cr-history + HTML report TOC and test filtering ([`fc99eb3`](https://github.com/oisee/vibing-steampunk/commit/fc99eb33b527bd5a5a03c1d45111349572c09226))
- Default mode changed from focused to hyperfocused ([`880aa68`](https://github.com/oisee/vibing-steampunk/commit/880aa6879c9e534a4e34e52f1e6e42593b6d019b))
- --report html for tr-boundaries and cr-boundaries ([`2115afb`](https://github.com/oisee/vibing-steampunk/commit/2115afb215a5e25650610a59cd7f4b5aee35908e))
- --details flag for tr/cr-boundaries shows cross-package deps within scope ([`1e8034a`](https://github.com/oisee/vibing-steampunk/commit/1e8034a1cc54eda520116888b14bb72618300b2a))
- Add XCO_CP_I18N translation support via ZADT_VSP WebSocket ([`0a40d8f`](https://github.com/oisee/vibing-steampunk/commit/0a40d8fb08e9f178bbc8589e317a6b1974609bbf))



## [2.38.1] - 2026-04-07
### Bug Fixes

Expand Down
16 changes: 15 additions & 1 deletion cmd/vsp/cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -177,13 +177,27 @@ func getClient(params *systemParams) (*adt.Client, error) {

// getWSClient creates an AMDP WebSocket client for GitExport.
func getWSClient(ctx context.Context, params *systemParams) (*adt.AMDPWebSocketClient, error) {
// NewAMDPWebSocketClient(baseURL, client, user, password, insecure)
// Resolve cookies from file/string if available
var cookies map[string]string
if params.CookieFile != "" {
var err error
cookies, err = adt.LoadCookiesFromFile(params.CookieFile)
if err != nil {
return nil, fmt.Errorf("failed to load cookies: %w", err)
}
} else if params.CookieString != "" {
cookies = adt.ParseCookieString(params.CookieString)
} else if len(cfg.Cookies) > 0 {
cookies = cfg.Cookies
}

wsClient := adt.NewAMDPWebSocketClient(
params.URL,
params.Client,
params.User,
params.Password,
params.Insecure,
cookies,
)

if err := wsClient.Connect(ctx); err != nil {
Expand Down
1 change: 1 addition & 0 deletions cmd/vsp/debug.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ func runDebug(cmd *cobra.Command, args []string) error {
cfg.Username,
cfg.Password,
cfg.InsecureSkipVerify,
cfg.Cookies,
)

// Try to connect WebSocket (optional - falls back to HTTP if unavailable)
Expand Down
10 changes: 10 additions & 0 deletions embedded/abap/embed.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ var ZclVspGitService string
//go:embed zcl_vsp_report_service.clas.abap
var ZclVspReportService string

//go:embed zcl_vsp_i18n_service.clas.abap
var ZclVspI18NService string

//go:embed zcl_vsp_apc_handler.clas.abap
var ZclVspApcHandler string

Expand Down Expand Up @@ -101,6 +104,13 @@ func GetObjects() []ObjectInfo {
Description: "Report domain - background job execution with spool output",
Optional: false,
},
{
Type: "CLAS",
Name: "ZCL_VSP_I18N_SERVICE",
Source: ZclVspI18NService,
Description: "I18N domain - translation via XCO_CP_I18N",
Optional: false,
},
{
Type: "CLAS",
Name: "ZCL_VSP_APC_HANDLER",
Expand Down
4 changes: 2 additions & 2 deletions embedded/abap/zcl_vsp_amdp_service.clas.abap
Original file line number Diff line number Diff line change
Expand Up @@ -846,11 +846,11 @@ CLASS zcl_vsp_amdp_service IMPLEMENTATION.
DATA lv_pattern TYPE string.
lv_pattern = |"{ iv_name }"\\s*:\\s*"([^"]*)"|.

FIND REGEX lv_pattern IN iv_params SUBMATCHES rv_value.
FIND PCRE lv_pattern IN iv_params SUBMATCHES rv_value.
IF sy-subrc <> 0.
" Try numeric value
lv_pattern = |"{ iv_name }"\\s*:\\s*(\\d+)|.
FIND REGEX lv_pattern IN iv_params SUBMATCHES rv_value.
FIND PCRE lv_pattern IN iv_params SUBMATCHES rv_value.
ENDIF.
ENDMETHOD.

Expand Down
45 changes: 25 additions & 20 deletions embedded/abap/zcl_vsp_apc_handler.clas.abap
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,20 @@ ENDCLASS.
CLASS zcl_vsp_apc_handler IMPLEMENTATION.

METHOD class_constructor.
APPEND NEW zcl_vsp_rfc_service( ) TO gt_services.
APPEND NEW zcl_vsp_debug_service( ) TO gt_services.
APPEND NEW zcl_vsp_amdp_service( ) TO gt_services.
APPEND NEW zcl_vsp_git_service( ) TO gt_services.
APPEND NEW zcl_vsp_report_service( ) TO gt_services.
" Dynamic discovery: find all classes implementing ZIF_VSP_SERVICE
SELECT clsname FROM seometarel
WHERE refclsname = 'ZIF_VSP_SERVICE'
AND reltype = 1
INTO TABLE @DATA(lt_impls).

LOOP AT lt_impls INTO DATA(ls_impl).
TRY.
DATA lo_service TYPE REF TO zif_vsp_service.
CREATE OBJECT lo_service TYPE (ls_impl-clsname).
APPEND lo_service TO gt_services.
CATCH cx_root ##NO_HANDLER.
ENDTRY.
ENDLOOP.
ENDMETHOD.

METHOD if_apc_wsp_extension~on_start.
Expand All @@ -71,10 +80,17 @@ CLASS zcl_vsp_apc_handler IMPLEMENTATION.
ENDTRY.
mv_session_id = lv_uuid.

" Build domains list dynamically from registered services
DATA lt_domains TYPE string_table.
LOOP AT gt_services INTO DATA(lo_svc).
APPEND lo_svc->get_domain( ) TO lt_domains.
ENDLOOP.
DATA(lv_domains_json) = concat_lines_of( table = lt_domains sep = '","' ).

DATA(lv_data) = zcl_vsp_utils=>json_obj( zcl_vsp_utils=>json_join( VALUE #(
( zcl_vsp_utils=>json_str( iv_key = 'session' iv_value = mv_session_id ) )
( zcl_vsp_utils=>json_str( iv_key = 'version' iv_value = '2.3.0' ) )
( |"domains":["rfc","debug","amdp","git","report"]| )
( |"domains":["{ lv_domains_json }"]| )
) ) ).

send_response( VALUE #(
Expand Down Expand Up @@ -109,7 +125,6 @@ CLASS zcl_vsp_apc_handler IMPLEMENTATION.
ENDMETHOD.

METHOD if_apc_wsp_extension~on_error.
" Log error - could extend with more sophisticated handling
ENDMETHOD.

METHOD parse_message.
Expand All @@ -118,12 +133,10 @@ CLASS zcl_vsp_apc_handler IMPLEMENTATION.
FIND PCRE '"domain"\s*:\s*"([^"]*)"' IN iv_text SUBMATCHES rs_message-domain.
FIND PCRE '"action"\s*:\s*"([^"]*)"' IN iv_text SUBMATCHES rs_message-action.

" Handle nested JSON in params by finding the balanced braces
DATA(lv_params_start) = find( val = iv_text sub = '"params"' ).
IF lv_params_start >= 0.
DATA(lv_brace_start) = find( val = iv_text off = lv_params_start sub = '{' ).
IF lv_brace_start >= 0.
" Count braces to find the matching closing brace
DATA(lv_depth) = 0.
DATA(lv_pos) = lv_brace_start.
DATA(lv_len) = strlen( iv_text ).
Expand Down Expand Up @@ -236,9 +249,7 @@ CLASS zcl_vsp_apc_handler IMPLEMENTATION.
rs_response = zcl_vsp_utils=>build_success( iv_id = is_message-id iv_data = lv_data ).
ENDMETHOD.


METHOD handle_abap_help.
" Get ABAP keyword documentation via CL_ABAP_DOCU
DATA(lv_keyword) = zcl_vsp_utils=>extract_param(
iv_params = is_message-params
iv_name = 'keyword'
Expand All @@ -253,33 +264,29 @@ CLASS zcl_vsp_apc_handler IMPLEMENTATION.
RETURN.
ENDIF.

" Convert to uppercase for CL_ABAP_DOCU lookup
TRANSLATE lv_keyword TO UPPER CASE.

" Retrieve ABAP documentation
DATA lt_html TYPE abapdocu_html_tab.
DATA lv_html TYPE string.

TRY.
cl_abap_docu=>convert_itf_to_html(
EXPORTING
area = 'ABEN' " ABAP English documentation
area = 'ABEN'
name = CONV #( lv_keyword )
langu = sy-langu
IMPORTING
html = lt_html ).

" Concatenate HTML lines
LOOP AT lt_html INTO DATA(ls_html_line).
lv_html = lv_html && ls_html_line.
ENDLOOP.

CATCH cx_abap_docu_conversion INTO DATA(lx_docu_error).
" Try generic error message area if keyword not found in ABEN
TRY.
cl_abap_docu=>convert_itf_to_html(
EXPORTING
area = 'AB' " Alternative area
area = 'AB'
name = CONV #( lv_keyword )
langu = sy-langu
IMPORTING
Expand All @@ -290,12 +297,10 @@ CLASS zcl_vsp_apc_handler IMPLEMENTATION.
ENDLOOP.

CATCH cx_abap_docu_conversion INTO DATA(lx_error2).
" Documentation not found - return empty
lv_html = ''.
ENDTRY.
ENDTRY.

" Build response
DATA(lv_data) = zcl_vsp_utils=>json_obj( zcl_vsp_utils=>json_join( VALUE #(
( zcl_vsp_utils=>json_str( iv_key = 'keyword' iv_value = lv_keyword ) )
( zcl_vsp_utils=>json_str( iv_key = 'html' iv_value = lv_html ) )
Expand All @@ -305,4 +310,4 @@ CLASS zcl_vsp_apc_handler IMPLEMENTATION.
rs_response = zcl_vsp_utils=>build_success( iv_id = is_message-id iv_data = lv_data ).
ENDMETHOD.

ENDCLASS.
ENDCLASS.
Loading