@productbrain/cli 0.1.0-beta.35 → 0.1.0-beta.37

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 (105) hide show
  1. package/dist/__tests__/capture.test.js +22 -0
  2. package/dist/__tests__/capture.test.js.map +1 -1
  3. package/dist/__tests__/experiment.test.d.ts +6 -0
  4. package/dist/__tests__/experiment.test.d.ts.map +1 -0
  5. package/dist/__tests__/experiment.test.js +69 -0
  6. package/dist/__tests__/experiment.test.js.map +1 -0
  7. package/dist/__tests__/onboarding-path-b.test.d.ts +2 -0
  8. package/dist/__tests__/onboarding-path-b.test.d.ts.map +1 -0
  9. package/dist/__tests__/onboarding-path-b.test.js +46 -0
  10. package/dist/__tests__/onboarding-path-b.test.js.map +1 -0
  11. package/dist/__tests__/onboarding.test.d.ts +1 -1
  12. package/dist/__tests__/onboarding.test.js +304 -156
  13. package/dist/__tests__/onboarding.test.js.map +1 -1
  14. package/dist/__tests__/setup.test.js +22 -74
  15. package/dist/__tests__/setup.test.js.map +1 -1
  16. package/dist/commands/connect-integration.test.d.ts +7 -0
  17. package/dist/commands/connect-integration.test.d.ts.map +1 -0
  18. package/dist/commands/connect-integration.test.js +148 -0
  19. package/dist/commands/connect-integration.test.js.map +1 -0
  20. package/dist/commands/connect.d.ts +17 -0
  21. package/dist/commands/connect.d.ts.map +1 -0
  22. package/dist/commands/connect.js +280 -0
  23. package/dist/commands/connect.js.map +1 -0
  24. package/dist/commands/connect.test.d.ts +6 -0
  25. package/dist/commands/connect.test.d.ts.map +1 -0
  26. package/dist/commands/connect.test.js +230 -0
  27. package/dist/commands/connect.test.js.map +1 -0
  28. package/dist/commands/handshake.d.ts +2 -0
  29. package/dist/commands/handshake.d.ts.map +1 -1
  30. package/dist/commands/handshake.js +20 -5
  31. package/dist/commands/handshake.js.map +1 -1
  32. package/dist/commands/setup.d.ts.map +1 -1
  33. package/dist/commands/setup.js +57 -81
  34. package/dist/commands/setup.js.map +1 -1
  35. package/dist/generators/context-md.d.ts +1 -1
  36. package/dist/generators/context-md.d.ts.map +1 -1
  37. package/dist/generators/context-md.js +12 -1
  38. package/dist/generators/context-md.js.map +1 -1
  39. package/dist/index.js +13 -1
  40. package/dist/index.js.map +1 -1
  41. package/dist/lib/config.d.ts +1 -0
  42. package/dist/lib/config.d.ts.map +1 -1
  43. package/dist/lib/config.js +25 -1
  44. package/dist/lib/config.js.map +1 -1
  45. package/dist/lib/conversation-engine.d.ts +45 -0
  46. package/dist/lib/conversation-engine.d.ts.map +1 -0
  47. package/dist/lib/conversation-engine.js +112 -0
  48. package/dist/lib/conversation-engine.js.map +1 -0
  49. package/dist/lib/conversation-phases.d.ts +59 -0
  50. package/dist/lib/conversation-phases.d.ts.map +1 -0
  51. package/dist/lib/conversation-phases.js +11 -0
  52. package/dist/lib/conversation-phases.js.map +1 -0
  53. package/dist/lib/conversation-signals.d.ts +30 -0
  54. package/dist/lib/conversation-signals.d.ts.map +1 -0
  55. package/dist/lib/conversation-signals.js +64 -0
  56. package/dist/lib/conversation-signals.js.map +1 -0
  57. package/dist/lib/experiment.d.ts +18 -0
  58. package/dist/lib/experiment.d.ts.map +1 -0
  59. package/dist/lib/experiment.js +28 -0
  60. package/dist/lib/experiment.js.map +1 -0
  61. package/dist/lib/onboarding-path-b.d.ts +10 -0
  62. package/dist/lib/onboarding-path-b.d.ts.map +1 -0
  63. package/dist/lib/onboarding-path-b.js +214 -0
  64. package/dist/lib/onboarding-path-b.js.map +1 -0
  65. package/dist/lib/onboarding-phases.d.ts +9 -0
  66. package/dist/lib/onboarding-phases.d.ts.map +1 -0
  67. package/dist/lib/onboarding-phases.js +120 -0
  68. package/dist/lib/onboarding-phases.js.map +1 -0
  69. package/dist/lib/onboarding-shared.d.ts +81 -0
  70. package/dist/lib/onboarding-shared.d.ts.map +1 -0
  71. package/dist/lib/onboarding-shared.js +190 -0
  72. package/dist/lib/onboarding-shared.js.map +1 -0
  73. package/dist/lib/onboarding-topics.d.ts +27 -0
  74. package/dist/lib/onboarding-topics.d.ts.map +1 -0
  75. package/dist/lib/onboarding-topics.js +57 -0
  76. package/dist/lib/onboarding-topics.js.map +1 -0
  77. package/dist/lib/onboarding.d.ts +3 -5
  78. package/dist/lib/onboarding.d.ts.map +1 -1
  79. package/dist/lib/onboarding.js +224 -247
  80. package/dist/lib/onboarding.js.map +1 -1
  81. package/dist/lib/profiles.d.ts +5 -0
  82. package/dist/lib/profiles.d.ts.map +1 -1
  83. package/dist/lib/profiles.js +7 -0
  84. package/dist/lib/profiles.js.map +1 -1
  85. package/dist/lib/telemetry.d.ts +5 -5
  86. package/dist/lib/telemetry.d.ts.map +1 -1
  87. package/dist/lib/telemetry.js +34 -16
  88. package/dist/lib/telemetry.js.map +1 -1
  89. package/dist/lib/wizard-surfaces.d.ts +47 -0
  90. package/dist/lib/wizard-surfaces.d.ts.map +1 -0
  91. package/dist/lib/wizard-surfaces.js +176 -0
  92. package/dist/lib/wizard-surfaces.js.map +1 -0
  93. package/dist/lib/wizard-surfaces.test.d.ts +2 -0
  94. package/dist/lib/wizard-surfaces.test.d.ts.map +1 -0
  95. package/dist/lib/wizard-surfaces.test.js +127 -0
  96. package/dist/lib/wizard-surfaces.test.js.map +1 -0
  97. package/dist/lib/wizard-trust.d.ts +31 -0
  98. package/dist/lib/wizard-trust.d.ts.map +1 -0
  99. package/dist/lib/wizard-trust.js +66 -0
  100. package/dist/lib/wizard-trust.js.map +1 -0
  101. package/dist/lib/wizard-trust.test.d.ts +2 -0
  102. package/dist/lib/wizard-trust.test.d.ts.map +1 -0
  103. package/dist/lib/wizard-trust.test.js +32 -0
  104. package/dist/lib/wizard-trust.test.js.map +1 -0
  105. package/package.json +1 -1
