@patimweb/pi-abap-fs 1.1.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,15 +1,14 @@
1
1
  # pi ABAP FS
2
2
 
3
- An [ABAP remote filesystem](https://github.com/marcellourbani/vscode_abap_remote_fs)-style
4
- extension for the [pi coding agent](https://github.com/earendil-works/pi-coding-agent).
3
+ ABAP remote filesystem access for the [pi coding agent](https://github.com/earendil-works/pi-coding-agent).
5
4
 
6
- It gives the pi agent **live access to an SAP system** via the ADT (ABAP Development
7
- Tools) protocol: search and read real objects, edit and activate source code, run ABAP
8
- unit tests, and query live tables — all through plain-language prompts.
5
+ Gives the pi agent **live, read/write access to an SAP S/4HANA system** over the ADT
6
+ (ABAP Development Tools) protocol — search and read real objects, edit and activate
7
+ source code, run unit tests and ATC, analyze dumps and performance traces, and query
8
+ live tables, all through plain-language prompts. No VS Code or IDE required.
9
9
 
10
- This is a port of the core `vscode_abap_remote_fs` capabilities to pi. It is built on
11
- [`abap-adt-api`](https://www.npmjs.com/package/abap-adt-api), the same ADT client
12
- library the VS Code extension uses.
10
+ Built on [`abap-adt-api`](https://www.npmjs.com/package/abap-adt-api), a standalone
11
+ Node.js client for the ADT REST interface.
13
12
 
14
13
  ## Requirements
15
14
 
@@ -87,6 +86,12 @@ pi -e ./index.ts
87
86
  - "Add method `calculate` to `ZCL_MY_CLASS` and activate it."
88
87
  - "Run the unit tests for `ZCL_MY_CLASS` and explain the failures."
89
88
  - "Show me the first 20 rows of table `SFLIGHT` where `CARRID = 'LH'`."
89
+ - "Run ATC on `ZCL_MY_CLASS` and summarize the findings."
90
+ - "Are there any recent runtime dumps in the system?"
91
+ - "List my open transport requests, then show the objects in `DEVK900123`."
92
+ - "Analyze the latest performance trace and find the hot spots."
93
+ - "Create a new class `ZCL_ORDER_HELPER` in package `Z_MY_PACKAGE`."
94
+ - "Read the text symbols of report `Z_MY_REPORT`."
90
95
 
91
96
  ## Development
92
97
 
@@ -0,0 +1,101 @@
1
+ # Architecture
2
+
3
+ The extension bridges two worlds: the agent speaks tool calls, SAP speaks
4
+ ADT-REST. In between lie four layers with clear responsibilities.
5
+
6
+ ## Layers
7
+
8
+ ```mermaid
9
+ flowchart TB
10
+ agent["pi coding agent<br/><small>LLM · tool runtime</small>"]
11
+ index["index.ts<br/><small>loadConfig() + 27 × registerTool</small>"]
12
+ tools["src/tools/*.ts<br/><small>27 modules: typebox schema + execute()</small>"]
13
+ client["src/client.ts<br/><small>withClient() · resolveObject() · toError()</small>"]
14
+ api["abap-adt-api<br/><small>ADTClient, stateless/stateful</small>"]
15
+ sap[("SAP S/4HANA<br/><small>/sap/bc/adt/…</small>")]
16
+
17
+ config["src/config.ts<br/><small>profiles + active profile</small>"]
18
+ file[/"~/.pi/abap-config.json<br/><small>0600 · atomic rename</small>"/]
19
+ fmt["src/formatting/formatters.ts<br/><small>pure: data → text</small>"]
20
+
21
+ agent -->|"loads extension at startup"| index
22
+ index -->|"registerTool × 27"| tools
23
+ tools -->|"withClient(profile, fn)"| client
24
+ client -->|"login → operation → dropSession"| api
25
+ api -->|"HTTP(S), Basic Auth, client + language"| sap
26
+ sap -.->|"response (XML/JSON)"| client
27
+
28
+ config -->|"resolveConfig(profile)"| tools
29
+ config <-->|"load / persist"| file
30
+ client -->|"raw data"| fmt
31
+ fmt -.->|"formatted text"| tools
32
+ ```
33
+
34
+ The downward path is the call path; the dashed edges are the return path: raw
35
+ ADT responses pass through the pure formatters and leave the tool as text plus a
36
+ structured `details` object. `src/types.ts` deliberately sits beside the flow,
37
+ which is why it is absent from the diagram — it holds only data shapes and error
38
+ classes, no behavior.
39
+
40
+ ## Flow of a write operation (`abap_write`)
41
+
42
+ Writing requires a lock, and the lock only holds within *one* stateful session.
43
+ Hence `stateful: true`, and hence `unLock` sits in a `finally`.
44
+
45
+ ```mermaid
46
+ sequenceDiagram
47
+ autonumber
48
+ participant A as Agent
49
+ participant T as abap_write
50
+ participant C as client.ts
51
+ participant S as SAP · ADT
52
+
53
+ A->>T: abap_write(name, source, transport?)
54
+ T->>T: resolveConfig(profile)
55
+ T->>C: withClient(fn, { stateful: true })
56
+
57
+ rect rgba(13,108,118,0.08)
58
+ note over C,S: one session
59
+ C->>S: login()
60
+ C->>S: searchObject → objectStructure
61
+ note right of C: resolveObject: best name match, mainInclude
62
+ C->>S: lock(objectUrl, "MODIFY")
63
+ S-->>C: LOCK_HANDLE
64
+ C->>S: setObjectSource(mainInclude, source, handle, transport?)
65
+ C->>S: unLock() «finally»
66
+ C->>S: dropSession()
67
+ end
68
+
69
+ T-->>A: "Source written …" + details
70
+ ```
71
+
72
+ If a `lockHandle` from an earlier `abap_lock` is supplied, `lock` and `unLock`
73
+ are skipped — the lock then belongs to the caller and stays in place. Activation
74
+ is never automatic: `abap_activate` is a separate call.
75
+
76
+ ## Tools by task
77
+
78
+ | Group | Tools |
79
+ |---|---|
80
+ | Connection | `abap_setup`, `abap_status`, `abap_profile`, `abap_test_connection` |
81
+ | Search & read | `abap_search`, `abap_object_types`, `abap_node_contents`, `abap_object_structure`, `abap_read`, `abap_where_used`, `abap_text_elements` |
82
+ | Modify | `abap_lock`, `abap_unlock`, `abap_write`, `abap_activate`, `abap_create_object`, `abap_set_text_elements` |
83
+ | Check & test | `abap_syntax_check`, `abap_unit_test`, `abap_atc` |
84
+ | Data | `abap_query`, `abap_table` |
85
+ | Operations & transport | `abap_transports`, `abap_transport_details`, `abap_dumps`, `abap_traces`, `abap_trace_hitlist` |
86
+
87
+ ## Decisions
88
+
89
+ - **Session per call** (`withClient`) — fresh client, login, `dropSession` in the
90
+ `finally`. No shared connection state between tools.
91
+ - **stateless as the default** — only locking operations run `stateful`.
92
+ - **Errors are normalized** (`toError`) — the model sees the SAP message
93
+ directly; dedicated error classes say what to do next (e.g. "run `abap_setup`
94
+ first").
95
+ - **Profile file written atomically** — temp file with `0600` and `rename`,
96
+ because `writeFileSync` with `mode` does not change the permissions of an
97
+ existing file.
98
+ - **Side-effect-free formatters** — data in, string out; which is why most of
99
+ the code is testable without an SAP system.
100
+ - **No build step** — pi loads `index.ts` via jiti; `tsc` only runs as a
101
+ `--noEmit` typecheck.
@@ -0,0 +1,61 @@
1
+ # Mind Place Report
2
+
3
+ Generated from `/Users/patrickweppelmann/Documents/Workspaces/pi-abap-fs`
4
+
5
+ ## Corpus
6
+
7
+ - **Files scanned:** 39
8
+ - **Languages:** 35 .ts, 3 .json, 1 .cjs
9
+
10
+ ## Graph Statistics
11
+
12
+ | Metric | Value |
13
+ |--------|-------|
14
+ | Nodes | 107 |
15
+ | Edges | 118 |
16
+ | Communities | 9 |
17
+ | Avg. Degree | 2.2 |
18
+
19
+ ## God Nodes
20
+
21
+ The most-connected entities - these are the architectural pillars:
22
+
23
+ | # | Node | Type | Connections | File |
24
+ |---|------|------|-------------|------|
25
+ | 1 | **index.ts** | file | 28 | `index.ts` |
26
+ | 2 | **src/formatting/formatters.ts** | file | 20 | `src/formatting/formatters.ts` |
27
+ | 3 | **package.json** | file | 15 | `package.json` |
28
+ | 4 | **src/config.ts** | file | 15 | `src/config.ts` |
29
+ | 5 | **src/client.ts** | file | 10 | `src/client.ts` |
30
+
31
+ ## Communities
32
+
33
+ The graph was partitioned into these subsystems:
34
+
35
+ | Community | Size | Key Members |
36
+ |-----------|------|-------------|
37
+ | **AbapProfileNotFoundError.constructor** | 63 | index.ts, src/client.ts, createClient |
38
+ | **formatTextElements** | 20 | src/formatting/formatters.ts, formatSearchResults, formatObjectStructure |
39
+ | **devDependencies** | 16 | package.json, name, version |
40
+ | **include** | 3 | tsconfig.json, compilerOptions, include |
41
+ | **release.config.cjs** | 1 | release.config.cjs |
42
+ | **isClassStructure** | 1 | isClassStructure |
43
+ | **tests/config.test.ts** | 1 | tests/config.test.ts |
44
+ | **tests/formatters.test.ts** | 1 | tests/formatters.test.ts |
45
+ | **tests/smoke.test.ts** | 1 | tests/smoke.test.ts |
46
+
47
+ ## Surprising Connections
48
+
49
+ - **src/formatting/formatters.ts** → `contains` → **isClassStructure**: Cross-community bridge between "src/formatting/formatters.ts" and "isClassStructure"
50
+
51
+ ## Suggested Questions
52
+
53
+ - How does **index.ts** connect to **src/formatting/formatters.ts**?
54
+ - What calls **index.ts** and what does it depend on?
55
+ - Trace the data flow between **index.ts** and **src/formatting/formatters.ts**
56
+ - Which modules have the most dependencies?
57
+ - Show me the architecture of the `index.ts` subsystem
58
+ - What is the most heavily connected module in the codebase?
59
+
60
+ ---
61
+ _Report generated by pi-mindplace · Use `mindplace_query` to explore the graph_