/sac-planning
Planning operation: publish, copy, lock, workflow, version, dataaction
$ npx -y skills add secondsky/sap-skills --agent claude-codeHow it fires
How this command gets triggered: by you, by Claude, or both.
- Fires itselfClaude auto-loads it when your prompt matches the work.
- You can call itInvoke it directly when you want it.
- Slash command
/sac-planning
Context preview
What this command does when you run it.
Planning operation: publish, copy, lock, workflow, version, dataaction
Command definition
sac-planning.mdname: sac-planning
description: Generate SAC planning operation templates and workflows
allowed-tools:
- Read
argument-hint: "<publish|copy|lock|workflow|version|dataaction>"
arguments:
- name: operation
description: "Planning operation: publish, copy, lock, workflow, version, dataaction"
required: trueShell Snippet Notes
- Shell snippets assume Bash on Linux/macOS, WSL2, or Git Bash.
- Install the command-specific tooling shown near each snippet before running it.
- Confirm before running commands that delete files, change ownership, deploy, or modify remote systems.
Output Contract
Return planning API guidance, version/data-locking caveats, safe script examples, and pending SAC tenant checks. Default to read-only guidance; do not publish planning data or write files unless the user explicitly confirms the target.
Generate SAC planning operation templates based on the requested operation type.
Available Operations
publish
Publish private version data to public version.
copy
Copy data between versions (private to public, public to private).
lock
Data locking patterns for planning input control.
workflow
Complete planning workflow with status management.
version
Version management (create, get, delete versions).
dataaction
Data action integration with scripts.
---
Operation: publish
/*
* Publish Private to Public Version
* Purpose: Submit planning data for approval/consolidation
* Prerequisites: User has private version with changes
*/
function publishPlanningData() {
var planning = Table_Planning.getPlanning();
Application.showBusyIndicator("Publishing planning data...");
try {
// Verify private version exists
var privateVersion = planning.getPrivateVersion();
if (privateVersion === null) {
Application.showMessage(
ApplicationMessageType.Warning,
"No private version found. Nothing to publish."
);
return;
}
// Check for unsaved changes (if applicable)
// planning.hasChanges() - in some versions
// Publish to public version
planning.publish();
Application.showMessage(
ApplicationMessageType.Success,
"Planning data published successfully"
);
// Refresh view to show updated data
Table_Planning.getDataSource().refreshData();
} catch (error) {
Application.showMessage(
ApplicationMessageType.Error,
"Publish failed: " + error.message
);
console.error("Publish error:", error);
} finally {
Application.hideBusyIndicator();
}
}
// Call on button click
publishPlanningData();---
Operation: copy
/*
* Copy Data Between Versions
* Purpose: Initialize private version from public, or reverse
*/
// Copy PUBLIC to PRIVATE (initialize working copy)
function copyPublicToPrivate() {
var planning = Table_Planning.getPlanning();
Application.showBusyIndicator("Creating working copy...");
try {
// Create private version if doesn't exist
var privateVersion = planning.getPrivateVersion();
if (privateVersion === null) {
planning.createPrivateVersion();
}
// Copy data from public to private
planning.copyFromPublicVersion();
Application.showMessage(
ApplicationMessageType.Success,
"Working copy created from public data"
);
Table_Planning.getDataSource().refreshData();
} catch (error) {
Application.showMessage(
ApplicationMessageType.Error,
"Copy failed: " + error.message
);
} finally {
Application.hideBusyIndicator();
}
}
// Copy PRIVATE to PUBLIC (alternative to publish)
function copyPrivateToPublic() {
var planning = Table_Planning.getPlanning();
Application.showBusyIndicator("Copying to public version...");
try {
planning.copyToPublicVersion();
Application.showMessage(
ApplicationMessageType.Success,
"Data copied to public version"
);
Table_Planning.getDataSource().refreshData();
} catch (error) {
Application.showMessage(
ApplicationMessageType.Error,
"Copy failed: " + error.message
);
} finally {
Application.hideBusyIndicator();
}
}---
Operation: lock
/*
* Data Locking Pattern
* Purpose: Control concurrent access to planning data
*/
// Check lock status
function checkLockStatus() {
var planning = Table_Planning.getPlanning();
var lockInfo = planning.getLockInfo();
if (lockInfo.isLocked) {
if (lockInfo.lockedBy === Application.getUserInfo().id) {
console.log("Data is locked by current user");
return "owned";
} else {
console.log("Data is locked by: " + lockInfo.lockedBy);
Application.showMessage(
ApplicationMessageType.Warning,
"Data is locked by: " + lockInfo.lockedByName
);
return "other";
}
}
return "unlocked";
}
// Acquire lock before editing
function acquireLock() {
var planning = Table_Planning.getPlanning();
var status = checkLockStatus();
if (status === "other") {
return false; // Cannot acquire, locked by another user
}
if (status === "unlocked") {
try {
planning.setLock(true);
Application.showMessage(
ApplicationMessageType.Info,
"Data locked for editing"
);
} catch (error) {
Application.showMessage(
ApplicationMessageType.Error,
"Failed to acquire lock: " + error.message
);
return false;
}
}
return true;
}
// Release lock when donRead more
name: sac-planning
description: Generate SAC planning operation templates and workflows
allowed-tools:
- Read
argument-hint: "<publish|copy|lock|workflow|version|dataaction>"
arguments:
- name: operation
description: "Planning operation: publish, copy, lock, workflow, version, dataaction"
required: trueShell Snippet Notes
- Shell snippets assume Bash on Linux/macOS, WSL2, or Git Bash.
- Install the command-specific tooling shown near each snippet before running it.
- Confirm before running commands that delete files, change ownership, deploy, or modify remote systems.
Output Contract
Return planning API guidance, version/data-locking caveats, safe script examples, and pending SAC tenant checks. Default to read-only guidance; do not publish planning data or write files unless the user explicitly confirms the target.
Generate SAC planning operation templates based on the requested operation type.
Available Operations
publish
Publish private version data to public version.
copy
Copy data between versions (private to public, public to private).
lock
Data locking patterns for planning input control.
workflow
Complete planning workflow with status management.
version
Version management (create, get, delete versions).
dataaction
Data action integration with scripts.
---
Operation: publish
/*
* Publish Private to Public Version
* Purpose: Submit planning data for approval/consolidation
* Prerequisites: User has private version with changes
*/
function publishPlanningData() {
var planning = Table_Planning.getPlanning();
Application.showBusyIndicator("Publishing planning data...");
try {
// Verify private version exists
var privateVersion = planning.getPrivateVersion();
if (privateVersion === null) {
Application.showMessage(
ApplicationMessageType.Warning,
"No private version found. Nothing to publish."
);
return;
}
// Check for unsaved changes (if applicable)
// planning.hasChanges() - in some versions
// Publish to public version
planning.publish();
Application.showMessage(
ApplicationMessageType.Success,
"Planning data published successfully"
);
// Refresh view to show updated data
Table_Planning.getDataSource().refreshData();
} catch (error) {
Application.showMessage(
ApplicationMessageType.Error,
"Publish failed: " + error.message
);
console.error("Publish error:", error);
} finally {
Application.hideBusyIndicator();
}
}
// Call on button click
publishPlanningData();---
Operation: copy
/*
* Copy Data Between Versions
* Purpose: Initialize private version from public, or reverse
*/
// Copy PUBLIC to PRIVATE (initialize working copy)
function copyPublicToPrivate() {
var planning = Table_Planning.getPlanning();
Application.showBusyIndicator("Creating working copy...");
try {
// Create private version if doesn't exist
var privateVersion = planning.getPrivateVersion();
if (privateVersion === null) {
planning.createPrivateVersion();
}
// Copy data from public to private
planning.copyFromPublicVersion();
Application.showMessage(
ApplicationMessageType.Success,
"Working copy created from public data"
);
Table_Planning.getDataSource().refreshData();
} catch (error) {
Application.showMessage(
ApplicationMessageType.Error,
"Copy failed: " + error.message
);
} finally {
Application.hideBusyIndicator();
}
}
// Copy PRIVATE to PUBLIC (alternative to publish)
function copyPrivateToPublic() {
var planning = Table_Planning.getPlanning();
Application.showBusyIndicator("Copying to public version...");
try {
planning.copyToPublicVersion();
Application.showMessage(
ApplicationMessageType.Success,
"Data copied to public version"
);
Table_Planning.getDataSource().refreshData();
} catch (error) {
Application.showMessage(
ApplicationMessageType.Error,
"Copy failed: " + error.message
);
} finally {
Application.hideBusyIndicator();
}
}---
Operation: lock
/*
* Data Locking Pattern
* Purpose: Control concurrent access to planning data
*/
// Check lock status
function checkLockStatus() {
var planning = Table_Planning.getPlanning();
var lockInfo = planning.getLockInfo();
if (lockInfo.isLocked) {
if (lockInfo.lockedBy === Application.getUserInfo().id) {
console.log("Data is locked by current user");
return "owned";
} else {
console.log("Data is locked by: " + lockInfo.lockedBy);
Application.showMessage(
ApplicationMessageType.Warning,
"Data is locked by: " + lockInfo.lockedByName
);
return "other";
}
}
return "unlocked";
}
// Acquire lock before editing
function acquireLock() {
var planning = Table_Planning.getPlanning();
var status = checkLockStatus();
if (status === "other") {
return false; // Cannot acquire, locked by another user
}
if (status === "unlocked") {
try {
planning.setLock(true);
Application.showMessage(
ApplicationMessageType.Info,
"Data locked for editing"
);
} catch (error) {
Application.showMessage(
ApplicationMessageType.Error,
"Failed to acquire lock: " + error.message
);
return false;
}
}
return true;
}
// Release lock when don40 SAP development plugins with evidence-tracked verification SAP development plugins for AI coding assistants, with public-source or package-registry verification tracked where available.
Repo: secondsky/sap-skills
Other commands on sap-skills.
- /abap-cds-model-check
Optional intended usage such as analytical, transactional, reuse, value-help, or extraction
Open command - /abap-cloud-review
Optional target ABAP platform or SAP BTP ABAP Environment release
Open command - /ai-core-deployment-check
Optional runtime or scenario name, such as orchestration, serving, training, or batch
Open command - /api-style-review
Optional API style lens such as REST, OData, OpenAPI, or SDK
Open command - /btp-architecture-review
Optional scenario lens such as extension, integration, analytics, or AI
Open command - /work-zone-content-check
Optional Work Zone edition or content type
Open command

