feat: add developer profiling pipeline (#1084)

Analyze Claude Code session history to build behavioral profiles across
8 dimensions (communication, decisions, debugging, UX, vendor choices,
frustrations, learning style, explanation depth). Profiles generate
USER-PROFILE.md, dev-preferences command, and CLAUDE.md profile section.

New modules:
- profile-pipeline.cjs: session scanning, message extraction, sampling
- profile-output.cjs: profile rendering, questionnaire, artifact generation

New files:
- agents/gsd-user-profiler.md: profiler agent (8-dimension scoring)
- commands/gsd/profile-user.md: user-facing command
- workflows/profile-user.md: orchestration workflow
- templates/: user-profile, dev-preferences, claude-md templates
- references/user-profiling.md: detection heuristics reference

8 new CLI commands: scan-sessions, extract-messages, profile-sample,
write-profile, profile-questionnaire, generate-dev-preferences,
generate-claude-profile, generate-claude-md

Co-authored-by: TÂCHES <afromanguy@me.com>
This commit is contained in:
jecanore
2026-03-16 10:46:00 -05:00
committed by GitHub
parent a2f359e94b
commit 4cf6c04a3e
11 changed files with 3180 additions and 2 deletions

View File

@@ -746,10 +746,10 @@ describe('Copilot agent conversion - real files', () => {
assert.ok(toolsLine.includes("'read'"), 'Read mapped');
});
test('all 15 agents convert without error', () => {
test('all 16 agents convert without error', () => {
const agents = fs.readdirSync(agentsSrc)
.filter(f => f.startsWith('gsd-') && f.endsWith('.md'));
assert.strictEqual(agents.length, 15, `expected 15 agents, got ${agents.length}`);
assert.strictEqual(agents.length, 16, `expected 16 agents, got ${agents.length}`);
for (const agentFile of agents) {
const content = fs.readFileSync(path.join(agentsSrc, agentFile), 'utf8');
@@ -1202,6 +1202,7 @@ describe('E2E: Copilot full install verification', () => {
'gsd-ui-auditor.agent.md',
'gsd-ui-checker.agent.md',
'gsd-ui-researcher.agent.md',
'gsd-user-profiler.agent.md',
'gsd-verifier.agent.md',
].sort();
assert.deepStrictEqual(gsdAgents, expected);