@planu/cli 4.7.2 → 4.7.4
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/CHANGELOG.md +19 -1
- package/README.md +6 -3
- package/dist/config/token-waste-autopilot.json +16 -0
- package/dist/engine/cascade-hooks/core/append-releases.d.ts +2 -1
- package/dist/engine/cascade-hooks/core/append-releases.js +30 -3
- package/dist/engine/compact/compact-middleware.d.ts +2 -2
- package/dist/engine/compact/compact-middleware.js +68 -7
- package/dist/engine/context-artifacts/index.d.ts +2 -0
- package/dist/engine/context-artifacts/index.js +2 -0
- package/dist/engine/context-artifacts/store.d.ts +5 -0
- package/dist/engine/context-artifacts/store.js +176 -0
- package/dist/engine/evidence-gates/artifact-reader.js +15 -2
- package/dist/engine/evidence-gates/lifecycle-gate.js +14 -2
- package/dist/engine/handoff-packager.js +6 -49
- package/dist/engine/readiness-checker.js +13 -7
- package/dist/engine/spec-format/acceptance-criteria.d.ts +5 -0
- package/dist/engine/spec-format/acceptance-criteria.js +106 -0
- package/dist/engine/spec-migrator/strict-planu-cleanup.js +16 -0
- package/dist/engine/token-optimizer/content-aware-compactor.d.ts +4 -0
- package/dist/engine/token-optimizer/content-aware-compactor.js +230 -0
- package/dist/engine/token-optimizer/index.d.ts +1 -0
- package/dist/engine/token-optimizer/index.js +1 -0
- package/dist/engine/token-optimizer/output-filter.js +18 -2
- package/dist/engine/token-optimizer/policy-loader.js +12 -0
- package/dist/engine/token-optimizer/reporter.d.ts +4 -0
- package/dist/engine/token-optimizer/reporter.js +14 -1
- package/dist/engine/universal-rules/rules/planu-release-policy.js +8 -5
- package/dist/engine/web-fetcher/docs-fetcher.js +5 -1
- package/dist/native/lightweight-command-catalog.d.ts +1 -1
- package/dist/native/lightweight-command-catalog.js +1 -1
- package/dist/resources/process.js +3 -2
- package/dist/tools/challenge-spec/event-challenge-scenarios.js +10 -6
- package/dist/tools/git/hook-ops.js +1 -1
- package/dist/tools/init-project/per-client-files-writer.js +2 -1
- package/dist/tools/init-project/rules-generator.js +14 -0
- package/dist/tools/safe-handler.js +4 -1
- package/dist/tools/token-usage-handler.js +5 -3
- package/dist/tools/update-status/evidence-gate.js +5 -9
- package/dist/types/cascade-hooks.d.ts +5 -0
- package/dist/types/compact/compact-mode.d.ts +5 -0
- package/dist/types/context-artifacts.d.ts +96 -0
- package/dist/types/context-artifacts.js +2 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.js +1 -0
- package/dist/types/spec-format.d.ts +6 -0
- package/dist/types/token-optimization.d.ts +2 -0
- package/dist/types/token-waste-autopilot.d.ts +15 -0
- package/package.json +18 -18
- package/planu-native.json +30 -9
- package/planu-plugin.json +35 -7
|
@@ -20,6 +20,19 @@ Auto-generated by \`init_project\`. Do not edit manually.
|
|
|
20
20
|
|
|
21
21
|
Flow: \`facilitate → create_spec → challenge_spec → check_readiness → approve → implement → validate → done\`
|
|
22
22
|
|
|
23
|
+
## Evidence Gates
|
|
24
|
+
|
|
25
|
+
For non-trivial specs, Planu blocks lifecycle transitions unless evidence is present:
|
|
26
|
+
|
|
27
|
+
| Transition | Required evidence |
|
|
28
|
+
|------------|-------------------|
|
|
29
|
+
| \`approved\` | Discovery evidence: rules, examples, open questions, out-of-scope, glossary |
|
|
30
|
+
| \`implementing\` | Task plan mapped to acceptance criteria |
|
|
31
|
+
| \`done\` | Traceability matrix covering every acceptance criterion |
|
|
32
|
+
| \`done\` for API/UI/event/MCP work | Passing contract validation evidence |
|
|
33
|
+
|
|
34
|
+
Evidence lives in the external Planu handoff store, not under \`planu/specs/<spec>/\`. Spec folders remain \`spec.md\`-only.
|
|
35
|
+
|
|
23
36
|
## When to use \`facilitate\`
|
|
24
37
|
|
|
25
38
|
Any new feature, bug fix, refactor, integration, or task > 5 min.
|
|
@@ -51,6 +64,7 @@ Any new feature, bug fix, refactor, integration, or task > 5 min.
|
|
|
51
64
|
- NEVER write code before spec is \`approved\`
|
|
52
65
|
- NEVER skip \`validate\` after implementation
|
|
53
66
|
- NEVER create design docs outside \`planu/specs/\`
|
|
67
|
+
- NEVER recreate legacy \`technical.md\`, \`progress.md\`, or \`HU.md\` files for new specs
|
|
54
68
|
|
|
55
69
|
## Model Selection (MANDATORY)
|
|
56
70
|
|
|
@@ -268,7 +268,10 @@ function safeWithTelemetry(toolName, handler) {
|
|
|
268
268
|
// SPEC-455: Compress verbose JSON outputs to save LLM tokens
|
|
269
269
|
const compressed = compressToolOutput(result);
|
|
270
270
|
// SPEC-922: Apply compact mode middleware
|
|
271
|
-
const compacted = applyCompactMode(compressed, decision
|
|
271
|
+
const compacted = applyCompactMode(compressed, decision, {
|
|
272
|
+
projectPath,
|
|
273
|
+
flow: toolName,
|
|
274
|
+
});
|
|
272
275
|
// Inject pending drift banner (non-blocking, informational only)
|
|
273
276
|
const driftBanner = projectPath !== undefined ? await checkPendingDriftBanner(projectPath) : null;
|
|
274
277
|
const withDrift = injectDriftBanner(compacted, driftBanner);
|
|
@@ -27,10 +27,12 @@ export function handleTokenUsage(args) {
|
|
|
27
27
|
let details;
|
|
28
28
|
if (groupBy === 'tool' && toolRecords.length > 0) {
|
|
29
29
|
const lines = toolRecords.map((r) => `| ${r.toolName} | ${String(r.totalTokens)} | ${String(r.callCount)} | ` +
|
|
30
|
-
`${String(r.cacheHits)}/${String(r.cacheHits + r.cacheMisses)} |
|
|
30
|
+
`${String(r.cacheHits)}/${String(r.cacheHits + r.cacheMisses)} | ` +
|
|
31
|
+
`${String(r.tokensSaved)} | ${String(r.compactionTokensSaved ?? 0)} | ` +
|
|
32
|
+
`${String(r.artifactRetrievals ?? 0)} |`);
|
|
31
33
|
details = [
|
|
32
|
-
'| Tool | Tokens | Calls | Cache H/T | Saved |',
|
|
33
|
-
'
|
|
34
|
+
'| Tool | Tokens | Calls | Cache H/T | Saved | Compaction Saved | Retrievals |',
|
|
35
|
+
'|------|--------|-------|-----------|-------|------------------|------------|',
|
|
34
36
|
...lines,
|
|
35
37
|
].join('\n');
|
|
36
38
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { readFile } from 'node:fs/promises';
|
|
2
2
|
import { isAbsolute, join } from 'node:path';
|
|
3
|
-
import { extractCriteria
|
|
4
|
-
import { stripFrontmatter } from '../../engine/frontmatter-parser.js';
|
|
3
|
+
import { extractCriteria } from '../../engine/validator/extractors.js';
|
|
5
4
|
import { readEvidenceArtifacts } from '../../engine/evidence-gates/artifact-reader.js';
|
|
6
5
|
import { checkLifecycleEvidenceGate } from '../../engine/evidence-gates/lifecycle-gate.js';
|
|
7
6
|
import { buildSpecEvidenceIndex } from '../../engine/evidence-index/index-builder.js';
|
|
8
7
|
import { checkDoneDriftContract } from '../../engine/evidence-index/done-drift.js';
|
|
9
8
|
import { parseTechnicalReferenceGroundingRecords } from '../../engine/spec-grounding/contract.js';
|
|
9
|
+
import { extractAcceptanceCriteriaTexts } from '../../engine/spec-format/acceptance-criteria.js';
|
|
10
10
|
/** SPEC-1054: BDD/SDD lifecycle evidence gate. */
|
|
11
11
|
export async function checkLifecycleEvidenceTransitionGate(args) {
|
|
12
12
|
const [criteriaResult, artifacts] = await Promise.all([
|
|
@@ -54,13 +54,9 @@ async function extractLifecycleGateCriteriaAndBody(spec, projectPath) {
|
|
|
54
54
|
const specPath = isAbsolute(spec.specPath) || !projectPath ? spec.specPath : join(projectPath, spec.specPath);
|
|
55
55
|
try {
|
|
56
56
|
const raw = await readFile(specPath, 'utf-8');
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
const items = extractListItems(acceptanceCriteria);
|
|
61
|
-
if (items.length > 0) {
|
|
62
|
-
return { criteria: [...new Set(items)], body: raw };
|
|
63
|
-
}
|
|
57
|
+
const criteria = extractAcceptanceCriteriaTexts(raw);
|
|
58
|
+
if (criteria.length > 0) {
|
|
59
|
+
return { criteria: [...new Set(criteria)], body: raw };
|
|
64
60
|
}
|
|
65
61
|
}
|
|
66
62
|
catch {
|
|
@@ -35,6 +35,11 @@ export type CoreActionResult = {
|
|
|
35
35
|
ok: false;
|
|
36
36
|
error: string;
|
|
37
37
|
};
|
|
38
|
+
export interface PendingReleaseEntry {
|
|
39
|
+
specId: string;
|
|
40
|
+
title: string;
|
|
41
|
+
completedAt: string;
|
|
42
|
+
}
|
|
38
43
|
/** SPEC-772: Result of a single fast hook execution. */
|
|
39
44
|
export interface FastHookResult {
|
|
40
45
|
hookId: string;
|
|
@@ -20,6 +20,11 @@ export interface CompactDecision {
|
|
|
20
20
|
contextUsed?: number;
|
|
21
21
|
reason: 'header_above_enter' | 'header_below_exit' | 'hysteresis_keep' | 'no_header';
|
|
22
22
|
}
|
|
23
|
+
export interface CompactModeOptions {
|
|
24
|
+
projectPath?: string;
|
|
25
|
+
sourcePath?: string;
|
|
26
|
+
flow?: string;
|
|
27
|
+
}
|
|
23
28
|
export interface CompactMetrics {
|
|
24
29
|
compactDecisions: number;
|
|
25
30
|
verboseDecisions: number;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
export type ContextArtifactContentType = 'json' | 'test-log' | 'runtime-log' | 'search-results' | 'code' | 'spec-or-handoff' | 'generic-text';
|
|
2
|
+
export interface ContextArtifactCompactionMetadata {
|
|
3
|
+
artifactRef: string;
|
|
4
|
+
originalTokens: number;
|
|
5
|
+
compactTokens: number;
|
|
6
|
+
tokensSaved: number;
|
|
7
|
+
strategy: string;
|
|
8
|
+
contentType: ContextArtifactContentType;
|
|
9
|
+
expiresAt: string;
|
|
10
|
+
retrievalHint: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ContextArtifact {
|
|
13
|
+
ref: string;
|
|
14
|
+
contentHash: string;
|
|
15
|
+
createdAt: string;
|
|
16
|
+
expiresAt: string;
|
|
17
|
+
ttlMs: number;
|
|
18
|
+
projectId: string;
|
|
19
|
+
contentType: ContextArtifactContentType;
|
|
20
|
+
strategy: string;
|
|
21
|
+
originalTokens: number;
|
|
22
|
+
compactTokens: number;
|
|
23
|
+
tokensSaved: number;
|
|
24
|
+
retrievalCount: number;
|
|
25
|
+
metadata: Record<string, string | number | boolean>;
|
|
26
|
+
originalContent: string;
|
|
27
|
+
compactContent: string;
|
|
28
|
+
}
|
|
29
|
+
export interface StoreContextArtifactInput {
|
|
30
|
+
projectPath: string;
|
|
31
|
+
originalContent: string;
|
|
32
|
+
compactContent: string;
|
|
33
|
+
contentType: ContextArtifactContentType;
|
|
34
|
+
strategy: string;
|
|
35
|
+
originalTokens: number;
|
|
36
|
+
compactTokens: number;
|
|
37
|
+
ttlMs: number;
|
|
38
|
+
sourcePath?: string;
|
|
39
|
+
flow?: string;
|
|
40
|
+
metadata?: Record<string, unknown>;
|
|
41
|
+
}
|
|
42
|
+
export interface StoreContextArtifactResult {
|
|
43
|
+
stored: boolean;
|
|
44
|
+
artifact?: ContextArtifact;
|
|
45
|
+
metadata?: ContextArtifactCompactionMetadata;
|
|
46
|
+
refusedReason?: string;
|
|
47
|
+
}
|
|
48
|
+
export interface RetrieveContextArtifactResult {
|
|
49
|
+
found: boolean;
|
|
50
|
+
artifact?: ContextArtifact;
|
|
51
|
+
reason?: 'missing' | 'expired' | 'corrupt' | 'invalid-ref' | 'unauthorized';
|
|
52
|
+
hint: string;
|
|
53
|
+
}
|
|
54
|
+
export interface ContextArtifactStats {
|
|
55
|
+
artifactCount: number;
|
|
56
|
+
totalOriginalTokens: number;
|
|
57
|
+
totalCompactTokens: number;
|
|
58
|
+
totalTokensSaved: number;
|
|
59
|
+
retrievalCount: number;
|
|
60
|
+
}
|
|
61
|
+
export interface ContentAwareCompactionInput {
|
|
62
|
+
text: string;
|
|
63
|
+
policy: {
|
|
64
|
+
contextArtifacts?: {
|
|
65
|
+
enabled?: boolean;
|
|
66
|
+
ttlMs?: number;
|
|
67
|
+
minTokens?: number;
|
|
68
|
+
};
|
|
69
|
+
contentCompaction?: {
|
|
70
|
+
strategies?: Partial<Record<ContextArtifactContentType, {
|
|
71
|
+
maxLines?: number;
|
|
72
|
+
maxSnippetChars?: number;
|
|
73
|
+
}>>;
|
|
74
|
+
};
|
|
75
|
+
redaction: {
|
|
76
|
+
maxSnippetChars: number;
|
|
77
|
+
redactPatterns: string[];
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
projectPath?: string;
|
|
81
|
+
kind?: string;
|
|
82
|
+
sourcePath?: string;
|
|
83
|
+
flow?: string;
|
|
84
|
+
metadata?: Record<string, unknown>;
|
|
85
|
+
}
|
|
86
|
+
export interface ContentAwareCompactionResult {
|
|
87
|
+
text: string;
|
|
88
|
+
originalTokens: number;
|
|
89
|
+
compactTokens: number;
|
|
90
|
+
tokensSaved: number;
|
|
91
|
+
strategy: string;
|
|
92
|
+
contentType: ContextArtifactContentType;
|
|
93
|
+
artifact?: ContextArtifactCompactionMetadata;
|
|
94
|
+
refusedReason?: string;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=context-artifacts.d.ts.map
|
package/dist/types/index.d.ts
CHANGED
|
@@ -80,6 +80,7 @@ export * from './workers.js';
|
|
|
80
80
|
export * from './orchestration-runtime.js';
|
|
81
81
|
export * from './token-optimization.js';
|
|
82
82
|
export * from './token-waste-autopilot.js';
|
|
83
|
+
export * from './context-artifacts.js';
|
|
83
84
|
export * from './minimal-implementation-gate.js';
|
|
84
85
|
export * from './llm-providers.js';
|
|
85
86
|
export * from './plugins.js';
|
package/dist/types/index.js
CHANGED
|
@@ -81,6 +81,7 @@ export * from './workers.js';
|
|
|
81
81
|
export * from './orchestration-runtime.js';
|
|
82
82
|
export * from './token-optimization.js';
|
|
83
83
|
export * from './token-waste-autopilot.js';
|
|
84
|
+
export * from './context-artifacts.js';
|
|
84
85
|
export * from './minimal-implementation-gate.js';
|
|
85
86
|
export * from './llm-providers.js';
|
|
86
87
|
export * from './plugins.js';
|
|
@@ -27,6 +27,12 @@ export interface BddScenario {
|
|
|
27
27
|
line?: number;
|
|
28
28
|
}[];
|
|
29
29
|
}
|
|
30
|
+
export interface NormalizedAcceptanceCriterion {
|
|
31
|
+
id: string;
|
|
32
|
+
text: string;
|
|
33
|
+
source: 'body' | 'frontmatter';
|
|
34
|
+
aliases: string[];
|
|
35
|
+
}
|
|
30
36
|
/** Input for lean spec generation. */
|
|
31
37
|
export interface LeanSpecInput {
|
|
32
38
|
spec: Spec;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ContextArtifactCompactionMetadata } from './context-artifacts.js';
|
|
1
2
|
export type TokenWasteDecisionKind = 'include' | 'summarize' | 'exclude' | 'recommend' | 'avoid' | 'warn' | 'override';
|
|
2
3
|
export type TokenWasteConfidence = 'high' | 'medium' | 'low';
|
|
3
4
|
export type TokenWasteAction = string;
|
|
@@ -21,6 +22,7 @@ export interface TokenWasteOutputStrategy {
|
|
|
21
22
|
keepFailures?: boolean;
|
|
22
23
|
uniqueOnly?: boolean;
|
|
23
24
|
summarizeKeys?: boolean;
|
|
25
|
+
maxSnippetChars?: number;
|
|
24
26
|
}
|
|
25
27
|
export interface TokenWastePolicy {
|
|
26
28
|
version: 1;
|
|
@@ -35,6 +37,14 @@ export interface TokenWastePolicy {
|
|
|
35
37
|
outputs: {
|
|
36
38
|
strategies: Record<string, TokenWasteOutputStrategy>;
|
|
37
39
|
};
|
|
40
|
+
contextArtifacts?: {
|
|
41
|
+
enabled: boolean;
|
|
42
|
+
ttlMs: number;
|
|
43
|
+
minTokens: number;
|
|
44
|
+
};
|
|
45
|
+
contentCompaction?: {
|
|
46
|
+
strategies: Record<string, TokenWasteOutputStrategy>;
|
|
47
|
+
};
|
|
38
48
|
tools: {
|
|
39
49
|
groups: Record<string, string[]>;
|
|
40
50
|
maxRecommended: number;
|
|
@@ -83,12 +93,17 @@ export interface VerboseOutputInput {
|
|
|
83
93
|
text: string;
|
|
84
94
|
policy: TokenWastePolicy;
|
|
85
95
|
fullOutputRef?: string;
|
|
96
|
+
projectPath?: string;
|
|
97
|
+
sourcePath?: string;
|
|
98
|
+
flow?: string;
|
|
99
|
+
metadata?: Record<string, unknown>;
|
|
86
100
|
}
|
|
87
101
|
export interface VerboseOutputResult {
|
|
88
102
|
text: string;
|
|
89
103
|
originalLines: number;
|
|
90
104
|
returnedLines: number;
|
|
91
105
|
fullOutputRef?: string;
|
|
106
|
+
compaction?: ContextArtifactCompactionMetadata;
|
|
92
107
|
decisions: TokenWasteDecision[];
|
|
93
108
|
}
|
|
94
109
|
export interface ToolRelevanceInput {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@planu/cli",
|
|
3
|
-
"version": "4.7.
|
|
3
|
+
"version": "4.7.4",
|
|
4
4
|
"description": "Planu — MCP Server for Spec Driven Development with native Rust acceleration for hot paths. Cross-platform (Linux/macOS/Windows, x64/arm64, glibc/musl).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -34,14 +34,14 @@
|
|
|
34
34
|
"packageName": "@planu/core"
|
|
35
35
|
},
|
|
36
36
|
"optionalDependencies": {
|
|
37
|
-
"@planu/core-darwin-arm64": "4.7.
|
|
38
|
-
"@planu/core-darwin-x64": "4.7.
|
|
39
|
-
"@planu/core-linux-arm64-gnu": "4.7.
|
|
40
|
-
"@planu/core-linux-arm64-musl": "4.7.
|
|
41
|
-
"@planu/core-linux-x64-gnu": "4.7.
|
|
42
|
-
"@planu/core-linux-x64-musl": "4.7.
|
|
43
|
-
"@planu/core-win32-arm64-msvc": "4.7.
|
|
44
|
-
"@planu/core-win32-x64-msvc": "4.7.
|
|
37
|
+
"@planu/core-darwin-arm64": "4.7.4",
|
|
38
|
+
"@planu/core-darwin-x64": "4.7.4",
|
|
39
|
+
"@planu/core-linux-arm64-gnu": "4.7.4",
|
|
40
|
+
"@planu/core-linux-arm64-musl": "4.7.4",
|
|
41
|
+
"@planu/core-linux-x64-gnu": "4.7.4",
|
|
42
|
+
"@planu/core-linux-x64-musl": "4.7.4",
|
|
43
|
+
"@planu/core-win32-arm64-msvc": "4.7.4",
|
|
44
|
+
"@planu/core-win32-x64-msvc": "4.7.4"
|
|
45
45
|
},
|
|
46
46
|
"engines": {
|
|
47
47
|
"node": ">=24.0.0"
|
|
@@ -129,7 +129,7 @@
|
|
|
129
129
|
],
|
|
130
130
|
"license": "SEE LICENSE IN LICENSE",
|
|
131
131
|
"dependencies": {
|
|
132
|
-
"@anthropic-ai/sdk": "^0.
|
|
132
|
+
"@anthropic-ai/sdk": "^0.105.0",
|
|
133
133
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
134
134
|
"glob": "^13.0.6",
|
|
135
135
|
"yaml": "^2.9.0",
|
|
@@ -168,8 +168,8 @@
|
|
|
168
168
|
}
|
|
169
169
|
},
|
|
170
170
|
"devDependencies": {
|
|
171
|
-
"@commitlint/cli": "^21.0
|
|
172
|
-
"@commitlint/config-conventional": "^21.0
|
|
171
|
+
"@commitlint/cli": "^21.1.0",
|
|
172
|
+
"@commitlint/config-conventional": "^21.1.0",
|
|
173
173
|
"@eslint/js": "^10.0.1",
|
|
174
174
|
"@napi-rs/cli": "^3.7.2",
|
|
175
175
|
"@secretlint/secretlint-rule-no-homedir": "^13.0.2",
|
|
@@ -183,7 +183,7 @@
|
|
|
183
183
|
"@stryker-mutator/core": "^9.6.1",
|
|
184
184
|
"@stryker-mutator/vitest-runner": "^9.6.1",
|
|
185
185
|
"@supabase/supabase-js": "^2.108.2",
|
|
186
|
-
"@types/node": "^
|
|
186
|
+
"@types/node": "^26.0.0",
|
|
187
187
|
"@vitejs/plugin-vue": "^6.0.7",
|
|
188
188
|
"@vitest/coverage-v8": "^4.1.9",
|
|
189
189
|
"@vue/test-utils": "^2.4.11",
|
|
@@ -191,11 +191,11 @@
|
|
|
191
191
|
"eslint-config-prettier": "^10.1.8",
|
|
192
192
|
"eslint-import-resolver-typescript": "^4.4.5",
|
|
193
193
|
"eslint-plugin-import": "^2.32.0",
|
|
194
|
-
"happy-dom": "^20.10.
|
|
194
|
+
"happy-dom": "^20.10.6",
|
|
195
195
|
"husky": "^9.1.7",
|
|
196
196
|
"javascript-obfuscator": "^5.4.3",
|
|
197
|
-
"knip": "^6.
|
|
198
|
-
"lint-staged": "^17.0.
|
|
197
|
+
"knip": "^6.18.0",
|
|
198
|
+
"lint-staged": "^17.0.8",
|
|
199
199
|
"madge": "^8.0.0",
|
|
200
200
|
"prettier": "^3.8.4",
|
|
201
201
|
"secretlint": "^13.0.2",
|
|
@@ -203,8 +203,8 @@
|
|
|
203
203
|
"tsc-alias": "^1.8.17",
|
|
204
204
|
"type-coverage": "^2.29.7",
|
|
205
205
|
"typescript": "^6.0.3",
|
|
206
|
-
"typescript-eslint": "^8.
|
|
207
|
-
"vite": "^8.0
|
|
206
|
+
"typescript-eslint": "^8.62.0",
|
|
207
|
+
"vite": "^8.1.0",
|
|
208
208
|
"vitest": "^4.1.9",
|
|
209
209
|
"vue": "^3.5.38"
|
|
210
210
|
}
|
package/planu-native.json
CHANGED
|
@@ -1,20 +1,26 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dev.planu.native",
|
|
3
3
|
"displayName": "Planu Native Lightweight Surface",
|
|
4
|
-
"version": "4.7.
|
|
4
|
+
"version": "4.7.4",
|
|
5
5
|
"packageName": "@planu/cli",
|
|
6
6
|
"modes": {
|
|
7
7
|
"lightweight": {
|
|
8
8
|
"requiresMcp": false,
|
|
9
9
|
"requiresDaemon": false,
|
|
10
|
-
"hosts": [
|
|
10
|
+
"hosts": [
|
|
11
|
+
"codex",
|
|
12
|
+
"claude-code"
|
|
13
|
+
],
|
|
11
14
|
"commands": [
|
|
12
15
|
{
|
|
13
16
|
"id": "planu.status",
|
|
14
17
|
"title": "Project status",
|
|
15
18
|
"description": "Show the compact Planu project snapshot without loading the MCP tool graph.",
|
|
16
19
|
"invocation": "planu status",
|
|
17
|
-
"hosts": [
|
|
20
|
+
"hosts": [
|
|
21
|
+
"codex",
|
|
22
|
+
"claude-code"
|
|
23
|
+
],
|
|
18
24
|
"requiresMcp": false,
|
|
19
25
|
"requiresDaemon": false,
|
|
20
26
|
"mapsTo": "handlePlanStatus"
|
|
@@ -24,7 +30,10 @@
|
|
|
24
30
|
"title": "Create spec",
|
|
25
31
|
"description": "Create a new spec through the CLI-backed SDD contract.",
|
|
26
32
|
"invocation": "planu spec create \"<title>\"",
|
|
27
|
-
"hosts": [
|
|
33
|
+
"hosts": [
|
|
34
|
+
"codex",
|
|
35
|
+
"claude-code"
|
|
36
|
+
],
|
|
28
37
|
"requiresMcp": false,
|
|
29
38
|
"requiresDaemon": false,
|
|
30
39
|
"mapsTo": "handleCreateSpec"
|
|
@@ -34,7 +43,10 @@
|
|
|
34
43
|
"title": "List specs",
|
|
35
44
|
"description": "List specs in the current project with optional status/type filters.",
|
|
36
45
|
"invocation": "planu spec list",
|
|
37
|
-
"hosts": [
|
|
46
|
+
"hosts": [
|
|
47
|
+
"codex",
|
|
48
|
+
"claude-code"
|
|
49
|
+
],
|
|
38
50
|
"requiresMcp": false,
|
|
39
51
|
"requiresDaemon": false,
|
|
40
52
|
"mapsTo": "handleListSpecs"
|
|
@@ -44,7 +56,10 @@
|
|
|
44
56
|
"title": "Validate spec",
|
|
45
57
|
"description": "Validate a spec against the current codebase from the native CLI surface.",
|
|
46
58
|
"invocation": "planu spec validate SPEC-001",
|
|
47
|
-
"hosts": [
|
|
59
|
+
"hosts": [
|
|
60
|
+
"codex",
|
|
61
|
+
"claude-code"
|
|
62
|
+
],
|
|
48
63
|
"requiresMcp": false,
|
|
49
64
|
"requiresDaemon": false,
|
|
50
65
|
"mapsTo": "handleValidate"
|
|
@@ -54,7 +69,10 @@
|
|
|
54
69
|
"title": "Audit technical debt",
|
|
55
70
|
"description": "Run the read-only project audit path for lightweight debt checks.",
|
|
56
71
|
"invocation": "planu audit debt",
|
|
57
|
-
"hosts": [
|
|
72
|
+
"hosts": [
|
|
73
|
+
"codex",
|
|
74
|
+
"claude-code"
|
|
75
|
+
],
|
|
58
76
|
"requiresMcp": false,
|
|
59
77
|
"requiresDaemon": false,
|
|
60
78
|
"mapsTo": "handleAudit"
|
|
@@ -62,9 +80,12 @@
|
|
|
62
80
|
{
|
|
63
81
|
"id": "planu.release.check",
|
|
64
82
|
"title": "Check release readiness",
|
|
65
|
-
"description": "Check local branch cleanliness and
|
|
83
|
+
"description": "Check local-first release readiness, branch cleanliness, and optional gitflow drift.",
|
|
66
84
|
"invocation": "planu release check",
|
|
67
|
-
"hosts": [
|
|
85
|
+
"hosts": [
|
|
86
|
+
"codex",
|
|
87
|
+
"claude-code"
|
|
88
|
+
],
|
|
68
89
|
"requiresMcp": false,
|
|
69
90
|
"requiresDaemon": false,
|
|
70
91
|
"mapsTo": "releaseCommand"
|
package/planu-plugin.json
CHANGED
|
@@ -2,9 +2,12 @@
|
|
|
2
2
|
"name": "dev.planu.cli",
|
|
3
3
|
"displayName": "Planu — Spec Driven Development",
|
|
4
4
|
"description": "Manage software specs, estimations, and autonomous SDD workflows. Language-agnostic MCP server for Claude Code.",
|
|
5
|
-
"version": "4.7.
|
|
5
|
+
"version": "4.7.4",
|
|
6
6
|
"icon": "assets/plugin/icon.svg",
|
|
7
|
-
"command": [
|
|
7
|
+
"command": [
|
|
8
|
+
"npx",
|
|
9
|
+
"@planu/cli@latest"
|
|
10
|
+
],
|
|
8
11
|
"packageName": "@planu/cli",
|
|
9
12
|
"capabilities": {
|
|
10
13
|
"tools": [
|
|
@@ -23,17 +26,42 @@
|
|
|
23
26
|
"create_skill",
|
|
24
27
|
"skill_search"
|
|
25
28
|
],
|
|
26
|
-
"resources": [
|
|
27
|
-
|
|
28
|
-
|
|
29
|
+
"resources": [
|
|
30
|
+
"planu://specs/list",
|
|
31
|
+
"planu://specs/{id}",
|
|
32
|
+
"planu://project/status",
|
|
33
|
+
"planu://roadmap"
|
|
34
|
+
],
|
|
35
|
+
"prompts": [
|
|
36
|
+
"create-spec-from-idea",
|
|
37
|
+
"review-spec-readiness",
|
|
38
|
+
"generate-implementation-plan"
|
|
39
|
+
],
|
|
40
|
+
"subagents": [
|
|
41
|
+
"sdd-orchestrator",
|
|
42
|
+
"spec-challenger",
|
|
43
|
+
"test-generator"
|
|
44
|
+
]
|
|
29
45
|
},
|
|
30
46
|
"compatibility": {
|
|
31
47
|
"minimumHostVersion": "1.0.0",
|
|
32
|
-
"requiredFeatures": [
|
|
48
|
+
"requiredFeatures": [
|
|
49
|
+
"mcp-tools",
|
|
50
|
+
"file-editing"
|
|
51
|
+
]
|
|
33
52
|
},
|
|
34
53
|
"repository": "https://github.com/planu-dev/planu",
|
|
35
54
|
"author": "Planu",
|
|
36
55
|
"license": "MIT",
|
|
37
56
|
"homepage": "https://planu.dev",
|
|
38
|
-
"keywords": [
|
|
57
|
+
"keywords": [
|
|
58
|
+
"sdd",
|
|
59
|
+
"spec-driven-development",
|
|
60
|
+
"mcp",
|
|
61
|
+
"specs",
|
|
62
|
+
"planning",
|
|
63
|
+
"ai",
|
|
64
|
+
"bdd",
|
|
65
|
+
"tdd"
|
|
66
|
+
]
|
|
39
67
|
}
|