Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
51012e4
feat(knowledge): 얇은 모듈 4종 지식 자산 보강 + 진단 경로 명시
BoxLogoDev Aug 16, 2026
caa8320
feat(runtime): LearningService 추가 — 세션에서 지식 환류 후보 산출
BoxLogoDev Aug 16, 2026
192f7a4
fix(mcp): 실행된 적 없던 테스트 2종을 러너에 연결
BoxLogoDev Aug 16, 2026
94cfaac
feat(eval): 진단 응답 규칙 강화 + 채점을 운영 동작에 맞춰 교정
BoxLogoDev Aug 16, 2026
026455f
feat(desktop): 학습 후보 조회 UI + SAP 커넥터 fail-closed 정책
BoxLogoDev Aug 16, 2026
d0431aa
feat(release): 데스크톱 Windows 설치파일을 릴리스 파이프라인에 연결
BoxLogoDev Aug 16, 2026
fe454fe
docs(plans): 고도화 계획 + 데스크톱 준비 상태 + 4-AI 작업 지시서
BoxLogoDev Aug 16, 2026
6d05958
fix(desktop): 자동 업데이트 소스를 GitHub Releases 로 교체
BoxLogoDev Aug 16, 2026
cdf5fab
feat(desktop): 폐쇄망 모드 — 크래시 리포팅·업데이트 폴링 차단
BoxLogoDev Aug 16, 2026
e6064f9
feat(data): gold-set 58건·업종 7종 확장 + stale 문서 정정
BoxLogoDev Aug 16, 2026
e0cc511
fix(ci): 게이트가 SIGPIPE 로 오판하던 버그 수정
BoxLogoDev Aug 16, 2026
f9dbca6
fix(ci): 줄바꿈 혼재로 게이트가 로컬과 CI 에서 다른 답을 내던 문제
BoxLogoDev Aug 16, 2026
7f752bc
ci: 데스크톱 테스트 4,899건을 관찰 모드로 CI 에 편입
BoxLogoDev Aug 16, 2026
296c64b
docs(plans): 데스크톱 준비 상태 갱신 — 미확인 항목 3건 확인
BoxLogoDev Aug 16, 2026
b508685
docs: CHANGELOG 에 미릴리스 33커밋 정리
BoxLogoDev Aug 16, 2026
5280cac
docs(plans): 데스크톱 테스트 71건 판정 완료
BoxLogoDev Aug 16, 2026
086a3d7
fix(desktop): Apache-2.0 고지 파일을 설치파일에 포함
BoxLogoDev Aug 16, 2026
d2ac5a9
docs(plans): 2차 작업 지시서 — Codex 지식 심화 / Grok 다국어 완성
BoxLogoDev Aug 16, 2026
de4ebde
feat(desktop): messaging·브라우저 자동화를 feature flag 로 기본 숨김
BoxLogoDev Aug 16, 2026
f0b3829
fix(desktop): 양쪽 OS 에서 실패하던 테스트 32건 판정·처리
BoxLogoDev Aug 16, 2026
94a7bb3
ci: 데스크톱 테스트를 관찰 모드에서 정식 게이트로 승격
BoxLogoDev Aug 16, 2026
ed7be91
fix(desktop): 브라우저 툴 게이팅을 기존 제품 축으로 일원화 + 플래키 근원 수정
BoxLogoDev Aug 16, 2026
7dcff51
fix(desktop): 미생성 plans 폴더 쓰기 차단 버그 — safe 모드 경로 격리 수정
BoxLogoDev Aug 16, 2026
656e706
feat(eval): 58건 전수 baseline 승격 + 게이트를 실측 회귀 방지선으로 재설정
BoxLogoDev Aug 16, 2026
a820423
fix(desktop): build-win.ps1 에 -KeepRunningProcesses 스위치 추가
BoxLogoDev Aug 16, 2026
fb5791d
fix(desktop): CI 잔여 실패 2건 — 로거 절연 + 플랫폼 가드
BoxLogoDev Aug 16, 2026
98ae904
docs(plans): Antigravity 설치 QA 리포트 + 지시서
BoxLogoDev Aug 16, 2026
89b62ad
feat(desktop): 로컬 LLM 엔진 내장 — 폐쇄망 자체 AI 추론 경로 (Phase 2-A)
BoxLogoDev Aug 16, 2026
c3aba75
feat(eval): EVAL_PROVIDER=local — 폐쇄망 Local 등급 측정 경로
BoxLogoDev Aug 16, 2026
2216708
feat(data): 로컬 LLM 컴팩트 진단 카드 20종 (Grok 3차 산출 수용)
BoxLogoDev Aug 17, 2026
6ed480b
fix(desktop): 번들 로컬 엔진의 thinking 비활성 (--reasoning-budget 0)
BoxLogoDev Aug 17, 2026
7f4640e
feat(data): 다국어 100% 완성 + gold-set 전수 90건 (Grok 2차 산출 수용)
BoxLogoDev Aug 17, 2026
7501c09
feat(eval): local 답변 토큰 상한을 EVAL_LOCAL_MAX_TOKENS 로 조절 (기본 512)
BoxLogoDev Aug 17, 2026
f20bc97
fix(data): CI 차단 IW65 중복 키 제거 + T-code checker 사각지대 2종 픽스
BoxLogoDev Aug 17, 2026
d1459fb
feat(knowledge): Codex 2차 산출 수용 — plugin.json 24종 표준화 + SKILL 심화
BoxLogoDev Aug 17, 2026
bda7e96
docs(plans): 4차 스프린트 — 데스크톱 전면 검수 결과 + 함대 배분 계획
BoxLogoDev Aug 17, 2026
e3905f0
docs(handoff): round4 함대 지시서 — Codex i18n 루프 / Grok 백로그 검증+문서 / Antig…
BoxLogoDev Aug 17, 2026
0bee414
feat(i18n): 데스크톱 앱 UI 6개 언어 실동작 완성 (ko/vi 신설 + SAP UI 하드코딩 제거)
BoxLogoDev Aug 19, 2026
3004a8e
fix(desktop): 로컬 LLM 온보딩 무검증 통과 결함 수리 + probe IPC 신설
BoxLogoDev Aug 19, 2026
1e6ea9d
docs(knowledge): T-code 백로그 101건 전수 검증 + 데스크톱 표면 문서화
BoxLogoDev Aug 19, 2026
4bf4dca
docs: 벤더 지시서를 AGENTS.md 정본으로 통합 + DESIGN.md 신설
BoxLogoDev Aug 19, 2026
1a39278
fix: Universal Rules 소비 지점 3곳을 AGENTS.md 정본으로 정렬
BoxLogoDev Aug 19, 2026
270b40b
docs: 프로젝트 메모리 4계층 도입 (Rules/State/Decisions/Knowledge)
BoxLogoDev Aug 19, 2026
f409123
docs(decisions): 이미 내려진 핵심 결정 2건 발굴 기록
BoxLogoDev Aug 19, 2026
9a998c5
docs(agents): 플러그인·에이전트 표를 소스에서 재생성 (15→24, 9→20)
BoxLogoDev Aug 19, 2026
02cfdb4
fix(build): .windsurfrules 를 eol=lf 로 고정해 sync drift 재발 차단
BoxLogoDev Aug 19, 2026
b74da63
fix(desktop): 서브프로세스 서버를 dist/resources 로 복사 — piServerPath 결함 근본 수리
BoxLogoDev Aug 19, 2026
83cacd3
fix(mode-manager): 셸 리다이렉트 경로 추출이 Windows 경로를 자르던 것 수리
BoxLogoDev Aug 19, 2026
946b20c
chore: bump version to 2.4.1
BoxLogoDev Aug 19, 2026
d6bf9ac
docs(state): 해소된 항목 4건 정리 + v2.4.1 릴리스 준비 반영
BoxLogoDev Aug 19, 2026
cdb00f1
fix(ci): --ignore-scripts 로 건너뛴 Electron 바이너리 설치를 복구
BoxLogoDev Aug 19, 2026
4abfd02
chore: 버전 bump 후 호환 레이어 sync block 갱신 (2.4.1)
BoxLogoDev Aug 19, 2026
6b46f1f
chore: 버전 bump 캐스케이드 완결 — asset-manifest + doc stats 마커 (2.4.1)
BoxLogoDev Aug 19, 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: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "sapstack",
"version": "2.4.0",
"version": "2.4.1",
"description": "SAP Enterprise Operations Platform — 20 plugins, 16 agents, 18 commands, MCP Server (20+ tools, 5 prompts), VS Code Extension, NPM, Compliance (K-SOX/SOC2/ISO27001/GDPR), exceptions/hooks/country/bridge frameworks, 55+ IMG guides, 43+ Best Practices, 7 country localizations, 6 languages",
"author": "BoxLogoDev",
"license": "MIT",
Expand Down
2 changes: 1 addition & 1 deletion .cody/rules.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
Repository: https://github.com/BoxLogoDev/sapstack

