@promptwheel/cli 0.7.3 → 0.7.5
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.
- package/dist/bin/promptwheel.js +1 -1
- package/dist/lib/display-adapter-spinner.d.ts +2 -0
- package/dist/lib/display-adapter-spinner.d.ts.map +1 -1
- package/dist/lib/display-adapter-spinner.js +9 -2
- package/dist/lib/display-adapter-spinner.js.map +1 -1
- package/dist/lib/integrations.d.ts +89 -0
- package/dist/lib/integrations.d.ts.map +1 -0
- package/dist/lib/integrations.js +380 -0
- package/dist/lib/integrations.js.map +1 -0
- package/dist/lib/run-state.d.ts +11 -0
- package/dist/lib/run-state.d.ts.map +1 -1
- package/dist/lib/run-state.js +21 -0
- package/dist/lib/run-state.js.map +1 -1
- package/dist/lib/solo-auto-between-cycles.d.ts.map +1 -1
- package/dist/lib/solo-auto-between-cycles.js +93 -65
- package/dist/lib/solo-auto-between-cycles.js.map +1 -1
- package/dist/lib/solo-auto-drill.d.ts +1 -1
- package/dist/lib/solo-auto-drill.d.ts.map +1 -1
- package/dist/lib/solo-auto-drill.js +45 -36
- package/dist/lib/solo-auto-drill.js.map +1 -1
- package/dist/lib/solo-auto-execute.d.ts.map +1 -1
- package/dist/lib/solo-auto-execute.js +8 -7
- package/dist/lib/solo-auto-execute.js.map +1 -1
- package/dist/lib/solo-auto-filter.d.ts.map +1 -1
- package/dist/lib/solo-auto-filter.js +21 -12
- package/dist/lib/solo-auto-filter.js.map +1 -1
- package/dist/lib/solo-auto-finalize.js +3 -3
- package/dist/lib/solo-auto-finalize.js.map +1 -1
- package/dist/lib/solo-auto-scout.d.ts.map +1 -1
- package/dist/lib/solo-auto-scout.js +15 -6
- package/dist/lib/solo-auto-scout.js.map +1 -1
- package/dist/lib/solo-auto-state.d.ts.map +1 -1
- package/dist/lib/solo-auto-state.js +37 -20
- package/dist/lib/solo-auto-state.js.map +1 -1
- package/dist/lib/solo-auto-types.d.ts +7 -0
- package/dist/lib/solo-auto-types.d.ts.map +1 -1
- package/dist/lib/solo-auto.js +17 -7
- package/dist/lib/solo-auto.js.map +1 -1
- package/dist/lib/solo-config.d.ts +16 -0
- package/dist/lib/solo-config.d.ts.map +1 -1
- package/dist/lib/solo-config.js.map +1 -1
- package/dist/lib/solo-stdin.d.ts.map +1 -1
- package/dist/lib/solo-stdin.js +16 -13
- package/dist/lib/solo-stdin.js.map +1 -1
- package/package.json +3 -3
package/dist/bin/promptwheel.js
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
import { Command } from 'commander';
|
|
17
17
|
import { soloCommand } from '../commands/solo.js';
|
|
18
18
|
import { checkForUpdateInBackground, printUpdateNotification, runSelfUpdate, } from '../lib/update-check.js';
|
|
19
|
-
const CURRENT_VERSION = '0.7.
|
|
19
|
+
const CURRENT_VERSION = '0.7.5';
|
|
20
20
|
const program = new Command();
|
|
21
21
|
program
|
|
22
22
|
.name('promptwheel')
|
|
@@ -10,6 +10,8 @@ export declare class SpinnerDisplayAdapter implements DisplayAdapter {
|
|
|
10
10
|
private ticketSpinners;
|
|
11
11
|
private scoutSpinner;
|
|
12
12
|
private batchProgress;
|
|
13
|
+
private lastProgressLine;
|
|
14
|
+
private lastProgressTime;
|
|
13
15
|
sessionStarted(_info: SessionInfo): void;
|
|
14
16
|
sessionEnded(): void;
|
|
15
17
|
scoutStarted(scope: string, _cycle: number): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"display-adapter-spinner.d.ts","sourceRoot":"","sources":["../../src/lib/display-adapter-spinner.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGvG,qBAAa,qBAAsB,YAAW,cAAc;IAC1D,OAAO,CAAC,cAAc,CAAmC;IACzD,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,aAAa,CAAqC;
|
|
1
|
+
{"version":3,"file":"display-adapter-spinner.d.ts","sourceRoot":"","sources":["../../src/lib/display-adapter-spinner.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGvG,qBAAa,qBAAsB,YAAW,cAAc;IAC1D,OAAO,CAAC,cAAc,CAAmC;IACzD,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,aAAa,CAAqC;IAC1D,OAAO,CAAC,gBAAgB,CAAM;IAC9B,OAAO,CAAC,gBAAgB,CAAK;IAE7B,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAIxC,YAAY,IAAI,IAAI;IAIpB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAIjD,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIhC,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI;IAU/F,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI;IAY3C,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAShC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIpC,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAKjE,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAI7C,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAIlD,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAY3D,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAItB,iBAAiB,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,GAAG,IAAI;IAIxI,cAAc,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAWhD,OAAO,IAAI,IAAI;CAWhB"}
|
|
@@ -12,6 +12,8 @@ export class SpinnerDisplayAdapter {
|
|
|
12
12
|
ticketSpinners = new Map();
|
|
13
13
|
scoutSpinner = null;
|
|
14
14
|
batchProgress = null;
|
|
15
|
+
lastProgressLine = '';
|
|
16
|
+
lastProgressTime = 0;
|
|
15
17
|
sessionStarted(_info) {
|
|
16
18
|
// Banner is already printed by initSession — no-op here
|
|
17
19
|
}
|
|
@@ -83,9 +85,14 @@ export class SpinnerDisplayAdapter {
|
|
|
83
85
|
// No-op for spinner mode
|
|
84
86
|
}
|
|
85
87
|
progressUpdate(snapshot) {
|
|
86
|
-
if (process.
|
|
88
|
+
if (process.stdout.isTTY) {
|
|
87
89
|
const line = formatProgressLine(snapshot);
|
|
88
|
-
|
|
90
|
+
const now = Date.now();
|
|
91
|
+
if (line === this.lastProgressLine || now - this.lastProgressTime < 2000)
|
|
92
|
+
return;
|
|
93
|
+
this.lastProgressLine = line;
|
|
94
|
+
this.lastProgressTime = now;
|
|
95
|
+
console.log(`\n ${chalk.gray('───')} ${line} ${chalk.gray('───')}`);
|
|
89
96
|
}
|
|
90
97
|
}
|
|
91
98
|
destroy() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"display-adapter-spinner.js","sourceRoot":"","sources":["../../src/lib/display-adapter-spinner.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,aAAa,EACb,mBAAmB,GAGpB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,OAAO,qBAAqB;IACxB,cAAc,GAAG,IAAI,GAAG,EAAwB,CAAC;IACjD,YAAY,GAAwB,IAAI,CAAC;IACzC,aAAa,GAAgC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"display-adapter-spinner.js","sourceRoot":"","sources":["../../src/lib/display-adapter-spinner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Integrations — invoke external MCP servers on cadence during spin.
|
|
3
|
+
*
|
|
4
|
+
* Reads `.promptwheel/integrations.yaml` for provider definitions,
|
|
5
|
+
* spawns each provider's MCP server via stdio transport, calls the
|
|
6
|
+
* configured tool, and converts results into proposals / learnings / nudges.
|
|
7
|
+
*/
|
|
8
|
+
import type { TicketProposal } from '@promptwheel/core/scout';
|
|
9
|
+
export interface IntegrationProvider {
|
|
10
|
+
name: string;
|
|
11
|
+
/** MCP server launch command (e.g. "npx @securitychecks/mcp-server") */
|
|
12
|
+
command: string;
|
|
13
|
+
/** Tool name to call on the MCP server */
|
|
14
|
+
tool: string;
|
|
15
|
+
/** Arguments passed to the tool call */
|
|
16
|
+
args?: Record<string, unknown>;
|
|
17
|
+
/** Invoke every N spin cycles */
|
|
18
|
+
every: number;
|
|
19
|
+
/** When in the cycle to invoke */
|
|
20
|
+
phase: 'pre-scout' | 'post-cycle';
|
|
21
|
+
/** How to inject results */
|
|
22
|
+
feed: 'proposals' | 'learnings' | 'nudges';
|
|
23
|
+
/** Timeout in ms (default 60000) */
|
|
24
|
+
timeout?: number;
|
|
25
|
+
}
|
|
26
|
+
export interface IntegrationConfig {
|
|
27
|
+
providers: IntegrationProvider[];
|
|
28
|
+
}
|
|
29
|
+
export interface IntegrationResult {
|
|
30
|
+
provider: string;
|
|
31
|
+
feed: 'proposals' | 'learnings' | 'nudges';
|
|
32
|
+
data: unknown;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Load integrations config from `.promptwheel/integrations.yaml`.
|
|
36
|
+
* Returns `{ providers: [] }` if the file doesn't exist (opt-in feature).
|
|
37
|
+
*/
|
|
38
|
+
export declare function loadIntegrations(repoRoot: string): IntegrationConfig;
|
|
39
|
+
/**
|
|
40
|
+
* Parse the integrations YAML file into typed config.
|
|
41
|
+
*
|
|
42
|
+
* Expects a `providers:` top-level key with a list of provider objects.
|
|
43
|
+
* Uses line-by-line parsing (no external YAML library dependency).
|
|
44
|
+
*/
|
|
45
|
+
export declare function parseIntegrationsYaml(content: string): IntegrationConfig;
|
|
46
|
+
interface IntegrationState {
|
|
47
|
+
cycleCount: number;
|
|
48
|
+
repoRoot: string;
|
|
49
|
+
integrationLastRun: Record<string, number>;
|
|
50
|
+
options: {
|
|
51
|
+
verbose?: boolean;
|
|
52
|
+
};
|
|
53
|
+
displayAdapter: {
|
|
54
|
+
log(msg: string): void;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Run all integrations matching the given phase.
|
|
59
|
+
* Checks cadence (every N cycles) and invokes each due provider.
|
|
60
|
+
*/
|
|
61
|
+
export declare function runIntegrations(state: IntegrationState, config: IntegrationConfig, phase: 'pre-scout' | 'post-cycle'): Promise<IntegrationResult[]>;
|
|
62
|
+
/**
|
|
63
|
+
* Invoke a single integration provider:
|
|
64
|
+
* spawn MCP server, connect, call tool, disconnect.
|
|
65
|
+
*/
|
|
66
|
+
export declare function invokeProvider(provider: IntegrationProvider, repoRoot: string): Promise<unknown>;
|
|
67
|
+
/**
|
|
68
|
+
* Convert raw MCP tool output to TicketProposal[].
|
|
69
|
+
*
|
|
70
|
+
* Expects the MCP tool to return:
|
|
71
|
+
* ```json
|
|
72
|
+
* { "proposals": [{ "title", "description", "files", "category", "confidence", "impact" }] }
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
export declare function toProposals(result: IntegrationResult): TicketProposal[];
|
|
76
|
+
/**
|
|
77
|
+
* Convert raw MCP tool output to learnings and store them.
|
|
78
|
+
*
|
|
79
|
+
* Expects: `{ "learnings": [{ "text", "category"?, "tags"? }] }`
|
|
80
|
+
*/
|
|
81
|
+
export declare function toLearnings(data: unknown, repoRoot: string): void;
|
|
82
|
+
/**
|
|
83
|
+
* Convert raw MCP tool output to nudges (hints) and store them.
|
|
84
|
+
*
|
|
85
|
+
* Expects: `{ "nudges": [{ "text" }] }` or `{ "nudges": ["text", ...] }`
|
|
86
|
+
*/
|
|
87
|
+
export declare function toNudges(data: unknown, repoRoot: string): void;
|
|
88
|
+
export {};
|
|
89
|
+
//# sourceMappingURL=integrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integrations.d.ts","sourceRoot":"","sources":["../../src/lib/integrations.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAS9D,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,KAAK,EAAE,WAAW,GAAG,YAAY,CAAC;IAClC,4BAA4B;IAC5B,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3C,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,mBAAmB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3C,IAAI,EAAE,OAAO,CAAC;CACf;AAOD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAUpE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CA2FxE;AAmDD,UAAU,gBAAgB;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,OAAO,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC/B,cAAc,EAAE;QAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CAC5C;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,gBAAgB,EACvB,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE,WAAW,GAAG,YAAY,GAChC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA0C9B;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,mBAAmB,EAC7B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC,CAiElB;AAID;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,cAAc,EAAE,CAuBvE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAoBjE;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAe9D"}
|
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Integrations — invoke external MCP servers on cadence during spin.
|
|
3
|
+
*
|
|
4
|
+
* Reads `.promptwheel/integrations.yaml` for provider definitions,
|
|
5
|
+
* spawns each provider's MCP server via stdio transport, calls the
|
|
6
|
+
* configured tool, and converts results into proposals / learnings / nudges.
|
|
7
|
+
*/
|
|
8
|
+
import * as fs from 'node:fs';
|
|
9
|
+
import * as path from 'node:path';
|
|
10
|
+
import { createRequire } from 'node:module';
|
|
11
|
+
import { addLearning } from './learnings.js';
|
|
12
|
+
import { addHint } from './solo-hints.js';
|
|
13
|
+
const _require = createRequire(import.meta.url);
|
|
14
|
+
const CLI_VERSION = _require('../../package.json').version;
|
|
15
|
+
// ── Config loading ──────────────────────────────────────────────────────────
|
|
16
|
+
const VALID_PHASES = new Set(['pre-scout', 'post-cycle']);
|
|
17
|
+
const VALID_FEEDS = new Set(['proposals', 'learnings', 'nudges']);
|
|
18
|
+
/**
|
|
19
|
+
* Load integrations config from `.promptwheel/integrations.yaml`.
|
|
20
|
+
* Returns `{ providers: [] }` if the file doesn't exist (opt-in feature).
|
|
21
|
+
*/
|
|
22
|
+
export function loadIntegrations(repoRoot) {
|
|
23
|
+
const yamlPath = path.join(repoRoot, '.promptwheel', 'integrations.yaml');
|
|
24
|
+
if (!fs.existsSync(yamlPath)) {
|
|
25
|
+
const ymlPath = path.join(repoRoot, '.promptwheel', 'integrations.yml');
|
|
26
|
+
if (!fs.existsSync(ymlPath)) {
|
|
27
|
+
return { providers: [] };
|
|
28
|
+
}
|
|
29
|
+
return parseIntegrationsYaml(fs.readFileSync(ymlPath, 'utf-8'));
|
|
30
|
+
}
|
|
31
|
+
return parseIntegrationsYaml(fs.readFileSync(yamlPath, 'utf-8'));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Parse the integrations YAML file into typed config.
|
|
35
|
+
*
|
|
36
|
+
* Expects a `providers:` top-level key with a list of provider objects.
|
|
37
|
+
* Uses line-by-line parsing (no external YAML library dependency).
|
|
38
|
+
*/
|
|
39
|
+
export function parseIntegrationsYaml(content) {
|
|
40
|
+
const providers = [];
|
|
41
|
+
const lines = content.split('\n');
|
|
42
|
+
let inProviders = false;
|
|
43
|
+
let current = null;
|
|
44
|
+
let inArgs = false;
|
|
45
|
+
let args = {};
|
|
46
|
+
for (const line of lines) {
|
|
47
|
+
const trimmed = line.trim();
|
|
48
|
+
// Skip comments and empty lines
|
|
49
|
+
if (trimmed === '' || trimmed.startsWith('#'))
|
|
50
|
+
continue;
|
|
51
|
+
// Top-level key
|
|
52
|
+
if (/^providers\s*:/.test(trimmed)) {
|
|
53
|
+
inProviders = true;
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (!inProviders)
|
|
57
|
+
continue;
|
|
58
|
+
// New provider entry (starts with "- ")
|
|
59
|
+
if (/^\s*-\s+\w+/.test(line)) {
|
|
60
|
+
// Flush previous provider
|
|
61
|
+
if (current) {
|
|
62
|
+
if (Object.keys(args).length > 0)
|
|
63
|
+
current.args = args;
|
|
64
|
+
const validated = validateProvider(current);
|
|
65
|
+
if (validated)
|
|
66
|
+
providers.push(validated);
|
|
67
|
+
}
|
|
68
|
+
current = {};
|
|
69
|
+
args = {};
|
|
70
|
+
inArgs = false;
|
|
71
|
+
// Parse "- key: value" on the same line
|
|
72
|
+
const match = trimmed.match(/^-\s+(\w+)\s*:\s*(.*)/);
|
|
73
|
+
if (match) {
|
|
74
|
+
setProviderField(current, match[1], match[2].trim());
|
|
75
|
+
}
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
// Inside a provider object
|
|
79
|
+
if (current) {
|
|
80
|
+
// Check for args sub-object
|
|
81
|
+
if (/^\s+args\s*:/.test(line) && !trimmed.startsWith('-')) {
|
|
82
|
+
inArgs = true;
|
|
83
|
+
// Check for inline value like "args: {}"
|
|
84
|
+
const inlineMatch = trimmed.match(/^args\s*:\s*(.+)/);
|
|
85
|
+
if (inlineMatch && inlineMatch[1].trim() !== '') {
|
|
86
|
+
// Simple inline value — skip, args will stay empty
|
|
87
|
+
inArgs = false;
|
|
88
|
+
}
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
// Inside args sub-object
|
|
92
|
+
if (inArgs && /^\s{4,}\w/.test(line)) {
|
|
93
|
+
const argMatch = trimmed.match(/^(\w[\w_-]*)\s*:\s*(.*)/);
|
|
94
|
+
if (argMatch) {
|
|
95
|
+
args[argMatch[1]] = parseYamlValue(argMatch[2].trim());
|
|
96
|
+
}
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
// Regular provider field
|
|
100
|
+
if (/^\s+\w/.test(line) && !trimmed.startsWith('-')) {
|
|
101
|
+
inArgs = false;
|
|
102
|
+
const fieldMatch = trimmed.match(/^(\w[\w_-]*)\s*:\s*(.*)/);
|
|
103
|
+
if (fieldMatch) {
|
|
104
|
+
setProviderField(current, fieldMatch[1], fieldMatch[2].trim());
|
|
105
|
+
}
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// If we hit a non-indented line that isn't a provider, stop
|
|
110
|
+
if (!line.startsWith(' ') && !line.startsWith('\t') && !trimmed.startsWith('-')) {
|
|
111
|
+
inProviders = false;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Flush last provider
|
|
115
|
+
if (current) {
|
|
116
|
+
if (Object.keys(args).length > 0)
|
|
117
|
+
current.args = args;
|
|
118
|
+
const validated = validateProvider(current);
|
|
119
|
+
if (validated)
|
|
120
|
+
providers.push(validated);
|
|
121
|
+
}
|
|
122
|
+
return { providers };
|
|
123
|
+
}
|
|
124
|
+
function setProviderField(provider, key, value) {
|
|
125
|
+
switch (key) {
|
|
126
|
+
case 'name':
|
|
127
|
+
provider.name = unquote(value);
|
|
128
|
+
break;
|
|
129
|
+
case 'command':
|
|
130
|
+
provider.command = unquote(value);
|
|
131
|
+
break;
|
|
132
|
+
case 'tool':
|
|
133
|
+
provider.tool = unquote(value);
|
|
134
|
+
break;
|
|
135
|
+
case 'every':
|
|
136
|
+
provider.every = parseInt(value, 10);
|
|
137
|
+
break;
|
|
138
|
+
case 'phase':
|
|
139
|
+
provider.phase = unquote(value);
|
|
140
|
+
break;
|
|
141
|
+
case 'feed':
|
|
142
|
+
provider.feed = unquote(value);
|
|
143
|
+
break;
|
|
144
|
+
case 'timeout':
|
|
145
|
+
provider.timeout = parseInt(value, 10);
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
function unquote(s) {
|
|
150
|
+
if ((s.startsWith('"') && s.endsWith('"')) || (s.startsWith("'") && s.endsWith("'"))) {
|
|
151
|
+
return s.slice(1, -1);
|
|
152
|
+
}
|
|
153
|
+
return s;
|
|
154
|
+
}
|
|
155
|
+
function parseYamlValue(s) {
|
|
156
|
+
const unquoted = unquote(s);
|
|
157
|
+
if (unquoted === 'true')
|
|
158
|
+
return true;
|
|
159
|
+
if (unquoted === 'false')
|
|
160
|
+
return false;
|
|
161
|
+
if (unquoted === 'null')
|
|
162
|
+
return null;
|
|
163
|
+
const num = Number(unquoted);
|
|
164
|
+
if (!Number.isNaN(num) && unquoted !== '')
|
|
165
|
+
return num;
|
|
166
|
+
return unquoted;
|
|
167
|
+
}
|
|
168
|
+
function validateProvider(p) {
|
|
169
|
+
if (!p.name || !p.command || !p.tool)
|
|
170
|
+
return null;
|
|
171
|
+
if (!p.every || p.every < 1)
|
|
172
|
+
return null;
|
|
173
|
+
if (p.phase && !VALID_PHASES.has(p.phase))
|
|
174
|
+
return null;
|
|
175
|
+
if (p.feed && !VALID_FEEDS.has(p.feed))
|
|
176
|
+
return null;
|
|
177
|
+
return {
|
|
178
|
+
name: p.name,
|
|
179
|
+
command: p.command,
|
|
180
|
+
tool: p.tool,
|
|
181
|
+
args: p.args,
|
|
182
|
+
every: p.every,
|
|
183
|
+
phase: p.phase ?? 'pre-scout',
|
|
184
|
+
feed: p.feed ?? 'proposals',
|
|
185
|
+
timeout: p.timeout ?? 60_000,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Run all integrations matching the given phase.
|
|
190
|
+
* Checks cadence (every N cycles) and invokes each due provider.
|
|
191
|
+
*/
|
|
192
|
+
export async function runIntegrations(state, config, phase) {
|
|
193
|
+
if (config.providers.length === 0)
|
|
194
|
+
return [];
|
|
195
|
+
const due = config.providers.filter(p => {
|
|
196
|
+
if (p.phase !== phase)
|
|
197
|
+
return false;
|
|
198
|
+
const lastRun = state.integrationLastRun[p.name] ?? 0;
|
|
199
|
+
return (state.cycleCount - lastRun) >= p.every;
|
|
200
|
+
});
|
|
201
|
+
if (due.length === 0)
|
|
202
|
+
return [];
|
|
203
|
+
const results = [];
|
|
204
|
+
for (const provider of due) {
|
|
205
|
+
try {
|
|
206
|
+
if (state.options.verbose) {
|
|
207
|
+
state.displayAdapter.log(` Integration: invoking ${provider.name} (${provider.tool})`);
|
|
208
|
+
}
|
|
209
|
+
const data = await invokeProvider(provider, state.repoRoot);
|
|
210
|
+
state.integrationLastRun[provider.name] = state.cycleCount;
|
|
211
|
+
if (data !== null) {
|
|
212
|
+
results.push({ provider: provider.name, feed: provider.feed, data });
|
|
213
|
+
// Apply non-proposal feeds immediately
|
|
214
|
+
if (provider.feed === 'learnings') {
|
|
215
|
+
toLearnings(data, state.repoRoot);
|
|
216
|
+
}
|
|
217
|
+
else if (provider.feed === 'nudges') {
|
|
218
|
+
toNudges(data, state.repoRoot);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
224
|
+
if (state.options.verbose) {
|
|
225
|
+
state.displayAdapter.log(` Integration: ${provider.name} failed — ${msg}`);
|
|
226
|
+
}
|
|
227
|
+
// Don't crash the spin loop
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return results;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Invoke a single integration provider:
|
|
234
|
+
* spawn MCP server, connect, call tool, disconnect.
|
|
235
|
+
*/
|
|
236
|
+
export async function invokeProvider(provider, repoRoot) {
|
|
237
|
+
// Dynamic import to avoid hard dependency on @modelcontextprotocol/sdk
|
|
238
|
+
// (it's available in the monorepo but not a direct dependency of @promptwheel/cli)
|
|
239
|
+
const { Client } = await import('@modelcontextprotocol/sdk/client/index.js');
|
|
240
|
+
const { StdioClientTransport } = await import('@modelcontextprotocol/sdk/client/stdio.js');
|
|
241
|
+
const parts = provider.command.split(/\s+/);
|
|
242
|
+
const command = parts[0];
|
|
243
|
+
const args = parts.slice(1);
|
|
244
|
+
const transport = new StdioClientTransport({
|
|
245
|
+
command,
|
|
246
|
+
args,
|
|
247
|
+
env: { ...process.env },
|
|
248
|
+
});
|
|
249
|
+
const client = new Client({ name: 'promptwheel', version: CLI_VERSION }, { capabilities: {} });
|
|
250
|
+
const timeoutMs = provider.timeout ?? 60_000;
|
|
251
|
+
let timeoutId;
|
|
252
|
+
try {
|
|
253
|
+
// Connect with timeout
|
|
254
|
+
await Promise.race([
|
|
255
|
+
client.connect(transport),
|
|
256
|
+
new Promise((_, reject) => {
|
|
257
|
+
timeoutId = setTimeout(() => reject(new Error(`Connection timeout (${timeoutMs}ms)`)), timeoutMs);
|
|
258
|
+
}),
|
|
259
|
+
]);
|
|
260
|
+
if (timeoutId)
|
|
261
|
+
clearTimeout(timeoutId);
|
|
262
|
+
// Call the tool
|
|
263
|
+
const toolArgs = { ...provider.args, repoRoot };
|
|
264
|
+
const result = await Promise.race([
|
|
265
|
+
client.callTool({ name: provider.tool, arguments: toolArgs }),
|
|
266
|
+
new Promise((_, reject) => {
|
|
267
|
+
timeoutId = setTimeout(() => reject(new Error(`Tool call timeout (${timeoutMs}ms)`)), timeoutMs);
|
|
268
|
+
}),
|
|
269
|
+
]);
|
|
270
|
+
if (timeoutId)
|
|
271
|
+
clearTimeout(timeoutId);
|
|
272
|
+
// Extract data from result
|
|
273
|
+
if (result.structuredContent) {
|
|
274
|
+
return result.structuredContent;
|
|
275
|
+
}
|
|
276
|
+
const content = result.content;
|
|
277
|
+
if (content && content.length > 0) {
|
|
278
|
+
const textContent = content.find((c) => c.type === 'text');
|
|
279
|
+
if (textContent && 'text' in textContent && textContent.text) {
|
|
280
|
+
try {
|
|
281
|
+
return JSON.parse(textContent.text);
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
return textContent.text;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
290
|
+
finally {
|
|
291
|
+
if (timeoutId)
|
|
292
|
+
clearTimeout(timeoutId);
|
|
293
|
+
try {
|
|
294
|
+
await client.close();
|
|
295
|
+
}
|
|
296
|
+
catch { /* best-effort cleanup */ }
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
// ── Result adapters ─────────────────────────────────────────────────────────
|
|
300
|
+
/**
|
|
301
|
+
* Convert raw MCP tool output to TicketProposal[].
|
|
302
|
+
*
|
|
303
|
+
* Expects the MCP tool to return:
|
|
304
|
+
* ```json
|
|
305
|
+
* { "proposals": [{ "title", "description", "files", "category", "confidence", "impact" }] }
|
|
306
|
+
* ```
|
|
307
|
+
*/
|
|
308
|
+
export function toProposals(result) {
|
|
309
|
+
const data = result.data;
|
|
310
|
+
if (!data)
|
|
311
|
+
return [];
|
|
312
|
+
const raw = Array.isArray(data) ? data : data.proposals;
|
|
313
|
+
if (!Array.isArray(raw))
|
|
314
|
+
return [];
|
|
315
|
+
return raw
|
|
316
|
+
.filter((item) => item !== null && typeof item === 'object')
|
|
317
|
+
.map((item, i) => ({
|
|
318
|
+
id: `integration-${result.provider}-${Date.now()}-${i}`,
|
|
319
|
+
title: String(item.title ?? `${result.provider} finding ${i + 1}`),
|
|
320
|
+
description: String(item.description ?? ''),
|
|
321
|
+
category: item.category ?? 'fix',
|
|
322
|
+
confidence: typeof item.confidence === 'number' ? item.confidence : 50,
|
|
323
|
+
impact_score: typeof item.impact === 'number' ? item.impact : (typeof item.impact_score === 'number' ? item.impact_score : 5),
|
|
324
|
+
files: Array.isArray(item.files) ? item.files.map(String) : [],
|
|
325
|
+
allowed_paths: Array.isArray(item.files) ? item.files.map(String) : (Array.isArray(item.allowed_paths) ? item.allowed_paths.map(String) : []),
|
|
326
|
+
acceptance_criteria: Array.isArray(item.acceptance_criteria) ? item.acceptance_criteria.map(String) : [],
|
|
327
|
+
verification_commands: Array.isArray(item.verification_commands) ? item.verification_commands.map(String) : [],
|
|
328
|
+
rationale: String(item.rationale ?? item.description ?? ''),
|
|
329
|
+
estimated_complexity: item.estimated_complexity ?? 'moderate',
|
|
330
|
+
}));
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Convert raw MCP tool output to learnings and store them.
|
|
334
|
+
*
|
|
335
|
+
* Expects: `{ "learnings": [{ "text", "category"?, "tags"? }] }`
|
|
336
|
+
*/
|
|
337
|
+
export function toLearnings(data, repoRoot) {
|
|
338
|
+
if (!data || typeof data !== 'object')
|
|
339
|
+
return;
|
|
340
|
+
const obj = data;
|
|
341
|
+
const raw = Array.isArray(obj) ? obj : obj.learnings;
|
|
342
|
+
if (!Array.isArray(raw))
|
|
343
|
+
return;
|
|
344
|
+
for (const item of raw) {
|
|
345
|
+
if (!item || typeof item !== 'object')
|
|
346
|
+
continue;
|
|
347
|
+
const entry = item;
|
|
348
|
+
const text = String(entry.text ?? '').slice(0, 200);
|
|
349
|
+
if (!text)
|
|
350
|
+
continue;
|
|
351
|
+
addLearning(repoRoot, {
|
|
352
|
+
text,
|
|
353
|
+
category: entry.category ?? 'context',
|
|
354
|
+
source: { type: 'manual', detail: 'integration' },
|
|
355
|
+
tags: Array.isArray(entry.tags) ? entry.tags.map(String) : [],
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Convert raw MCP tool output to nudges (hints) and store them.
|
|
361
|
+
*
|
|
362
|
+
* Expects: `{ "nudges": [{ "text" }] }` or `{ "nudges": ["text", ...] }`
|
|
363
|
+
*/
|
|
364
|
+
export function toNudges(data, repoRoot) {
|
|
365
|
+
if (!data || typeof data !== 'object')
|
|
366
|
+
return;
|
|
367
|
+
const obj = data;
|
|
368
|
+
const raw = Array.isArray(obj) ? obj : obj.nudges;
|
|
369
|
+
if (!Array.isArray(raw))
|
|
370
|
+
return;
|
|
371
|
+
for (const item of raw) {
|
|
372
|
+
const text = typeof item === 'string'
|
|
373
|
+
? item
|
|
374
|
+
: (item && typeof item === 'object' ? String(item.text ?? '') : '');
|
|
375
|
+
if (text) {
|
|
376
|
+
addHint(repoRoot, text.slice(0, 500));
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
//# sourceMappingURL=integrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integrations.js","sourceRoot":"","sources":["../../src/lib/integrations.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/run-state.d.ts
CHANGED
|
@@ -75,6 +75,13 @@ export interface RunState {
|
|
|
75
75
|
};
|
|
76
76
|
/** Per-category success/failure stats for confidence calibration */
|
|
77
77
|
categoryStats?: Record<string, CategorySuccessStats>;
|
|
78
|
+
/** Per-integration provider tracking */
|
|
79
|
+
integrationStats?: Record<string, {
|
|
80
|
+
lastRunCycle: number;
|
|
81
|
+
totalRuns: number;
|
|
82
|
+
totalResults: number;
|
|
83
|
+
lastError?: string;
|
|
84
|
+
}>;
|
|
78
85
|
/** Learning ROI snapshots (ring buffer, max 20) */
|
|
79
86
|
learningSnapshots?: LearningSnapshot[];
|
|
80
87
|
}
|
|
@@ -174,4 +181,8 @@ export declare function snapshotLearningROI(repoRoot: string, getLearningEffecti
|
|
|
174
181
|
* Get confidence adjustment for a category. Returns 0 if no data.
|
|
175
182
|
*/
|
|
176
183
|
export declare function getCategoryConfidenceAdjustment(repoRoot: string, category: string): number;
|
|
184
|
+
/**
|
|
185
|
+
* Record an integration provider invocation.
|
|
186
|
+
*/
|
|
187
|
+
export declare function recordIntegrationRun(repoRoot: string, providerName: string, resultCount: number, error?: string): Promise<void>;
|
|
177
188
|
//# sourceMappingURL=run-state.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-state.d.ts","sourceRoot":"","sources":["../../src/lib/run-state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,wBAAwB,EAAE,MAAM,CAAC;IACjC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,QAAQ;IACvB,8DAA8D;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,kBAAkB,EAAE,MAAM,CAAC;IAC3B,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,0DAA0D;IAC1D,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC3C,6DAA6D;IAC7D,YAAY,CAAC,EAAE,YAAY,EAAE,CAAC;IAC9B,8DAA8D;IAC9D,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxF,2DAA2D;IAC3D,cAAc,CAAC,EAAE;QACf,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,oEAAoE;IACpE,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IACrD,mDAAmD;IACnD,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACxC;AAmCD;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,
|
|
1
|
+
{"version":3,"file":"run-state.d.ts","sourceRoot":"","sources":["../../src/lib/run-state.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/run-state.js
CHANGED
|
@@ -53,6 +53,7 @@ export function readRunState(repoRoot) {
|
|
|
53
53
|
recentDiffs: Array.isArray(parsed.recentDiffs) ? parsed.recentDiffs : [],
|
|
54
54
|
qualitySignals: parsed.qualitySignals ?? undefined,
|
|
55
55
|
categoryStats: parsed.categoryStats ?? undefined,
|
|
56
|
+
integrationStats: parsed.integrationStats ?? undefined,
|
|
56
57
|
learningSnapshots: Array.isArray(parsed.learningSnapshots) ? parsed.learningSnapshots : undefined,
|
|
57
58
|
formulaStats: (() => {
|
|
58
59
|
const statsRaw = parsed.formulaStats ?? {};
|
|
@@ -383,4 +384,24 @@ export function getCategoryConfidenceAdjustment(repoRoot, category) {
|
|
|
383
384
|
const state = readRunState(repoRoot);
|
|
384
385
|
return state.categoryStats?.[category]?.confidenceAdjustment ?? 0;
|
|
385
386
|
}
|
|
387
|
+
/**
|
|
388
|
+
* Record an integration provider invocation.
|
|
389
|
+
*/
|
|
390
|
+
export function recordIntegrationRun(repoRoot, providerName, resultCount, error) {
|
|
391
|
+
return withRunStateLock(() => {
|
|
392
|
+
const state = readRunState(repoRoot);
|
|
393
|
+
const stats = state.integrationStats ??= {};
|
|
394
|
+
const entry = stats[providerName] ??= { lastRunCycle: 0, totalRuns: 0, totalResults: 0 };
|
|
395
|
+
entry.lastRunCycle = state.totalCycles;
|
|
396
|
+
entry.totalRuns++;
|
|
397
|
+
entry.totalResults += resultCount;
|
|
398
|
+
if (error) {
|
|
399
|
+
entry.lastError = error.slice(0, 200);
|
|
400
|
+
}
|
|
401
|
+
else {
|
|
402
|
+
delete entry.lastError;
|
|
403
|
+
}
|
|
404
|
+
writeRunState(repoRoot, state);
|
|
405
|
+
});
|
|
406
|
+
}
|
|
386
407
|
//# sourceMappingURL=run-state.js.map
|