@@ -15,7 +15,7 @@ import { readFileSync, existsSync, mkdirSync, writeFileSync } from 'fs';
15
15
  import { resolve } from 'path';
16
16
  import { homedir } from 'os';
17
17
  import { DEFAULT_SITE_URL, isDevMode } from './constants.js';
18
- import { resolveProfileConfig } from './profiles.js';
18
+ import { resolveProfileConfig, resolveNamedProfileConfig } from './profiles.js';
19
19
  import { CLIError, ErrorCode } from './errors.js';
20
20
  import { confirm as promptConfirm, password as promptPassword } from './prompts.js';
21
21
  const HOME_CONFIG_DIR = resolve(homedir(), '.config', 'productbrain');
@@ -47,6 +47,9 @@ function readProjectConfig() {
47
47
  if (typeof parsed.siteUrl === 'string' && parsed.siteUrl) {
48
48
  result.siteUrl = parsed.siteUrl;
49
49
  }
50
+ if (typeof parsed.profile === 'string' && parsed.profile) {
51
+ result.profile = parsed.profile;
52
+ }
50
53
  return result;
51
54
  }
52
55
  catch {
@@ -85,6 +88,17 @@ export function resolveConfig() {
85
88
  source: 'project',
86
89
  };
87
90
  }
91
+ // 2b. Project config with profile reference (pb connect writes profile name, not key)
92
+ if (projectConfig?.profile) {
93
+ const namedConfig = resolveNamedProfileConfig(projectConfig.profile);
94
+ if (namedConfig?.apiKey) {
95
+ return {
96
+ apiKey: namedConfig.apiKey,
97
+ siteUrl: (projectConfig.siteUrl || namedConfig.siteUrl || envSite || DEFAULT_SITE_URL).replace(/\/$/, ''),
98
+ source: 'project',
99
+ };
100
+ }
101
+ }
88
102
  // 3. Profile system