<!-- BEGIN sapstack-auto: stats -->
- **sapstack 버전**: v2.4.0
- **sapstack 버전**: v2.4.1
- **플러그인**: 24개
- **서브에이전트**: 20개
- **슬래시 커맨드**: 22개
Expand Down
35 changes: 35 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# 기본: 텍스트 파일은 저장소에 LF 로 저장한다.
* text=auto

# 아래 확장자는 작업트리에서도 LF 를 강제한다.
#
# core.autocrlf=true 인 Windows 개발 환경에서는 체크아웃 시 CRLF 로 변환되는데,
# 셸 게이트가 쓰는 정규식(awk 의 /^---$/ 등)은 줄 끝의 \r 때문에 매치되지 않는다.
# 그러면 같은 커밋을 로컬(CRLF)과 CI(LF)에서 검사한 결과가 달라진다.
# 실제로 check-ecc-s4-split 이 로컬에서만 통과하고 CI 에서 실패한 적이 있다.
# 게이트는 어디서 돌리든 같은 답을 내야 한다.
#
# .sh 는 특히 중요하다. CRLF 면 shebang 해석까지 깨질 수 있다.
*.sh text eol=lf
*.mjs text eol=lf
*.md text eol=lf
*.yaml text eol=lf
*.yml text eol=lf
*.json text eol=lf

