feat: add Atlas PRD agent for product discovery

- src/prompts/atlas.ts — full Atlas system prompt (6-phase PM discovery flow)
- src/tools/prd.ts — finalize_prd tool that signals PRD completion
- src/agents/atlas.ts — Atlas agent config (Tier A, conversational)
- src/atlas.ts — atlasChat() multi-turn session handler
- server.ts — /atlas/chat, /atlas/sessions endpoints

Made-with: Cursor
This commit is contained in:
2026-03-01 15:56:26 -08:00
parent e29dccf745
commit e503e4312d
20 changed files with 756 additions and 0 deletions

27
dist/server.js vendored
View File

@@ -47,6 +47,7 @@ const agent_runner_1 = require("./agent-runner");
const agents_1 = require("./agents");
const security_1 = require("./tools/security");
const orchestrator_1 = require("./orchestrator");
const atlas_1 = require("./atlas");
const app = (0, express_1.default)();
app.use((0, cors_1.default)());
const startTime = new Date();
@@ -214,6 +215,32 @@ app.delete('/orchestrator/sessions/:id', (req, res) => {
(0, orchestrator_1.clearSession)(req.params.id);
res.json({ cleared: req.params.id });
});
// ---------------------------------------------------------------------------
// Atlas — PRD discovery agent
// ---------------------------------------------------------------------------
app.post('/atlas/chat', async (req, res) => {
const { message, session_id, history } = req.body;
if (!message) {
res.status(400).json({ error: '"message" is required' });
return;
}
const sessionId = session_id || `atlas_${Date.now()}`;
const ctx = buildContext();
try {
const result = await (0, atlas_1.atlasChat)(sessionId, message, ctx, { preloadedHistory: history });
res.json(result);
}
catch (err) {
res.status(500).json({ error: err instanceof Error ? err.message : String(err) });
}
});
app.get('/atlas/sessions', (_req, res) => {
res.json((0, atlas_1.listAtlasSessions)());
});
app.delete('/atlas/sessions/:id', (req, res) => {
(0, atlas_1.clearAtlasSession)(req.params.id);
res.json({ cleared: req.params.id });
});
// List recent jobs
app.get('/api/jobs', (req, res) => {
const limit = parseInt(req.query.limit || '20', 10);