@lnittman/pi-interview 0.4.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.
Files changed (42) hide show
  1. package/README.md +33 -0
  2. package/dist/adapters/model-client.d.ts +20 -0
  3. package/dist/adapters/model-client.d.ts.map +1 -0
  4. package/dist/adapters/model-client.js +129 -0
  5. package/dist/adapters/model-client.js.map +1 -0
  6. package/dist/core/demo.d.ts +9 -0
  7. package/dist/core/demo.d.ts.map +1 -0
  8. package/dist/core/demo.js +118 -0
  9. package/dist/core/demo.js.map +1 -0
  10. package/dist/core/project-context.d.ts +31 -0
  11. package/dist/core/project-context.d.ts.map +1 -0
  12. package/dist/core/project-context.js +82 -0
  13. package/dist/core/project-context.js.map +1 -0
  14. package/dist/core/signals.d.ts +43 -0
  15. package/dist/core/signals.d.ts.map +1 -0
  16. package/dist/core/signals.js +160 -0
  17. package/dist/core/signals.js.map +1 -0
  18. package/dist/core/state.d.ts +33 -0
  19. package/dist/core/state.d.ts.map +1 -0
  20. package/dist/core/state.js +62 -0
  21. package/dist/core/state.js.map +1 -0
  22. package/dist/core/types.d.ts +71 -0
  23. package/dist/core/types.d.ts.map +1 -0
  24. package/dist/core/types.js +18 -0
  25. package/dist/core/types.js.map +1 -0
  26. package/dist/index.d.ts +9 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +301 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/prompts/compose-template.d.ts +8 -0
  31. package/dist/prompts/compose-template.d.ts.map +1 -0
  32. package/dist/prompts/compose-template.js +40 -0
  33. package/dist/prompts/compose-template.js.map +1 -0
  34. package/dist/prompts/interview-template.d.ts +24 -0
  35. package/dist/prompts/interview-template.d.ts.map +1 -0
  36. package/dist/prompts/interview-template.js +101 -0
  37. package/dist/prompts/interview-template.js.map +1 -0
  38. package/dist/ui/interview-ui.d.ts +14 -0
  39. package/dist/ui/interview-ui.d.ts.map +1 -0
  40. package/dist/ui/interview-ui.js +285 -0
  41. package/dist/ui/interview-ui.js.map +1 -0
  42. package/package.json +51 -0