# 확장자가 없어 위 규칙에 걸리지 않는 호환 레이어 파일.
# build-multi-ai.sh 의 sync block 을 담고 있어, CRLF 로 체크아웃되면
# awk 가 을 떨어뜨린 LF 출력을 내놓아 전 라인이 drift 로 잡힌다.
.windsurfrules text eol=lf

# 바이너리 — 줄바꿈 변환 대상이 아니다.
*.png binary
*.jpg binary
*.jpeg binary
*.gif binary
*.ico binary
*.icns binary
*.tiff binary
*.pdf binary
*.vsix binary
*.tgz binary
32 changes: 27 additions & 5 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
node-version: "20"

- name: Install jq
run: sudo apt-get update && sudo apt-get install -y jq
Expand Down Expand Up @@ -81,6 +81,11 @@ jobs:
node scripts/generate-asset-manifest.mjs --check
node scripts/check-doc-stats.mjs

# 릴리스를 막는 게이트 로직 자체의 회귀 방지. 파일은 있었으나
# 어느 워크플로에서도 실행되지 않고 있었다.
- name: Test eval quality gate logic
run: node --test scripts/eval/check-gate.test.mjs

runtime-contract:
name: Runtime & MCP (${{ matrix.os }}, Node ${{ matrix.node }})
runs-on: ${{ matrix.os }}
Expand Down Expand Up @@ -112,7 +117,7 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
node-version: "20"
# mcp/tsconfig.json 이 ../packages/runtime/src 를 함께 컴파일한다.
# runtime 소스의 import 는 packages/runtime/node_modules 에서 해석되므로
# 여기를 설치하지 않으면 prepack 의 tsc 가 js-yaml/ajv 를 못 찾는다.
Expand All @@ -131,7 +136,7 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
node-version: "20"
# 루트에 package-lock.json 이 없어서, 워크스페이스 루트로 올라가면
# extension/package-lock.json 을 두고도 lockfile 을 못 찾는다.
- working-directory: extension
Expand All @@ -146,18 +151,35 @@ jobs:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
with:
bun-version: '1.3.14'
bun-version: "1.3.14"
- uses: actions/setup-node@v4
with:
node-version: '20'
node-version: "20"
# electron 의 tsc 는 packages/runtime/src 까지 들어간다. runtime 소스의
# import 는 packages/runtime/node_modules 에서 해석되므로 함께 설치한다.
- name: Install runtime dependencies
working-directory: packages/runtime
run: npm ci --workspaces=false
- working-directory: apps/desktop
run: bun install --frozen-lockfile --ignore-scripts
# --ignore-scripts 는 electron 의 postinstall(바이너리 다운로드)까지 건너뛴다.
# 그러면 `electron-log/main` 이 로드 시점에 electron 을 require 하다
# "Electron failed to install correctly" 로 죽고, 그 모듈을 import 하는
# 테스트 파일이 통째로 실패한다. 테스트는 Electron 을 실행하지 않고
# 경로만 필요로 하므로 postinstall 만 따로 돌린다.
- name: Install Electron binary (postinstall skipped above)
working-directory: apps/desktop
run: node node_modules/electron/install.js
- working-directory: apps/desktop
run: bun run typecheck:shared
- working-directory: apps/desktop
run: bun run typecheck:electron

