{
"meta": {
"agent": "planner",
"task_id": "347",
"title": "MT-3: Create CredentialManager interface + EnvCredentialManager",
"created_at": "2026-04-08T12:00:00Z"
},
"inputs": [
{
"name": "issue-347",
"type": "context",
"ref": "https://github.com/AgentSDE/agent-core/issues/347",
"notes": "CredentialManager interface + ENV implementation for multi-tenant foundation"
},
{
"name": "github-service-ref",
"type": "file",
"ref": "src/github/github.service.ts",
"notes": "Reference for GITHUB_TOKEN / HUMAN_PAT fallback pattern via ConfigService"
}
],
"outputs": [
{
"name": "plan",
"type": "plan",
"format": "md",
"content": "plan.md"
}
],
"files": [
{
"path": "src/credential/credential-manager.interface.ts",
"action": "create",
"reason": "CredentialManager interface, PlatformCredentials/LLMCredentials types, CREDENTIAL_MANAGER token"
},
{
"path": "src/credential/credential-error.ts",
"action": "create",
"reason": "Typed CredentialError class"
},
{
"path": "src/credential/env/env-credential-manager.ts",
"action": "create",
"reason": "ENV-backed CredentialManager implementation"
},
{
"path": "src/credential/credential.module.ts",
"action": "create",
"reason": "NestJS module providing CREDENTIAL_MANAGER"
},
{
"path": "src/credential/env/env-credential-manager.spec.ts",
"action": "create",
"reason": "Unit tests for EnvCredentialManager"
}
],
"steps": [
{
"id": "S1",
"summary": "Create CredentialManager interface, types, injection token, and CredentialError class",
"acceptance": [
"credential-manager.interface.ts exports CredentialManager interface, PlatformCredentials, LLMCredentials, and CREDENTIAL_MANAGER Symbol",
"credential-error.ts exports CredentialError extending Error with name='CredentialError'",
"tsc --noEmit passes"
],
"depends_on": []
},
{
"id": "S2",
"summary": "Implement EnvCredentialManager and CredentialModule",
"acceptance": [
"EnvCredentialManager implements CredentialManager interface",
"getPlatformCredentials returns GITHUB_TOKEN (or HUMAN_PAT fallback) and GITHUB_WEBHOOK_SECRET",
"getPlatformCredentials throws CredentialError when neither GITHUB_TOKEN nor HUMAN_PAT is set",
"getLLMCredentials returns ANTHROPIC_API_KEY or empty string",
"credentialPath parameter is accepted but ignored",
"CredentialModule provides CREDENTIAL_MANAGER token and exports it",
"tsc --noEmit passes"
],
"depends_on": [
"S1"
]
},
{
"id": "S3",
"summary": "Write unit tests and verify all quality checks pass",
"acceptance": [
"env-credential-manager.spec.ts covers: happy path, HUMAN_PAT fallback, missing token error, missing ANTHROPIC_API_KEY",
"npm run test passes",
"npm run lint passes",
"No existing files modified"
],
"depends_on": [
"S2"
]
}
],
"risks": [
{
"risk": "ConfigService.get() returns undefined for missing ENV vars",
"mitigation": "Use get<string>() with explicit undefined check, matching GitHubService pattern"
}
],
"assumptions": [
"ConfigService is available via ConfigModule (already globally imported in AppModule)",
"No existing files need modification — all new files only"
],
"open_questions": []
}