makdoong2-team 1.3.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.
- package/LICENSE +21 -0
- package/README.md +193 -0
- package/agents/makdoong2-analyzer.md +135 -0
- package/agents/makdoong2-engineer.md +165 -0
- package/agents/makdoong2-planner.md +267 -0
- package/agents/makdoong2-publisher.md +481 -0
- package/agents/makdoong2-team-leader.md +249 -0
- package/agents/makdoong2-verifier.md +353 -0
- package/assets/makdoong2-team.default.json +46 -0
- package/assets/makdoong2-team.schema.json +357 -0
- package/bin/cli.js +404 -0
- package/dist/agent-stage-config.d.ts +15 -0
- package/dist/agent-stage-config.js +119 -0
- package/dist/config.d.ts +79 -0
- package/dist/config.js +96 -0
- package/dist/logger.d.ts +14 -0
- package/dist/logger.js +131 -0
- package/dist/mcp-secret-injector.d.ts +56 -0
- package/dist/mcp-secret-injector.js +89 -0
- package/dist/model-chain-cli.d.ts +1 -0
- package/dist/model-chain-cli.js +21 -0
- package/dist/model-fallback-policy.d.ts +69 -0
- package/dist/model-fallback-policy.js +211 -0
- package/dist/opencode-plugin.d.ts +8 -0
- package/dist/opencode-plugin.js +2457 -0
- package/dist/poll-sub-session.d.ts +139 -0
- package/dist/poll-sub-session.js +494 -0
- package/dist/redact-secrets.d.ts +3 -0
- package/dist/redact-secrets.js +68 -0
- package/dist/session-index.d.ts +11 -0
- package/dist/session-index.js +71 -0
- package/dist/skill-mcp-registry.d.ts +59 -0
- package/dist/skill-mcp-registry.js +178 -0
- package/dist/stall-escalation.d.ts +1 -0
- package/dist/stall-escalation.js +22 -0
- package/dist/tmux-monitor.d.ts +193 -0
- package/dist/tmux-monitor.js +694 -0
- package/dist/verdict-hash.d.ts +1 -0
- package/dist/verdict-hash.js +62 -0
- package/gates/stage-analysis-verify.sh +84 -0
- package/gates/stage2-requirements-verify.sh +13 -0
- package/gates/stage3-scope-verify.sh +45 -0
- package/gates/stage4-dev-post-verify.sh +64 -0
- package/gates/stage4-dev-verify.sh +36 -0
- package/gates/stage5-coverage-verify.sh +36 -0
- package/gates/stage5-test-verify.sh +24 -0
- package/gates/stage6-commit-verify.sh +41 -0
- package/gates/stage6-post-commit-verify.sh +131 -0
- package/gates/stage7-post-pr-verify.sh +53 -0
- package/gates/stage7-pr-verify.sh +48 -0
- package/gates/stage8-post-review-verify.sh +84 -0
- package/gates/stage8-review-verify.sh +45 -0
- package/gates/verify.sh +44 -0
- package/opencode.json.example +40 -0
- package/package.json +84 -0
- package/postinstall.mjs +56 -0
- package/references/commit-convention.md +130 -0
- package/references/jira-issue-templates.md +203 -0
- package/references/pr-template.md +381 -0
- package/scripts/config.sh +46 -0
- package/scripts/coverage-record.sh +67 -0
- package/scripts/gate-policy-test.sh +152 -0
- package/scripts/install-lib.mjs +1029 -0
- package/scripts/lint-agent-prompts.sh +74 -0
- package/scripts/log-event.sh +44 -0
- package/scripts/model-policy.mjs +183 -0
- package/scripts/publish-if-changed.sh +207 -0
- package/scripts/release.sh +276 -0
- package/scripts/rollback-commits.sh +35 -0
- package/scripts/smoke-test.mjs +194 -0
- package/scripts/state.sh +192 -0
- package/scripts/test-postinstall.mjs +141 -0
- package/scripts/with-fallback.sh +56 -0
- package/scripts/wt-sync-ignored.sh +193 -0
- package/skills/_lib/load-secret.sh +149 -0
- package/skills/bamboo-ci/SKILL.md +81 -0
- package/skills/bamboo-ci/run-bamboo.sh +23 -0
- package/skills/bitbucket-research/SKILL.md +87 -0
- package/skills/bitbucket-research/run-repos.sh +23 -0
- package/skills/confluence-research/SKILL.md +75 -0
- package/skills/confluence-research/run-docs.sh +23 -0
- package/skills/github-oss-research/SKILL.md +59 -0
- package/skills/jira-research/SKILL.md +75 -0
- package/skills/jira-research/run-works.sh +23 -0
- package/src/hooks/guard-bash.sh +67 -0
- package/src/hooks/session-start.sh +96 -0
- package/src/hooks/sync-state.sh +47 -0
- package/stages/01-jira.md +43 -0
- package/stages/01-planning.md +229 -0
- package/stages/02-requirements.md +298 -0
- package/stages/03-scope.md +81 -0
- package/stages/04-analysis.md +281 -0
- package/stages/05-worktree-dev.md +124 -0
- package/stages/06-test.md +161 -0
- package/stages/07-commit.md +229 -0
- package/stages/08-pr.md +177 -0
- package/stages/09-review-comments.md +277 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# Shared credential loader sourced by skills/*/run-*.sh.
|
|
2
|
+
#
|
|
3
|
+
# Contract: load_secret_from_makdoong2_config TAG VAR_NAME [HELP_HINT]
|
|
4
|
+
# TAG short caller label used in stderr prefix
|
|
5
|
+
# VAR_NAME .secrets.<VAR_NAME> lookup key AND exported env var name
|
|
6
|
+
# HELP_HINT optional trailing hint printed on the missing-token path
|
|
7
|
+
#
|
|
8
|
+
# Exit codes (propagated to opencode's MCP-spawn error surface):
|
|
9
|
+
# 65 jq missing 66 makdoong2-team.json missing
|
|
10
|
+
# 67 invalid JSON 68 .secrets.<VAR_NAME> null/empty
|
|
11
|
+
|
|
12
|
+
set -uo pipefail
|
|
13
|
+
|
|
14
|
+
load_secret_from_makdoong2_config() {
|
|
15
|
+
local tag="${1:?load_secret: TAG missing}"
|
|
16
|
+
local var_name="${2:?load_secret: VAR_NAME missing}"
|
|
17
|
+
local help_hint="${3:-}"
|
|
18
|
+
|
|
19
|
+
local cfg_dir="${MAKDOONG2_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}"
|
|
20
|
+
local cfg_file="$cfg_dir/makdoong2-team.json"
|
|
21
|
+
|
|
22
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
23
|
+
printf '[%s] jq not found on PATH — install jq to load credentials from %s\n' \
|
|
24
|
+
"$tag" "$cfg_file" >&2
|
|
25
|
+
return 65
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
if [ ! -f "$cfg_file" ]; then
|
|
29
|
+
cat >&2 <<EOF
|
|
30
|
+
[$tag] makdoong2-team.json not found at $cfg_file
|
|
31
|
+
|
|
32
|
+
Run 'npx makdoong2-team install' to seed it, then edit the file and set:
|
|
33
|
+
|
|
34
|
+
{
|
|
35
|
+
"secrets": {
|
|
36
|
+
"$var_name": "<your token>"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
EOF
|
|
40
|
+
return 66
|
|
41
|
+
fi
|
|
42
|
+
|
|
43
|
+
# `jq -e` fails when the file cannot be parsed; capture stderr for diagnostics.
|
|
44
|
+
local token jq_err
|
|
45
|
+
jq_err=$(mktemp 2>/dev/null || echo "/tmp/load-secret.$$.err")
|
|
46
|
+
token=$(jq -r --arg k "$var_name" '.secrets[$k] // empty' "$cfg_file" 2>"$jq_err")
|
|
47
|
+
local jq_status=$?
|
|
48
|
+
if [ "$jq_status" -ne 0 ]; then
|
|
49
|
+
printf '[%s] makdoong2-team.json is not valid JSON: %s\n' "$tag" "$cfg_file" >&2
|
|
50
|
+
if [ -s "$jq_err" ]; then sed -e "s/^/[$tag] jq: /" "$jq_err" >&2; fi
|
|
51
|
+
rm -f "$jq_err"
|
|
52
|
+
return 67
|
|
53
|
+
fi
|
|
54
|
+
rm -f "$jq_err"
|
|
55
|
+
|
|
56
|
+
if [ -z "$token" ] || [ "$token" = "null" ]; then
|
|
57
|
+
cat >&2 <<EOF
|
|
58
|
+
[$tag] .secrets.$var_name is not set in $cfg_file
|
|
59
|
+
|
|
60
|
+
Edit the file and add:
|
|
61
|
+
|
|
62
|
+
{
|
|
63
|
+
"secrets": {
|
|
64
|
+
"$var_name": "<your token>"
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
Then restart opencode so the skill re-spawns.
|
|
69
|
+
EOF
|
|
70
|
+
if [ -n "$help_hint" ]; then printf '[%s] %s\n' "$tag" "$help_hint" >&2; fi
|
|
71
|
+
return 68
|
|
72
|
+
fi
|
|
73
|
+
|
|
74
|
+
local existing_token
|
|
75
|
+
eval "existing_token=\${$var_name:-}"
|
|
76
|
+
|
|
77
|
+
if [ -n "$existing_token" ] && [ "$existing_token" != "$token" ]; then
|
|
78
|
+
cat >&2 <<EOF
|
|
79
|
+
[$tag] WARNING: $var_name mismatch detected
|
|
80
|
+
opencode.json (or pre-set env): ${existing_token:0:20}...
|
|
81
|
+
makdoong2-team.json (SSoT): ${token:0:20}...
|
|
82
|
+
|
|
83
|
+
makdoong2-team plugin enforces SSoT policy: using makdoong2-team.json value.
|
|
84
|
+
To avoid this warning, update opencode.json or ensure both files have identical tokens.
|
|
85
|
+
EOF
|
|
86
|
+
unset "$var_name"
|
|
87
|
+
fi
|
|
88
|
+
|
|
89
|
+
# shellcheck disable=SC2163
|
|
90
|
+
export "$var_name=$token"
|
|
91
|
+
return 0
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
# Contract: load_host_from_makdoong2_config TAG VAR_NAME [HELP_HINT]
|
|
95
|
+
# TAG short caller label used in stderr prefix
|
|
96
|
+
# VAR_NAME .hosts.<VAR_NAME> lookup key AND exported env var name
|
|
97
|
+
# HELP_HINT optional trailing hint printed on the missing-host path
|
|
98
|
+
#
|
|
99
|
+
# Exit codes:
|
|
100
|
+
# 65 jq missing 66 makdoong2-team.json missing
|
|
101
|
+
# 67 invalid JSON 69 .hosts.<VAR_NAME> null/empty
|
|
102
|
+
load_host_from_makdoong2_config() {
|
|
103
|
+
local tag="${1:?load_host: TAG missing}"
|
|
104
|
+
local var_name="${2:?load_host: VAR_NAME missing}"
|
|
105
|
+
local help_hint="${3:-}"
|
|
106
|
+
|
|
107
|
+
local cfg_dir="${MAKDOONG2_CONFIG_DIR:-${XDG_CONFIG_HOME:-$HOME/.config}/opencode}"
|
|
108
|
+
local cfg_file="$cfg_dir/makdoong2-team.json"
|
|
109
|
+
|
|
110
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
111
|
+
printf '[%s] jq not found on PATH — install jq to load hosts from %s\n' \
|
|
112
|
+
"$tag" "$cfg_file" >&2
|
|
113
|
+
return 65
|
|
114
|
+
fi
|
|
115
|
+
|
|
116
|
+
if [ ! -f "$cfg_file" ]; then
|
|
117
|
+
printf '[%s] makdoong2-team.json not found at %s\n' "$tag" "$cfg_file" >&2
|
|
118
|
+
return 66
|
|
119
|
+
fi
|
|
120
|
+
|
|
121
|
+
local host
|
|
122
|
+
host=$(jq -r --arg k "$var_name" '.hosts[$k] // empty' "$cfg_file" 2>/dev/null)
|
|
123
|
+
if [ $? -ne 0 ]; then
|
|
124
|
+
printf '[%s] makdoong2-team.json is not valid JSON: %s\n' "$tag" "$cfg_file" >&2
|
|
125
|
+
return 67
|
|
126
|
+
fi
|
|
127
|
+
|
|
128
|
+
if [ -z "$host" ] || [ "$host" = "null" ]; then
|
|
129
|
+
cat >&2 <<EOF
|
|
130
|
+
[$tag] .hosts.$var_name is not set in $cfg_file
|
|
131
|
+
|
|
132
|
+
Edit the file and add your on-prem endpoint:
|
|
133
|
+
|
|
134
|
+
{
|
|
135
|
+
"hosts": {
|
|
136
|
+
"$var_name": "<your host or base URL>"
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
Then restart opencode so the skill re-spawns.
|
|
141
|
+
EOF
|
|
142
|
+
if [ -n "$help_hint" ]; then printf '[%s] %s\n' "$tag" "$help_hint" >&2; fi
|
|
143
|
+
return 69
|
|
144
|
+
fi
|
|
145
|
+
|
|
146
|
+
# shellcheck disable=SC2163
|
|
147
|
+
export "$var_name=$host"
|
|
148
|
+
return 0
|
|
149
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bamboo-ci
|
|
3
|
+
description: Bamboo CI/CD 스킬. Bamboo 대상. 빌드 실행, 배포, 빌드 플랜 조회/생성, 빌드 상태 확인, 실패 로그 요약 시 사용. 검색 키는 조직의 기본 Bamboo 프로젝트로 고정이며, 플랜 생성·트리거·배포 실행 권한을 갖는다.
|
|
4
|
+
mcp:
|
|
5
|
+
bamboo:
|
|
6
|
+
command: bash
|
|
7
|
+
args: ["-c", 'exec "${XDG_CONFIG_HOME:-$HOME/.config}/opencode/skills/bamboo-ci/run-bamboo.sh"']
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Skill: bamboo-ci
|
|
11
|
+
|
|
12
|
+
> Bamboo CI/CD 작업 스킬 — 설정된 `BAMBOO_URL` (makdoong2-team.json `.hosts`)
|
|
13
|
+
|
|
14
|
+
## 사전 조건 (필수)
|
|
15
|
+
|
|
16
|
+
이 스킬의 `bamboo` MCP 는 lazy-load 다. `skill_mcp(mcp_name="bamboo", ...)` 를 부르기 전에 반드시 `skill(name="bamboo-ci")` 로 skill 을 이 세션에 로드해야 한다. 로드 없이 호출하면 `MCP server "bamboo" not found` 로 실패한다.
|
|
17
|
+
|
|
18
|
+
## MCP
|
|
19
|
+
|
|
20
|
+
- **bamboo** (Atlassian Bamboo MCP) — mcp_name 은 `bamboo` 다. `skill_mcp(mcp_name="bamboo", ...)` 로 호출한다.
|
|
21
|
+
|
|
22
|
+
## 트리거 조건
|
|
23
|
+
|
|
24
|
+
다음 중 하나에 해당하면 이 스킬을 사용한다:
|
|
25
|
+
|
|
26
|
+
- 빌드 실행, 배포 요청
|
|
27
|
+
- 빌드/배포 상태 확인
|
|
28
|
+
- 파이프라인 설정, 빌드 플랜 조회
|
|
29
|
+
- "테스트", "빌드", "배포", "Bamboo", "CI/CD" 언급
|
|
30
|
+
|
|
31
|
+
## 워크플로우
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
1. 프로젝트 검색
|
|
35
|
+
└─ 검색 키: 조직 기본 프로젝트 (예: "Example Project") 고정
|
|
36
|
+
└─ 프로젝트 이름 기준으로 플랜 매칭 (대소문자 무시)
|
|
37
|
+
|
|
38
|
+
2. 빌드 플랜 확인
|
|
39
|
+
├─ 플랜 존재 → 3단계로
|
|
40
|
+
└─ 플랜 미존재 → 빌드 플랜 생성
|
|
41
|
+
|
|
42
|
+
3. 빌드 실행 / 상태 조회
|
|
43
|
+
├─ 실행 요청 시: 빌드 트리거
|
|
44
|
+
└─ 상태 확인 시: 최근 빌드 결과 조회
|
|
45
|
+
- 성공/실패 상태
|
|
46
|
+
- 실패 시 로그 요약
|
|
47
|
+
|
|
48
|
+
4. 결과 정리
|
|
49
|
+
└─ 빌드 키, 상태, 실행 시간 포함
|
|
50
|
+
└─ 출처 URL 명시
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## 출력 형식
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
### 빌드: {PLAN_KEY}-{BUILD_NUMBER}
|
|
57
|
+
- **상태**: {SUCCESS|FAILED|BUILDING}
|
|
58
|
+
- **트리거**: {manual|scheduled|code change}
|
|
59
|
+
- **소요 시간**: {duration}
|
|
60
|
+
- **실패 원인** (실패 시): {로그 요약}
|
|
61
|
+
- **출처**: {BAMBOO_URL}/browse/{PLAN_KEY}-{BUILD_NUMBER}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## 권한
|
|
65
|
+
|
|
66
|
+
- **읽기 + 쓰기 허용**.
|
|
67
|
+
- 빌드 플랜 생성 가능
|
|
68
|
+
- 빌드 트리거 가능
|
|
69
|
+
- 배포 실행 가능
|
|
70
|
+
|
|
71
|
+
## 고정 규칙
|
|
72
|
+
|
|
73
|
+
- 검색 키는 **조직의 기본 Bamboo 프로젝트**로 고정한다. 다른 프로젝트 키를 사용하지 않는다.
|
|
74
|
+
- 프로젝트 이름 매칭 시 대소문자를 구분하지 않는다.
|
|
75
|
+
- 빌드 플랜이 없으면 사용자 확인 없이 직접 생성한다.
|
|
76
|
+
|
|
77
|
+
## 사용 예시
|
|
78
|
+
|
|
79
|
+
- "Example Project 최근 빌드 실패했어?" → 최근 빌드 상태 + 실패 시 로그 요약
|
|
80
|
+
- "foo 서비스 빌드 돌려줘" → 해당 플랜 트리거
|
|
81
|
+
- "foo 배포 플랜 없는데 만들고 돌려줘" → 플랜 생성 후 트리거
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -uo pipefail
|
|
3
|
+
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
4
|
+
|
|
5
|
+
. "$HERE/../_lib/load-secret.sh"
|
|
6
|
+
|
|
7
|
+
export NODE_TLS_REJECT_UNAUTHORIZED="0"
|
|
8
|
+
|
|
9
|
+
load_host_from_makdoong2_config \
|
|
10
|
+
"run-bamboo" \
|
|
11
|
+
"BAMBOO_URL" \
|
|
12
|
+
"Example: https://bamboo.example.com (Bamboo base URL)."
|
|
13
|
+
status=$?
|
|
14
|
+
if [ "$status" -ne 0 ]; then exit "$status"; fi
|
|
15
|
+
|
|
16
|
+
load_secret_from_makdoong2_config \
|
|
17
|
+
"run-bamboo" \
|
|
18
|
+
"BAMBOO_TOKEN" \
|
|
19
|
+
"See your Bamboo instance — profile → Personal Access Tokens."
|
|
20
|
+
status=$?
|
|
21
|
+
if [ "$status" -ne 0 ]; then exit "$status"; fi
|
|
22
|
+
|
|
23
|
+
exec npx -y bamboo-mcp-server@latest
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bitbucket-research
|
|
3
|
+
description: Bitbucket DC 코드/PR 조사 스킬. Bitbucket DC 대상. 소스 코드 검색, 특정 파일/클래스/메서드 위치 파악, PR 조회 및 리뷰 상태 확인, 브랜치/커밋 이력 확인 시 사용. 읽기 전용이며 PR 생성·코드 수정·브랜치 생성은 하지 않는다.
|
|
4
|
+
mcp:
|
|
5
|
+
repos:
|
|
6
|
+
command: bash
|
|
7
|
+
args: ["-c", 'exec "${XDG_CONFIG_HOME:-$HOME/.config}/opencode/skills/bitbucket-research/run-repos.sh"']
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Skill: bitbucket-research
|
|
11
|
+
|
|
12
|
+
> Bitbucket DC 코드/PR 조사 스킬 — 설정된 `BITBUCKET_API_BASE_PATH` (makdoong2-team.json `.hosts`)
|
|
13
|
+
|
|
14
|
+
## 사전 조건 (필수)
|
|
15
|
+
|
|
16
|
+
이 스킬의 `repos` MCP 는 lazy-load 다. `skill_mcp(mcp_name="repos", ...)` 를 부르기 전에 반드시 `skill(name="bitbucket-research")` 로 skill 을 이 세션에 로드해야 한다. 로드 없이 호출하면 `MCP server "repos" not found` 로 실패한다.
|
|
17
|
+
|
|
18
|
+
## MCP
|
|
19
|
+
|
|
20
|
+
- **repos** (Bitbucket DC MCP)
|
|
21
|
+
|
|
22
|
+
## 트리거 조건
|
|
23
|
+
|
|
24
|
+
다음 중 하나에 해당하면 이 스킬을 사용한다:
|
|
25
|
+
|
|
26
|
+
- 소스 코드 검색, 특정 클래스/메서드/설정 파일 위치 파악
|
|
27
|
+
- PR(Pull Request) 조회, 리뷰 상태 확인
|
|
28
|
+
- 브랜치 상태, 최근 커밋 이력 확인
|
|
29
|
+
- "Bitbucket", "저장소", "PR" 언급
|
|
30
|
+
|
|
31
|
+
## 워크플로우
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
1. 검색
|
|
35
|
+
└─ repos MCP로 코드/PR/저장소 검색
|
|
36
|
+
└─ 프로젝트 키 + 저장소명이 명확하면 범위 한정
|
|
37
|
+
|
|
38
|
+
2. 파일 내용 조회
|
|
39
|
+
└─ 검색된 파일의 내용 조회
|
|
40
|
+
└─ 특정 라인 범위가 필요하면 해당 범위만 추출
|
|
41
|
+
|
|
42
|
+
3. PR 히스토리 확인 (필요시)
|
|
43
|
+
└─ PR 목록 조회 (상태: OPEN / MERGED / DECLINED)
|
|
44
|
+
└─ PR 상세: 리뷰어, 승인 상태, diff 요약
|
|
45
|
+
└─ 관련 커밋 메시지 수집
|
|
46
|
+
|
|
47
|
+
4. 브랜치 상태 (필요시)
|
|
48
|
+
└─ 브랜치 목록 조회
|
|
49
|
+
└─ 특정 브랜치의 최신 커밋 확인
|
|
50
|
+
|
|
51
|
+
5. 결과 정리
|
|
52
|
+
└─ 파일 경로, 저장소, 프로젝트 키 명시
|
|
53
|
+
└─ 출처 URL 포함
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## 출력 형식
|
|
57
|
+
|
|
58
|
+
### 코드 검색 결과
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
### {프로젝트}/{저장소} — `{파일 경로}`
|
|
62
|
+
- **브랜치**: {branch}
|
|
63
|
+
- **내용**: (관련 코드 발췌)
|
|
64
|
+
- **출처**: https://{BITBUCKET_HOST}/projects/{PROJECT}/repos/{REPO}/browse/{PATH}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### PR 조회 결과
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
### PR #{id}: {제목}
|
|
71
|
+
- **상태**: {OPEN|MERGED|DECLINED}
|
|
72
|
+
- **작성자**: {author}
|
|
73
|
+
- **리뷰어**: {reviewers + 승인 상태}
|
|
74
|
+
- **변경 파일**: {파일 수} files
|
|
75
|
+
- **출처**: https://{BITBUCKET_HOST}/projects/{PROJECT}/repos/{REPO}/pull-requests/{ID}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## 제약
|
|
79
|
+
|
|
80
|
+
- **읽기 전용**. PR 생성, 코드 수정, 브랜치 생성 불가.
|
|
81
|
+
- 대용량 파일(바이너리, 1000줄 초과)은 관련 부분만 발췌.
|
|
82
|
+
|
|
83
|
+
## 사용 예시
|
|
84
|
+
|
|
85
|
+
- "XYZ 클래스 정의된 곳 찾아줘" → 코드 검색 후 파일 경로/범위 반환
|
|
86
|
+
- "PROJECT/repo의 오픈 PR 리스트" → 상태 필터 PR 목록 조회
|
|
87
|
+
- "PR #123 리뷰 상태" → PR 상세 + 승인 현황 요약
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -uo pipefail
|
|
3
|
+
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
4
|
+
|
|
5
|
+
. "$HERE/../_lib/load-secret.sh"
|
|
6
|
+
|
|
7
|
+
export NODE_TLS_REJECT_UNAUTHORIZED="0"
|
|
8
|
+
|
|
9
|
+
load_host_from_makdoong2_config \
|
|
10
|
+
"run-repos" \
|
|
11
|
+
"BITBUCKET_API_BASE_PATH" \
|
|
12
|
+
"Example: https://bitbucket.example.com/rest (Bitbucket DC REST base URL)."
|
|
13
|
+
status=$?
|
|
14
|
+
if [ "$status" -ne 0 ]; then exit "$status"; fi
|
|
15
|
+
|
|
16
|
+
load_secret_from_makdoong2_config \
|
|
17
|
+
"run-repos" \
|
|
18
|
+
"BITBUCKET_API_TOKEN" \
|
|
19
|
+
"See your Bitbucket DC instance — profile → Manage account → HTTP access tokens."
|
|
20
|
+
status=$?
|
|
21
|
+
if [ "$status" -ne 0 ]; then exit "$status"; fi
|
|
22
|
+
|
|
23
|
+
exec npx -y @atlassian-dc-mcp/bitbucket
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: confluence-research
|
|
3
|
+
description: 사내 Confluence 문서 조사 스킬. Confluence DC 대상. 위키, 설계문서, 운영 가이드, 회의록, 온보딩 문서 조회 시 사용. docs MCP 우선, 접근 실패 시 chrome-devtools-mcp로 브라우저 fallback. 읽기 전용이며 문서 생성·수정·코멘트는 하지 않는다.
|
|
4
|
+
mcp:
|
|
5
|
+
docs:
|
|
6
|
+
command: bash
|
|
7
|
+
args: ["-c", 'exec "${XDG_CONFIG_HOME:-$HOME/.config}/opencode/skills/confluence-research/run-docs.sh"']
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Skill: confluence-research
|
|
11
|
+
|
|
12
|
+
> 사내 Confluence 문서 조사 스킬 — 설정된 `CONFLUENCE_HOST` (makdoong2-team.json `.hosts`)
|
|
13
|
+
|
|
14
|
+
## 사전 조건 (필수)
|
|
15
|
+
|
|
16
|
+
이 스킬의 `docs` MCP 는 lazy-load 다. `skill_mcp(mcp_name="docs", ...)` 를 부르기 전에 반드시 `skill(name="confluence-research")` 로 skill 을 이 세션에 로드해야 한다. 로드 없이 호출하면 `MCP server "docs" not found` 로 실패한다. `chrome-devtools-mcp` fallback 은 opencode.json 의 site-wide MCP 로 등록돼 있으므로 별도 로드 불필요.
|
|
17
|
+
|
|
18
|
+
## MCP
|
|
19
|
+
|
|
20
|
+
- **docs** (Confluence MCP) — 1차 수단
|
|
21
|
+
- **chrome-devtools-mcp** — fallback (docs MCP로 접근 불가 시)
|
|
22
|
+
|
|
23
|
+
## 트리거 조건
|
|
24
|
+
|
|
25
|
+
다음 중 하나에 해당하면 이 스킬을 사용한다:
|
|
26
|
+
|
|
27
|
+
- "사내 문서", "위키", "Confluence" 언급
|
|
28
|
+
- 설계 문서, 운영 가이드, 회의록, 온보딩 문서 등 조회 요청
|
|
29
|
+
- 특정 프로젝트/시스템의 내부 문서화 상태 확인
|
|
30
|
+
|
|
31
|
+
## 워크플로우
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
1. docs MCP 검색
|
|
35
|
+
└─ 키워드 기반 문서 검색
|
|
36
|
+
└─ 스페이스 키가 명확하면 스페이스 한정 검색
|
|
37
|
+
|
|
38
|
+
2. 페이지 내용 조회
|
|
39
|
+
└─ 검색 결과에서 관련 페이지 본문 조회
|
|
40
|
+
└─ 첨부 파일 목록 확인 (필요시)
|
|
41
|
+
|
|
42
|
+
3. fallback: chrome-devtools-mcp
|
|
43
|
+
└─ docs MCP로 내용 조회 실패 시
|
|
44
|
+
└─ 브라우저로 Confluence 호스트 직접 탐색
|
|
45
|
+
└─ 페이지 렌더링 후 내용 추출
|
|
46
|
+
|
|
47
|
+
4. 결과 정리
|
|
48
|
+
└─ 문서 제목 + 스페이스 + 최종 수정일 포함
|
|
49
|
+
└─ 핵심 내용 구조화 요약
|
|
50
|
+
└─ 출처 URL 명시
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## 출력 형식
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
### {문서 제목}
|
|
57
|
+
- **스페이스**: {space key / space name}
|
|
58
|
+
- **최종 수정**: {날짜} by {작성자}
|
|
59
|
+
- **요약**: {핵심 내용, 5줄 이내}
|
|
60
|
+
- **출처**: https://{CONFLUENCE_HOST}/pages/viewpage.action?pageId={pageId}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
복수 문서인 경우 관련도 순으로 나열한다.
|
|
64
|
+
|
|
65
|
+
## 제약
|
|
66
|
+
|
|
67
|
+
- **읽기 전용**. 문서 생성, 수정, 코멘트 작성 불가.
|
|
68
|
+
- 브라우저 사용 시 동기적 세션만 허용.
|
|
69
|
+
- 문서 본문이 과도하게 길 경우 핵심 섹션만 발췌 요약.
|
|
70
|
+
|
|
71
|
+
## 사용 예시
|
|
72
|
+
|
|
73
|
+
- "FOO 프로젝트 설계문서 찾아줘" → docs MCP 검색 후 페이지 본문 요약
|
|
74
|
+
- "지난주 팀 회의록" → 키워드 + 기간 범위 검색
|
|
75
|
+
- "운영 가이드: 배포 롤백 절차" → 스페이스 한정 검색 후 본문 발췌
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -uo pipefail
|
|
3
|
+
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
4
|
+
|
|
5
|
+
. "$HERE/../_lib/load-secret.sh"
|
|
6
|
+
|
|
7
|
+
export NODE_TLS_REJECT_UNAUTHORIZED="0"
|
|
8
|
+
|
|
9
|
+
load_host_from_makdoong2_config \
|
|
10
|
+
"run-docs" \
|
|
11
|
+
"CONFLUENCE_HOST" \
|
|
12
|
+
"Example: confluence.example.com (Confluence DC host, no scheme)."
|
|
13
|
+
status=$?
|
|
14
|
+
if [ "$status" -ne 0 ]; then exit "$status"; fi
|
|
15
|
+
|
|
16
|
+
load_secret_from_makdoong2_config \
|
|
17
|
+
"run-docs" \
|
|
18
|
+
"CONFLUENCE_API_TOKEN" \
|
|
19
|
+
"See your Confluence DC instance — profile → Personal Access Tokens."
|
|
20
|
+
status=$?
|
|
21
|
+
if [ "$status" -ne 0 ]; then exit "$status"; fi
|
|
22
|
+
|
|
23
|
+
exec npx -y @atlassian-dc-mcp/confluence
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: github-oss-research
|
|
3
|
+
description: GitHub 오픈소스 참조 스킬. 공개 라이브러리/프레임워크의 소스 코드, README, 이슈, 릴리즈 노트 조회 시 사용. 단일 파일은 raw.githubusercontent.com WebFetch 우선, 페이지 탐색은 chrome-devtools-mcp 사용. 읽기 전용이며 public 저장소만 접근한다.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Skill: github-oss-research
|
|
7
|
+
|
|
8
|
+
> GitHub 오픈소스 참조 스킬 — `github.com`
|
|
9
|
+
|
|
10
|
+
## MCP
|
|
11
|
+
|
|
12
|
+
- **chrome-devtools-mcp** — 브라우저 탐색
|
|
13
|
+
- WebFetch — raw 콘텐츠 직접 조회
|
|
14
|
+
|
|
15
|
+
## 트리거 조건
|
|
16
|
+
|
|
17
|
+
다음 중 하나에 해당하면 이 스킬을 사용한다:
|
|
18
|
+
|
|
19
|
+
- 오픈소스 라이브러리/프레임워크의 소스 코드 참조
|
|
20
|
+
- GitHub 저장소의 README, 이슈, 릴리즈 노트 확인
|
|
21
|
+
- 특정 오픈소스 설정 예제, 구현 패턴 조회
|
|
22
|
+
- "GitHub", 특정 저장소 URL, 오픈소스 프로젝트명 언급
|
|
23
|
+
|
|
24
|
+
## 워크플로우
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
1. 접근 방식 결정
|
|
28
|
+
├─ raw 콘텐츠(단일 파일) → WebFetch 우선
|
|
29
|
+
│ └─ https://raw.githubusercontent.com/{owner}/{repo}/{branch}/{path}
|
|
30
|
+
└─ 페이지 탐색(이슈, PR, 릴리즈 등) → chrome-devtools-mcp
|
|
31
|
+
|
|
32
|
+
2. 내용 조회
|
|
33
|
+
└─ 파일 내용, README, 이슈 본문, 릴리즈 노트 등 추출
|
|
34
|
+
|
|
35
|
+
3. 결과 정리
|
|
36
|
+
└─ 저장소명, 파일 경로, 브랜치/태그 명시
|
|
37
|
+
└─ 출처 URL 포함
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## 출력 형식
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
### {owner}/{repo} — `{파일 경로 또는 페이지}`
|
|
44
|
+
- **브랜치/태그**: {branch or tag}
|
|
45
|
+
- **내용**: {관련 내용 요약 또는 코드 발췌}
|
|
46
|
+
- **출처**: {GitHub URL}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## 제약
|
|
50
|
+
|
|
51
|
+
- **읽기 전용**.
|
|
52
|
+
- 브라우저 사용 시 동기적 세션만 허용.
|
|
53
|
+
- GitHub API 인증 불가 — public 저장소만 접근 가능.
|
|
54
|
+
|
|
55
|
+
## 사용 예시
|
|
56
|
+
|
|
57
|
+
- "openai/whisper setup.py 내용 보여줘" → raw WebFetch로 파일 직접 조회
|
|
58
|
+
- "facebook/react 최신 릴리즈노트" → chrome-devtools-mcp로 releases 페이지 탐색
|
|
59
|
+
- "특정 오픈소스 README" → raw WebFetch (기본 브랜치의 README.md)
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: jira-research
|
|
3
|
+
description: Jira 이슈 조사 스킬. Jira DC 대상. 이슈 키(예 PROJ-1234) 감지, 티켓 상세 조회, 스프린트/백로그 확인, 이슈 간 관계(블로커/서브태스크/에픽) 재귀 탐색 시 사용. 읽기 전용이며 이슈 생성·수정·전환·코멘트 작성은 하지 않는다.
|
|
4
|
+
mcp:
|
|
5
|
+
works:
|
|
6
|
+
command: bash
|
|
7
|
+
args: ["-c", 'exec "${XDG_CONFIG_HOME:-$HOME/.config}/opencode/skills/jira-research/run-works.sh"']
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Skill: jira-research
|
|
11
|
+
|
|
12
|
+
> Jira 이슈 조사 스킬 — 설정된 `JIRA_HOST` (makdoong2-team.json `.hosts`)
|
|
13
|
+
|
|
14
|
+
## 사전 조건 (필수)
|
|
15
|
+
|
|
16
|
+
이 스킬의 `works` MCP 는 lazy-load 다. `skill_mcp(mcp_name="works", ...)` 를 부르기 전에 반드시 `skill(name="jira-research")` 로 skill 을 이 세션에 로드해야 한다. 로드 없이 호출하면 `MCP server "works" not found` 로 실패한다.
|
|
17
|
+
|
|
18
|
+
## MCP
|
|
19
|
+
|
|
20
|
+
- **works** (Jira MCP)
|
|
21
|
+
|
|
22
|
+
## 트리거 조건
|
|
23
|
+
|
|
24
|
+
다음 중 하나에 해당하면 이 스킬을 사용한다:
|
|
25
|
+
|
|
26
|
+
- 사용자가 Jira 이슈 키(예: `PROJ-1234`)를 언급
|
|
27
|
+
- "이슈 찾아줘", "티켓 확인", "백로그", "스프린트", "jira" 등 Jira 관련 키워드
|
|
28
|
+
- 특정 기능/버그/작업의 진행 상태 질문
|
|
29
|
+
- 이슈 간 관계(블로커, 서브태스크, 링크) 파악 요청
|
|
30
|
+
|
|
31
|
+
## 워크플로우
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
1. 검색
|
|
35
|
+
└─ works MCP 검색 도구로 키워드/이슈 키 검색
|
|
36
|
+
|
|
37
|
+
2. 상세 조회
|
|
38
|
+
└─ 검색된 이슈의 상세 정보 조회
|
|
39
|
+
- 요약(summary), 상태(status), 담당자(assignee)
|
|
40
|
+
- 설명(description), 코멘트(comments)
|
|
41
|
+
- 우선순위(priority), 라벨(labels), 컴포넌트
|
|
42
|
+
|
|
43
|
+
3. 재귀 탐색 (필요시)
|
|
44
|
+
└─ 링크된 이슈, 서브태스크, 에픽 관계를 따라 탐색
|
|
45
|
+
└─ 탐색 깊이: 최대 3단계
|
|
46
|
+
└─ 순환 참조 방지: 이미 조회한 이슈 키는 스킵
|
|
47
|
+
|
|
48
|
+
4. 결과 정리
|
|
49
|
+
└─ 이슈 키 + 제목 + 상태 + 담당자 형태로 요약
|
|
50
|
+
└─ 출처 URL: https://{JIRA_HOST}/browse/{ISSUE_KEY}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## 출력 형식
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
### {ISSUE_KEY}: {요약}
|
|
57
|
+
- **상태**: {status}
|
|
58
|
+
- **담당자**: {assignee}
|
|
59
|
+
- **설명**: {description 요약, 3줄 이내}
|
|
60
|
+
- **주요 코멘트**: {최신 또는 핵심 코멘트 요약}
|
|
61
|
+
- **링크된 이슈**: {관련 이슈 목록}
|
|
62
|
+
- **출처**: https://{JIRA_HOST}/browse/{ISSUE_KEY}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## 제약
|
|
66
|
+
|
|
67
|
+
- **읽기 전용**. 이슈 생성, 수정, 전환, 코멘트 작성 불가.
|
|
68
|
+
- 재귀 탐색 시 깊이 3단계 초과 금지.
|
|
69
|
+
- 민감 정보(보안 이슈 등)는 사용자에게 직접 확인 유도.
|
|
70
|
+
|
|
71
|
+
## 사용 예시
|
|
72
|
+
|
|
73
|
+
- "PROJ-1234 상태 어때?" → 단일 이슈 상세 조회
|
|
74
|
+
- "이번 스프린트 내 담당 티켓" → 담당자 필터 + 스프린트 범위 검색
|
|
75
|
+
- "PROJ-1234 블로커까지 따라가서 요약" → 링크 이슈 재귀 탐색 (깊이 2~3)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -uo pipefail
|
|
3
|
+
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
4
|
+
|
|
5
|
+
. "$HERE/../_lib/load-secret.sh"
|
|
6
|
+
|
|
7
|
+
export NODE_TLS_REJECT_UNAUTHORIZED="0"
|
|
8
|
+
|
|
9
|
+
load_host_from_makdoong2_config \
|
|
10
|
+
"run-works" \
|
|
11
|
+
"JIRA_HOST" \
|
|
12
|
+
"Example: jira.example.com (Jira DC host, no scheme)."
|
|
13
|
+
status=$?
|
|
14
|
+
if [ "$status" -ne 0 ]; then exit "$status"; fi
|
|
15
|
+
|
|
16
|
+
load_secret_from_makdoong2_config \
|
|
17
|
+
"run-works" \
|
|
18
|
+
"JIRA_API_TOKEN" \
|
|
19
|
+
"See your Jira DC instance — profile → Personal Access Tokens."
|
|
20
|
+
status=$?
|
|
21
|
+
if [ "$status" -ne 0 ]; then exit "$status"; fi
|
|
22
|
+
|
|
23
|
+
exec npx -y @atlassian-dc-mcp/jira
|