Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
737f1b3
Initial plan
Copilot Mar 11, 2026
d3ebf34
feat: add PROG (Program) and FUGR (Function Group) ABAP object type s…
Copilot Mar 11, 2026
f000142
chore: remove package-lock.json (project uses bun.lock)
Copilot Mar 11, 2026
ecc04aa
chore: remove accidentally committed package-lock.json
Copilot Mar 11, 2026
cbb35d4
fix: correct .gitignore corruption and add FUGR fromAbapGit comment
Copilot Mar 11, 2026
8edc605
chore: add .nx/polygraph to .gitignore
ThePlenkov Mar 12, 2026
4e2276f
feat: enhance service key authentication and add redirect URI support
ThePlenkov Mar 12, 2026
7e0b6d6
fix: update fast-xml-parser dependency to version 5.5.3
ThePlenkov Mar 12, 2026
dbe608b
feat: fix ADT export XML serialization and live-test on BTP + on-prem
ThePlenkov Mar 14, 2026
caad1a5
fix: preserve targetNamespace xmlns in stripUnusedNamespaces + null g…
ThePlenkov Mar 14, 2026
03cbea6
Initial plan
Copilot Mar 14, 2026
6f4ddaa
fix: address all SonarQube findings for PR #81
Copilot Mar 14, 2026
b8513ec
Merge pull request #83 from abapify/copilot/fix-sonarqube-findings
ThePlenkov Mar 14, 2026
014ad88
fix: exclude generated schema files from SonarQube analysis to fix qu…
Copilot Mar 14, 2026
172d91c
feat: optimize export by skipping unchanged sources and auto-creating…
ThePlenkov Mar 15, 2026
b6f58a5
feat: move single-source save lifecycle to base class and add default…
ThePlenkov Mar 15, 2026
394c670
fix: add SonarCloud organization and project key to sonar-project.pro…
ThePlenkov Mar 15, 2026
2868dbb
docs: fix formatting and whitespace consistency across codebase
ThePlenkov Mar 15, 2026
e8cfed9
fix: resolve SonarCloud quality gate failures
ThePlenkov Mar 15, 2026
11a3408
fix: address remaining SonarQube findings - complexity, duplication, …
Copilot Mar 15, 2026
b459ea7
fix: use [^<]+ in XML tag regexes to require non-empty content
Copilot Mar 15, 2026
86e5257
Merge branch 'main' into copilot/support-programs-functional-groups
ThePlenkov Mar 15, 2026
2c2dad3
fix: simplify sonar exclusions to **/generated/**
ThePlenkov Mar 15, 2026
56b8e5e
fix: remove trailing blank lines from sonar-project.properties
ThePlenkov Mar 15, 2026
1f7a4e1
Merge branch 'main' into copilot/support-programs-functional-groups
ThePlenkov Mar 15, 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
2 changes: 2 additions & 0 deletions .agents/skills/add-endpoint/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ adt-fixtures packages/adt-fixtures/src/

Before writing any code, obtain the endpoint's HTTP details and XML payload structure.

> **Tip:** If the endpoint is undocumented or you need to research it first, use `$adt-reverse-engineering` for systematic discovery via live system, open source projects, and Sourcegraph code search.

### Option A: Live System Available

If you have a running SAP system connection:
Expand Down
66 changes: 66 additions & 0 deletions .agents/skills/add-object-type/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ adt-plugin-abapgit abapGit schema literal + TypeScript types + handler

Before writing code, gather details about the object type from live system or research.

> **Tip:** For undocumented object types, use `$adt-reverse-engineering` first to systematically discover endpoint details, XML structure, and content-types via live system discovery, open source projects, and Sourcegraph code search.

### Information to collect

| Item | Example (for PROG) | Where to find |
Expand Down Expand Up @@ -295,6 +297,67 @@ import { registerObjectType } from '../../../base/registry';
registerObjectType('PROG', ProgramKind, AdkProgram);
```

**For objects with source code**, also implement the save lifecycle methods:

```typescript
// ============================================
// Source Save Lifecycle (required for source-based objects)
// ============================================

/**
* Save pending source (set via _pendingSource)
* Used by export workflow after deserialization from abapGit
*/
protected override async savePendingSources(options?: {
lockHandle?: string;
transport?: string;
}): Promise<void> {
const pendingSource = (this as unknown as { _pendingSource?: string })
._pendingSource;
if (!pendingSource) return;

await this.saveMainSource(pendingSource, options);

// Clear pending source after save
delete (this as unknown as { _pendingSource?: string })._pendingSource;
}

/**
* Pre-lock comparison: check if pending source matches SAP
* If identical, sets _unchanged = true so save() skips locking and PUT
*/
protected override async checkPendingSourcesUnchanged(): Promise<void> {
const pendingSource = (this as unknown as { _pendingSource?: string })
._pendingSource;
if (!pendingSource) return;

try {
const currentSource = await this.getSource();
if (this.normalizeSource(currentSource) === this.normalizeSource(pendingSource)) {
this._unchanged = true;
delete (this as unknown as { _pendingSource?: string })._pendingSource;
}
} catch {
// Source doesn't exist on SAP (404) — needs saving
}
}

private normalizeSource(source: string): string {
return source.replace(/\s+$/gm, '').trimEnd();
}

protected override hasPendingSources(): boolean {
return !!(this as unknown as { _pendingSource?: string })._pendingSource;
}
```

**IMPORTANT:** Both `savePendingSources()` AND `checkPendingSourcesUnchanged()` must be implemented.

- `checkPendingSourcesUnchanged()` runs **before** lock — compares pending source with SAP, sets `_unchanged = true` if identical
- `savePendingSources()` runs **after** lock — does the actual PUT
- Without `checkPendingSourcesUnchanged()`, unchanged objects will still be locked and PUT unnecessarily
- See `AdkClass` (clas.model.ts) for multi-include example, `AdkInterface` (intf.model.ts) for single-source example

**Notes:**

- The `wrapperKey` matches the root element name in the schema (e.g., `abapProgram`)
Expand Down Expand Up @@ -801,6 +864,9 @@ expect(handler).toBeDefined();
- [ ] Object model created in `adk/src/objects/repository/{type}/`
- [ ] Object exported from `adk/src/index.ts`
- [ ] `adk/src/base/adt.ts` exports the response type
- [ ] (Source objects) `savePendingSources()` implemented
- [ ] (Source objects) `checkPendingSourcesUnchanged()` implemented for skip-unchanged support
- [ ] (Source objects) `hasPendingSources()` implemented

### abapGit Layer

Expand Down
Loading
Loading