opensoma 0.1.0

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.
Files changed (146) hide show
  1. package/.claude-plugin/README.md +145 -0
  2. package/.claude-plugin/plugin.json +23 -0
  3. package/.github/workflows/release.yml +86 -0
  4. package/.oxfmtrc.json +9 -0
  5. package/.oxlintrc.json +4 -0
  6. package/AGENTS.md +78 -0
  7. package/README.md +249 -0
  8. package/bun.lock +297 -0
  9. package/bunfig.toml +2 -0
  10. package/dist/package.json +56 -0
  11. package/dist/src/cli.d.ts +5 -0
  12. package/dist/src/cli.d.ts.map +1 -0
  13. package/dist/src/cli.js +39 -0
  14. package/dist/src/cli.js.map +1 -0
  15. package/dist/src/client.d.ts +98 -0
  16. package/dist/src/client.d.ts.map +1 -0
  17. package/dist/src/client.js +141 -0
  18. package/dist/src/client.js.map +1 -0
  19. package/dist/src/commands/auth.d.ts +3 -0
  20. package/dist/src/commands/auth.d.ts.map +1 -0
  21. package/dist/src/commands/auth.js +125 -0
  22. package/dist/src/commands/auth.js.map +1 -0
  23. package/dist/src/commands/dashboard.d.ts +3 -0
  24. package/dist/src/commands/dashboard.d.ts.map +1 -0
  25. package/dist/src/commands/dashboard.js +33 -0
  26. package/dist/src/commands/dashboard.js.map +1 -0
  27. package/dist/src/commands/event.d.ts +3 -0
  28. package/dist/src/commands/event.d.ts.map +1 -0
  29. package/dist/src/commands/event.js +58 -0
  30. package/dist/src/commands/event.js.map +1 -0
  31. package/dist/src/commands/helpers.d.ts +3 -0
  32. package/dist/src/commands/helpers.d.ts.map +1 -0
  33. package/dist/src/commands/helpers.js +12 -0
  34. package/dist/src/commands/helpers.js.map +1 -0
  35. package/dist/src/commands/index.d.ts +9 -0
  36. package/dist/src/commands/index.d.ts.map +1 -0
  37. package/dist/src/commands/index.js +9 -0
  38. package/dist/src/commands/index.js.map +1 -0
  39. package/dist/src/commands/member.d.ts +3 -0
  40. package/dist/src/commands/member.d.ts.map +1 -0
  41. package/dist/src/commands/member.js +23 -0
  42. package/dist/src/commands/member.js.map +1 -0
  43. package/dist/src/commands/mentoring.d.ts +3 -0
  44. package/dist/src/commands/mentoring.d.ts.map +1 -0
  45. package/dist/src/commands/mentoring.js +154 -0
  46. package/dist/src/commands/mentoring.js.map +1 -0
  47. package/dist/src/commands/notice.d.ts +3 -0
  48. package/dist/src/commands/notice.d.ts.map +1 -0
  49. package/dist/src/commands/notice.js +42 -0
  50. package/dist/src/commands/notice.js.map +1 -0
  51. package/dist/src/commands/room.d.ts +3 -0
  52. package/dist/src/commands/room.d.ts.map +1 -0
  53. package/dist/src/commands/room.js +79 -0
  54. package/dist/src/commands/room.js.map +1 -0
  55. package/dist/src/commands/team.d.ts +3 -0
  56. package/dist/src/commands/team.d.ts.map +1 -0
  57. package/dist/src/commands/team.js +20 -0
  58. package/dist/src/commands/team.js.map +1 -0
  59. package/dist/src/constants.d.ts +43 -0
  60. package/dist/src/constants.d.ts.map +1 -0
  61. package/dist/src/constants.js +62 -0
  62. package/dist/src/constants.js.map +1 -0
  63. package/dist/src/credential-manager.d.ts +15 -0
  64. package/dist/src/credential-manager.d.ts.map +1 -0
  65. package/dist/src/credential-manager.js +40 -0
  66. package/dist/src/credential-manager.js.map +1 -0
  67. package/dist/src/formatters.d.ts +15 -0
  68. package/dist/src/formatters.d.ts.map +1 -0
  69. package/dist/src/formatters.js +382 -0
  70. package/dist/src/formatters.js.map +1 -0
  71. package/dist/src/http.d.ts +32 -0
  72. package/dist/src/http.d.ts.map +1 -0
  73. package/dist/src/http.js +143 -0
  74. package/dist/src/http.js.map +1 -0
  75. package/dist/src/index.d.ts +7 -0
  76. package/dist/src/index.d.ts.map +1 -0
  77. package/dist/src/index.js +6 -0
  78. package/dist/src/index.js.map +1 -0
  79. package/dist/src/shared/utils/error-handler.d.ts +2 -0
  80. package/dist/src/shared/utils/error-handler.d.ts.map +1 -0
  81. package/dist/src/shared/utils/error-handler.js +7 -0
  82. package/dist/src/shared/utils/error-handler.js.map +1 -0
  83. package/dist/src/shared/utils/mentoring-params.d.ts +15 -0
  84. package/dist/src/shared/utils/mentoring-params.d.ts.map +1 -0
  85. package/dist/src/shared/utils/mentoring-params.js +39 -0
  86. package/dist/src/shared/utils/mentoring-params.js.map +1 -0
  87. package/dist/src/shared/utils/output.d.ts +2 -0
  88. package/dist/src/shared/utils/output.d.ts.map +1 -0
  89. package/dist/src/shared/utils/output.js +4 -0
  90. package/dist/src/shared/utils/output.js.map +1 -0
  91. package/dist/src/shared/utils/stderr.d.ts +5 -0
  92. package/dist/src/shared/utils/stderr.d.ts.map +1 -0
  93. package/dist/src/shared/utils/stderr.js +19 -0
  94. package/dist/src/shared/utils/stderr.js.map +1 -0
  95. package/dist/src/shared/utils/swmaestro.d.ts +33 -0
  96. package/dist/src/shared/utils/swmaestro.d.ts.map +1 -0
  97. package/dist/src/shared/utils/swmaestro.js +164 -0
  98. package/dist/src/shared/utils/swmaestro.js.map +1 -0
  99. package/dist/src/token-extractor.d.ts +23 -0
  100. package/dist/src/token-extractor.d.ts.map +1 -0
  101. package/dist/src/token-extractor.js +163 -0
  102. package/dist/src/token-extractor.js.map +1 -0
  103. package/dist/src/types.d.ts +176 -0
  104. package/dist/src/types.d.ts.map +1 -0
  105. package/dist/src/types.js +110 -0
  106. package/dist/src/types.js.map +1 -0
  107. package/e2e/.gitkeep +0 -0
  108. package/package.json +56 -0
  109. package/scripts/postbuild.ts +11 -0
  110. package/scripts/prepublish.ts +9 -0
  111. package/scripts/test.ts +82 -0
  112. package/skills/opensoma/SKILL.md +345 -0
  113. package/skills/opensoma/references/common-patterns.md +182 -0
  114. package/skills/opensoma/references/output-format.md +130 -0
  115. package/src/cli.ts +57 -0
  116. package/src/client.test.ts +210 -0
  117. package/src/client.ts +264 -0
  118. package/src/commands/auth.ts +153 -0
  119. package/src/commands/dashboard.ts +39 -0
  120. package/src/commands/event.ts +74 -0
  121. package/src/commands/helpers.ts +12 -0
  122. package/src/commands/index.ts +8 -0
  123. package/src/commands/member.ts +29 -0
  124. package/src/commands/mentoring.ts +209 -0
  125. package/src/commands/notice.ts +56 -0
  126. package/src/commands/room.ts +102 -0
  127. package/src/commands/team.ts +26 -0
  128. package/src/constants.ts +70 -0
  129. package/src/credential-manager.test.ts +66 -0
  130. package/src/credential-manager.ts +52 -0
  131. package/src/formatters.test.ts +382 -0
  132. package/src/formatters.ts +489 -0
  133. package/src/http.test.ts +152 -0
  134. package/src/http.ts +196 -0
  135. package/src/index.ts +6 -0
  136. package/src/shared/utils/error-handler.ts +7 -0
  137. package/src/shared/utils/mentoring-params.test.ts +112 -0
  138. package/src/shared/utils/mentoring-params.ts +57 -0
  139. package/src/shared/utils/output.ts +3 -0
  140. package/src/shared/utils/stderr.ts +23 -0
  141. package/src/shared/utils/swmaestro.ts +218 -0
  142. package/src/token-extractor.test.ts +119 -0
  143. package/src/token-extractor.ts +205 -0
  144. package/src/types.test.ts +172 -0
  145. package/src/types.ts +134 -0
  146. package/tsconfig.json +38 -0