# 관찰 모드(continue-on-error)로 확보한 판정: ubuntu 실패 32건은
# 브라우저 자동화 스위트(feature flag 로 기본 off, 스위트도 함께 skip)와
# 환경 의존이던 refreshConnectionRuntime 테스트(hermetic 픽스처로 고정)
# 였다. 둘 다 처리됐으므로 정식 게이트로 승격한다. Windows 전용 실패
# 39건은 ubuntu 러너와 무관하다.
- name: Run desktop tests
working-directory: apps/desktop
run: bun test
66 changes: 63 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,67 @@ name: sapstack Release
on:
push:
tags:
- 'v*'
- "v*"

permissions:
contents: write
packages: write

jobs:
desktop-windows:
name: Desktop installer (Windows)
runs-on: windows-latest

steps:
- name: Checkout
uses: actions/checkout@v4

- uses: oven-sh/setup-bun@v2
with:
bun-version: "1.3.14"

- uses: actions/setup-node@v4
with:
node-version: "20"

# electron 의 tsc 는 packages/runtime/src 까지 들어간다. runtime 소스의
# import 는 packages/runtime/node_modules 에서 해석되므로 함께 설치한다.
- name: Install runtime dependencies
working-directory: packages/runtime
run: npm ci --workspaces=false

- name: Install desktop dependencies
working-directory: apps/desktop
run: bun install --frozen-lockfile --ignore-scripts

# build-win.ps1 이 Windows 빌드 전체를 담당한다: bun 바이너리 다운로드(SHA 검증) →
# 루트 node_modules 에서 SDK 복사 + claude-agent-sdk-binary alias 생성 →
# ripgrep/interceptor 복사 → electron 빌드 → electron-builder --win → 설치파일 검증.
# electron-builder 를 직접 호출하면 alias 가 없어 extraResources 복사가 깨진다
# (electron-builder.yml 118행 주석 참조).
- name: Build Windows installer
working-directory: apps/desktop/apps/electron
run: powershell -ExecutionPolicy Bypass -File scripts/build-win.ps1
env:
# 코드 서명 인증서가 secret 으로 설정돼 있으면 electron-builder 가 자동 서명한다.
# 없으면 서명 없이 빌드되고 설치 시 SmartScreen 경고가 뜬다.
CSC_LINK: ${{ secrets.WINDOWS_CSC_LINK }}
CSC_KEY_PASSWORD: ${{ secrets.WINDOWS_CSC_KEY_PASSWORD }}

- name: Upload installer artifact
uses: actions/upload-artifact@v4
with:
name: desktop-windows
# latest.yml 은 electron-updater 가 새 버전을 판별하는 매니페스트다.
# Release 에 함께 올라가지 않으면 자동 업데이트가 동작하지 않는다.
path: |
apps/desktop/apps/electron/release/*.exe
apps/desktop/apps/electron/release/latest*.yml
if-no-files-found: error

release:
name: Build & Release
needs: [desktop-windows]
runs-on: ubuntu-latest

steps:
Expand All @@ -23,8 +75,8 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
registry-url: 'https://registry.npmjs.org'
node-version: "20"
registry-url: "https://registry.npmjs.org"

- name: Extract version from tag
id: version
Expand Down Expand Up @@ -90,6 +142,12 @@ jobs:
bash scripts/generate-release-notes.sh "${{ steps.version.outputs.version }}" > RELEASE_NOTES.md
echo "notes_file=RELEASE_NOTES.md" >> $GITHUB_OUTPUT

- name: Download desktop installer
uses: actions/download-artifact@v4
with:
name: desktop-windows
path: desktop-dist

- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
Expand All @@ -101,3 +159,5 @@ jobs:
files: |
mcp/*.tgz
extension/*.vsix
desktop-dist/*.exe
desktop-dist/latest*.yml
2 changes: 1 addition & 1 deletion .idea/sapstack-prompt.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 15 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# apps/desktop 은 craft-ai-agents/craft-agents-oss (Apache-2.0) 파생이고
# 자체 eslint 체계(apps/desktop/apps/electron/eslint.config.mjs)와
# 자체 코드 스타일(세미콜론 없음, 작은따옴표)을 쓴다.
#
# 루트에 prettier 설정이 없어 포맷터가 기본값(세미콜론·큰따옴표)으로 재포맷하면
# upstream 스타일과 어긋나 동기화 diff 가 폭발한다. 실제로 주석 3줄을 고쳤을 때
# index.ts 가 1,690줄 diff 로 부풀었다.
#
# upstream 코드는 upstream 규칙으로 관리한다.
apps/desktop/

# 생성물
**/dist/
**/release/
**/node_modules/
50 changes: 12 additions & 38 deletions .windsurfrules
Original file line number Diff line number Diff line change
@@ -1,57 +1,31 @@
# Windsurf / Codeium Rules for sapstack