89
103
  const profileConfig = resolveProfileConfig();
90
104
  if (profileConfig?.apiKey) {
@@ -156,6 +170,16 @@ function loadEnv() {
156
170
  if (!process.env.PRODUCTBRAIN_API_KEY && projectConfig.apiKey) {
157
171
  process.env.PRODUCTBRAIN_API_KEY = projectConfig.apiKey;
158
172
  }
173
+ // Project config can reference a named profile (written by pb connect)
174
+ if (!process.env.PRODUCTBRAIN_API_KEY && projectConfig.profile) {
175
+ const namedConfig = resolveNamedProfileConfig(projectConfig.profile);
176
+ if (namedConfig?.apiKey) {
177
+ process.env.PRODUCTBRAIN_API_KEY = namedConfig.apiKey;
178
+ if (!process.env.CONVEX_SITE_URL && namedConfig.siteUrl) {
179
+ process.env.CONVEX_SITE_URL = namedConfig.siteUrl;
180
+ }
181
+ }
182
+ }
159
183
  if (!process.env.CONVEX_SITE_URL && projectConfig.siteUrl) {
160
184
  process.env.CONVEX_SITE_URL = projectConfig.siteUrl;
161
185
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Conversation engine — topic evaluation, XML directive builder, post-processing.
3
+ * WP-304: Coach pattern — LLM judges topic completion, heuristic backup.
4
+ *
5
+ * The engine evaluates topic completion and builds XML directives.
6
+ * It does NOT generate content — that's the LLM's job.
7
+ */
8
+ import type { ConversationState, ConversationSignals, TopicQA } from './conversation-phases.js';
9
+ import type { OnboardingTopic } from './onboarding-topics.js';
10
+ /** Result of evaluating the current topic. */
11
+ export interface TopicEvalResult {
12
+ /** Whether the current topic is complete. */
13
+ complete: boolean;
14
+ /** Whether advancement was forced by maxExchanges. */
15
+ forced: boolean;
16
+ /** Whether this topic was skipped (signal already present). */
17
+ skip: boolean;
18
+ }
19
+ /**
20
+ * Check if a topic should be skipped because its signal is already present.
21
+ * Only skips if we have enough content for quality extraction (>= 20 words).
22
+ */
23
+ export declare function shouldSkipTopic(topic: OnboardingTopic, signals: ConversationSignals, totalUserWords: number): boolean;
24
+ /**
25
+ * Evaluate whether the current topic is complete.
26
+ * Priority: skip > LLM judgment > heuristic backup > forced > continue.
27
+ */
28
+ export declare function evaluateTopic(topic: OnboardingTopic, state: ConversationState, llmSaidComplete: boolean): TopicEvalResult;
29
+ /**
30
+ * Build the XML topic directive to inject into the system prompt.
31
+ * Renders <topic> with goal/behaviour/criteria, plus <accumulated_context>
32
+ * with completed Q&A pairs from earlier topics.
33
+ */
34
+ export declare function buildTopicDirective(topic: OnboardingTopic, topicIndex: number, totalTopics: number, completedQA: TopicQA[], workspaceName: string): string;
35
+ /**
36
+ * Strip banned patterns the LLM produces despite prompt instructions.
37
+ * Safety net — Gemini Flash at temp 0.3 still produces these ~15% of the time.
38
+ */
39
+ export declare function sanitizeResponse(text: string): string;
40
+ /**
41
+ * Detect if a response is too similar to recent ones (refusal loop).
42
+ * Uses Jaccard similarity on word sets.
43
+ */
44
+ export declare function isTooSimilar(newMsg: string, recentMsgs: string[], threshold?: number): boolean;
45
+ //# sourceMappingURL=conversation-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-engine.d.ts","sourceRoot":"","sources":["../../src/lib/conversation-engine.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,8CAA8C;AAC9C,MAAM,WAAW,eAAe;IAC9B,6CAA6C;IAC7C,QAAQ,EAAE,OAAO,CAAC;IAElB,sDAAsD;IACtD,MAAM,EAAE,OAAO,CAAC;IAEhB,+DAA+D;IAC/D,IAAI,EAAE,OAAO,CAAC;CACf;AASD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAIrH;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,iBAAiB,EACxB,eAAe,EAAE,OAAO,GACvB,eAAe,CAyBjB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,OAAO,EAAE,EACtB,aAAa,EAAE,MAAM,GACpB,MAAM,CAoBR;AAcD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOrD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,SAAS,SAAM,GAAG,OAAO,CAW3F"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Conversation engine — topic evaluation, XML directive builder, post-processing.
3
+ * WP-304: Coach pattern — LLM judges topic completion, heuristic backup.
4
+ *
5
+ * The engine evaluates topic completion and builds XML directives.
6
+ * It does NOT generate content — that's the LLM's job.
7
+ */
8
+ /**
9
+ * Minimum user words before topic skipping is allowed.
10
+ * Below this threshold, the conversation is too thin for quality extraction —
11
+ * keep asking even if LLM signals say the topic is covered.
12
+ */
13
+ const MIN_WORDS_FOR_SKIP = 20;
14
+ /**
15
+ * Check if a topic should be skipped because its signal is already present.
16
+ * Only skips if we have enough content for quality extraction (>= 20 words).
17
+ */
18
+ export function shouldSkipTopic(topic, signals, totalUserWords) {
19
+ if (topic.skipIfSignal === null)
20
+ return false;
21
+ if (totalUserWords < MIN_WORDS_FOR_SKIP)
22
+ return false;
23
+ return signals[topic.skipIfSignal] === true;
24
+ }
25
+ /**
26
+ * Evaluate whether the current topic is complete.
27
+ * Priority: skip > LLM judgment > heuristic backup > forced > continue.
28
+ */
29
+ export function evaluateTopic(topic, state, llmSaidComplete) {
30
+ // 1. Skip: signal already present from earlier topics (only if enough content)
31
+ if (shouldSkipTopic(topic, state.signals, state.totalUserWords)) {
32
+ return { complete: true, forced: false, skip: true };
33
+ }
34
+ const exchanges = state.topicExchanges[topic.id] ?? 0;
35
+ // 2. LLM says complete (require at least 1 exchange to prevent premature completion)
36
+ if (llmSaidComplete && exchanges >= 1) {
37
+ return { complete: true, forced: false, skip: false };
38
+ }
39
+ // 3. Heuristic backup: signal detected even if LLM didn't say complete
40
+ if (topic.heuristicSignal && state.signals[topic.heuristicSignal] === true && exchanges >= 1) {
41
+ return { complete: true, forced: false, skip: false };
42
+ }
43
+ // 4. Forced: max exchanges hit
44
+ if (exchanges >= topic.maxExchanges) {
45
+ return { complete: true, forced: true, skip: false };
46
+ }
47
+ // 5. Continue
48
+ return { complete: false, forced: false, skip: false };
49
+ }
50
+ /**
51
+ * Build the XML topic directive to inject into the system prompt.
52
+ * Renders <topic> with goal/behaviour/criteria, plus <accumulated_context>
53
+ * with completed Q&A pairs from earlier topics.
54
+ */
55
+ export function buildTopicDirective(topic, topicIndex, totalTopics, completedQA, workspaceName) {
56
+ let xml = `
57
+ <topic id="${topic.id}" index="${topicIndex + 1}" of="${totalTopics}">
58
+ <goal>${topic.goal}</goal>
59
+ <behaviour>${topic.behaviour}</behaviour>
60
+ <criteria>${topic.criteria}</criteria>
61
+ </topic>`;
62
+ if (completedQA.length > 0) {
63
+ xml += '\n\n<accumulated_context>';
64
+ for (const qa of completedQA) {
65
+ xml += `\n <topic_qa id="${qa.topicId}">`;
66
+ xml += `\n <question>${qa.question}</question>`;
67
+ xml += `\n <answer>${qa.answer}</answer>`;
68
+ xml += '\n </topic_qa>';
69
+ }
70
+ xml += '\n</accumulated_context>';
71
+ }
72
+ return xml;
73
+ }
74
+ // ── Post-processing ─────────────────────────────────────────────────────────
75
+ const BANNED_PATTERNS = [
76
+ /\bsounds like\b/gi,
77
+ /\bit sounds like\b/gi,
78
+ /\bsounds\s+(?:ambitious|exciting|fascinating|impressive|intriguing|interesting|amazing|complex|like)\b/gi,
79
+ /\bintriguing\b/gi,
80
+ // Anti-paraphrase: strip "When you say X," and "You mentioned X," prefixes
81
+ /^when you (?:say|mention|talk about)\b[^.?!]{0,60}[,]\s*/i,
82
+ /^you mentioned\b[^.?!]{0,60}[,]\s*/i,
83
+ ];
84
+ /**
85
+ * Strip banned patterns the LLM produces despite prompt instructions.
86
+ * Safety net — Gemini Flash at temp 0.3 still produces these ~15% of the time.
87
+ */
88
+ export function sanitizeResponse(text) {
89
+ let cleaned = text;
90
+ for (const pattern of BANNED_PATTERNS) {
91
+ cleaned = cleaned.replace(pattern, '');
92
+ }
93
+ // Clean up double spaces and leading punctuation from removals
94
+ return cleaned.replace(/\s{2,}/g, ' ').replace(/^\s*[.,]\s*/, '').trim();
95
+ }
96
+ /**
97
+ * Detect if a response is too similar to recent ones (refusal loop).
98
+ * Uses Jaccard similarity on word sets.
99
+ */
100
+ export function isTooSimilar(newMsg, recentMsgs, threshold = 0.6) {
101
+ const newWords = new Set(newMsg.toLowerCase().split(/\s+/));
102
+ for (const prev of recentMsgs.slice(-2)) {
103
+ const prevWords = new Set(prev.toLowerCase().split(/\s+/));
104
+ const intersection = new Set([...newWords].filter((w) => prevWords.has(w)));
105
+ const union = new Set([...newWords, ...prevWords]);
106
+ if (union.size > 0 && intersection.size / union.size > threshold) {
107
+ return true;
108
+ }
109
+ }
110
+ return false;
111
+ }
112
+ //# sourceMappingURL=conversation-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-engine.js","sourceRoot":"","sources":["../../src/lib/conversation-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Conversation types — state and signal types for coach-pattern conversations.
3
+ * WP-304: LLM owns content, CLI owns flow.
4
+ *
5
+ * Pattern: Deterministic Shell, Stochastic Core.
6
+ * - CLI defines topics with goal/behaviour/criteria (deterministic)
7
+ * - LLM generates conversation content and judges criteria (stochastic)
8
+ * - CLI evaluates with heuristic backup and decides when to advance
9
+ */
10
+ /** A completed topic's question-answer pair, accumulated as context for later topics. */
11
+ export interface TopicQA {
12
+ topicId: string;
13
+ question: string;
14
+ answer: string;
15
+ }
16
+ /** Conversation state — the CLI's accumulated view of the conversation. */
17
+ export interface ConversationState {
18
+ /** All messages so far. */
19
+ messages: Array<{
20
+ role: 'user' | 'assistant';
21
+ content: string;
22
+ }>;
23
+ /** Number of user messages total. */
24
+ userMessageCount: number;
25
+ /** Total user words total. */
26
+ totalUserWords: number;
27
+ /** Exchange count per topic (coach pattern) or phase (legacy). */
28
+ topicExchanges: Record<string, number>;
29
+ /** @deprecated Alias for topicExchanges — used by legacy phase engine until Slice 3. */
30
+ phaseExchanges: Record<string, number>;
31
+ /** Which topics have been completed. */
32
+ completedTopics: Set<string>;
33
+ /** @deprecated Alias for completedTopics — used by legacy phase engine until Slice 3. */
34
+ completedPhases: Set<string>;
35
+ /** Current topic ID. */
36
+ currentTopicId: string;
37
+ /** @deprecated Alias for currentTopicId — used by legacy phase engine until Slice 3. */
38
+ currentPhaseId: string;
39
+ /** Completed topic Q&A pairs — accumulated context for later topics. */
40
+ completedQA: TopicQA[];
41
+ /** Heuristic signals detected from user messages. */
42
+ signals: ConversationSignals;
43
+ /** Count of consecutive refusals/non-answers. */
44
+ refusalStreak: number;
45
+ }
46
+ /** Signals detected from user messages — heuristic + LLM-reported. */
47
+ export interface ConversationSignals {
48
+ /** User described what they're building. */
49
+ mentionedProduct: boolean;
50
+ /** User described a problem, pain point, or challenge. */
51
+ mentionedChallenge: boolean;
52
+ /** User mentioned why they're trying Product Brain. */
53
+ mentionedWhyPB: boolean;
54
+ /** User gave at least one substantive answer (>= 15 words). */
55
+ hasSubstantiveAnswer: boolean;
56
+ /** Number of user messages with >= 8 words. */
57
+ substantiveMessageCount: number;
58
+ }
59
+ //# sourceMappingURL=conversation-phases.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-phases.d.ts","sourceRoot":"","sources":["../../src/lib/conversation-phases.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,yFAAyF;AACzF,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,2EAA2E;AAC3E,MAAM,WAAW,iBAAiB;IAChC,2BAA2B;IAC3B,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAEjE,qCAAqC;IACrC,gBAAgB,EAAE,MAAM,CAAC;IAEzB,8BAA8B;IAC9B,cAAc,EAAE,MAAM,CAAC;IAEvB,kEAAkE;IAClE,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,wFAAwF;IACxF,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEvC,wCAAwC;IACxC,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,yFAAyF;IACzF,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAE7B,wBAAwB;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,wFAAwF;IACxF,cAAc,EAAE,MAAM,CAAC;IAEvB,wEAAwE;IACxE,WAAW,EAAE,OAAO,EAAE,CAAC;IAEvB,qDAAqD;IACrD,OAAO,EAAE,mBAAmB,CAAC;IAE7B,iDAAiD;IACjD,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,sEAAsE;AACtE,MAAM,WAAW,mBAAmB;IAClC,4CAA4C;IAC5C,gBAAgB,EAAE,OAAO,CAAC;IAE1B,0DAA0D;IAC1D,kBAAkB,EAAE,OAAO,CAAC;IAE5B,uDAAuD;IACvD,cAAc,EAAE,OAAO,CAAC;IAExB,+DAA+D;IAC/D,oBAAoB,EAAE,OAAO,CAAC;IAE9B,+CAA+C;IAC/C,uBAAuB,EAAE,MAAM,CAAC;CACjC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Conversation types — state and signal types for coach-pattern conversations.
3
+ * WP-304: LLM owns content, CLI owns flow.
4
+ *
5
+ * Pattern: Deterministic Shell, Stochastic Core.
6
+ * - CLI defines topics with goal/behaviour/criteria (deterministic)
7
+ * - LLM generates conversation content and judges criteria (stochastic)
8
+ * - CLI evaluates with heuristic backup and decides when to advance
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=conversation-phases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-phases.js","sourceRoot":"","sources":["../../src/lib/conversation-phases.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Conversation signal detection — heuristic pattern matching on user text.
3
+ * WP-304: CLI-side signal detection as backup/validation for LLM-reported signals.
4
+ *
5
+ * These are intentionally loose. False positives advance the conversation
6
+ * (fine — user gave a relevant answer). False negatives mean one more turn
7
+ * in the phase (also fine — maxExchanges caps prevent loops).
8
+ */
9
+ import type { ConversationSignals } from './conversation-phases.js';
10
+ /**
11
+ * Detect signals from user messages using regex heuristics.
12
+ * Returns accumulated signals across all user messages.
13
+ *
14
+ * Thresholds are intentionally strict — we'd rather ask one more question
15
+ * than advance on a vague answer. maxExchanges is the safety valve.
16
+ */
17
+ export declare function detectSignals(messages: Array<{
18
+ role: string;
19
+ content: string;
20
+ }>): ConversationSignals;
21
+ /**
22
+ * Merge LLM-reported signals into heuristic signals.
23
+ * LLM signals are additive — once true, always true.
24
+ */
25
+ export declare function mergeSignals(heuristic: ConversationSignals, llmSignals: {
26
+ describedProduct?: boolean;
27
+ describedProblem?: boolean;
28
+ answeredWhyPB?: boolean;
29
+ }): ConversationSignals;
30
+ //# sourceMappingURL=conversation-signals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-signals.d.ts","sourceRoot":"","sources":["../../src/lib/conversation-signals.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AA4BpE;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,mBAAmB,CAgBrG;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,mBAAmB,EAC9B,UAAU,EAAE;IAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9F,mBAAmB,CAOrB"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Conversation signal detection — heuristic pattern matching on user text.
3
+ * WP-304: CLI-side signal detection as backup/validation for LLM-reported signals.
4
+ *
5
+ * These are intentionally loose. False positives advance the conversation
6
+ * (fine — user gave a relevant answer). False negatives mean one more turn
7
+ * in the phase (also fine — maxExchanges caps prevent loops).
8
+ */
9
+ const PRODUCT_PATTERNS = [
10
+ /\b(?:building|making|creating|working on|developing)\b/i,
11
+ /\b(?:app|platform|tool|product|service|saas|api|system|software)\b/i,
12
+ ];
13
+ const CHALLENGE_PATTERNS = [
14
+ /\b(?:hard|hardest|difficult|challeng|struggling?|pain|problem|frustrat|broken|mess)\b/i,
15
+ /\b(?:don'?t know|can'?t figure|losing track|forget|lost context|outdated|rot)\b/i,
16
+ /\b(?:hate|annoying|waste|slow|manual|tedious)\b/i,
17
+ ];
18
+ const WHY_PB_PATTERNS = [
19
+ /\b(?:product brain|brain)\b/i,
20
+ /\b(?:context|memory|decisions?|knowledge|source of truth|ssot)\b/i,
21
+ /\b(?:ai|llm|claude|cursor|copilot|agent)\b.*\b(?:context|remember|forget|know)\b/i,
22
+ /\b(?:remember|forget|consistent|prompt)\b.*\b(?:ai|llm|agent|tool)\b/i,
23
+ // Broader: user describes the problem PB solves without naming PB
24
+ /\b(?:re-?explain|repeat myself|start from (?:zero|scratch)|re-?tell)\b/i,
25
+ /\b(?:docs?|documentation|md files?)\b.*\b(?:outdated|stale|rot|drift|wrong|maintain)\b/i,
26
+ /\b(?:cost|waste|spend)\b.*\b(?:tokens?|context|time)\b.*\b(?:re-?explain|repeat|maintain)\b/i,
27
+ ];
28
+ function countWords(text) {
29
+ return text.trim().split(/\s+/).filter(Boolean).length;
30
+ }
31
+ /**
32
+ * Detect signals from user messages using regex heuristics.
33
+ * Returns accumulated signals across all user messages.
34
+ *
35
+ * Thresholds are intentionally strict — we'd rather ask one more question
36
+ * than advance on a vague answer. maxExchanges is the safety valve.
37
+ */
38
+ export function detectSignals(messages) {
39
+ const userMessages = messages.filter((m) => m.role === 'user');
40
+ return {
41
+ // Product mention requires BOTH a pattern match AND enough words to be meaningful.
42
+ // "a cool app" matches the pattern but isn't substantive — need at least 10 words.
43
+ mentionedProduct: userMessages.some((m) => PRODUCT_PATTERNS.some((p) => p.test(m.content)) && countWords(m.content) >= 10),
44
+ mentionedChallenge: userMessages.some((m) => CHALLENGE_PATTERNS.some((p) => p.test(m.content))),
45
+ mentionedWhyPB: userMessages.some((m) => WHY_PB_PATTERNS.some((p) => p.test(m.content))),
46
+ // Substantive = enough detail to extract something meaningful from
47
+ hasSubstantiveAnswer: userMessages.some((m) => countWords(m.content) >= 15),
48
+ // Count messages with real content (not just "me" or "yes")
49
+ substantiveMessageCount: userMessages.filter((m) => countWords(m.content) >= 8).length,
50
+ };
51
+ }
52
+ /**
53
+ * Merge LLM-reported signals into heuristic signals.
54
+ * LLM signals are additive — once true, always true.
55
+ */
56
+ export function mergeSignals(heuristic, llmSignals) {
57
+ return {
58
+ ...heuristic,
59
+ mentionedProduct: heuristic.mentionedProduct || (llmSignals.describedProduct ?? false),
60
+ mentionedChallenge: heuristic.mentionedChallenge || (llmSignals.describedProblem ?? false),
61
+ mentionedWhyPB: heuristic.mentionedWhyPB || (llmSignals.answeredWhyPB ?? false),
62
+ };
63
+ }
64
+ //# sourceMappingURL=conversation-signals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-signals.js","sourceRoot":"","sources":["../../src/lib/conversation-signals.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,gBAAgB,GAAG;IACvB,yDAAyD;IACzD,qEAAqE;CACtE,CAAC;AAEF,MAAM,kBAAkB,GAAG;IACzB,wFAAwF;IACxF,kFAAkF;IAClF,kDAAkD;CACnD,CAAC;AAEF,MAAM,eAAe,GAAG;IACtB,8BAA8B;IAC9B,mEAAmE;IACnE,mFAAmF;IACnF,uEAAuE;IACvE,kEAAkE;IAClE,yEAAyE;IACzE,yFAAyF;IACzF,8FAA8F;CAC/F,CAAC;AAEF,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;AACzD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,QAAkD;IAC9E,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IAE/D,OAAO;QACL,mFAAmF;QACnF,mFAAmF;QACnF,gBAAgB,EAAE,YAAY,CAAC,IAAI,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CACtF;QACD,kBAAkB,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/F,cAAc,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACxF,mEAAmE;QACnE,oBAAoB,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC3E,4DAA4D;QAC5D,uBAAuB,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;KACvF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,SAA8B,EAC9B,UAA+F;IAE/F,OAAO;QACL,GAAG,SAAS;QACZ,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,IAAI,CAAC,UAAU,CAAC,gBAAgB,IAAI,KAAK,CAAC;QACtF,kBAAkB,EAAE,SAAS,CAAC,kBAAkB,IAAI,CAAC,UAAU,CAAC,gBAAgB,IAAI,KAAK,CAAC;QAC1F,cAAc,EAAE,SAAS,CAAC,cAAc,IAAI,CAAC,UAAU,CAAC,aAAa,IAAI,KAAK,CAAC;KAChF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Experiment assignment — deterministic path selection for A/B experiments.
3
+ * WP-304: Dormant until PB_EXPERIMENT_304=1. When active, overrides PB_ONBOARDING_PATH.
4
+ */
5
+ export type ExperimentPath = 'A' | 'B';
6
+ /**
7
+ * Deterministic assignment based on workspace ID.
8
+ * FNV-1a hash mod 2 — same workspace always gets the same path.
9
+ */
10
+ export declare function assignOnboardingPath(workspaceId: string): ExperimentPath;
11
+ /** Check if the WP-304 experiment is active. */
12
+ export declare function isExperimentActive(): boolean;
13
+ /**
14
+ * FNV-1a hash — fast, deterministic, good distribution for short strings.
15
+ * Returns a positive 32-bit integer.
16
+ */
17
+ export declare function fnv1aHash(str: string): number;
18
+ //# sourceMappingURL=experiment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"experiment.d.ts","sourceRoot":"","sources":["../../src/lib/experiment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,cAAc,GAAG,GAAG,GAAG,GAAG,CAAC;AAEvC;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,CAExE;AAED,gDAAgD;AAChD,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAO7C"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Experiment assignment — deterministic path selection for A/B experiments.
3
+ * WP-304: Dormant until PB_EXPERIMENT_304=1. When active, overrides PB_ONBOARDING_PATH.
4
+ */
5
+ /**
6
+ * Deterministic assignment based on workspace ID.
7
+ * FNV-1a hash mod 2 — same workspace always gets the same path.
8
+ */
9
+ export function assignOnboardingPath(workspaceId) {
10
+ return fnv1aHash(workspaceId) % 2 === 0 ? 'A' : 'B';
11
+ }
12
+ /** Check if the WP-304 experiment is active. */
13
+ export function isExperimentActive() {
14
+ return process.env.PB_EXPERIMENT_304 === '1';
15
+ }
16
+ /**
17
+ * FNV-1a hash — fast, deterministic, good distribution for short strings.
18
+ * Returns a positive 32-bit integer.
19
+ */
20
+ export function fnv1aHash(str) {
21
+ let hash = 0x811c9dc5; // FNV offset basis
22
+ for (let i = 0; i < str.length; i++) {
23
+ hash ^= str.charCodeAt(i);
24
+ hash = (hash * 0x01000193) >>> 0; // FNV prime, keep as unsigned 32-bit
25
+ }
26
+ return hash >>> 0;
27
+ }
28
+ //# sourceMappingURL=experiment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"experiment.js","sourceRoot":"","sources":["../../src/lib/experiment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,OAAO,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AACtD,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,kBAAkB;IAChC,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,GAAG,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,IAAI,IAAI,GAAG,UAAU,CAAC,CAAC,mBAAmB;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,GAAG,CAAC,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,qCAAqC;IACzE,CAAC;IACD,OAAO,IAAI,KAAK,CAAC,CAAC;AACpB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Path B — Facilitator-pattern onboarding (2 exchanges max).
3
+ * WP-304: Shorter flow, silent extraction, auto-capture, governance proof.
4
+ */
5
+ import { type OnboardingExtraction } from './onboarding-shared.js';
6
+ export declare function runOnboardingPathB(workspaceName: string): Promise<void>;
7
+ /** Merge two extractions — second takes precedence for scalar fields, arrays concatenate. */
8
+ export declare function mergeExtractions(first: OnboardingExtraction | null, second: OnboardingExtraction): OnboardingExtraction;
9
+ export declare function dedupe(arr: string[]): string[];
10
+ //# sourceMappingURL=onboarding-path-b.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding-path-b.d.ts","sourceRoot":"","sources":["../../src/lib/onboarding-path-b.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAIL,KAAK,oBAAoB,EAG1B,MAAM,wBAAwB,CAAC;AAEhC,wBAAsB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyK7E;AAED,6FAA6F;AAC7F,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,oBAAoB,GAAG,IAAI,EAClC,MAAM,EAAE,oBAAoB,GAC3B,oBAAoB,CAUtB;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAI9C"}