@jungjaehoon/mama-os 0.1.1
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.
- package/CHANGELOG.md +67 -0
- package/README.md +643 -0
- package/dist/agent/agent-loop.d.ts +98 -0
- package/dist/agent/agent-loop.d.ts.map +1 -0
- package/dist/agent/agent-loop.js +417 -0
- package/dist/agent/agent-loop.js.map +1 -0
- package/dist/agent/auto-recall.d.ts +48 -0
- package/dist/agent/auto-recall.d.ts.map +1 -0
- package/dist/agent/auto-recall.js +178 -0
- package/dist/agent/auto-recall.js.map +1 -0
- package/dist/agent/claude-cli-wrapper.d.ts +130 -0
- package/dist/agent/claude-cli-wrapper.d.ts.map +1 -0
- package/dist/agent/claude-cli-wrapper.js +227 -0
- package/dist/agent/claude-cli-wrapper.js.map +1 -0
- package/dist/agent/claude-client.d.ts +50 -0
- package/dist/agent/claude-client.d.ts.map +1 -0
- package/dist/agent/claude-client.js +214 -0
- package/dist/agent/claude-client.js.map +1 -0
- package/dist/agent/gateway-tool-executor.d.ts +75 -0
- package/dist/agent/gateway-tool-executor.d.ts.map +1 -0
- package/dist/agent/gateway-tool-executor.js +348 -0
- package/dist/agent/gateway-tool-executor.js.map +1 -0
- package/dist/agent/index.d.ts +13 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +18 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/mcp-executor.d.ts +75 -0
- package/dist/agent/mcp-executor.d.ts.map +1 -0
- package/dist/agent/mcp-executor.js +307 -0
- package/dist/agent/mcp-executor.js.map +1 -0
- package/dist/agent/session-pool.d.ts +148 -0
- package/dist/agent/session-pool.d.ts.map +1 -0
- package/dist/agent/session-pool.js +272 -0
- package/dist/agent/session-pool.js.map +1 -0
- package/dist/agent/streaming-callback-manager.d.ts +85 -0
- package/dist/agent/streaming-callback-manager.d.ts.map +1 -0
- package/dist/agent/streaming-callback-manager.js +103 -0
- package/dist/agent/streaming-callback-manager.js.map +1 -0
- package/dist/agent/types.d.ts +437 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +29 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/api/cron-handler.d.ts +44 -0
- package/dist/api/cron-handler.d.ts.map +1 -0
- package/dist/api/cron-handler.js +195 -0
- package/dist/api/cron-handler.js.map +1 -0
- package/dist/api/error-handler.d.ts +22 -0
- package/dist/api/error-handler.d.ts.map +1 -0
- package/dist/api/error-handler.js +104 -0
- package/dist/api/error-handler.js.map +1 -0
- package/dist/api/heartbeat-handler.d.ts +49 -0
- package/dist/api/heartbeat-handler.d.ts.map +1 -0
- package/dist/api/heartbeat-handler.js +91 -0
- package/dist/api/heartbeat-handler.js.map +1 -0
- package/dist/api/index.d.ts +61 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +145 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/types.d.ts +156 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +62 -0
- package/dist/api/types.js.map +1 -0
- package/dist/auth/index.d.ts +7 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +11 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/oauth-manager.d.ts +59 -0
- package/dist/auth/oauth-manager.d.ts.map +1 -0
- package/dist/auth/oauth-manager.js +237 -0
- package/dist/auth/oauth-manager.js.map +1 -0
- package/dist/auth/types.d.ts +92 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +23 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/cli/commands/init.d.ts +19 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +155 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/run.d.ts +19 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +89 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +19 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +134 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/start.d.ts +24 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +1073 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.d.ts +10 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +85 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +10 -0
- package/dist/cli/commands/stop.d.ts.map +1 -0
- package/dist/cli/commands/stop.js +65 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/config/config-manager.d.ts +51 -0
- package/dist/cli/config/config-manager.d.ts.map +1 -0
- package/dist/cli/config/config-manager.js +216 -0
- package/dist/cli/config/config-manager.js.map +1 -0
- package/dist/cli/config/types.d.ts +172 -0
- package/dist/cli/config/types.d.ts.map +1 -0
- package/dist/cli/config/types.js +48 -0
- package/dist/cli/config/types.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +92 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/pid-manager.d.ts +66 -0
- package/dist/cli/utils/pid-manager.d.ts.map +1 -0
- package/dist/cli/utils/pid-manager.js +167 -0
- package/dist/cli/utils/pid-manager.js.map +1 -0
- package/dist/concurrency/index.d.ts +13 -0
- package/dist/concurrency/index.d.ts.map +1 -0
- package/dist/concurrency/index.js +22 -0
- package/dist/concurrency/index.js.map +1 -0
- package/dist/concurrency/lane-manager.d.ts +113 -0
- package/dist/concurrency/lane-manager.d.ts.map +1 -0
- package/dist/concurrency/lane-manager.js +245 -0
- package/dist/concurrency/lane-manager.js.map +1 -0
- package/dist/concurrency/session-key.d.ts +41 -0
- package/dist/concurrency/session-key.d.ts.map +1 -0
- package/dist/concurrency/session-key.js +61 -0
- package/dist/concurrency/session-key.js.map +1 -0
- package/dist/concurrency/types.d.ts +69 -0
- package/dist/concurrency/types.d.ts.map +1 -0
- package/dist/concurrency/types.js +16 -0
- package/dist/concurrency/types.js.map +1 -0
- package/dist/gateways/channel-history.d.ts +102 -0
- package/dist/gateways/channel-history.d.ts.map +1 -0
- package/dist/gateways/channel-history.js +181 -0
- package/dist/gateways/channel-history.js.map +1 -0
- package/dist/gateways/context-injector.d.ts +74 -0
- package/dist/gateways/context-injector.d.ts.map +1 -0
- package/dist/gateways/context-injector.js +121 -0
- package/dist/gateways/context-injector.js.map +1 -0
- package/dist/gateways/discord.d.ts +122 -0
- package/dist/gateways/discord.d.ts.map +1 -0
- package/dist/gateways/discord.js +602 -0
- package/dist/gateways/discord.js.map +1 -0
- package/dist/gateways/index.d.ts +30 -0
- package/dist/gateways/index.d.ts.map +1 -0
- package/dist/gateways/index.js +49 -0
- package/dist/gateways/index.js.map +1 -0
- package/dist/gateways/message-router.d.ts +116 -0
- package/dist/gateways/message-router.d.ts.map +1 -0
- package/dist/gateways/message-router.js +315 -0
- package/dist/gateways/message-router.js.map +1 -0
- package/dist/gateways/message-splitter.d.ts +54 -0
- package/dist/gateways/message-splitter.d.ts.map +1 -0
- package/dist/gateways/message-splitter.js +146 -0
- package/dist/gateways/message-splitter.js.map +1 -0
- package/dist/gateways/plugin-loader.d.ts +76 -0
- package/dist/gateways/plugin-loader.d.ts.map +1 -0
- package/dist/gateways/plugin-loader.js +221 -0
- package/dist/gateways/plugin-loader.js.map +1 -0
- package/dist/gateways/session-store.d.ts +77 -0
- package/dist/gateways/session-store.d.ts.map +1 -0
- package/dist/gateways/session-store.js +233 -0
- package/dist/gateways/session-store.js.map +1 -0
- package/dist/gateways/slack.d.ts +90 -0
- package/dist/gateways/slack.d.ts.map +1 -0
- package/dist/gateways/slack.js +281 -0
- package/dist/gateways/slack.js.map +1 -0
- package/dist/gateways/telegram.d.ts +79 -0
- package/dist/gateways/telegram.d.ts.map +1 -0
- package/dist/gateways/telegram.js +207 -0
- package/dist/gateways/telegram.js.map +1 -0
- package/dist/gateways/types.d.ts +340 -0
- package/dist/gateways/types.d.ts.map +1 -0
- package/dist/gateways/types.js +6 -0
- package/dist/gateways/types.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/memory-logger.d.ts +47 -0
- package/dist/memory/memory-logger.d.ts.map +1 -0
- package/dist/memory/memory-logger.js +126 -0
- package/dist/memory/memory-logger.js.map +1 -0
- package/dist/onboarding/all-tools.d.ts +18 -0
- package/dist/onboarding/all-tools.d.ts.map +1 -0
- package/dist/onboarding/all-tools.js +149 -0
- package/dist/onboarding/all-tools.js.map +1 -0
- package/dist/onboarding/autonomous-discovery-tools.d.ts +13 -0
- package/dist/onboarding/autonomous-discovery-tools.d.ts.map +1 -0
- package/dist/onboarding/autonomous-discovery-tools.js +268 -0
- package/dist/onboarding/autonomous-discovery-tools.js.map +1 -0
- package/dist/onboarding/bootstrap-template.d.ts +5 -0
- package/dist/onboarding/bootstrap-template.d.ts.map +1 -0
- package/dist/onboarding/bootstrap-template.js +142 -0
- package/dist/onboarding/bootstrap-template.js.map +1 -0
- package/dist/onboarding/complete-autonomous-prompt.d.ts +13 -0
- package/dist/onboarding/complete-autonomous-prompt.d.ts.map +1 -0
- package/dist/onboarding/complete-autonomous-prompt.js +1220 -0
- package/dist/onboarding/complete-autonomous-prompt.js.map +1 -0
- package/dist/onboarding/onboarding-state.d.ts +70 -0
- package/dist/onboarding/onboarding-state.d.ts.map +1 -0
- package/dist/onboarding/onboarding-state.js +184 -0
- package/dist/onboarding/onboarding-state.js.map +1 -0
- package/dist/onboarding/personality-quiz.d.ts +35 -0
- package/dist/onboarding/personality-quiz.d.ts.map +1 -0
- package/dist/onboarding/personality-quiz.js +219 -0
- package/dist/onboarding/personality-quiz.js.map +1 -0
- package/dist/onboarding/phase-5-summary.d.ts +22 -0
- package/dist/onboarding/phase-5-summary.d.ts.map +1 -0
- package/dist/onboarding/phase-5-summary.js +151 -0
- package/dist/onboarding/phase-5-summary.js.map +1 -0
- package/dist/onboarding/phase-6-security.d.ts +33 -0
- package/dist/onboarding/phase-6-security.d.ts.map +1 -0
- package/dist/onboarding/phase-6-security.js +473 -0
- package/dist/onboarding/phase-6-security.js.map +1 -0
- package/dist/onboarding/phase-7-integrations.d.ts +66 -0
- package/dist/onboarding/phase-7-integrations.d.ts.map +1 -0
- package/dist/onboarding/phase-7-integrations.js +619 -0
- package/dist/onboarding/phase-7-integrations.js.map +1 -0
- package/dist/onboarding/phase-8-demo.d.ts +43 -0
- package/dist/onboarding/phase-8-demo.d.ts.map +1 -0
- package/dist/onboarding/phase-8-demo.js +346 -0
- package/dist/onboarding/phase-8-demo.js.map +1 -0
- package/dist/onboarding/phase-9-finalization.d.ts +22 -0
- package/dist/onboarding/phase-9-finalization.d.ts.map +1 -0
- package/dist/onboarding/phase-9-finalization.js +375 -0
- package/dist/onboarding/phase-9-finalization.js.map +1 -0
- package/dist/onboarding/ritual-prompt.d.ts +2 -0
- package/dist/onboarding/ritual-prompt.d.ts.map +1 -0
- package/dist/onboarding/ritual-prompt.js +285 -0
- package/dist/onboarding/ritual-prompt.js.map +1 -0
- package/dist/onboarding/ritual-tools.d.ts +13 -0
- package/dist/onboarding/ritual-tools.d.ts.map +1 -0
- package/dist/onboarding/ritual-tools.js +93 -0
- package/dist/onboarding/ritual-tools.js.map +1 -0
- package/dist/runners/cli-runner.d.ts +59 -0
- package/dist/runners/cli-runner.d.ts.map +1 -0
- package/dist/runners/cli-runner.js +190 -0
- package/dist/runners/cli-runner.js.map +1 -0
- package/dist/runners/index.d.ts +11 -0
- package/dist/runners/index.d.ts.map +1 -0
- package/dist/runners/index.js +15 -0
- package/dist/runners/index.js.map +1 -0
- package/dist/runners/types.d.ts +81 -0
- package/dist/runners/types.d.ts.map +1 -0
- package/dist/runners/types.js +31 -0
- package/dist/runners/types.js.map +1 -0
- package/dist/scheduler/cron-scheduler.d.ts +115 -0
- package/dist/scheduler/cron-scheduler.d.ts.map +1 -0
- package/dist/scheduler/cron-scheduler.js +320 -0
- package/dist/scheduler/cron-scheduler.js.map +1 -0
- package/dist/scheduler/heartbeat.d.ts +53 -0
- package/dist/scheduler/heartbeat.d.ts.map +1 -0
- package/dist/scheduler/heartbeat.js +160 -0
- package/dist/scheduler/heartbeat.js.map +1 -0
- package/dist/scheduler/index.d.ts +22 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +31 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/scheduler/job-lock.d.ts +85 -0
- package/dist/scheduler/job-lock.d.ts.map +1 -0
- package/dist/scheduler/job-lock.js +137 -0
- package/dist/scheduler/job-lock.js.map +1 -0
- package/dist/scheduler/recovery.d.ts +78 -0
- package/dist/scheduler/recovery.d.ts.map +1 -0
- package/dist/scheduler/recovery.js +124 -0
- package/dist/scheduler/recovery.js.map +1 -0
- package/dist/scheduler/schedule-store.d.ts +112 -0
- package/dist/scheduler/schedule-store.d.ts.map +1 -0
- package/dist/scheduler/schedule-store.js +259 -0
- package/dist/scheduler/schedule-store.js.map +1 -0
- package/dist/scheduler/token-keep-alive.d.ts +49 -0
- package/dist/scheduler/token-keep-alive.d.ts.map +1 -0
- package/dist/scheduler/token-keep-alive.js +102 -0
- package/dist/scheduler/token-keep-alive.js.map +1 -0
- package/dist/scheduler/types.d.ts +96 -0
- package/dist/scheduler/types.d.ts.map +1 -0
- package/dist/scheduler/types.js +21 -0
- package/dist/scheduler/types.js.map +1 -0
- package/dist/setup/setup-prompt.d.ts +2 -0
- package/dist/setup/setup-prompt.d.ts.map +1 -0
- package/dist/setup/setup-prompt.js +138 -0
- package/dist/setup/setup-prompt.js.map +1 -0
- package/dist/setup/setup-server.d.ts +8 -0
- package/dist/setup/setup-server.d.ts.map +1 -0
- package/dist/setup/setup-server.js +71 -0
- package/dist/setup/setup-server.js.map +1 -0
- package/dist/setup/setup-tools.d.ts +13 -0
- package/dist/setup/setup-tools.d.ts.map +1 -0
- package/dist/setup/setup-tools.js +103 -0
- package/dist/setup/setup-tools.js.map +1 -0
- package/dist/setup/setup-websocket.d.ts +6 -0
- package/dist/setup/setup-websocket.d.ts.map +1 -0
- package/dist/setup/setup-websocket.js +312 -0
- package/dist/setup/setup-websocket.js.map +1 -0
- package/dist/skills/index.d.ts +10 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +26 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/skill-executor.d.ts +48 -0
- package/dist/skills/skill-executor.d.ts.map +1 -0
- package/dist/skills/skill-executor.js +483 -0
- package/dist/skills/skill-executor.js.map +1 -0
- package/dist/skills/skill-loader.d.ts +40 -0
- package/dist/skills/skill-loader.d.ts.map +1 -0
- package/dist/skills/skill-loader.js +225 -0
- package/dist/skills/skill-loader.js.map +1 -0
- package/dist/skills/skill-matcher.d.ts +33 -0
- package/dist/skills/skill-matcher.d.ts.map +1 -0
- package/dist/skills/skill-matcher.js +190 -0
- package/dist/skills/skill-matcher.js.map +1 -0
- package/dist/skills/types.d.ts +123 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +12 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/tools/browser-tool.d.ts +149 -0
- package/dist/tools/browser-tool.d.ts.map +1 -0
- package/dist/tools/browser-tool.js +257 -0
- package/dist/tools/browser-tool.js.map +1 -0
- package/package.json +84 -0
- package/public/favicon.ico +0 -0
- package/public/setup.html +1026 -0
- package/public/viewer/icons/icon-192.png +0 -0
- package/public/viewer/icons/icon-512.png +0 -0
- package/public/viewer/js/modules/chat.js +1587 -0
- package/public/viewer/js/modules/dashboard.js +275 -0
- package/public/viewer/js/modules/graph.js +997 -0
- package/public/viewer/js/modules/memory.js +353 -0
- package/public/viewer/js/modules/settings.js +255 -0
- package/public/viewer/js/utils/api.js +169 -0
- package/public/viewer/js/utils/dom.js +92 -0
- package/public/viewer/js/utils/format.js +192 -0
- package/public/viewer/manifest.json +26 -0
- package/public/viewer/sw.js +131 -0
- package/public/viewer/viewer.css +500 -0
- package/public/viewer/viewer.html +1535 -0
- package/scripts/postinstall.js +118 -0
- package/templates/skills/document-analyze.md +63 -0
- package/templates/skills/heartbeat-report.md +75 -0
- package/templates/skills/image-translate.md +67 -0
- package/templates/workspace/skill-forge/DESIGN.md +115 -0
- package/templates/workspace/skill-forge/agents/architect.ts +295 -0
- package/templates/workspace/skill-forge/agents/developer.ts +364 -0
- package/templates/workspace/skill-forge/agents/qa.ts +313 -0
- package/templates/workspace/skill-forge/claude-api.ts +353 -0
- package/templates/workspace/skill-forge/discord-ui.ts +580 -0
- package/templates/workspace/skill-forge/error-handler.ts +354 -0
- package/templates/workspace/skill-forge/mama-integration.ts +357 -0
- package/templates/workspace/skill-forge/orchestrator.ts +495 -0
- package/templates/workspace/skill-forge/output/generated-skills/skills/hello-world/README.md +24 -0
- package/templates/workspace/skill-forge/output/generated-skills/skills/hello-world/index.ts +79 -0
- package/templates/workspace/skill-forge/output/generated-skills/skills/hello-world/types.ts +17 -0
- package/templates/workspace/skill-forge/package.json +21 -0
- package/templates/workspace/skill-forge/state/session.json +132 -0
- package/templates/workspace/skill-forge/test-e2e.ts +139 -0
- package/templates/workspace/skill-forge/tsconfig.json +20 -0
- package/templates/workspace/skill-forge/types.ts +159 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "e7520448-07ac-43c3-8aba-699bc7352566",
|
|
3
|
+
"phase": "qa_review",
|
|
4
|
+
"request": {
|
|
5
|
+
"name": "hello-world",
|
|
6
|
+
"description": "간단한 인사 스킬",
|
|
7
|
+
"triggers": ["/hello", "안녕"],
|
|
8
|
+
"capabilities": ["인사하기", "이름 받기"],
|
|
9
|
+
"rawInput": "/forge hello-world - 간단한 인사 스킬"
|
|
10
|
+
},
|
|
11
|
+
"artifacts": {
|
|
12
|
+
"architectOutput": {
|
|
13
|
+
"skillName": "hello-world",
|
|
14
|
+
"purpose": "간단한 인사 스킬",
|
|
15
|
+
"triggers": ["/hello", "안녕"],
|
|
16
|
+
"workflow": [
|
|
17
|
+
{
|
|
18
|
+
"step": 1,
|
|
19
|
+
"action": "parse",
|
|
20
|
+
"description": "사용자 입력 파싱"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"step": 2,
|
|
24
|
+
"action": "validate",
|
|
25
|
+
"description": "입력 검증"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"step": 3,
|
|
29
|
+
"action": "execute",
|
|
30
|
+
"description": "핵심 로직 실행"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"step": 4,
|
|
34
|
+
"action": "format",
|
|
35
|
+
"description": "결과 포맷팅"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"step": 5,
|
|
39
|
+
"action": "respond",
|
|
40
|
+
"description": "응답 반환"
|
|
41
|
+
}
|
|
42
|
+
],
|
|
43
|
+
"fileStructure": [
|
|
44
|
+
{
|
|
45
|
+
"path": "skills/hello-world/index.ts",
|
|
46
|
+
"purpose": "메인 진입점"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"path": "skills/hello-world/types.ts",
|
|
50
|
+
"purpose": "타입 정의"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"path": "skills/hello-world/README.md",
|
|
54
|
+
"purpose": "사용법 문서"
|
|
55
|
+
}
|
|
56
|
+
],
|
|
57
|
+
"toolsRequired": ["discord_send"],
|
|
58
|
+
"estimatedComplexity": "simple"
|
|
59
|
+
},
|
|
60
|
+
"developerOutput": {
|
|
61
|
+
"files": [
|
|
62
|
+
{
|
|
63
|
+
"path": "skills/hello-world/index.ts",
|
|
64
|
+
"content": "/**\n * hello-world - 간단한 인사 스킬\n *\n * @triggers /hello, 안녕\n * @complexity simple\n */\n\nimport { SkillContext, SkillResult } from './types';\n\n// ===== Skill Definition =====\n\nexport const skill = {\n name: 'hello-world',\n description: '간단한 인사 스킬',\n triggers: [\"/hello\",\"안녕\"],\n\n async execute(context: SkillContext): Promise<SkillResult> {\n try {\n console.log('[hello-world] 시작:', context.input);\n\n // Workflow Steps\n // Step 1: parse - 사용자 입력 파싱\n const step1 = await parse(context.input);\n // Step 2: validate - 입력 검증\n const step2 = await validate(step1);\n // Step 3: execute - 핵심 로직 실행\n const step3 = await execute(step2);\n // Step 4: format - 결과 포맷팅\n const step4 = await format(step3);\n // Step 5: respond - 응답 반환\n const step5 = await respond(step4);\n\n return {\n success: true,\n message: String(step5),\n };\n } catch (error) {\n console.error('[hello-world] 에러:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : '알 수 없는 에러',\n };\n }\n },\n};\n\n// ===== Helper Functions =====\n\nasync function parse(input: unknown): Promise<unknown> {\n // 사용자 입력 파싱\n console.log('[parse]', input);\n return input;\n}\n\nasync function validate(input: unknown): Promise<unknown> {\n // 입력 검증\n console.log('[validate]', input);\n return input;\n}\n\nasync function execute(input: unknown): Promise<unknown> {\n // 핵심 로직 실행\n console.log('[execute]', input);\n return input;\n}\n\nasync function format(input: unknown): Promise<unknown> {\n // 결과 포맷팅\n console.log('[format]', input);\n return input;\n}\n\nasync function respond(input: unknown): Promise<unknown> {\n // 응답 반환\n console.log('[respond]', input);\n return input;\n}\n\nexport default skill;\n",
|
|
65
|
+
"language": "typescript"
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"path": "skills/hello-world/types.ts",
|
|
69
|
+
"content": "/**\n * hello-world - Type Definitions\n */\n\nexport interface SkillContext {\n input: string;\n channelId?: string;\n userId?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface SkillResult {\n success: boolean;\n message?: string;\n error?: string;\n data?: unknown;\n}\n",
|
|
70
|
+
"language": "typescript"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"path": "skills/hello-world/README.md",
|
|
74
|
+
"content": "# hello-world\n\n> 간단한 인사 스킬\n\n## 트리거\n\n- `/hello`\n- `안녕`\n\n## 워크플로우\n\n1. **parse**: 사용자 입력 파싱\n2. **validate**: 입력 검증\n3. **execute**: 핵심 로직 실행\n4. **format**: 결과 포맷팅\n5. **respond**: 응답 반환\n\n## 필요한 도구\n\n- discord_send\n\n---\nGenerated by Skill Forge 🔥\n",
|
|
75
|
+
"language": "markdown"
|
|
76
|
+
}
|
|
77
|
+
],
|
|
78
|
+
"installInstructions": [],
|
|
79
|
+
"testCommands": ["npx tsx skills/hello-world/index.ts"]
|
|
80
|
+
},
|
|
81
|
+
"qaOutput": {
|
|
82
|
+
"passed": true,
|
|
83
|
+
"checklist": [
|
|
84
|
+
{
|
|
85
|
+
"item": "필수 파일 생성됨",
|
|
86
|
+
"passed": true,
|
|
87
|
+
"note": "3개 파일"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"item": "index.ts 존재",
|
|
91
|
+
"passed": true
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"item": "types.ts 존재",
|
|
95
|
+
"passed": true
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"item": "export 문 존재",
|
|
99
|
+
"passed": true
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"item": "에러 핸들링 (try-catch)",
|
|
103
|
+
"passed": true
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"item": "타입 어노테이션",
|
|
107
|
+
"passed": true
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"item": "하드코딩 비밀 없음",
|
|
111
|
+
"passed": true
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"item": "트리거 정의됨",
|
|
115
|
+
"passed": true
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"item": "README 존재",
|
|
119
|
+
"passed": true
|
|
120
|
+
}
|
|
121
|
+
],
|
|
122
|
+
"issues": [],
|
|
123
|
+
"recommendation": "approve"
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
"countdown": {
|
|
127
|
+
"startedAt": "2026-01-31T16:49:55.891Z",
|
|
128
|
+
"durationMs": 2000
|
|
129
|
+
},
|
|
130
|
+
"createdAt": "2026-01-31T16:49:51.876Z",
|
|
131
|
+
"updatedAt": "2026-01-31T16:49:55.891Z"
|
|
132
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Forge - End-to-End Test
|
|
3
|
+
*
|
|
4
|
+
* Phase 1 완성 테스트
|
|
5
|
+
* Orchestrator + Architect + Discord UI 통합
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { createOrchestrator } from './orchestrator';
|
|
9
|
+
import {
|
|
10
|
+
formatCountdownMessage,
|
|
11
|
+
formatProgressMessage,
|
|
12
|
+
formatCompletionMessage,
|
|
13
|
+
} from './discord-ui';
|
|
14
|
+
import { SkillRequest, SessionPhase } from './types';
|
|
15
|
+
|
|
16
|
+
async function runE2ETest() {
|
|
17
|
+
console.log('═'.repeat(60));
|
|
18
|
+
console.log('🔥 Skill Forge E2E Test - Phase 1');
|
|
19
|
+
console.log('═'.repeat(60));
|
|
20
|
+
console.log('');
|
|
21
|
+
|
|
22
|
+
// 1. Orchestrator 생성
|
|
23
|
+
const orchestrator = createOrchestrator({
|
|
24
|
+
countdownMs: 2000, // 테스트용 2초
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
// 2. 이벤트 로깅
|
|
28
|
+
orchestrator.onEvent((event) => {
|
|
29
|
+
console.log(`\n📢 [${event.type}]`);
|
|
30
|
+
|
|
31
|
+
switch (event.type) {
|
|
32
|
+
case 'REQUEST_RECEIVED':
|
|
33
|
+
console.log(` 스킬: ${event.request.name}`);
|
|
34
|
+
console.log(` 설명: ${event.request.description}`);
|
|
35
|
+
break;
|
|
36
|
+
|
|
37
|
+
case 'AGENT_START':
|
|
38
|
+
console.log(` ${formatProgressMessage(event.agent as SessionPhase)}`);
|
|
39
|
+
break;
|
|
40
|
+
|
|
41
|
+
case 'AGENT_COMPLETE':
|
|
42
|
+
if (event.agent === 'architect') {
|
|
43
|
+
const output = event.output as any;
|
|
44
|
+
console.log(` ✅ 설계 완료: ${output.skillName}`);
|
|
45
|
+
console.log(` 📋 워크플로우: ${output.workflow.length}단계`);
|
|
46
|
+
console.log(` 📁 파일: ${output.fileStructure.length}개`);
|
|
47
|
+
}
|
|
48
|
+
break;
|
|
49
|
+
|
|
50
|
+
case 'COUNTDOWN_START':
|
|
51
|
+
console.log(` ⏳ ${event.phase} 카운트다운 시작`);
|
|
52
|
+
break;
|
|
53
|
+
|
|
54
|
+
case 'COUNTDOWN_EXPIRE':
|
|
55
|
+
console.log(` ⏰ 카운트다운 만료 - 자동 승인`);
|
|
56
|
+
break;
|
|
57
|
+
|
|
58
|
+
case 'SESSION_COMPLETE':
|
|
59
|
+
console.log(` ${event.success ? '🎉 성공!' : '❌ 실패'}`);
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// 3. 테스트 요청
|
|
65
|
+
const testRequest: SkillRequest = {
|
|
66
|
+
name: 'weather-check',
|
|
67
|
+
description: '현재 날씨 정보를 조회하고 알려줍니다',
|
|
68
|
+
triggers: ['/weather', '날씨 알려줘', '오늘 날씨'],
|
|
69
|
+
capabilities: ['API 호출', '데이터 파싱', '응답 포맷팅'],
|
|
70
|
+
rawInput: '/forge weather-check - 현재 날씨 정보를 조회하고 알려줍니다',
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
console.log('\n📝 테스트 요청:');
|
|
74
|
+
console.log(` 스킬명: ${testRequest.name}`);
|
|
75
|
+
console.log(` 설명: ${testRequest.description}`);
|
|
76
|
+
console.log(` 트리거: ${testRequest.triggers.join(', ')}`);
|
|
77
|
+
|
|
78
|
+
// 4. 세션 시작
|
|
79
|
+
console.log('\n' + '─'.repeat(60));
|
|
80
|
+
console.log('🚀 세션 시작...');
|
|
81
|
+
console.log('─'.repeat(60));
|
|
82
|
+
|
|
83
|
+
try {
|
|
84
|
+
const state = await orchestrator.startSession(testRequest);
|
|
85
|
+
|
|
86
|
+
// 5. Architect 결과 출력 (Discord UI 포맷)
|
|
87
|
+
if (state.artifacts.architectOutput) {
|
|
88
|
+
console.log('\n' + '─'.repeat(60));
|
|
89
|
+
console.log('📱 Discord UI Preview (Architect Review)');
|
|
90
|
+
console.log('─'.repeat(60));
|
|
91
|
+
|
|
92
|
+
const discordMessage = formatCountdownMessage('architect_review', 5, state.artifacts);
|
|
93
|
+
|
|
94
|
+
console.log('\n' + discordMessage.content);
|
|
95
|
+
|
|
96
|
+
console.log('\n🔘 버튼:', discordMessage.components?.[0]?.map((b) => b.label).join(' | '));
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// 6. 전체 파이프라인 대기 (Developer → QA → Complete)
|
|
100
|
+
console.log('\n' + '─'.repeat(60));
|
|
101
|
+
console.log('⏳ 전체 파이프라인 실행 대기 (6초)...');
|
|
102
|
+
console.log('─'.repeat(60));
|
|
103
|
+
|
|
104
|
+
await new Promise((resolve) => setTimeout(resolve, 6000));
|
|
105
|
+
|
|
106
|
+
// 7. 최종 상태 확인
|
|
107
|
+
const finalState = orchestrator.getState();
|
|
108
|
+
console.log('\n' + '─'.repeat(60));
|
|
109
|
+
console.log('📊 최종 상태');
|
|
110
|
+
console.log('─'.repeat(60));
|
|
111
|
+
|
|
112
|
+
console.log(` Phase: ${finalState?.phase}`);
|
|
113
|
+
console.log(` Architect: ${finalState?.artifacts.architectOutput ? '✅' : '❌'}`);
|
|
114
|
+
console.log(` Developer: ${finalState?.artifacts.developerOutput ? '✅' : '❌'}`);
|
|
115
|
+
console.log(` QA: ${finalState?.artifacts.qaOutput ? '✅' : '❌'}`);
|
|
116
|
+
|
|
117
|
+
// 8. 완료 메시지
|
|
118
|
+
if (finalState?.phase === 'completed') {
|
|
119
|
+
console.log('\n' + '─'.repeat(60));
|
|
120
|
+
console.log('📱 Discord UI Preview (Completion)');
|
|
121
|
+
console.log('─'.repeat(60));
|
|
122
|
+
console.log('\n' + formatCompletionMessage(finalState));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
console.log('\n' + '═'.repeat(60));
|
|
126
|
+
console.log('✅ E2E Test 완료!');
|
|
127
|
+
console.log('═'.repeat(60));
|
|
128
|
+
} catch (error) {
|
|
129
|
+
console.error('\n❌ 테스트 실패:', error);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
process.exit(0);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// ESM entry point
|
|
136
|
+
const isMainModule = import.meta.url === `file://${process.argv[1]}`;
|
|
137
|
+
if (isMainModule) {
|
|
138
|
+
runE2ETest();
|
|
139
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "ESNext",
|
|
5
|
+
"moduleResolution": "bundler",
|
|
6
|
+
"lib": ["ES2022"],
|
|
7
|
+
"outDir": "./dist",
|
|
8
|
+
"rootDir": "./",
|
|
9
|
+
"strict": true,
|
|
10
|
+
"esModuleInterop": true,
|
|
11
|
+
"skipLibCheck": true,
|
|
12
|
+
"forceConsistentCasingInFileNames": true,
|
|
13
|
+
"declaration": true,
|
|
14
|
+
"declarationMap": true,
|
|
15
|
+
"sourceMap": true,
|
|
16
|
+
"resolveJsonModule": true
|
|
17
|
+
},
|
|
18
|
+
"include": ["*.ts", "agents/**/*.ts"],
|
|
19
|
+
"exclude": ["node_modules", "dist"]
|
|
20
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Forge - Type Definitions
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
// ===== Agent Types =====
|
|
6
|
+
|
|
7
|
+
export type AgentRole = 'architect' | 'developer' | 'qa';
|
|
8
|
+
|
|
9
|
+
export type AgentModel = 'sonnet' | 'opus' | 'haiku';
|
|
10
|
+
|
|
11
|
+
export interface AgentConfig {
|
|
12
|
+
role: AgentRole;
|
|
13
|
+
model: AgentModel;
|
|
14
|
+
systemPrompt: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// ===== Session State =====
|
|
18
|
+
|
|
19
|
+
export type SessionPhase =
|
|
20
|
+
| 'idle' // 대기 중
|
|
21
|
+
| 'architect' // Architect 작업 중
|
|
22
|
+
| 'architect_review' // Architect 결과 검토 (카운트다운)
|
|
23
|
+
| 'developer' // Developer 작업 중
|
|
24
|
+
| 'developer_review' // Developer 결과 검토 (카운트다운)
|
|
25
|
+
| 'qa' // QA 작업 중
|
|
26
|
+
| 'qa_review' // QA 결과 검토 (카운트다운)
|
|
27
|
+
| 'completed' // 완료
|
|
28
|
+
| 'cancelled'; // 취소됨
|
|
29
|
+
|
|
30
|
+
export interface SessionState {
|
|
31
|
+
id: string;
|
|
32
|
+
phase: SessionPhase;
|
|
33
|
+
request: SkillRequest;
|
|
34
|
+
artifacts: SessionArtifacts;
|
|
35
|
+
countdown: CountdownState | null;
|
|
36
|
+
createdAt: string;
|
|
37
|
+
updatedAt: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface SkillRequest {
|
|
41
|
+
name: string;
|
|
42
|
+
description: string;
|
|
43
|
+
triggers: string[];
|
|
44
|
+
capabilities: string[];
|
|
45
|
+
rawInput: string;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface SessionArtifacts {
|
|
49
|
+
architectOutput?: ArchitectOutput;
|
|
50
|
+
developerOutput?: DeveloperOutput;
|
|
51
|
+
qaOutput?: QAOutput;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// ===== Agent Outputs =====
|
|
55
|
+
|
|
56
|
+
export interface ArchitectOutput {
|
|
57
|
+
skillName: string;
|
|
58
|
+
purpose: string;
|
|
59
|
+
triggers: string[];
|
|
60
|
+
workflow: WorkflowStep[];
|
|
61
|
+
fileStructure: FileSpec[];
|
|
62
|
+
toolsRequired: string[];
|
|
63
|
+
estimatedComplexity: 'simple' | 'medium' | 'complex';
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface WorkflowStep {
|
|
67
|
+
step: number;
|
|
68
|
+
action: string;
|
|
69
|
+
description: string;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export interface FileSpec {
|
|
73
|
+
path: string;
|
|
74
|
+
purpose: string;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export interface DeveloperOutput {
|
|
78
|
+
files: GeneratedFile[];
|
|
79
|
+
installInstructions: string[];
|
|
80
|
+
testCommands: string[];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export interface GeneratedFile {
|
|
84
|
+
path: string;
|
|
85
|
+
content: string;
|
|
86
|
+
language: string;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export interface QAOutput {
|
|
90
|
+
passed: boolean;
|
|
91
|
+
checklist: ChecklistItem[];
|
|
92
|
+
issues: QAIssue[];
|
|
93
|
+
recommendation: 'approve' | 'revise' | 'reject';
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export interface ChecklistItem {
|
|
97
|
+
item: string;
|
|
98
|
+
passed: boolean;
|
|
99
|
+
note?: string;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export interface QAIssue {
|
|
103
|
+
severity: 'critical' | 'warning' | 'suggestion';
|
|
104
|
+
description: string;
|
|
105
|
+
location?: string;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// ===== Countdown =====
|
|
109
|
+
|
|
110
|
+
export interface CountdownState {
|
|
111
|
+
startedAt: string;
|
|
112
|
+
durationMs: number;
|
|
113
|
+
messageId?: string;
|
|
114
|
+
channelId?: string;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// ===== Discord Integration =====
|
|
118
|
+
|
|
119
|
+
export interface DiscordAction {
|
|
120
|
+
type: 'approve' | 'revise' | 'cancel' | 'extend';
|
|
121
|
+
userId: string;
|
|
122
|
+
timestamp: string;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// ===== Orchestrator Events =====
|
|
126
|
+
|
|
127
|
+
export type OrchestratorEvent =
|
|
128
|
+
| { type: 'REQUEST_RECEIVED'; request: SkillRequest }
|
|
129
|
+
| { type: 'AGENT_START'; agent: AgentRole }
|
|
130
|
+
| { type: 'AGENT_COMPLETE'; agent: AgentRole; output: unknown }
|
|
131
|
+
| { type: 'COUNTDOWN_START'; phase: SessionPhase }
|
|
132
|
+
| { type: 'COUNTDOWN_EXPIRE' }
|
|
133
|
+
| { type: 'USER_ACTION'; action: DiscordAction }
|
|
134
|
+
| { type: 'SESSION_COMPLETE'; success: boolean }
|
|
135
|
+
| { type: 'ERROR'; error: string };
|
|
136
|
+
|
|
137
|
+
// ===== Config =====
|
|
138
|
+
|
|
139
|
+
export interface SkillForgeConfig {
|
|
140
|
+
countdownMs: number; // 기본 5000 (5초)
|
|
141
|
+
outputDir: string;
|
|
142
|
+
stateFile: string;
|
|
143
|
+
models: {
|
|
144
|
+
architect: AgentModel;
|
|
145
|
+
developer: AgentModel;
|
|
146
|
+
qa: AgentModel;
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export const DEFAULT_CONFIG: SkillForgeConfig = {
|
|
151
|
+
countdownMs: 5000,
|
|
152
|
+
outputDir: '~/.mama/workspace/skill-forge/output/generated-skills',
|
|
153
|
+
stateFile: '~/.mama/workspace/skill-forge/state/session.json',
|
|
154
|
+
models: {
|
|
155
|
+
architect: 'sonnet',
|
|
156
|
+
developer: 'opus',
|
|
157
|
+
qa: 'haiku',
|
|
158
|
+
},
|
|
159
|
+
};
|