@slope-dev/slope 1.6.0 → 1.12.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.
- package/dist/cli/commands/analyze.d.ts +2 -0
- package/dist/cli/commands/analyze.d.ts.map +1 -0
- package/dist/cli/commands/analyze.js +106 -0
- package/dist/cli/commands/analyze.js.map +1 -0
- package/dist/cli/commands/guard.d.ts.map +1 -1
- package/dist/cli/commands/guard.js +4 -0
- package/dist/cli/commands/guard.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +149 -0
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/review-state.d.ts +6 -0
- package/dist/cli/commands/review-state.d.ts.map +1 -1
- package/dist/cli/commands/review-state.js +264 -1
- package/dist/cli/commands/review-state.js.map +1 -1
- package/dist/cli/commands/standup.d.ts.map +1 -1
- package/dist/cli/commands/standup.js +31 -2
- package/dist/cli/commands/standup.js.map +1 -1
- package/dist/cli/commands/transcript.d.ts +10 -0
- package/dist/cli/commands/transcript.d.ts.map +1 -0
- package/dist/cli/commands/transcript.js +188 -0
- package/dist/cli/commands/transcript.js.map +1 -0
- package/dist/cli/commands/vision.d.ts +2 -0
- package/dist/cli/commands/vision.d.ts.map +1 -0
- package/dist/cli/commands/vision.js +53 -0
- package/dist/cli/commands/vision.js.map +1 -0
- package/dist/cli/guards/next-action.d.ts +4 -0
- package/dist/cli/guards/next-action.d.ts.map +1 -1
- package/dist/cli/guards/next-action.js +35 -0
- package/dist/cli/guards/next-action.js.map +1 -1
- package/dist/cli/guards/pr-review.d.ts +7 -0
- package/dist/cli/guards/pr-review.d.ts.map +1 -0
- package/dist/cli/guards/pr-review.js +34 -0
- package/dist/cli/guards/pr-review.js.map +1 -0
- package/dist/cli/guards/transcript.d.ts +12 -0
- package/dist/cli/guards/transcript.d.ts.map +1 -0
- package/dist/cli/guards/transcript.js +79 -0
- package/dist/cli/guards/transcript.js.map +1 -0
- package/dist/cli/index.js +28 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/store.d.ts.map +1 -1
- package/dist/cli/store.js +16 -0
- package/dist/cli/store.js.map +1 -1
- package/dist/core/analyzers/backlog-merged.d.ts +13 -0
- package/dist/core/analyzers/backlog-merged.d.ts.map +1 -0
- package/dist/core/analyzers/backlog-merged.js +16 -0
- package/dist/core/analyzers/backlog-merged.js.map +1 -0
- package/dist/core/analyzers/backlog.d.ts +16 -0
- package/dist/core/analyzers/backlog.d.ts.map +1 -0
- package/dist/core/analyzers/backlog.js +103 -0
- package/dist/core/analyzers/backlog.js.map +1 -0
- package/dist/core/analyzers/ci.d.ts +6 -0
- package/dist/core/analyzers/ci.d.ts.map +1 -0
- package/dist/core/analyzers/ci.js +62 -0
- package/dist/core/analyzers/ci.js.map +1 -0
- package/dist/core/analyzers/complexity.d.ts +21 -0
- package/dist/core/analyzers/complexity.d.ts.map +1 -0
- package/dist/core/analyzers/complexity.js +76 -0
- package/dist/core/analyzers/complexity.js.map +1 -0
- package/dist/core/analyzers/docs.d.ts +6 -0
- package/dist/core/analyzers/docs.d.ts.map +1 -0
- package/dist/core/analyzers/docs.js +54 -0
- package/dist/core/analyzers/docs.js.map +1 -0
- package/dist/core/analyzers/git.d.ts +3 -0
- package/dist/core/analyzers/git.d.ts.map +1 -0
- package/dist/core/analyzers/git.js +88 -0
- package/dist/core/analyzers/git.js.map +1 -0
- package/dist/core/analyzers/github-backlog.d.ts +14 -0
- package/dist/core/analyzers/github-backlog.d.ts.map +1 -0
- package/dist/core/analyzers/github-backlog.js +43 -0
- package/dist/core/analyzers/github-backlog.js.map +1 -0
- package/dist/core/analyzers/index.d.ts +9 -0
- package/dist/core/analyzers/index.d.ts.map +1 -0
- package/dist/core/analyzers/index.js +95 -0
- package/dist/core/analyzers/index.js.map +1 -0
- package/dist/core/analyzers/stack.d.ts +3 -0
- package/dist/core/analyzers/stack.d.ts.map +1 -0
- package/dist/core/analyzers/stack.js +161 -0
- package/dist/core/analyzers/stack.js.map +1 -0
- package/dist/core/analyzers/structure.d.ts +3 -0
- package/dist/core/analyzers/structure.d.ts.map +1 -0
- package/dist/core/analyzers/structure.js +106 -0
- package/dist/core/analyzers/structure.js.map +1 -0
- package/dist/core/analyzers/testing.d.ts +3 -0
- package/dist/core/analyzers/testing.d.ts.map +1 -0
- package/dist/core/analyzers/testing.js +119 -0
- package/dist/core/analyzers/testing.js.map +1 -0
- package/dist/core/analyzers/types.d.ts +83 -0
- package/dist/core/analyzers/types.d.ts.map +1 -0
- package/dist/core/analyzers/types.js +3 -0
- package/dist/core/analyzers/types.js.map +1 -0
- package/dist/core/analyzers/walk.d.ts +11 -0
- package/dist/core/analyzers/walk.d.ts.map +1 -0
- package/dist/core/analyzers/walk.js +33 -0
- package/dist/core/analyzers/walk.js.map +1 -0
- package/dist/core/config.d.ts +9 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +3 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/constants.d.ts +3 -1
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +8 -0
- package/dist/core/constants.js.map +1 -1
- package/dist/core/dashboard.d.ts.map +1 -1
- package/dist/core/dashboard.js +3 -1
- package/dist/core/dashboard.js.map +1 -1
- package/dist/core/dispersion.d.ts.map +1 -1
- package/dist/core/dispersion.js +6 -4
- package/dist/core/dispersion.js.map +1 -1
- package/dist/core/event-ingestion.d.ts +34 -0
- package/dist/core/event-ingestion.d.ts.map +1 -0
- package/dist/core/event-ingestion.js +115 -0
- package/dist/core/event-ingestion.js.map +1 -0
- package/dist/core/generators/common-issues.d.ts +9 -0
- package/dist/core/generators/common-issues.d.ts.map +1 -0
- package/dist/core/generators/common-issues.js +71 -0
- package/dist/core/generators/common-issues.js.map +1 -0
- package/dist/core/generators/config.d.ts +14 -0
- package/dist/core/generators/config.d.ts.map +1 -0
- package/dist/core/generators/config.js +45 -0
- package/dist/core/generators/config.js.map +1 -0
- package/dist/core/generators/first-sprint.d.ts +28 -0
- package/dist/core/generators/first-sprint.d.ts.map +1 -0
- package/dist/core/generators/first-sprint.js +71 -0
- package/dist/core/generators/first-sprint.js.map +1 -0
- package/dist/core/generators/roadmap.d.ts +14 -0
- package/dist/core/generators/roadmap.d.ts.map +1 -0
- package/dist/core/generators/roadmap.js +228 -0
- package/dist/core/generators/roadmap.js.map +1 -0
- package/dist/core/github.d.ts +71 -0
- package/dist/core/github.d.ts.map +1 -0
- package/dist/core/github.js +189 -0
- package/dist/core/github.js.map +1 -0
- package/dist/core/guard.d.ts +1 -1
- package/dist/core/guard.d.ts.map +1 -1
- package/dist/core/guard.js +14 -0
- package/dist/core/guard.js.map +1 -1
- package/dist/core/index.d.ts +36 -4
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +33 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/interview.d.ts +31 -0
- package/dist/core/interview.d.ts.map +1 -0
- package/dist/core/interview.js +167 -0
- package/dist/core/interview.js.map +1 -0
- package/dist/core/project-registry.d.ts +26 -0
- package/dist/core/project-registry.d.ts.map +1 -0
- package/dist/core/project-registry.js +56 -0
- package/dist/core/project-registry.js.map +1 -0
- package/dist/core/report.d.ts.map +1 -1
- package/dist/core/report.js +6 -4
- package/dist/core/report.js.map +1 -1
- package/dist/core/review.d.ts +41 -0
- package/dist/core/review.d.ts.map +1 -0
- package/dist/core/review.js +142 -0
- package/dist/core/review.js.map +1 -0
- package/dist/core/standup.d.ts +33 -0
- package/dist/core/standup.d.ts.map +1 -1
- package/dist/core/standup.js +137 -0
- package/dist/core/standup.js.map +1 -1
- package/dist/core/transcript.d.ts +23 -0
- package/dist/core/transcript.d.ts.map +1 -0
- package/dist/core/transcript.js +64 -0
- package/dist/core/transcript.js.map +1 -0
- package/dist/core/types.d.ts +40 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/vision.d.ts +5 -0
- package/dist/core/vision.d.ts.map +1 -0
- package/dist/core/vision.js +58 -0
- package/dist/core/vision.js.map +1 -0
- package/dist/core/webhooks.d.ts +31 -0
- package/dist/core/webhooks.d.ts.map +1 -0
- package/dist/core/webhooks.js +114 -0
- package/dist/core/webhooks.js.map +1 -0
- package/dist/mcp/registry.d.ts +1 -1
- package/dist/mcp/registry.d.ts.map +1 -1
- package/dist/mcp/registry.js +170 -0
- package/dist/mcp/registry.js.map +1 -1
- package/dist/store-pg/index.d.ts +49 -0
- package/dist/store-pg/index.d.ts.map +1 -0
- package/dist/store-pg/index.js +422 -0
- package/dist/store-pg/index.js.map +1 -0
- package/package.json +8 -1
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// SLOPE — slope vision: display project vision document
|
|
2
|
+
import { loadVision } from '../../core/vision.js';
|
|
3
|
+
function parseArgs(args) {
|
|
4
|
+
const result = {};
|
|
5
|
+
for (const arg of args) {
|
|
6
|
+
const match = arg.match(/^--(\w[\w-]*)(?:=(.+))?$/);
|
|
7
|
+
if (match)
|
|
8
|
+
result[match[1]] = match[2] ?? 'true';
|
|
9
|
+
}
|
|
10
|
+
return result;
|
|
11
|
+
}
|
|
12
|
+
export async function visionCommand(args) {
|
|
13
|
+
const flags = parseArgs(args);
|
|
14
|
+
if (args.includes('--help') || args.includes('-h')) {
|
|
15
|
+
console.log(`
|
|
16
|
+
slope vision — Display project vision document
|
|
17
|
+
|
|
18
|
+
Usage:
|
|
19
|
+
slope vision Show current vision
|
|
20
|
+
slope vision --json Output as JSON
|
|
21
|
+
`);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const vision = loadVision();
|
|
25
|
+
if (!vision) {
|
|
26
|
+
console.log('No vision set. Run `slope init --interactive` to create one.');
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (flags.json === 'true') {
|
|
30
|
+
console.log(JSON.stringify(vision, null, 2));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
console.log(`\nProject Vision\n`);
|
|
34
|
+
console.log(` Purpose: ${vision.purpose}`);
|
|
35
|
+
if (vision.audience)
|
|
36
|
+
console.log(` Audience: ${vision.audience}`);
|
|
37
|
+
if (vision.priorities.length > 0) {
|
|
38
|
+
console.log(` Priorities:`);
|
|
39
|
+
for (const p of vision.priorities) {
|
|
40
|
+
console.log(` - ${p}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (vision.techDirection)
|
|
44
|
+
console.log(` Tech: ${vision.techDirection}`);
|
|
45
|
+
if (vision.nonGoals && vision.nonGoals.length > 0) {
|
|
46
|
+
console.log(` Non-goals:`);
|
|
47
|
+
for (const ng of vision.nonGoals) {
|
|
48
|
+
console.log(` - ${ng}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
console.log(` Updated: ${vision.updatedAt}\n`);
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=vision.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vision.js","sourceRoot":"","sources":["../../../src/cli/commands/vision.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACpD,IAAI,KAAK;YAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IACnD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAc;IAChD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAE9B,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC;;;;;;CAMf,CAAC,CAAC;QACC,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;QAC5E,OAAO;IACT,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACjD,IAAI,MAAM,CAAC,QAAQ;QAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvE,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC7B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,aAAa;QAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;IACjF,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC5B,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"next-action.d.ts","sourceRoot":"","sources":["../../../src/cli/guards/next-action.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAe,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"next-action.d.ts","sourceRoot":"","sources":["../../../src/cli/guards/next-action.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAe,MAAM,qBAAqB,CAAC;AAK/E,mDAAmD;AACnD,KAAK,WAAW,GACZ;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,GACnF;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GACnE;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD;;;GAGG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAmCzF;AAED,qEAAqE;AACrE,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAuFzE;AAuBD,gDAAgD;AAChD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAoF3D"}
|
|
@@ -2,6 +2,7 @@ import { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync } from '
|
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { loadConfig, detectLatestSprint, parseRoadmap, formatStrategicContext } from '../../core/index.js';
|
|
4
4
|
import { resolveStore } from '../store.js';
|
|
5
|
+
import { loadFindings } from '../commands/review-state.js';
|
|
5
6
|
/**
|
|
6
7
|
* Next-action guard: fires on Stop.
|
|
7
8
|
* Suggests next actions before session end based on sprint state.
|
|
@@ -101,6 +102,26 @@ export async function detectSprintState(cwd) {
|
|
|
101
102
|
if (!existsSync(reviewPath)) {
|
|
102
103
|
return { type: 'needs-review', sprintNumber: latestScoredSprint };
|
|
103
104
|
}
|
|
105
|
+
// Check if findings exist but scorecard hasn't been amended
|
|
106
|
+
const findingsData = loadFindings(cwd);
|
|
107
|
+
if (findingsData && findingsData.findings.length > 0) {
|
|
108
|
+
try {
|
|
109
|
+
// Check if scorecard already has review hazards
|
|
110
|
+
const scorecardPath = join(retrosDir, `sprint-${latestScoredSprint}.json`);
|
|
111
|
+
if (existsSync(scorecardPath)) {
|
|
112
|
+
const scorecard = JSON.parse(readFileSync(scorecardPath, 'utf8'));
|
|
113
|
+
const hasReviewHazards = scorecard.shots?.some((s) => s.hazards?.some((h) => h.gotcha_id?.startsWith('review:')));
|
|
114
|
+
if (!hasReviewHazards) {
|
|
115
|
+
return {
|
|
116
|
+
type: 'needs-amend',
|
|
117
|
+
sprintNumber: latestScoredSprint,
|
|
118
|
+
findingCount: findingsData.findings.length,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch { /* scorecard parse error — skip */ }
|
|
124
|
+
}
|
|
104
125
|
}
|
|
105
126
|
// Default: between sprints
|
|
106
127
|
return buildBetweenSprints(config, cwd, latestScoredSprint);
|
|
@@ -174,6 +195,20 @@ export function buildSuggestions(state) {
|
|
|
174
195
|
'Present these using AskUserQuestion. If the user chooses to end the session, stop without further action.',
|
|
175
196
|
].join('\n');
|
|
176
197
|
}
|
|
198
|
+
case 'needs-amend': {
|
|
199
|
+
return [
|
|
200
|
+
header,
|
|
201
|
+
'',
|
|
202
|
+
`Current state: Sprint ${state.sprintNumber} has ${state.findingCount} review finding(s) not yet applied to scorecard`,
|
|
203
|
+
'',
|
|
204
|
+
'Suggested options:',
|
|
205
|
+
'1. Run `slope review amend` to apply findings as hazards and recalculate score',
|
|
206
|
+
'2. Run `slope review findings list` to see the findings first',
|
|
207
|
+
'3. End session — nothing more to do right now',
|
|
208
|
+
'',
|
|
209
|
+
'Present these using AskUserQuestion. If the user chooses to end the session, stop without further action.',
|
|
210
|
+
].join('\n');
|
|
211
|
+
}
|
|
177
212
|
case 'between-sprints': {
|
|
178
213
|
const contextLine = state.roadmapContext
|
|
179
214
|
? `\n${state.roadmapContext}\n`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"next-action.js","sourceRoot":"","sources":["../../../src/cli/guards/next-action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,IAAI,EAAW,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAkB,kBAAkB,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC3H,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"next-action.js","sourceRoot":"","sources":["../../../src/cli/guards/next-action.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { HookInput, GuardResult } from '../../core/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* PR review guard: fires PostToolUse on Bash.
|
|
4
|
+
* Detects `gh pr create` output and prompts for review workflow choice.
|
|
5
|
+
*/
|
|
6
|
+
export declare function prReviewGuard(input: HookInput, _cwd: string): Promise<GuardResult>;
|
|
7
|
+
//# sourceMappingURL=pr-review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-review.d.ts","sourceRoot":"","sources":["../../../src/cli/guards/pr-review.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElE;;;GAGG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA8BxF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PR review guard: fires PostToolUse on Bash.
|
|
3
|
+
* Detects `gh pr create` output and prompts for review workflow choice.
|
|
4
|
+
*/
|
|
5
|
+
export async function prReviewGuard(input, _cwd) {
|
|
6
|
+
const command = input.tool_input?.command ?? '';
|
|
7
|
+
const response = input.tool_response?.stdout ?? input.tool_response?.result ?? '';
|
|
8
|
+
// Only fire after gh pr create commands
|
|
9
|
+
if (!command.includes('gh pr create'))
|
|
10
|
+
return {};
|
|
11
|
+
// Verify a PR URL was returned (successful creation)
|
|
12
|
+
if (!response.includes('github.com/') || !response.includes('/pull/'))
|
|
13
|
+
return {};
|
|
14
|
+
// Extract PR URL from response
|
|
15
|
+
const urlMatch = response.match(/(https:\/\/github\.com\/[^\s]+\/pull\/\d+)/);
|
|
16
|
+
const prUrl = urlMatch ? urlMatch[1] : 'the PR';
|
|
17
|
+
return {
|
|
18
|
+
context: [
|
|
19
|
+
`SLOPE pr-review: A pull request was just created (${prUrl}).`,
|
|
20
|
+
'',
|
|
21
|
+
'IMPORTANT: You MUST now ask the user how they want to handle the PR review using AskUserQuestion.',
|
|
22
|
+
'Present these options:',
|
|
23
|
+
'',
|
|
24
|
+
'1. Code Review — Detailed line-by-line code review of the diff',
|
|
25
|
+
'2. Architect Review — High-level architecture and design review',
|
|
26
|
+
'3. Both — Run code review followed by architect review',
|
|
27
|
+
'4. Manual Review — User will review manually, no automated review',
|
|
28
|
+
'5. Skip / Merge Now — No review needed, proceed to merge',
|
|
29
|
+
'',
|
|
30
|
+
'Wait for the user\'s choice before taking any further action.',
|
|
31
|
+
].join('\n'),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=pr-review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-review.js","sourceRoot":"","sources":["../../../src/cli/guards/pr-review.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAgB,EAAE,IAAY;IAChE,MAAM,OAAO,GAAI,KAAK,CAAC,UAAU,EAAE,OAAkB,IAAI,EAAE,CAAC;IAC5D,MAAM,QAAQ,GAAI,KAAK,CAAC,aAAa,EAAE,MAAiB,IAAK,KAAK,CAAC,aAAa,EAAE,MAAiB,IAAI,EAAE,CAAC;IAE1G,wCAAwC;IACxC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjD,qDAAqD;IACrD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjF,+BAA+B;IAC/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC9E,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEhD,OAAO;QACL,OAAO,EAAE;YACP,qDAAqD,KAAK,IAAI;YAC9D,EAAE;YACF,mGAAmG;YACnG,wBAAwB;YACxB,EAAE;YACF,gEAAgE;YAChE,iEAAiE;YACjE,wDAAwD;YACxD,mEAAmE;YACnE,0DAA0D;YAC1D,EAAE;YACF,+DAA+D;SAChE,CAAC,IAAI,CAAC,IAAI,CAAC;KACb,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { HookInput, GuardResult } from '../../core/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Transcript guard: fires PostToolUse on all tools (no matcher).
|
|
4
|
+
* Appends tool call metadata to the session transcript JSONL file.
|
|
5
|
+
* Silent — returns empty GuardResult, no context injection.
|
|
6
|
+
*
|
|
7
|
+
* Note: appendFileSync is safe for single-agent sessions (typical usage).
|
|
8
|
+
* Multi-agent scenarios sharing a session_id could interleave partial writes;
|
|
9
|
+
* if multi-agent transcript support is needed, add file locking or per-agent files.
|
|
10
|
+
*/
|
|
11
|
+
export declare function transcriptGuard(input: HookInput, cwd: string): Promise<GuardResult>;
|
|
12
|
+
//# sourceMappingURL=transcript.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../../../src/cli/guards/transcript.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAyClE;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA+BzF"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { appendTurn } from '../../core/transcript.js';
|
|
3
|
+
import { loadConfig } from '../config.js';
|
|
4
|
+
/**
|
|
5
|
+
* Summarize tool_input params into a short string for the transcript.
|
|
6
|
+
*/
|
|
7
|
+
function summarizeParams(toolName, toolInput) {
|
|
8
|
+
switch (toolName) {
|
|
9
|
+
case 'Read':
|
|
10
|
+
return `file: ${toolInput.file_path ?? ''}`;
|
|
11
|
+
case 'Edit':
|
|
12
|
+
case 'Write':
|
|
13
|
+
return `file: ${toolInput.file_path ?? ''}`;
|
|
14
|
+
case 'Bash':
|
|
15
|
+
return `cmd: ${String(toolInput.command ?? '').slice(0, 80)}`;
|
|
16
|
+
case 'Grep':
|
|
17
|
+
return `pattern: ${toolInput.pattern ?? ''}, path: ${toolInput.path ?? '.'}`;
|
|
18
|
+
case 'Glob':
|
|
19
|
+
return `pattern: ${toolInput.pattern ?? ''}`;
|
|
20
|
+
case 'Task':
|
|
21
|
+
return `type: ${toolInput.subagent_type ?? ''}`;
|
|
22
|
+
default: {
|
|
23
|
+
const json = JSON.stringify(toolInput);
|
|
24
|
+
return json.length > 80 ? json.slice(0, 80) + '...' : json;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Detect whether the tool call succeeded from tool_response.
|
|
30
|
+
*/
|
|
31
|
+
function detectSuccess(toolResponse) {
|
|
32
|
+
if (!toolResponse)
|
|
33
|
+
return true;
|
|
34
|
+
if (toolResponse.error)
|
|
35
|
+
return false;
|
|
36
|
+
if (typeof toolResponse.stderr === 'string' && toolResponse.stderr.length > 0)
|
|
37
|
+
return false;
|
|
38
|
+
if (toolResponse.is_error === true)
|
|
39
|
+
return false;
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Transcript guard: fires PostToolUse on all tools (no matcher).
|
|
44
|
+
* Appends tool call metadata to the session transcript JSONL file.
|
|
45
|
+
* Silent — returns empty GuardResult, no context injection.
|
|
46
|
+
*
|
|
47
|
+
* Note: appendFileSync is safe for single-agent sessions (typical usage).
|
|
48
|
+
* Multi-agent scenarios sharing a session_id could interleave partial writes;
|
|
49
|
+
* if multi-agent transcript support is needed, add file locking or per-agent files.
|
|
50
|
+
*/
|
|
51
|
+
export async function transcriptGuard(input, cwd) {
|
|
52
|
+
// Skip if no session_id
|
|
53
|
+
if (!input.session_id)
|
|
54
|
+
return {};
|
|
55
|
+
const config = loadConfig();
|
|
56
|
+
const transcriptsDir = join(cwd, config.transcriptsPath ?? '.slope/transcripts');
|
|
57
|
+
const toolName = input.tool_name ?? 'unknown';
|
|
58
|
+
const toolInput = input.tool_input ?? {};
|
|
59
|
+
const success = detectSuccess(input.tool_response);
|
|
60
|
+
const toolCall = {
|
|
61
|
+
tool: toolName,
|
|
62
|
+
params_summary: summarizeParams(toolName, toolInput),
|
|
63
|
+
success,
|
|
64
|
+
};
|
|
65
|
+
const line = {
|
|
66
|
+
role: 'tool_result',
|
|
67
|
+
timestamp: new Date().toISOString(),
|
|
68
|
+
tool_calls: [toolCall],
|
|
69
|
+
outcome: success ? 'success' : 'failure',
|
|
70
|
+
};
|
|
71
|
+
try {
|
|
72
|
+
appendTurn(transcriptsDir, input.session_id, line);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Silent — transcript write failure should never block the agent
|
|
76
|
+
}
|
|
77
|
+
return {};
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=transcript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../../src/cli/guards/transcript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C;;GAEG;AACH,SAAS,eAAe,CAAC,QAAgB,EAAE,SAAkC;IAC3E,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,SAAS,SAAS,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;QAC9C,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO;YACV,OAAO,SAAS,SAAS,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;QAC9C,KAAK,MAAM;YACT,OAAO,QAAQ,MAAM,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QAChE,KAAK,MAAM;YACT,OAAO,YAAY,SAAS,CAAC,OAAO,IAAI,EAAE,WAAW,SAAS,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;QAC/E,KAAK,MAAM;YACT,OAAO,YAAY,SAAS,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QAC/C,KAAK,MAAM;YACT,OAAO,SAAS,SAAS,CAAC,aAAa,IAAI,EAAE,EAAE,CAAC;QAClD,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACvC,OAAO,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7D,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,YAAiD;IACtE,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IAC/B,IAAI,YAAY,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,OAAO,YAAY,CAAC,MAAM,KAAK,QAAQ,IAAK,YAAY,CAAC,MAAiB,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACxG,IAAI,YAAY,CAAC,QAAQ,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACjD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAgB,EAAE,GAAW;IACjE,wBAAwB;IACxB,IAAI,CAAC,KAAK,CAAC,UAAU;QAAE,OAAO,EAAE,CAAC;IAEjC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,eAAe,IAAI,oBAAoB,CAAC,CAAC;IAEjF,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,IAAI,SAAS,CAAC;IAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAEnD,MAAM,QAAQ,GAAoB;QAChC,IAAI,EAAE,QAAQ;QACd,cAAc,EAAE,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC;QACpD,OAAO;KACR,CAAC;IAEF,MAAM,IAAI,GAAmB;QAC3B,IAAI,EAAE,aAAa;QACnB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,UAAU,EAAE,CAAC,QAAQ,CAAC;QACtB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;KACzC,CAAC;IAEF,IAAI,CAAC;QACH,UAAU,CAAC,cAAc,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,iEAAiE;IACnE,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
package/dist/cli/index.js
CHANGED
|
@@ -42,6 +42,9 @@ import { dashboardCommand } from './commands/dashboard.js';
|
|
|
42
42
|
import { mapCommand } from './commands/map.js';
|
|
43
43
|
import { flowsCommand } from './commands/flows.js';
|
|
44
44
|
import { reviewStateCommand } from './commands/review-state.js';
|
|
45
|
+
import { analyzeCommand } from './commands/analyze.js';
|
|
46
|
+
import { visionCommand } from './commands/vision.js';
|
|
47
|
+
import { transcriptCommand } from './commands/transcript.js';
|
|
45
48
|
const subcommand = process.argv[2];
|
|
46
49
|
switch (subcommand) {
|
|
47
50
|
case 'init':
|
|
@@ -59,7 +62,7 @@ switch (subcommand) {
|
|
|
59
62
|
case 'review': {
|
|
60
63
|
const reviewArgs = process.argv.slice(3);
|
|
61
64
|
const reviewSub = reviewArgs[0];
|
|
62
|
-
if (['start', 'round', 'status', 'reset'].includes(reviewSub)) {
|
|
65
|
+
if (['start', 'round', 'status', 'reset', 'recommend', 'findings', 'amend'].includes(reviewSub)) {
|
|
63
66
|
reviewStateCommand(reviewArgs).catch(err => {
|
|
64
67
|
console.error('Error:', err.message);
|
|
65
68
|
process.exit(1);
|
|
@@ -205,6 +208,24 @@ switch (subcommand) {
|
|
|
205
208
|
process.exit(1);
|
|
206
209
|
});
|
|
207
210
|
break;
|
|
211
|
+
case 'analyze':
|
|
212
|
+
analyzeCommand(process.argv.slice(3)).catch(err => {
|
|
213
|
+
console.error('Error:', err.message);
|
|
214
|
+
process.exit(1);
|
|
215
|
+
});
|
|
216
|
+
break;
|
|
217
|
+
case 'vision':
|
|
218
|
+
visionCommand(process.argv.slice(3)).catch(err => {
|
|
219
|
+
console.error('Error:', err.message);
|
|
220
|
+
process.exit(1);
|
|
221
|
+
});
|
|
222
|
+
break;
|
|
223
|
+
case 'transcript':
|
|
224
|
+
transcriptCommand(process.argv.slice(3)).catch(err => {
|
|
225
|
+
console.error('Error:', err.message);
|
|
226
|
+
process.exit(1);
|
|
227
|
+
});
|
|
228
|
+
break;
|
|
208
229
|
default:
|
|
209
230
|
console.log(`
|
|
210
231
|
SLOPE CLI — Sprint Lifecycle & Operational Performance Engine
|
|
@@ -221,6 +242,9 @@ Usage:
|
|
|
221
242
|
slope review round Record a completed review round
|
|
222
243
|
slope review status Show current review state
|
|
223
244
|
slope review reset Clear review state
|
|
245
|
+
slope review recommend Recommend review types for current sprint
|
|
246
|
+
slope review findings add|list|clear Manage implementation review findings
|
|
247
|
+
slope review amend [--sprint=N] Amend scorecard with review findings
|
|
224
248
|
slope briefing [--sprint=N] [options] Pre-round briefing
|
|
225
249
|
slope plan --complexity=<level> Pre-shot advisor (club + training + hazards)
|
|
226
250
|
slope classify --scope=... ... Classify a shot from execution trace
|
|
@@ -246,6 +270,9 @@ Usage:
|
|
|
246
270
|
slope roadmap validate|review|status|show Strategic planning tools
|
|
247
271
|
slope map [--check] [--output=<path>] Generate/update codebase map
|
|
248
272
|
slope flows init|list|check Manage user flow definitions
|
|
273
|
+
slope analyze [--json] [--analyzers=...] Scan repo and generate profile
|
|
274
|
+
slope vision [--json] Display project vision document
|
|
275
|
+
slope transcript list|show|stats View session transcript data
|
|
249
276
|
slope plugin list|validate Manage custom plugins
|
|
250
277
|
|
|
251
278
|
Examples:
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/cli/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD,wBAAsB,YAAY,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/cli/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD,wBAAsB,YAAY,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,UAAU,CAAC,CAyBnF"}
|
package/dist/cli/store.js
CHANGED
|
@@ -6,6 +6,22 @@ export async function resolveStore(cwd = process.cwd()) {
|
|
|
6
6
|
const { createStore } = await import('../store/index.js');
|
|
7
7
|
return createStore({ storePath: config.store_path ?? '.slope/slope.db', cwd });
|
|
8
8
|
}
|
|
9
|
+
if (storeType === 'postgres') {
|
|
10
|
+
try {
|
|
11
|
+
const { createPostgresStore } = await import('../store-pg/index.js');
|
|
12
|
+
return createPostgresStore({
|
|
13
|
+
connectionString: config.postgres?.connectionString,
|
|
14
|
+
projectId: config.postgres?.projectId ?? config.projectId,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
if (err.code === 'MODULE_NOT_FOUND' ||
|
|
19
|
+
(err instanceof Error && err.message.includes('Cannot find module'))) {
|
|
20
|
+
throw new Error('PostgreSQL support requires the "pg" package. Run: npm install pg');
|
|
21
|
+
}
|
|
22
|
+
throw err;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
9
25
|
// Custom adapter: dynamic import of the store module
|
|
10
26
|
const mod = await import(storeType);
|
|
11
27
|
return mod.createStore({ cwd, ...config });
|
package/dist/cli/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/cli/store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC5D,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC;IAC3C,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC1D,OAAO,WAAW,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,IAAI,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,qDAAqD;IACrD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IACpC,OAAO,GAAG,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;AAC7C,CAAC"}
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/cli/store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC5D,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC;IAC3C,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAC1D,OAAO,WAAW,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,IAAI,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;YACrE,OAAO,mBAAmB,CAAC;gBACzB,gBAAgB,EAAE,MAAM,CAAC,QAAQ,EAAE,gBAAgB;gBACnD,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,IAAI,MAAM,CAAC,SAAS;aAC1D,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAA6B,CAAC,IAAI,KAAK,kBAAkB;gBAC1D,CAAC,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,EAAE,CAAC;gBACzE,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;YACvF,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IACD,qDAAqD;IACrD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IACpC,OAAO,GAAG,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { BacklogAnalysis } from './backlog.js';
|
|
2
|
+
import type { GitHubBacklogAnalysis } from './github-backlog.js';
|
|
3
|
+
export interface MergedBacklog {
|
|
4
|
+
local: BacklogAnalysis;
|
|
5
|
+
remote?: GitHubBacklogAnalysis;
|
|
6
|
+
totalItems: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Merge local backlog (TODO/FIXME) with optional remote GitHub backlog.
|
|
10
|
+
* Provides unified totalItems count across both sources.
|
|
11
|
+
*/
|
|
12
|
+
export declare function mergeBacklogs(local: BacklogAnalysis, remote?: GitHubBacklogAnalysis): MergedBacklog;
|
|
13
|
+
//# sourceMappingURL=backlog-merged.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backlog-merged.d.ts","sourceRoot":"","sources":["../../../src/core/analyzers/backlog-merged.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,eAAe,CAAC;IACvB,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,eAAe,EACtB,MAAM,CAAC,EAAE,qBAAqB,GAC7B,aAAa,CASf"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// SLOPE — Merged Backlog
|
|
2
|
+
// Combines local TODO/FIXME analysis with remote GitHub issue data.
|
|
3
|
+
/**
|
|
4
|
+
* Merge local backlog (TODO/FIXME) with optional remote GitHub backlog.
|
|
5
|
+
* Provides unified totalItems count across both sources.
|
|
6
|
+
*/
|
|
7
|
+
export function mergeBacklogs(local, remote) {
|
|
8
|
+
const localCount = local.todos.length;
|
|
9
|
+
const remoteCount = remote?.issues.length ?? 0;
|
|
10
|
+
return {
|
|
11
|
+
local,
|
|
12
|
+
remote,
|
|
13
|
+
totalItems: localCount + remoteCount,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=backlog-merged.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backlog-merged.js","sourceRoot":"","sources":["../../../src/core/analyzers/backlog-merged.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,oEAAoE;AAWpE;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAsB,EACtB,MAA8B;IAE9B,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;IACtC,MAAM,WAAW,GAAG,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAE/C,OAAO;QACL,KAAK;QACL,MAAM;QACN,UAAU,EAAE,UAAU,GAAG,WAAW;KACrC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface TodoEntry {
|
|
2
|
+
type: 'TODO' | 'FIXME' | 'HACK' | 'XXX';
|
|
3
|
+
text: string;
|
|
4
|
+
file: string;
|
|
5
|
+
line: number;
|
|
6
|
+
}
|
|
7
|
+
export interface BacklogAnalysis {
|
|
8
|
+
todos: TodoEntry[];
|
|
9
|
+
todosByModule: Record<string, TodoEntry[]>;
|
|
10
|
+
changelogUnreleased?: string[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Analyze a codebase for TODO/FIXME/HACK/XXX comments and changelog data.
|
|
14
|
+
*/
|
|
15
|
+
export declare function analyzeBacklog(cwd: string): Promise<BacklogAnalysis>;
|
|
16
|
+
//# sourceMappingURL=backlog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backlog.d.ts","sourceRoot":"","sources":["../../../src/core/analyzers/backlog.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAC3C,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC;AAMD;;GAEG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA8C1E"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// SLOPE — Backlog Analyzer
|
|
2
|
+
// Scans source files for TODO/FIXME/HACK/XXX comments and parses CHANGELOG unreleased.
|
|
3
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { walkDir } from './walk.js';
|
|
6
|
+
const SOURCE_EXTENSIONS = new Set(['.ts', '.js', '.tsx', '.jsx', '.py', '.go', '.rs', '.rb']);
|
|
7
|
+
const TODO_PATTERN = /(?:\/\/|#)\s*(TODO|FIXME|HACK|XXX)[:\s]+(.+)/i;
|
|
8
|
+
const MAX_TODOS = 200;
|
|
9
|
+
/**
|
|
10
|
+
* Analyze a codebase for TODO/FIXME/HACK/XXX comments and changelog data.
|
|
11
|
+
*/
|
|
12
|
+
export async function analyzeBacklog(cwd) {
|
|
13
|
+
const entries = walkDir(cwd, { maxDepth: 8 });
|
|
14
|
+
const todos = [];
|
|
15
|
+
for (const entry of entries) {
|
|
16
|
+
if (entry.isDirectory)
|
|
17
|
+
continue;
|
|
18
|
+
if (todos.length >= MAX_TODOS)
|
|
19
|
+
break;
|
|
20
|
+
const ext = getExtension(entry.path);
|
|
21
|
+
if (!SOURCE_EXTENSIONS.has(ext))
|
|
22
|
+
continue;
|
|
23
|
+
let content;
|
|
24
|
+
try {
|
|
25
|
+
content = readFileSync(entry.fullPath, 'utf8');
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const lines = content.split('\n');
|
|
31
|
+
for (let i = 0; i < lines.length; i++) {
|
|
32
|
+
if (todos.length >= MAX_TODOS)
|
|
33
|
+
break;
|
|
34
|
+
const match = TODO_PATTERN.exec(lines[i]);
|
|
35
|
+
if (match) {
|
|
36
|
+
todos.push({
|
|
37
|
+
type: match[1].toUpperCase(),
|
|
38
|
+
text: match[2].trim(),
|
|
39
|
+
file: entry.path,
|
|
40
|
+
line: i + 1,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Group by module (first directory component under src/)
|
|
46
|
+
const todosByModule = {};
|
|
47
|
+
for (const todo of todos) {
|
|
48
|
+
const mod = inferModule(todo.file);
|
|
49
|
+
if (!todosByModule[mod])
|
|
50
|
+
todosByModule[mod] = [];
|
|
51
|
+
todosByModule[mod].push(todo);
|
|
52
|
+
}
|
|
53
|
+
// Parse CHANGELOG.md for unreleased section
|
|
54
|
+
const changelogUnreleased = parseChangelogUnreleased(cwd);
|
|
55
|
+
return { todos, todosByModule, changelogUnreleased };
|
|
56
|
+
}
|
|
57
|
+
function getExtension(filePath) {
|
|
58
|
+
const dot = filePath.lastIndexOf('.');
|
|
59
|
+
return dot >= 0 ? filePath.slice(dot) : '';
|
|
60
|
+
}
|
|
61
|
+
function inferModule(filePath) {
|
|
62
|
+
const parts = filePath.split('/');
|
|
63
|
+
// If file is under src/X/..., use X as module name
|
|
64
|
+
const srcIdx = parts.indexOf('src');
|
|
65
|
+
if (srcIdx >= 0 && srcIdx + 1 < parts.length) {
|
|
66
|
+
return parts[srcIdx + 1];
|
|
67
|
+
}
|
|
68
|
+
// Otherwise use first directory, or 'root'
|
|
69
|
+
return parts.length > 1 ? parts[0] : 'root';
|
|
70
|
+
}
|
|
71
|
+
function parseChangelogUnreleased(cwd) {
|
|
72
|
+
const changelogPath = join(cwd, 'CHANGELOG.md');
|
|
73
|
+
if (!existsSync(changelogPath))
|
|
74
|
+
return undefined;
|
|
75
|
+
let content;
|
|
76
|
+
try {
|
|
77
|
+
content = readFileSync(changelogPath, 'utf8');
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
const lines = content.split('\n');
|
|
83
|
+
const items = [];
|
|
84
|
+
let inUnreleased = false;
|
|
85
|
+
for (const line of lines) {
|
|
86
|
+
// Match ## Unreleased or ## [Unreleased]
|
|
87
|
+
if (/^##\s+\[?unreleased\]?/i.test(line)) {
|
|
88
|
+
inUnreleased = true;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
// Stop at next heading
|
|
92
|
+
if (inUnreleased && /^##\s/.test(line)) {
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
if (inUnreleased) {
|
|
96
|
+
const trimmed = line.replace(/^[-*]\s*/, '').trim();
|
|
97
|
+
if (trimmed)
|
|
98
|
+
items.push(trimmed);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return items.length > 0 ? items : undefined;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=backlog.js.map
|