> Project-wide instructions for **Windsurf (Codeium)** AI assistant.
> Windsurf reads `.windsurfrules` automatically from the project root.
> **Read `AGENTS.md` first.** It is the single source of truth for this
> repository: Universal Rules, Korean field language, response modes
> (Quick Advisory / Evidence Loop), plugin and subagent routing, the
> compatibility matrix, and the reference map. Nothing on this page repeats it.
>
> For Claude Code users: `plugins/*/skills/*/SKILL.md`.
> For Codex/Kiro users: `AGENTS.md`.
> For Copilot users: `.github/copilot-instructions.md`.
> For Cody users: `.cody/rules.md`.

---

## Project: sapstack

SAP operations advisory plugin collection — 24 SAP modules covering FI, CO, TR, MM, SD, PP, HCM, SFSF, ABAP, S4-Migration, BTP, BASIS, BC, PM, QM, EWM, GTS, IBP, SAC, Ariba, Integration Cloud, plus meta plugins.
> Windsurf reads `.windsurfrules` automatically from the project root, so this
> file carries only Windsurf-specific routing.

Repository: https://github.com/BoxLogoDev/sapstack

<!-- BEGIN sapstack-auto: stats -->
- **sapstack 버전**: v2.4.0
- **sapstack 버전**: v2.4.1
- **플러그인**: 24개
- **서브에이전트**: 20개
- **슬래시 커맨드**: 22개
<!-- END sapstack-auto: stats -->

## Universal Rules (mandatory)

1. NEVER hardcode company codes, G/L accounts, cost centers, org units.
2. ALWAYS ask for environment first: SAP Release (ECC EhP / S/4HANA year), Deployment (On-Prem / RISE / Cloud PE), Industry sector, Company code.
3. ALWAYS distinguish ECC vs S/4HANA where behavior differs.
4. Transport request mandatory for any config change.
5. No production changes without simulation/test run.
6. No SE16N data edits in production.
7. Always provide T-code AND menu path.

## Korean Field Language

When responding in Korean:
- Use 외래어 as primary: "코스트 센터", "페이먼트 메소드", "트포", "미고"
- Annotate on first occurrence: "코스트 센터 (원가센터, KOSTL)"
- Accept conversational patterns: "돌렸는데", "뜨네요", "안 돼요"
- Keep T-codes and abbreviations as-is (F110, PO, GR, MIGO)

## Response Modes

- **Quick Advisory** for factual questions: Issue → Root Cause → Check → Fix → Prevention → SAP Note
- **Evidence Loop** for incident diagnosis: Turn 1 INTAKE → Turn 2 HYPOTHESIS → Turn 3 COLLECT → Turn 4 VERIFY (see `plugins/sap-session/skills/sap-session/SKILL.md`)

## Windsurf-Specific Tips

- Use Cascade chat to reference SKILL.md files: `@plugins/sap-fi/...`
- For multi-file SAP context, mention `data/tcodes.yaml`, `data/symptom-index.yaml`, `data/synonyms.yaml`
- The `references/ko/quick-guide.md` (and other languages) under each plugin provides compressed quick-reference

## References
## Other AI tools

Universal rules source of truth: `CLAUDE.md` (repo root).
- Claude Code: `AGENTS.md` + `CLAUDE.md` + `plugins/*/skills/*/SKILL.md`
- Codex / Kiro: `AGENTS.md`
- Copilot: `.github/copilot-instructions.md`
- Cody: `.cody/rules.md`
Loading
Loading