@@ -0,0 +1,145 @@
1
+ # OpenSoma
2
+
3
+ SWMaestro MyPage CLI & SDK for AI agents.
4
+
5
+ ## Overview
6
+
7
+ OpenSoma wraps the SWMaestro MyPage platform (swmaestro.ai) to provide programmatic access to:
8
+
9
+ - **Mentoring sessions** - List, create, apply, cancel, and manage mentoring sessions
10
+ - **Meeting room reservations** - Reserve rooms at the SWMaestro center
11
+ - **Dashboard** - View upcoming events, notices, and personal information
12
+ - **Team info** - Access team details and member information
13
+ - **Notices** - Read official announcements
14
+ - **Events** - Browse and apply for program events
15
+
16
+ ## Installation
17
+
18
+ ```bash
19
+ npm install -g opensoma
20
+ ```
21
+
22
+ ## Authentication
23
+
24
+ ### Browser Session Extraction
25
+
26
+ Extract existing session from Chromium-based browsers:
27
+
28
+ ```bash
29
+ opensoma auth extract
30
+ ```
31
+
32
+ ### Login with Credentials
33
+
34
+ ```bash
35
+ opensoma auth login --username <email> --password <password>
36
+ ```
37
+
38
+ Or use environment variables:
39
+
40
+ ```bash
41
+ export OPENSOMA_USERNAME=<email>
42
+ export OPENSOMA_PASSWORD=<password>
43
+ opensoma auth login
44
+ ```
45
+
46
+ ## Commands
47
+
48
+ All commands output JSON. Add `--pretty` for formatted output.
49
+
50
+ ### Dashboard
51
+
52
+ ```bash
53
+ opensoma dashboard show
54
+ ```
55
+
56
+ ### Mentoring
57
+
58
+ ```bash
59
+ # List sessions
60
+ opensoma mentoring list
61
+ opensoma mentoring list --status open --type public
62
+
63
+ # Search
64
+ opensoma mentoring list --search "keyword"
65
+
66
+ # Get details
67
+ opensoma mentoring get <id>
68
+
69
+ # Create session
70
+ opensoma mentoring create \
71
+ --title "Title" \
72
+ --type public \
73
+ --date 2025-01-15 \
74
+ --start 14:00 \
75
+ --end 16:00 \
76
+ --venue "스페이스 A1"
77
+
78
+ # Apply to session
79
+ opensoma mentoring apply <id>
80
+
81
+ # Cancel application
82
+ opensoma mentoring cancel --apply-sn <number> --qustnr-sn <number>
83
+
84
+ # View history
85
+ opensoma mentoring history
86
+ ```
87
+
88
+ ### Meeting Rooms
89
+
90
+ ```bash
91
+ # List rooms
92
+ opensoma room list --date 2025-01-15
93
+
94
+ # Check availability
95
+ opensoma room available <roomId> --date 2025-01-15
96
+
97
+ # Reserve
98
+ opensoma room reserve \
99
+ --room A1 \
100
+ --date 2025-01-15 \
101
+ --slots "14:00,14:30,15:00" \
102
+ --title "Team Meeting"
103
+ ```
104
+
105
+ ### Notices
106
+
107
+ ```bash
108
+ opensoma notice list
109
+ opensoma notice get <id>
110
+ ```
111
+
112
+ ### Team & Member
113
+
114
+ ```bash
115
+ opensoma team show
116
+ opensoma member show
117
+ ```
118
+
119
+ ### Events
120
+
121
+ ```bash
122
+ opensoma event list
123
+ opensoma event get <id>
124
+ opensoma event apply <id>
125
+ ```
126
+
127
+ ## SDK
128
+
129
+ ```typescript
130
+ import { SomaClient } from 'opensoma'
131
+
132
+ const client = new SomaClient({
133
+ username: process.env.OPENSOMA_USERNAME,
134
+ password: process.env.OPENSOMA_PASSWORD,
135
+ })
136
+ await client.login()
137
+
138
+ // Use the SDK
139
+ const dashboard = await client.dashboard.get()
140
+ const { items } = await client.mentoring.list({ status: 'open' })
141
+ ```
142
+
143
+ ## License
144
+
145
+ MIT
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "opensoma",
3
+ "version": "0.1.0",
4
+ "description": "SWMaestro MyPage CLI & SDK for AI agents - manage mentoring sessions, reserve meeting rooms, view dashboard, team info, notices, and member profiles",
5
+ "author": {
6
+ "name": "devxoul",
7
+ "url": "https://github.com/devxoul"
8
+ },
9
+ "license": "MIT",
10
+ "keywords": [
11
+ "swmaestro",
12
+ "software-maestro",
13
+ "mentoring",
14
+ "meeting-room",
15
+ "kr",
16
+ "korean"
17
+ ],
18
+ "homepage": "https://github.com/devxoul/opensoma",
19
+ "repository": "https://github.com/devxoul/opensoma",
20
+ "skills": [
21
+ "./skills/opensoma"
22
+ ]
23
+ }
@@ -0,0 +1,86 @@
1
+ name: Release
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ version:
7
+ description: "Version (x.y.z)"
8
+ required: true
9
+
10
+ permissions:
11
+ contents: write
12
+ id-token: write
13
+
14
+ jobs:
15
+ release:
16
+ runs-on: ubuntu-latest
17
+
18
+ steps:
19
+ - uses: actions/checkout@v4
20
+
21
+ - uses: oven-sh/setup-bun@v2
22
+ with:
23
+ bun-version: latest
24
+
25
+ - uses: actions/setup-node@v4
26
+ with:
27
+ node-version: "22"
28
+
29
+ - name: Install dependencies
30
+ run: bun install --frozen-lockfile
31
+
32
+ - name: Typecheck
33
+ run: bun run typecheck
34
+
35
+ - name: Lint
36
+ run: bun run lint
37
+
38
+ - name: Test
39
+ run: bun run test
40
+
41
+ - name: Build
42
+ run: bun run build
43
+
44
+ - uses: actions/setup-node@v4
45
+ with:
46
+ node-version: "24"
47
+ registry-url: "https://registry.npmjs.org"
48
+
49
+ - name: Bump version
50
+ run: |
51
+ npm version ${{ inputs.version }} --no-git-tag-version --allow-same-version
52
+ bun -e "
53
+ const fs = require('fs');
54
+ const v = '${{ inputs.version }}';
55
+ let readme = fs.readFileSync('README.md', 'utf8');
56
+ readme = readme.replace(/opensoma@[\d.]+/g, 'opensoma@' + v);
57
+ fs.writeFileSync('README.md', readme);
58
+ const pluginJson = JSON.parse(fs.readFileSync('.claude-plugin/plugin.json', 'utf8'));
59
+ pluginJson.version = v;
60
+ fs.writeFileSync('.claude-plugin/plugin.json', JSON.stringify(pluginJson, null, 2) + '\n');
61
+ for (const dir of fs.readdirSync('skills')) {
62
+ const p = 'skills/' + dir + '/SKILL.md';
63
+ if (fs.existsSync(p)) {
64
+ let s = fs.readFileSync(p, 'utf8');
65
+ s = s.replace(/^version: .+$/m, 'version: ' + v);
66
+ fs.writeFileSync(p, s);
67
+ }
68
+ }
69
+ "
70
+
71
+ - name: Commit and tag
72
+ run: |
73
+ git config user.name "github-actions[bot]"
74
+ git config user.email "github-actions[bot]@users.noreply.github.com"
75
+ git add package.json README.md skills/*/SKILL.md .claude-plugin/plugin.json
76
+ git diff --staged --quiet || git commit -m "${{ inputs.version }}"
77
+ git tag "${{ inputs.version }}"
78
+ git push origin HEAD --tags
79
+
80
+ - name: Publish to npm
81
+ run: npm publish --provenance --access public
82
+
83
+ - name: Create GitHub Release
84
+ run: gh release create "${{ inputs.version }}" --generate-notes
85
+ env:
86
+ GH_TOKEN: ${{ github.token }}
package/.oxfmtrc.json ADDED
@@ -0,0 +1,9 @@
1
+ {
2
+ "$schema": "./node_modules/oxfmt/configuration_schema.json",
3
+ "printWidth": 120,
4
+ "useTabs": false,
5
+ "semi": false,
6
+ "singleQuote": true,
7
+ "sortImports": {},
8
+ "ignorePatterns": ["dist/**", ".github/**", "**/*.md"]
9
+ }
package/.oxlintrc.json ADDED
@@ -0,0 +1,4 @@
1
+ {
2
+ "$schema": "./node_modules/oxlint/configuration_schema.json",
3
+ "ignorePatterns": ["dist/**", ".github/**", "**/*.md"]
4
+ }
package/AGENTS.md ADDED
@@ -0,0 +1,78 @@
1
+ # AGENTS.md
2
+
3
+ ## Project Overview
4
+
5
+ SWMaestro MyPage CLI & SDK for AI agents. Wraps the SWMaestro platform (swmaestro.ai) to provide programmatic access to mentoring sessions, meeting room reservations, dashboard, notices, team info, member profiles, and events.
6
+
7
+ Runtime: Bun for development, Node.js-compatible output for npm distribution.
8
+
9
+ ## Commands
10
+
11
+ ```bash
12
+ # Install dependencies
13
+ bun install
14
+
15
+ # Run all unit tests
16
+ bun test
17
+
18
+ # Type checking
19
+ bun run typecheck
20
+
21
+ # Lint (oxlint)
22
+ bun run lint
23
+ bun run lint:fix
24
+
25
+ # Format (oxfmt)
26
+ bun run format
27
+ ```
28
+
29
+ Always use `bun` — never `node`, `npm`, `npx`, `yarn`, or `pnpm`. Bun loads `.env` automatically; do not use dotenv.
30
+
31
+ ## TypeScript Execution Model
32
+
33
+ ### Local Development
34
+
35
+ Bun runs TypeScript directly — no compilation step needed.
36
+
37
+ - `bin` entry in `package.json` points to `./src/cli.ts`
38
+ - CLI entry point uses `#!/usr/bin/env bun` shebang
39
+ - Run directly: `bun src/cli.ts`
40
+
41
+ ### Production Build (Publish)
42
+
43
+ `bun run build` compiles to `dist/` for npm consumers who don't have Bun.
44
+
45
+ 1. `tsc` compiles `src/` → `dist/src/` (JS + declarations + source maps)
46
+ 2. `tsc-alias` resolves `@/*` path aliases in the compiled output
47
+ 3. `scripts/postbuild.ts` replaces `#!/usr/bin/env bun` → `#!/usr/bin/env node` in CLI file
48
+ 4. `module` and `main` in `package.json` point to `dist/src/index.js`
49
+
50
+ npm consumers run compiled JS via Node.js. The `prepublishOnly` script runs the build, then `scripts/prepublish.ts` rewrites `bin` paths from `./src/*.ts` to `dist/src/*.js`. After publish, `postpublish` restores `package.json` via `git checkout`.
51
+
52
+ ### Key Distinction
53
+
54
+ | | Local (dev) | Published (npm) |
55
+ | ----------- | ----------------- | ------------------------ |
56
+ | Runtime | Bun | Node.js |
57
+ | Entry files | `src/cli.ts` | `dist/src/cli.js` |
58
+ | Shebang | `#!/usr/bin/env bun` | `#!/usr/bin/env node` |
59
+ | Compilation | None (Bun runs TS) | `tsc` → `dist/` |
60
+
61
+ ## Release
62
+
63
+ To publish a new version to npm:
64
+
65
+ 1. Bump version in `package.json`
66
+ 2. Run `bun run build` to verify the build succeeds
67
+ 3. Run `npm publish` (triggers `prepublishOnly` → build + rewrite bin paths, then `postpublish` → restore `package.json`)
68
+
69
+ Tags have no `v` prefix.
70
+
71
+ ### Version Decision
72
+
73
+ When asked to release without a specific version:
74
+
75
+ - **Patch** (x.y.Z) — bug fixes, docs, refactors, non-breaking changes
76
+ - **Minor** (x.Y.0) — new features, new commands, new options, expanded capabilities
77
+
78
+ Decide automatically based on commits since last release. Do not ask the user. Never bump major unless the user explicitly requests it. If the user specifies a version, use it as-is.
package/README.md ADDED
@@ -0,0 +1,249 @@
1
+ # opensoma
2
+
3
+ 소프트웨어 마에스트로(SWMaestro) 마이페이지 CLI & SDK. 멘토링, 회의실 예약, 공지사항, 행사 등 마이페이지 기능을 커맨드라인과 프로그래밍 방식으로 사용할 수 있습니다.
4
+
5
+ AI 에이전트가 SWMaestro 플랫폼과 상호작용할 수 있도록 설계되었습니다. 모든 출력은 JSON 형식입니다.
6
+
7
+ ## 설치
8
+
9
+ ```bash
10
+ npm install opensoma
11
+ ```
12
+
13
+ ## 인증
14
+
15
+ ### 브라우저 세션 추출
16
+
17
+ Chromium 계열 브라우저(Chrome, Edge, Brave, Arc, Vivaldi)에서 swmaestro.ai에 로그인된 세션을 자동으로 추출합니다.
18
+
19
+ ```bash
20
+ opensoma auth extract
21
+ ```
22
+
23
+ ### 아이디/비밀번호 로그인
24
+
25
+ ```bash
26
+ opensoma auth login --username <아이디> --password <비밀번호>
27
+ ```
28
+
29
+ 환경변수로도 전달 가능합니다:
30
+
31
+ ```bash
32
+ export OPENSOMA_USERNAME=<아이디>
33
+ export OPENSOMA_PASSWORD=<비밀번호>
34
+ opensoma auth login
35
+ ```
36
+
37
+ ### 인증 상태 확인
38
+
39
+ ```bash
40
+ opensoma auth status
41
+ ```
42
+
43
+ ### 로그아웃
44
+
45
+ ```bash
46
+ opensoma auth logout
47
+ ```
48
+
49
+ 인증 정보는 `~/.config/opensoma/credentials.json`에 저장되며, 파일 권한은 `0600`으로 설정됩니다.
50
+
51
+ ## CLI 명령어
52
+
53
+ 모든 명령어에 `--pretty` 옵션을 추가하면 JSON 출력을 보기 좋게 포맷합니다.
54
+
55
+ ### 대시보드
56
+
57
+ ```bash
58
+ opensoma dashboard show
59
+ ```
60
+
61
+ ### 멘토링
62
+
63
+ ```bash
64
+ # 목록 조회
65
+ opensoma mentoring list
66
+ opensoma mentoring list --status open --type public --page 2
67
+
68
+ # 검색
69
+ opensoma mentoring list --search "OpenCode"
70
+ opensoma mentoring list --search "author:@me"
71
+ opensoma mentoring list --search "author:@me" --status open --type lecture
72
+
73
+ # 상세 조회
74
+ opensoma mentoring get <id>
75
+
76
+ # 멘토링 생성
77
+ opensoma mentoring create \
78
+ --title "멘토링 제목" \
79
+ --type public \
80
+ --date 2025-01-15 \
81
+ --start 14:00 \
82
+ --end 16:00 \
83
+ --venue "스페이스 A1"
84
+
85
+ # 멘토링 삭제
86
+ opensoma mentoring delete <id>
87
+
88
+ # 멘토링 신청
89
+ opensoma mentoring apply <id>
90
+
91
+ # 신청 취소
92
+ opensoma mentoring cancel --apply-sn <신청번호> --qustnr-sn <멘토링번호>
93
+
94
+ # 신청 내역 조회
95
+ opensoma mentoring history
96
+ ```
97
+
98
+ ### 회의실
99
+
100
+ ```bash
101
+ # 회의실 목록
102
+ opensoma room list
103
+ opensoma room list --date 2025-01-15 --room A1
104
+
105
+ # 예약 가능 시간 조회
106
+ opensoma room available <roomId> --date 2025-01-15
107
+
108
+ # 회의실 예약
109
+ opensoma room reserve \
110
+ --room A1 \
111
+ --date 2025-01-15 \
112
+ --slots "14:00,14:30,15:00" \
113
+ --title "팀 회의"
114
+ ```
115
+
116
+ ### 공지사항
117
+
118
+ ```bash
119
+ opensoma notice list
120
+ opensoma notice get <id>
121
+ ```
122
+
123
+ ### 팀
124
+
125
+ ```bash
126
+ opensoma team show
127
+ ```
128
+
129
+ ### 회원 정보
130
+
131
+ ```bash
132
+ opensoma member show
133
+ ```
134
+
135
+ ### 행사
136
+
137
+ ```bash
138
+ # 행사 목록
139
+ opensoma event list
140
+
141
+ # 행사 상세
142
+ opensoma event get <id>
143
+
144
+ # 행사 신청
145
+ opensoma event apply <id>
146
+ ```
147
+
148
+ ## SDK
149
+
150
+ TypeScript/JavaScript에서 프로그래밍 방식으로 사용할 수 있습니다.
151
+
152
+ ```typescript
153
+ import { SomaClient } from 'opensoma'
154
+
155
+ const client = new SomaClient({
156
+ username: process.env.OPENSOMA_USERNAME,
157
+ password: process.env.OPENSOMA_PASSWORD,
158
+ })
159
+ await client.login()
160
+
161
+ // 대시보드
162
+ const dashboard = await client.dashboard.get()
163
+
164
+ // 멘토링 목록
165
+ const { items, pagination } = await client.mentoring.list({ status: 'open' })
166
+
167
+ // 멘토링 상세
168
+ const detail = await client.mentoring.get(123)
169
+
170
+ // 멘토링 생성
171
+ await client.mentoring.create({
172
+ title: '멘토링 제목',
173
+ type: 'public',
174
+ date: '2025-01-15',
175
+ startTime: '14:00',
176
+ endTime: '16:00',
177
+ venue: '스페이스 A1',
178
+ })
179
+
180
+ // 회의실 목록
181
+ const rooms = await client.room.list({ date: '2025-01-15' })
182
+
183
+ // 회의실 예약
184
+ await client.room.reserve({
185
+ roomId: 17,
186
+ date: '2025-01-15',
187
+ slots: ['14:00', '14:30'],
188
+ title: '팀 회의',
189
+ })
190
+
191
+ // 공지사항
192
+ const notices = await client.notice.list()
193
+ const notice = await client.notice.get(456)
194
+
195
+ // 팀 정보
196
+ const team = await client.team.show()
197
+
198
+ // 회원 정보
199
+ const member = await client.member.show()
200
+
201
+ // 행사
202
+ const events = await client.event.list()
203
+ await client.event.apply(789)
204
+ ```
205
+
206
+ 세션 쿠키로 직접 인증할 수도 있습니다:
207
+
208
+ ```typescript
209
+ const client = new SomaClient({
210
+ sessionCookie: '<세션쿠키>',
211
+ csrfToken: '<CSRF토큰>',
212
+ })
213
+ ```
214
+
215
+ ## 회의실 코드
216
+
217
+ | 코드 | 회의실 |
218
+ |------|--------|
219
+ | A1 | 스페이스 A1 |
220
+ | A2 | 스페이스 A2 |
221
+ | A3 | 스페이스 A3 |
222
+ | A4 | 스페이스 A4 |
223
+ | A5 | 스페이스 A5 |
224
+ | A6 | 스페이스 A6 |
225
+ | A7 | 스페이스 A7 |
226
+ | A8 | 스페이스 A8 |
227
+
228
+ ## 개발
229
+
230
+ ```bash
231
+ # 의존성 설치
232
+ bun install
233
+
234
+ # 테스트
235
+ bun test
236
+
237
+ # 타입 체크
238
+ bun run typecheck
239
+
240
+ # 린트
241
+ bun run lint
242
+
243
+ # 포맷
244
+ bun run format
245
+ ```
246
+
247
+ ## 라이선스
248
+
249
+ MIT