package/README.md ADDED
@@ -0,0 +1,33 @@
1
+ # pi-quiz
2
+
3
+ > Multiple-choice next-prompt quiz for [pi](https://github.com/badlogic/pi-mono)
4
+
5
+ After each agent turn, generates structured multiple-choice questions to help you decide what to do next. Every question has options — no blank text fields.
6
+
7
+ ## Install
8
+
9
+ ```json
10
+ {
11
+ "extensions": ["/path/to/pi-quiz/dist/index.js"]
12
+ }
13
+ ```
14
+
15
+ ## How it works
16
+
17
+ 1. Agent finishes → pi-quiz analyzes the conversation
18
+ 2. Calls haiku to generate 1-3 multiple-choice questions
19
+ 3. Shows an interactive quiz in the TUI
20
+ 4. You pick options (or "Type something else...")
21
+ 5. Composed prompt lands in your editor
22
+
23
+ ## Usage
24
+
25
+ **Auto mode** (default): Quiz appears after substantial agent turns.
26
+
27
+ **Manual**: `/quiz config mode manual`, then `Ctrl+Q` or `/quiz ask`.
28
+
29
+ **Number keys** for instant pick. `Tab` between questions. `Esc` to dismiss.
30
+
31
+ ## License
32
+
33
+ MIT
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Model client for pi-interview.
3
+ * Uses getApiKeyAndHeaders (correct pi API).
4
+ */
5
+ import type { ExtensionContext } from "@mariozechner/pi-coding-agent";
6
+ import { completeSimple } from "@mariozechner/pi-ai";
7
+ import type { QuizResult, QuizConfig } from "../core/types.js";
8
+ import type { QuizPromptContext } from "../prompts/interview-template.js";
9
+ type CompleteSimpleFn = typeof completeSimple;
10
+ interface RuntimeProvider {
11
+ getContext(): ExtensionContext | undefined;
12
+ }
13
+ export declare class QuizModelClient {
14
+ private runtime;
15
+ private completeFn;
16
+ constructor(runtime: RuntimeProvider, completeFn: CompleteSimpleFn);
17
+ generateQuiz(promptContext: QuizPromptContext, config: QuizConfig): Promise<QuizResult>;
18
+ }
19
+ export {};
20
+ //# sourceMappingURL=model-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-client.d.ts","sourceRoot":"","sources":["../../src/adapters/model-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EACV,UAAU,EAEV,UAAU,EAEX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAG1E,KAAK,gBAAgB,GAAG,OAAO,cAAc,CAAC;AAE9C,UAAU,eAAe;IACvB,UAAU,IAAI,gBAAgB,GAAG,SAAS,CAAC;CAC5C;AAiFD,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,UAAU,CAAmB;gBAEzB,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,gBAAgB;IAK5D,YAAY,CAChB,aAAa,EAAE,iBAAiB,EAChC,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,UAAU,CAAC;CAkEvB"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Model client for pi-interview.
3
+ * Uses getApiKeyAndHeaders (correct pi API).
4
+ */
5
+ import { renderQuizPrompt } from "../prompts/interview-template.js";
6
+ function resolveModel(ctx, configuredModelRef) {
7
+ const allModels = ctx.modelRegistry.getAll();
8
+ if (configuredModelRef && configuredModelRef !== "session-default") {
9
+ const [provider, id] = configuredModelRef.split("/");
10
+ const found = allModels.find((m) => m.provider === provider && m.id === id);
11
+ if (found)
12
+ return found;
13
+ const byId = allModels.find((m) => m.id === configuredModelRef);
14
+ if (byId)
15
+ return byId;
16
+ }
17
+ return ctx.model;
18
+ }
19
+ function parseQuizResponse(text, maxQuestions, maxOptions) {
20
+ let cleaned = text.trim();
21
+ if (cleaned.startsWith("```")) {
22
+ cleaned = cleaned.replace(/^```(?:json)?\s*\n?/, "").replace(/\n?```\s*$/, "");
23
+ }
24
+ const jsonMatch = cleaned.match(/\{[\s\S]*\}/);
25
+ if (!jsonMatch) {
26
+ return { questions: [], skipped: true, skipReason: "Failed to parse response" };
27
+ }
28
+ try {
29
+ const parsed = JSON.parse(jsonMatch[0]);
30
+ if (parsed.skipped === true) {
31
+ return {
32
+ questions: [],
33
+ skipped: true,
34
+ skipReason: parsed.skipReason || "Model chose to skip",
35
+ };
36
+ }
37
+ if (!Array.isArray(parsed.questions)) {
38
+ return { questions: [], skipped: true, skipReason: "No questions array" };
39
+ }
40
+ const questions = parsed.questions
41
+ .slice(0, maxQuestions)
42
+ .map((q, i) => ({
43
+ id: q.id || `q${i + 1}`,
44
+ text: String(q.text || "").slice(0, 120),
45
+ // Always multi — user picks one or more with checkboxes
46
+ type: "multi",
47
+ options: Array.isArray(q.options)
48
+ ? q.options.slice(0, maxOptions).map((o) => ({
49
+ label: String(o.label || "").slice(0, 80),
50
+ description: o.description
51
+ ? String(o.description).slice(0, 100)
52
+ : undefined,
53
+ }))
54
+ : [],
55
+ }))
56
+ .filter((q) => q.text.length > 0 && q.options.length >= 2);
57
+ return {
58
+ questions,
59
+ skipped: questions.length === 0,
60
+ skipReason: questions.length === 0 ? "No valid questions generated" : undefined,
61
+ };
62
+ }
63
+ catch {
64
+ return { questions: [], skipped: true, skipReason: "JSON parse error" };
65
+ }
66
+ }
67
+ export class QuizModelClient {
68
+ runtime;
69
+ completeFn;
70
+ constructor(runtime, completeFn) {
71
+ this.runtime = runtime;
72
+ this.completeFn = completeFn;
73
+ }
74
+ async generateQuiz(promptContext, config) {
75
+ const ctx = this.runtime.getContext();
76
+ if (!ctx?.model) {
77
+ return { questions: [], skipped: true, skipReason: "No model available" };
78
+ }
79
+ const model = resolveModel(ctx, config.model);
80
+ if (!model) {
81
+ return { questions: [], skipped: true, skipReason: "Configured model not found" };
82
+ }
83
+ const auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);
84
+ if (!auth.ok) {
85
+ return { questions: [], skipped: true, skipReason: `Auth failed: ${auth.error}` };
86
+ }
87
+ const prompt = renderQuizPrompt(promptContext);
88
+ try {
89
+ const response = await this.completeFn(model, {
90
+ systemPrompt: "You generate multiple-choice interview questions for a coding agent session. Return ONLY valid JSON. Every question MUST have options grounded in specific files, errors, and tool outputs from the context — never generic options. No text-only questions.",
91
+ messages: [
92
+ {
93
+ role: "user",
94
+ content: [{ type: "text", text: prompt }],
95
+ timestamp: Date.now(),
96
+ },
97
+ ],
98
+ }, {
99
+ apiKey: auth.apiKey,
100
+ headers: auth.headers,
101
+ reasoning: config.thinkingLevel === "off" ? undefined : config.thinkingLevel,
102
+ });
103
+ const text = response.content
104
+ .filter((block) => block.type === "text")
105
+ .map((block) => block.text)
106
+ .join("\n");
107
+ const usage = response.usage
108
+ ? {
109
+ inputTokens: response.usage.input ?? 0,
110
+ outputTokens: response.usage.output ?? 0,
111
+ totalTokens: response.usage.totalTokens ?? 0,
112
+ costTotal: response.usage.cost?.total ?? 0,
113
+ }
114
+ : undefined;
115
+ const result = parseQuizResponse(text, config.maxQuestions, config.maxOptions);
116
+ result.usage = usage;
117
+ return result;
118
+ }
119
+ catch (error) {
120
+ const msg = error instanceof Error ? error.message : String(error);
121
+ return {
122
+ questions: [],
123
+ skipped: true,
124
+ skipReason: `Generation failed: ${msg.slice(0, 100)}`,
125
+ };
126
+ }
127
+ }
128
+ }
129
+ //# sourceMappingURL=model-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-client.js","sourceRoot":"","sources":["../../src/adapters/model-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Demo turn contexts for testing pi-quiz without a real agent session.
3
+ * Used by /quiz demo command.
4
+ */
5
+ import type { TurnContext } from "./types.js";
6
+ export declare const DEMO_TURNS: Record<string, TurnContext>;
7
+ export declare function getDemoTurn(scenario?: string): TurnContext;
8
+ export declare function listDemoScenarios(): string[];
9
+ //# sourceMappingURL=demo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo.d.ts","sourceRoot":"","sources":["../../src/core/demo.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAyGlD,CAAC;AAEF,wBAAgB,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,CAO1D;AAED,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAE5C"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Demo turn contexts for testing pi-quiz without a real agent session.
3
+ * Used by /quiz demo command.
4
+ */
5
+ export const DEMO_TURNS = {
6
+ /** Agent just built something and finished */
7
+ build: {
8
+ turnId: "demo-build",
9
+ sourceLeafId: "demo-build",
10
+ assistantText: `I've implemented the authentication module with JWT token refresh. Created src/auth/jwt.ts with token generation and validation, updated src/middleware/auth.ts to use the new JWT flow, and added tests in src/auth/__tests__/jwt.test.ts. All 12 existing tests pass, but the 3 new token refresh tests are failing because the mock Redis client doesn't support TTL operations. The linting also shows 2 warnings in auth.ts about unused imports from the old session-based auth that I didn't remove yet.`,
11
+ status: "success",
12
+ occurredAt: new Date().toISOString(),
13
+ recentUserPrompts: [
14
+ "implement JWT auth with token refresh",
15
+ "yes, use the existing middleware pattern",
16
+ ],
17
+ toolSignals: [
18
+ "write(src/auth/jwt.ts)",
19
+ "edit(src/middleware/auth.ts)",
20
+ "write(src/auth/__tests__/jwt.test.ts)",
21
+ "bash(npm test)",
22
+ "bash(npm run lint)",
23
+ ],
24
+ touchedFiles: [
25
+ "src/auth/jwt.ts",
26
+ "src/middleware/auth.ts",
27
+ "src/auth/__tests__/jwt.test.ts",
28
+ ],
29
+ unresolvedQuestions: [],
30
+ },
31
+ /** Agent hit errors */
32
+ error: {
33
+ turnId: "demo-error",
34
+ sourceLeafId: "demo-error",
35
+ assistantText: `I tried to run the migration but hit an error. The database connection to the staging environment timed out after 30s. The migration file packages/db/migrations/003_add_user_roles.sql looks correct syntactically, but the connection string in .env.staging might be stale — the last successful connection was 3 days ago. I also noticed the docker-compose.staging.yml has the old port mapping (5432:5432) while the staging DB was moved to port 5433 last week.`,
36
+ status: "error",
37
+ occurredAt: new Date().toISOString(),
38
+ recentUserPrompts: [
39
+ "run the staging migration",
40
+ "use the new roles table schema",
41
+ ],
42
+ toolSignals: [
43
+ "read(packages/db/migrations/003_add_user_roles.sql)",
44
+ "read(.env.staging)",
45
+ "bash(npx knex migrate:latest --env staging):error",
46
+ "read(docker-compose.staging.yml)",
47
+ ],
48
+ touchedFiles: [],
49
+ unresolvedQuestions: [],
50
+ },
51
+ /** Agent was interrupted */
52
+ aborted: {
53
+ turnId: "demo-aborted",
54
+ sourceLeafId: "demo-aborted",
55
+ assistantText: `I was in the middle of refactoring the notification service. So far I've split src/services/notifications.ts into three files: src/services/notifications/email.ts, src/services/notifications/push.ts, and src/services/notifications/index.ts. The email module is complete but push notifications are half-done — I was updating the Firebase config when you interrupted. The old monolithic file still exists and the imports in src/api/routes/alerts.ts and src/workers/digest.ts still point to it.`,
56
+ status: "aborted",
57
+ occurredAt: new Date().toISOString(),
58
+ recentUserPrompts: [
59
+ "refactor the notification service into separate modules",
60
+ ],
61
+ toolSignals: [
62
+ "write(src/services/notifications/email.ts)",
63
+ "write(src/services/notifications/push.ts)",
64
+ "write(src/services/notifications/index.ts)",
65
+ "read(src/services/notifications.ts)",
66
+ "edit(src/services/notifications/push.ts)",
67
+ ],
68
+ touchedFiles: [
69
+ "src/services/notifications/email.ts",
70
+ "src/services/notifications/push.ts",
71
+ "src/services/notifications/index.ts",
72
+ ],
73
+ unresolvedQuestions: [],
74
+ abortContextNote: "User interrupted mid-refactor. Push notification module is incomplete, old file still exists, imports not updated.",
75
+ },
76
+ /** Agent asked questions */
77
+ questions: {
78
+ turnId: "demo-questions",
79
+ sourceLeafId: "demo-questions",
80
+ assistantText: `I've analyzed the codebase and have a few questions before proceeding with the API redesign:
81
+
82
+ 1. The current REST endpoints in src/api/v1/ use Express middleware chains. Should we keep Express or migrate to Hono for the v2 API?
83
+ 2. The auth tokens are currently stored in Redis with a 24h TTL. Should v2 tokens use shorter TTLs with refresh, or keep the current approach?
84
+ 3. There are 47 endpoints total. Should we migrate all at once, or start with the 12 high-traffic endpoints in src/api/v1/core/?
85
+ 4. The OpenAPI spec in docs/api.yaml is 6 months stale. Should I regenerate it as part of this work?`,
86
+ status: "success",
87
+ occurredAt: new Date().toISOString(),
88
+ recentUserPrompts: [
89
+ "let's redesign the API for v2",
90
+ "focus on performance and developer experience",
91
+ ],
92
+ toolSignals: [
93
+ "bash(find src/api -name '*.ts' | wc -l)",
94
+ "read(src/api/v1/core/users.ts)",
95
+ "read(docs/api.yaml)",
96
+ "outline(src/api/)",
97
+ ],
98
+ touchedFiles: [],
99
+ unresolvedQuestions: [
100
+ "Should we keep Express or migrate to Hono for the v2 API?",
101
+ "Should v2 tokens use shorter TTLs with refresh, or keep the current approach?",
102
+ "Should we migrate all at once, or start with the 12 high-traffic endpoints in src/api/v1/core/?",
103
+ "Should I regenerate the OpenAPI spec in docs/api.yaml as part of this work?",
104
+ ],
105
+ },
106
+ };
107
+ export function getDemoTurn(scenario) {
108
+ if (scenario && scenario in DEMO_TURNS) {
109
+ return DEMO_TURNS[scenario];
110
+ }
111
+ // Random demo
112
+ const keys = Object.keys(DEMO_TURNS);
113
+ return DEMO_TURNS[keys[Math.floor(Math.random() * keys.length)]];
114
+ }
115
+ export function listDemoScenarios() {
116
+ return Object.keys(DEMO_TURNS);
117
+ }
118
+ //# sourceMappingURL=demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo.js","sourceRoot":"","sources":["../../src/core/demo.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,CAAC,MAAM,UAAU,GAAgC;IACrD,8CAA8C;IAC9C,KAAK,EAAE;QACL,MAAM,EAAE,YAAY;QACpB,YAAY,EAAE,YAAY;QAC1B,aAAa,EAAE,ifAAif;QAChgB,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,iBAAiB,EAAE;YACjB,uCAAuC;YACvC,0CAA0C;SAC3C;QACD,WAAW,EAAE;YACX,wBAAwB;YACxB,8BAA8B;YAC9B,uCAAuC;YACvC,gBAAgB;YAChB,oBAAoB;SACrB;QACD,YAAY,EAAE;YACZ,iBAAiB;YACjB,wBAAwB;YACxB,gCAAgC;SACjC;QACD,mBAAmB,EAAE,EAAE;KACxB;IAED,uBAAuB;IACvB,KAAK,EAAE;QACL,MAAM,EAAE,YAAY;QACpB,YAAY,EAAE,YAAY;QAC1B,aAAa,EAAE,0cAA0c;QACzd,MAAM,EAAE,OAAO;QACf,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,iBAAiB,EAAE;YACjB,2BAA2B;YAC3B,gCAAgC;SACjC;QACD,WAAW,EAAE;YACX,qDAAqD;YACrD,oBAAoB;YACpB,mDAAmD;YACnD,kCAAkC;SACnC;QACD,YAAY,EAAE,EAAE;QAChB,mBAAmB,EAAE,EAAE;KACxB;IAED,4BAA4B;IAC5B,OAAO,EAAE;QACP,MAAM,EAAE,cAAc;QACtB,YAAY,EAAE,cAAc;QAC5B,aAAa,EAAE,6eAA6e;QAC5f,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,iBAAiB,EAAE;YACjB,yDAAyD;SAC1D;QACD,WAAW,EAAE;YACX,4CAA4C;YAC5C,2CAA2C;YAC3C,4CAA4C;YAC5C,qCAAqC;YACrC,0CAA0C;SAC3C;QACD,YAAY,EAAE;YACZ,qCAAqC;YACrC,oCAAoC;YACpC,qCAAqC;SACtC;QACD,mBAAmB,EAAE,EAAE;QACvB,gBAAgB,EACd,oHAAoH;KACvH;IAED,4BAA4B;IAC5B,SAAS,EAAE;QACT,MAAM,EAAE,gBAAgB;QACxB,YAAY,EAAE,gBAAgB;QAC9B,aAAa,EAAE;;;;;qGAKkF;QACjG,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,iBAAiB,EAAE;YACjB,+BAA+B;YAC/B,+CAA+C;SAChD;QACD,WAAW,EAAE;YACX,yCAAyC;YACzC,gCAAgC;YAChC,qBAAqB;YACrB,mBAAmB;SACpB;QACD,YAAY,EAAE,EAAE;QAChB,mBAAmB,EAAE;YACnB,2DAA2D;YAC3D,+EAA+E;YAC/E,iGAAiG;YACjG,6EAA6E;SAC9E;KACF;CACF,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,QAAiB;IAC3C,IAAI,QAAQ,IAAI,QAAQ,IAAI,UAAU,EAAE,CAAC;QACvC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IACD,cAAc;IACd,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrC,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Lightweight project context for pi-quiz.
3
+ *
4
+ * Instead of prompt-suggester's heavy agentic seeding loop,
5
+ * we do a fast one-shot scan: package.json + git status + cwd name.
6
+ * Gives the model just enough project awareness to generate grounded questions.
7
+ */
8
+ export interface ProjectSnapshot {
9
+ /** Project name from package.json or directory */
10
+ name: string;
11
+ /** Brief description from package.json */
12
+ description?: string;
13
+ /** Key scripts available */
14
+ scripts: string[];
15
+ /** Current git branch */
16
+ branch?: string;
17
+ /** Whether there are uncommitted changes */
18
+ dirty: boolean;
19
+ /** Recent commit subjects (last 3) */
20
+ recentCommits: string[];
21
+ }
22
+ /**
23
+ * Build a fast project snapshot from cwd.
24
+ * Designed to complete in <500ms.
25
+ */
26
+ export declare function buildProjectSnapshot(cwd: string): Promise<ProjectSnapshot>;
27
+ /**
28
+ * Format project snapshot as a compact string for the prompt.
29
+ */
30
+ export declare function formatProjectContext(snapshot: ProjectSnapshot): string;
31
+ //# sourceMappingURL=project-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-context.d.ts","sourceRoot":"","sources":["../../src/core/project-context.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,MAAM,WAAW,eAAe;IAC9B,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4BAA4B;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,yBAAyB;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,KAAK,EAAE,OAAO,CAAC;IACf,sCAAsC;IACtC,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AA4BD;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,eAAe,CAAC,CA2B1B;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAgBtE"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Lightweight project context for pi-quiz.
3
+ *
4
+ * Instead of prompt-suggester's heavy agentic seeding loop,
5
+ * we do a fast one-shot scan: package.json + git status + cwd name.
6
+ * Gives the model just enough project awareness to generate grounded questions.
7
+ */
8
+ import { execFile } from "node:child_process";
9
+ import { readFile } from "node:fs/promises";
10
+ import { basename, join } from "node:path";
11
+ import { promisify } from "node:util";
12
+ const exec = promisify(execFile);
13
+ async function tryExec(cmd, args, cwd) {
14
+ try {
15
+ const { stdout } = await exec(cmd, args, {
16
+ cwd,
17
+ timeout: 3000,
18
+ env: { ...process.env, GIT_TERMINAL_PROMPT: "0" },
19
+ });
20
+ return stdout.trim();
21
+ }
22
+ catch {
23
+ return "";
24
+ }
25
+ }
26
+ async function tryReadJson(path) {
27
+ try {
28
+ const content = await readFile(path, "utf8");
29
+ return JSON.parse(content);
30
+ }
31
+ catch {
32
+ return null;
33
+ }
34
+ }
35
+ /**
36
+ * Build a fast project snapshot from cwd.
37
+ * Designed to complete in <500ms.
38
+ */
39
+ export async function buildProjectSnapshot(cwd) {
40
+ // Run all lookups in parallel
41
+ const [pkg, branch, status, log] = await Promise.all([
42
+ tryReadJson(join(cwd, "package.json")),
43
+ tryExec("git", ["rev-parse", "--abbrev-ref", "HEAD"], cwd),
44
+ tryExec("git", ["status", "--porcelain", "--short"], cwd),
45
+ tryExec("git", ["log", "--oneline", "-3", "--no-decorate"], cwd),
46
+ ]);
47
+ const name = pkg?.name ?? basename(cwd);
48
+ const description = pkg?.description;
49
+ // Extract key script names (not the commands themselves)
50
+ const allScripts = Object.keys(pkg?.scripts ?? {});
51
+ const keyScripts = allScripts.filter((s) => /^(dev|build|test|lint|start|deploy|typecheck|verify)/.test(s));
52
+ const scripts = keyScripts.length > 0 ? keyScripts.slice(0, 8) : allScripts.slice(0, 5);
53
+ return {
54
+ name,
55
+ description,
56
+ scripts,
57
+ branch: branch || undefined,
58
+ dirty: status.length > 0,
59
+ recentCommits: log ? log.split("\n").filter(Boolean).slice(0, 3) : [],
60
+ };
61
+ }
62
+ /**
63
+ * Format project snapshot as a compact string for the prompt.
64
+ */
65
+ export function formatProjectContext(snapshot) {
66
+ const lines = [];
67
+ lines.push(`Project: ${snapshot.name}${snapshot.description ? ` — ${snapshot.description}` : ""}`);
68
+ if (snapshot.branch) {
69
+ lines.push(`Branch: ${snapshot.branch}${snapshot.dirty ? " (dirty)" : ""}`);
70
+ }
71
+ if (snapshot.scripts.length > 0) {
72
+ lines.push(`Scripts: ${snapshot.scripts.join(", ")}`);
73
+ }
74
+ if (snapshot.recentCommits.length > 0) {
75
+ lines.push(`Recent commits:`);
76
+ for (const c of snapshot.recentCommits) {
77
+ lines.push(` ${c}`);
78
+ }
79
+ }
80
+ return lines.join("\n");
81
+ }
82
+ //# sourceMappingURL=project-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-context.js","sourceRoot":"","sources":["../../src/core/project-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Conversation signal extraction — builds TurnContext from pi session data.
3
+ * Adapted from pi-prompt-suggester's conversation-signals.ts with simplifications.
4
+ */
5
+ import type { TurnContext } from "./types.js";
6
+ interface AgentMessage {
7
+ role: string;
8
+ content?: unknown;
9
+ stopReason?: string;
10
+ timestamp?: number;
11
+ toolName?: string;
12
+ isError?: boolean;
13
+ usage?: {
14
+ input?: number;
15
+ output?: number;
16
+ totalTokens?: number;
17
+ cost?: {
18
+ total?: number;
19
+ };
20
+ };
21
+ }
22
+ interface BranchEntry {
23
+ id: string;
24
+ type: string;
25
+ message: AgentMessage;
26
+ }
27
+ /**
28
+ * Build turn context from agent_end event messages + full branch.
29
+ * Returns null if no usable assistant message found.
30
+ */
31
+ export declare function buildTurnContext(params: {
32
+ turnId: string;
33
+ sourceLeafId: string;
34
+ messagesFromPrompt: AgentMessage[];
35
+ branchMessages: AgentMessage[];
36
+ occurredAt: string;
37
+ }): TurnContext | null;
38
+ /**
39
+ * Build turn context from the latest branch entries (for session restore).
40
+ */
41
+ export declare function buildTurnContextFromBranch(branchEntries: BranchEntry[]): TurnContext | null;
42
+ export {};
43
+ //# sourceMappingURL=signals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../../src/core/signals.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,YAAY,CAAC;AAI1D,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE;QACN,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE;YAAE,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KAC3B,CAAC;CACH;AAED,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,YAAY,CAAC;CACvB;AAmFD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,YAAY,EAAE,CAAC;IACnC,cAAc,EAAE,YAAY,EAAE,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,WAAW,GAAG,IAAI,CAkDrB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,aAAa,EAAE,WAAW,EAAE,GAC3B,WAAW,GAAG,IAAI,CAsCpB"}