Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
bc56730
docs: point demo image at the abap2UI5-addons org
claude Jul 13, 2026
b6bbc70
docs: add CI status badges to README
claude Jul 13, 2026
fb43fbf
ci: validate pull requests and add Dependabot
claude Jul 13, 2026
f5b3f44
docs: note that authorization checks are the operator's responsibility
claude Jul 13, 2026
7f7eda8
chore: remove Dependabot config
claude Jul 13, 2026
b582d7d
ci: add build_rename workflow for namespace branches
claude Jul 13, 2026
72f6625
chore: drop unused devDependencies
claude Jul 13, 2026
e7fbc65
refactor: vendor sql-console context and db classes instead of z2ui5_…
claude Jul 13, 2026
88594e5
ci: bump actions/checkout and actions/setup-node to v5
claude Jul 13, 2026
35bc3d2
docs: align sql-console external dependencies across README and abaplint
claude Jul 13, 2026
ed3a4d0
chore: hygiene batch — gitattributes, CoC, workflows, lint rules, tit…
claude Jul 13, 2026
cc0154c
docs: uniform CI badge block; rename the rename check to 'renaming'
claude Jul 13, 2026
9cf6fa4
docs: add AGENTS.md
claude Jul 13, 2026
281b13b
Remove dead code and tidy config
claude Jul 13, 2026
d5dc84a
chore: reformat abap_cloud config to 2-space indentation
claude Jul 13, 2026
b6c053c
chore: update @abaplint/cli to 2.119.66
claude Jul 13, 2026
af648e5
fix: remove unreachable session-load confirm branch
claude Jul 13, 2026
5b09c8e
docs: fill in the empty Code of Conduct enforcement contact
claude Jul 13, 2026
3fd0a47
fix: strip ` AS alias` from unqualified SELECT fields too
claude Jul 13, 2026
4c1f967
revert: restore src/ to main, keep CI and docs changes only
claude Jul 13, 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
11 changes: 11 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Normalize line endings to LF for all text files (abapGit + tooling expect LF)
* text=auto eol=lf
*.abap text eol=lf
*.xml text eol=lf
*.json text eol=lf
*.jsonc text eol=lf
*.md text eol=lf
*.mjs text eol=lf
*.js text eol=lf
*.yaml text eol=lf
*.yml text eol=lf
53 changes: 29 additions & 24 deletions .github/abaplint/abap_cloud.jsonc
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"global": {
"files": "/../../src/**/*.*"
},
"dependencies": [
"global": {
"files": "/../../src/**/*.*"
},
"dependencies": [
{
"url": "https://github.com/abapedia/steampunk-2305-api-intersect-702",
"folder": "/deps",
Expand All @@ -13,29 +13,34 @@
"folder": "/abap2UI5",
"files": "/src/**/*.*"
},
{
"url": "https://github.com/abap2UI5-addons/popups",
"folder": "/popups",
"files": "/src/**/*.*"
},
{
"url": "https://github.com/abap2UI5-addons/custom-controls",
"folder": "/customcontrols",
"files": "/src/**/*.*"
}
],
"syntax": {
"version": "Cloud",
"errorNamespace": "."
},
"rules": {
"downport": true,
"begin_end_names": true,
"check_ddic": true,
"check_include": true,
"check_syntax": true,
"global_class": true,
"definitions_top": false,
"implement_methods": true,
"method_implemented_twice": true,
"parser_error": true,
"superclass_final": true,
"unknown_types": true,
"xml_consistency": true
}
],
"syntax": {
"version": "Cloud",
"errorNamespace": "."
},
"rules": {
"downport": true,
"begin_end_names": true,
"check_ddic": true,
"check_include": true,
"check_syntax": true,
"global_class": true,
"definitions_top": false,
"implement_methods": true,
"method_implemented_twice": true,
"parser_error": true,
"superclass_final": true,
"unknown_types": true,
"xml_consistency": true
}
}
10 changes: 10 additions & 0 deletions .github/abaplint/rename.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,16 @@
"url": "https://github.com/abap2UI5/abap2UI5",
"folder": "/abap2UI5",
"files": "/src/**/*.*"
},
{
"url": "https://github.com/abap2UI5-addons/popups",
"folder": "/popups",
"files": "/src/**/*.*"
},
{
"url": "https://github.com/abap2UI5-addons/custom-controls",
"folder": "/customcontrols",
"files": "/src/**/*.*"
}
],
"rename": {
Expand Down
12 changes: 9 additions & 3 deletions .github/workflows/ABAP_CLOUD.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,24 @@ name: ABAP_CLOUD
on:
push:
branches: [main]
pull_request:

permissions:
contents: read

concurrency:
group: ABAP_CLOUD-${{ github.ref }}
cancel-in-progress: true

jobs:
ABAP_CLOUD:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- uses: actions/checkout@v5
- uses: actions/setup-node@v5
with:
node-version: 22
node-version: '22'
cache: 'npm'
- run: npm ci
- run: npx abaplint .github/abaplint/abap_cloud.jsonc
12 changes: 9 additions & 3 deletions .github/workflows/ABAP_STANDARD.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,24 @@ name: ABAP_STANDARD
on:
push:
branches: [main]
pull_request:

permissions:
contents: read

concurrency:
group: ABAP_STANDARD-${{ github.ref }}
cancel-in-progress: true

jobs:
ABAP_STANDARD:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- uses: actions/checkout@v5
- uses: actions/setup-node@v5
with:
node-version: 22
node-version: '22'
cache: 'npm'
- run: npm ci
- run: npx abaplint ./abaplint.jsonc
101 changes: 101 additions & 0 deletions .github/workflows/build_rename.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
name: build_rename

# Renames all artifacts to a chosen namespace and pushes the result to
# the branch rename_<name>, e.g. rename_zmyui5 - ready to pull with
# abapGit for a parallel installation in the same SAP system. The
# renaming itself is the plain abaplint rename with the checked-in
# config .github/abaplint/rename.json (placeholder "zabap2ui5"); this
# workflow only sets the chosen name in the config and stores the
# result. Re-running with the same name updates the branch to the
# current main state; without content changes nothing is pushed. The
# main commit is carried as second parent so GitHub shows the branch as
# "ahead" instead of "behind" main.

on:
workflow_dispatch:
inputs:
namespace:
description: "New namespace (max. 9 characters), e.g. ZMYUI5"
required: true
type: string
default: zabap2ui5

permissions:
contents: write

concurrency:
group: build_rename-${{ inputs.namespace }}
cancel-in-progress: false

jobs:
build_rename:
runs-on: ubuntu-latest
timeout-minutes: 15
env:
NAMESPACE: ${{ inputs.namespace }}
steps:
# validate the input and derive the branch name before building
- name: Derive branch name
run: |
if ! printf '%s' "$NAMESPACE" | grep -Eq '^[A-Za-z][A-Za-z0-9_]{0,8}$'; then
echo "::error::Invalid namespace '$NAMESPACE' (letter + letters/digits/underscore, max. 9 characters)"
exit 1
fi
ns=$(printf '%s' "$NAMESPACE" | tr '[:upper:]' '[:lower:]')
if [ "$ns" = "z2ui5" ]; then
echo "::error::Namespace '$NAMESPACE' is the original namespace - nothing to rename"
exit 1
fi
echo "NS=$ns" >> "$GITHUB_ENV"
echo "BRANCH=rename_$ns" >> "$GITHUB_ENV"
echo "Building branch: rename_$ns"

- uses: actions/checkout@v5
- uses: actions/setup-node@v5
with:
node-version: '22'
cache: 'npm'
- run: npm ci

# set the chosen name in the rename config and run the abaplint
# rename; it writes the renamed sources to
# .github/abaplint/output/<workspace path>/src
- name: Rename to ${{ inputs.namespace }}
run: |
sed "s/zabap2ui5/$NS/g" .github/abaplint/rename.json > .github/abaplint/rename_run.json
npx abaplint .github/abaplint/rename_run.json --rename

# branch content: the renamed src tree plus the abapGit descriptor
# and the license
- name: Assemble branch content
run: |
src=$(find .github/abaplint/output -type d -name src | head -n 1)
if [ -z "$src" ]; then
echo "::error::no renamed src folder found under .github/abaplint/output"
exit 1
fi
out=".github/out/$BRANCH"
rm -rf "$out"
mkdir -p "$out"
cp -r "$src" "$out/src"
cp LICENSE "$out/"
cp .abapgit.xml "$out/"

- name: Push renamed branch
run: |
b="$BRANCH"
git config user.name 'github-actions[bot]'
git config user.email 'github-actions[bot]@users.noreply.github.com'
git fetch origin "$b" --depth 1 2>/dev/null || true
parent=$(git rev-parse -q --verify "refs/remotes/origin/$b" || true)
index="$RUNNER_TEMP/index-$b"
rm -f "$index"
(cd ".github/out/$b" && GIT_DIR="$GITHUB_WORKSPACE/.git" GIT_WORK_TREE=. GIT_INDEX_FILE="$index" git add -A)
tree=$(GIT_INDEX_FILE="$index" git write-tree)
if [ -n "$parent" ] && [ "$(git rev-parse "$parent^{tree}")" = "$tree" ]; then
echo "$b: no changes"
exit 0
fi
commit=$(git commit-tree "$tree" ${parent:+-p "$parent"} -p "$GITHUB_SHA" -m "build: $b from $GITHUB_SHA")
git push origin "$commit:refs/heads/$b"
echo "$b: pushed $commit"
14 changes: 10 additions & 4 deletions .github/workflows/rename_test.yaml
Original file line number Diff line number Diff line change
@@ -1,20 +1,26 @@
name: rename_test
name: renaming

on:
push:
branches: [main]
pull_request:

permissions:
contents: read

concurrency:
group: rename_test-${{ github.ref }}
cancel-in-progress: true

jobs:
rename_test:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- uses: actions/checkout@v5
- uses: actions/setup-node@v5
with:
node-version: 22
node-version: '22'
cache: 'npm'
- run: npm ci
- run: npm run rename
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
node_modules
output
.github/out/
.github/abaplint/output/
.github/abaplint/rename_run.json
61 changes: 61 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# AGENTS.md — AI Assistant Guide for abap2UI5 sql-console

> This file follows the cross-tool AGENTS.md convention and is the single
> agent instruction file of this repository — Claude Code reads `AGENTS.md`
> natively, there is no separate `CLAUDE.md`.

## Project Overview

An SQL console in the browser, built with
[abap2UI5](https://github.com/abap2UI5/abap2UI5) — no Eclipse or SAP GUI needed.

**Language:** English — all code, comments, commit messages, PRs, issues and
documentation must be in English.

## Package Structure

| Package | Content |
|---|---|
| `src/abap/` | The app (`z2ui5_sql_cl_*`), Open-SQL query path |
| `src/native/` | Native-SQL/ADBC path (`zcl_2ui5_native_*`, `zcl_association_processor`), derived from [ZTOAD](https://github.com/marianfoo/ztoad) |

## Dependencies

Installed alongside via abapGit; declared in the abaplint configs:

* [abap2UI5](https://github.com/abap2UI5/abap2UI5)
* [popups](https://github.com/abap2UI5-addons/popups)
* [custom-controls](https://github.com/abap2UI5-addons/custom-controls) — `z2ui5_cl_cc_spreadsheet`

## Security

This is a developer tool. It runs the SQL the user enters, without an
authorization check of its own; the native path uses ADBC and therefore
bypasses ABAP authorizations and client separation. Before using it beyond a
development system, add your own authorization checks and restrict who may run
the app. See the README Todo — authorization checks and full ABAP Cloud
readiness are still open.

## Coding Style

Follows the abap2UI5 core conventions (see its
[AGENTS.md](https://github.com/abap2UI5/abap2UI5/blob/main/AGENTS.md)): Clean
ABAP with backtick string literals and string templates (`|…{ }…|`). The
`src/native/` classes are ZTOAD-derived and keep their own style
(`errorNamespace` in `abaplint.jsonc` is loosened for them, with `check_syntax`
excludes for their test doubles).

## Validation

Run `npx abaplint` before considering changes complete (config `abaplint.jsonc`,
0 issues expected on the standard config). CI:

* `ABAP_STANDARD` — lint against Standard ABAP
* `ABAP_CLOUD` — lint against ABAP Cloud; the `src/native/` ADBC/DDIC code is
**not** ABAP-Cloud-ready, so this check has known findings there
* `renaming` (`rename_test.yaml`) — namespace-rename check
* `build_rename` — manual workflow that pushes a namespace-renamed branch
`rename_<name>` for a parallel install

There is no 702 downport (the native code uses APIs unavailable at 7.02).
All `.abap`/`.xml`/config files are LF-only (`.gitattributes` enforces it).
Loading
Loading