@planu/cli 0.78.0 → 0.79.1
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/serve.d.ts.map +1 -1
- package/dist/cli/commands/serve.js +1 -1
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/config/contradiction-patterns.json +83 -0
- package/dist/config/estimation-tables.json +49 -0
- package/dist/config/license-plans.json +5 -1
- package/dist/engine/ci-generator/local-script.d.ts +8 -0
- package/dist/engine/ci-generator/local-script.d.ts.map +1 -0
- package/dist/engine/ci-generator/local-script.js +177 -0
- package/dist/engine/ci-generator/local-script.js.map +1 -0
- package/dist/engine/ci-generator/planu-steps.d.ts.map +1 -1
- package/dist/engine/ci-generator/planu-steps.js +37 -22
- package/dist/engine/ci-generator/planu-steps.js.map +1 -1
- package/dist/engine/config-loader.d.ts +73 -0
- package/dist/engine/config-loader.d.ts.map +1 -0
- package/dist/engine/config-loader.js +246 -0
- package/dist/engine/config-loader.js.map +1 -0
- package/dist/engine/config-schemas.d.ts +64 -0
- package/dist/engine/config-schemas.d.ts.map +1 -0
- package/dist/engine/config-schemas.js +55 -0
- package/dist/engine/config-schemas.js.map +1 -0
- package/dist/engine/spec-summary-html.d.ts.map +1 -1
- package/dist/engine/spec-summary-html.js +5 -0
- package/dist/engine/spec-summary-html.js.map +1 -1
- package/dist/index.js +10 -2
- package/dist/index.js.map +1 -1
- package/dist/storage/ideas-store.d.ts +15 -0
- package/dist/storage/ideas-store.d.ts.map +1 -0
- package/dist/storage/ideas-store.js +37 -0
- package/dist/storage/ideas-store.js.map +1 -0
- package/dist/tools/capture-idea-handler.d.ts +4 -0
- package/dist/tools/capture-idea-handler.d.ts.map +1 -0
- package/dist/tools/capture-idea-handler.js +39 -0
- package/dist/tools/capture-idea-handler.js.map +1 -0
- package/dist/tools/ci-planu-handler.d.ts +2 -2
- package/dist/tools/ci-planu-handler.d.ts.map +1 -1
- package/dist/tools/ci-planu-handler.js +55 -22
- package/dist/tools/ci-planu-handler.js.map +1 -1
- package/dist/tools/discard-idea-handler.d.ts +4 -0
- package/dist/tools/discard-idea-handler.d.ts.map +1 -0
- package/dist/tools/discard-idea-handler.js +27 -0
- package/dist/tools/discard-idea-handler.js.map +1 -0
- package/dist/tools/git/cleanup-ops.d.ts +15 -0
- package/dist/tools/git/cleanup-ops.d.ts.map +1 -0
- package/dist/tools/git/cleanup-ops.js +417 -0
- package/dist/tools/git/cleanup-ops.js.map +1 -0
- package/dist/tools/license-gate.d.ts +6 -0
- package/dist/tools/license-gate.d.ts.map +1 -1
- package/dist/tools/license-gate.js +14 -0
- package/dist/tools/license-gate.js.map +1 -1
- package/dist/tools/list-backlog-handler.d.ts +4 -0
- package/dist/tools/list-backlog-handler.d.ts.map +1 -0
- package/dist/tools/list-backlog-handler.js +60 -0
- package/dist/tools/list-backlog-handler.js.map +1 -0
- package/dist/tools/manage-git.d.ts.map +1 -1
- package/dist/tools/manage-git.js +3 -0
- package/dist/tools/manage-git.js.map +1 -1
- package/dist/tools/promote-idea-handler.d.ts +4 -0
- package/dist/tools/promote-idea-handler.d.ts.map +1 -0
- package/dist/tools/promote-idea-handler.js +51 -0
- package/dist/tools/promote-idea-handler.js.map +1 -0
- package/dist/tools/register-backlog-tools.d.ts +3 -0
- package/dist/tools/register-backlog-tools.d.ts.map +1 -0
- package/dist/tools/register-backlog-tools.js +81 -0
- package/dist/tools/register-backlog-tools.js.map +1 -0
- package/dist/tools/register-ci-tools.d.ts.map +1 -1
- package/dist/tools/register-ci-tools.js +8 -0
- package/dist/tools/register-ci-tools.js.map +1 -1
- package/dist/tools/schemas/infra.d.ts +1 -1
- package/dist/tools/schemas/lifecycle.d.ts +1 -0
- package/dist/tools/schemas/lifecycle.d.ts.map +1 -1
- package/dist/tools/schemas/lifecycle.js +2 -1
- package/dist/tools/schemas/lifecycle.js.map +1 -1
- package/dist/tools/update-status-actions.d.ts.map +1 -1
- package/dist/tools/update-status-actions.js +12 -0
- package/dist/tools/update-status-actions.js.map +1 -1
- package/dist/types/ci.d.ts +16 -1
- package/dist/types/ci.d.ts.map +1 -1
- package/dist/types/common/tech-enums.d.ts +1 -1
- package/dist/types/common/tech-enums.d.ts.map +1 -1
- package/dist/types/estimation.d.ts +34 -0
- package/dist/types/estimation.d.ts.map +1 -1
- package/dist/types/git.d.ts +24 -0
- package/dist/types/git.d.ts.map +1 -1
- package/dist/types/ideas.d.ts +37 -0
- package/dist/types/ideas.d.ts.map +1 -0
- package/dist/types/ideas.js +3 -0
- package/dist/types/ideas.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/package.json +1 -1
- package/src/config/contradiction-patterns.json +83 -0
- package/src/config/estimation-tables.json +49 -0
- package/src/config/license-plans.json +5 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/serve.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,oBAAoB,CAAC;AAGlE,eAAO,MAAM,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/serve.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,oBAAoB,CAAC;AAGlE,eAAO,MAAM,YAAY,EAAE,UAqC1B,CAAC"}
|
|
@@ -24,7 +24,7 @@ export const serveCommand = {
|
|
|
24
24
|
const { registerSpecTools } = await import('../../tools/register-spec-tools.js');
|
|
25
25
|
const { registerPlatformTools } = await import('../../tools/register-platform-tools.js');
|
|
26
26
|
process.stdout.write(`${green('Starting Planu MCP server')} on port ${cyan(port)}...\n`);
|
|
27
|
-
const server = withToolTracking(new McpServer({ name:
|
|
27
|
+
const server = withToolTracking(new McpServer({ name: `planu v${PLANU_VERSION}`, version: PLANU_VERSION }));
|
|
28
28
|
registerResources(server);
|
|
29
29
|
registerSpecTools(server);
|
|
30
30
|
registerPlatformTools(server);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/cli/commands/serve.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAE/D,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,MAAM,YAAY,GAAe;IACtC,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,yCAAyC;IACtD,KAAK,EAAE,2BAA2B;IAElC,KAAK,CAAC,GAAG,CAAC,IAAc,EAAE,MAAoB;QAC5C,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;YAC3B,IAAI;YACJ,OAAO,EAAE;gBACP,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;aACrC;YACD,MAAM,EAAE,KAAK;YACb,gBAAgB,EAAE,IAAI;SACvB,CAAC,CAAC;QAEH,MAAM,IAAI,GAAI,MAAM,CAAC,IAA2B,IAAI,MAAM,CAAC;QAE3D,oDAAoD;QACpD,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,uCAAuC,CAAC,CAAC;QAClF,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,yCAAyC,CAAC,CAAC;QAC9E,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;QAClE,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC;QAC1E,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;QAC1E,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,oCAAoC,CAAC,CAAC;QACjF,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,wCAAwC,CAAC,CAAC;QAEzF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,2BAA2B,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEzF,MAAM,MAAM,GAAG,gBAAgB,
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/cli/commands/serve.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAE/D,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,MAAM,YAAY,GAAe;IACtC,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,yCAAyC;IACtD,KAAK,EAAE,2BAA2B;IAElC,KAAK,CAAC,GAAG,CAAC,IAAc,EAAE,MAAoB;QAC5C,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;YAC3B,IAAI;YACJ,OAAO,EAAE;gBACP,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;aACrC;YACD,MAAM,EAAE,KAAK;YACb,gBAAgB,EAAE,IAAI;SACvB,CAAC,CAAC;QAEH,MAAM,IAAI,GAAI,MAAM,CAAC,IAA2B,IAAI,MAAM,CAAC;QAE3D,oDAAoD;QACpD,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,uCAAuC,CAAC,CAAC;QAClF,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,yCAAyC,CAAC,CAAC;QAC9E,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;QAClE,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC;QAC1E,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;QAC1E,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,oCAAoC,CAAC,CAAC;QACjF,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,wCAAwC,CAAC,CAAC;QAEzF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,2BAA2B,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEzF,MAAM,MAAM,GAAG,gBAAgB,CAC7B,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,aAAa,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAC3E,CAAC;QACF,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC1B,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC1B,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAE9B,MAAM,eAAe,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC;IACvF,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"id": "offline-vs-realtime",
|
|
4
|
+
"name": "offline-vs-realtime",
|
|
5
|
+
"sideA": ["offline", "offline-first", "no internet", "without internet", "disconnected"],
|
|
6
|
+
"sideB": ["real-time", "realtime", "online", "sync", "synchronization", "live", "streaming"],
|
|
7
|
+
"severity": "blocker",
|
|
8
|
+
"descriptionTemplate": "{specA} requires offline capability while {specB} requires real-time synchronization — these are mutually exclusive without explicit conflict resolution.",
|
|
9
|
+
"recommendation": "Define a clear synchronization strategy: optimistic updates with eventual consistency, or restrict real-time features to connected mode only."
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"id": "sync-vs-async",
|
|
13
|
+
"name": "sync-vs-async",
|
|
14
|
+
"sideA": ["synchronous", "blocking", "sequential", "serial"],
|
|
15
|
+
"sideB": ["asynchronous", "async", "non-blocking", "concurrent", "parallel", "event-driven"],
|
|
16
|
+
"severity": "warning",
|
|
17
|
+
"descriptionTemplate": "{specA} implies synchronous execution while {specB} implies asynchronous processing — mixing these requires careful interface design.",
|
|
18
|
+
"recommendation": "Decide on a unified execution model. If both are needed, document clearly which parts are sync vs async and add adapters at boundaries."
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "simple-vs-complex",
|
|
22
|
+
"name": "simple-vs-complex",
|
|
23
|
+
"sideA": ["simple", "minimal", "lightweight", "basic", "mvp"],
|
|
24
|
+
"sideB": ["complex", "enterprise", "advanced", "comprehensive", "full-featured", "sophisticated"],
|
|
25
|
+
"severity": "warning",
|
|
26
|
+
"descriptionTemplate": "{specA} targets simplicity/MVP while {specB} targets enterprise complexity — these have opposing design priorities.",
|
|
27
|
+
"recommendation": "Clarify which spec defines the North Star. Consider a phased approach: start minimal, extend to complex in a later iteration."
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "performance-vs-security",
|
|
31
|
+
"name": "performance-vs-security",
|
|
32
|
+
"sideA": ["fast", "performance", "speed", "low latency", "optimized", "cache"],
|
|
33
|
+
"sideB": ["security", "encrypted", "encryption", "audit", "compliant", "zero-trust"],
|
|
34
|
+
"severity": "warning",
|
|
35
|
+
"descriptionTemplate": "{specA} prioritizes performance while {specB} prioritizes security — these often create architectural tradeoffs.",
|
|
36
|
+
"recommendation": "Define explicit performance budgets for security operations. Benchmark encryption overhead. Consider hardware acceleration for crypto."
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"id": "local-vs-cloud",
|
|
40
|
+
"name": "local-vs-cloud",
|
|
41
|
+
"sideA": ["local", "on-premise", "self-hosted", "air-gapped", "desktop", "embedded"],
|
|
42
|
+
"sideB": ["cloud", "remote", "saas", "hosted", "serverless", "managed service"],
|
|
43
|
+
"severity": "blocker",
|
|
44
|
+
"descriptionTemplate": "{specA} requires local/on-premise deployment while {specB} assumes cloud/remote infrastructure — these are incompatible deployment targets.",
|
|
45
|
+
"recommendation": "Choose a single deployment model or build explicit abstraction layers that support both. Hybrid architectures significantly increase complexity."
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"id": "serverless-vs-stateful",
|
|
49
|
+
"name": "serverless-vs-stateful",
|
|
50
|
+
"sideA": ["serverless", "lambda", "function-as-a-service", "faas", "stateless", "ephemeral"],
|
|
51
|
+
"sideB": ["stateful", "persistent connection", "websocket", "long-running", "session", "in-memory state"],
|
|
52
|
+
"severity": "warning",
|
|
53
|
+
"descriptionTemplate": "{specA} assumes serverless/stateless execution while {specB} requires persistent state or long-running connections — these have incompatible execution models.",
|
|
54
|
+
"recommendation": "Choose a clear execution model. If both are needed, use external state stores (Redis, DynamoDB) for serverless and reserve stateful components for dedicated compute."
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"id": "mobile-vs-desktop",
|
|
58
|
+
"name": "mobile-vs-desktop",
|
|
59
|
+
"sideA": ["mobile-first", "touch", "small screen", "responsive", "native app", "ios", "android"],
|
|
60
|
+
"sideB": ["desktop-first", "keyboard-driven", "large screen", "electron", "native desktop", "mouse-driven"],
|
|
61
|
+
"severity": "warning",
|
|
62
|
+
"descriptionTemplate": "{specA} targets mobile-first design while {specB} targets desktop-first design — these have conflicting UX priorities.",
|
|
63
|
+
"recommendation": "Adopt a responsive design strategy or build separate experiences. Define which platform is primary and which adapts."
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"id": "cqrs-vs-crud",
|
|
67
|
+
"name": "cqrs-vs-crud",
|
|
68
|
+
"sideA": ["cqrs", "event sourcing", "command query", "write model", "read model", "event store"],
|
|
69
|
+
"sideB": ["crud", "rest api", "simple database", "active record", "orm", "direct update"],
|
|
70
|
+
"severity": "warning",
|
|
71
|
+
"descriptionTemplate": "{specA} implies CQRS/event-sourcing architecture while {specB} implies simple CRUD — these have fundamentally different data access patterns.",
|
|
72
|
+
"recommendation": "Pick one architectural style per bounded context. CQRS adds complexity; only use it where the read/write asymmetry justifies it."
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"id": "microservices-vs-monolith",
|
|
76
|
+
"name": "microservices-vs-monolith",
|
|
77
|
+
"sideA": ["microservices", "distributed", "service mesh", "api gateway", "independently deployable"],
|
|
78
|
+
"sideB": ["monolith", "single deployment", "modular monolith", "single process", "shared database"],
|
|
79
|
+
"severity": "blocker",
|
|
80
|
+
"descriptionTemplate": "{specA} assumes microservices architecture while {specB} assumes monolithic deployment — these are incompatible deployment topologies.",
|
|
81
|
+
"recommendation": "Align on a single deployment topology. Consider starting with a modular monolith and extracting services only when proven necessary."
|
|
82
|
+
}
|
|
83
|
+
]
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"defaultConfig": {
|
|
3
|
+
"defaultLocale": "en",
|
|
4
|
+
"defaultExperienceLevel": "intermediate",
|
|
5
|
+
"hourlyRate": 65,
|
|
6
|
+
"pricingOpusPerMToken": 15,
|
|
7
|
+
"pricingSonnetPerMToken": 3
|
|
8
|
+
},
|
|
9
|
+
"baseHoursByType": [
|
|
10
|
+
{ "id": "feature", "hours": 8 },
|
|
11
|
+
{ "id": "refactor", "hours": 6 },
|
|
12
|
+
{ "id": "bugfix", "hours": 3 },
|
|
13
|
+
{ "id": "infra", "hours": 5 },
|
|
14
|
+
{ "id": "docs", "hours": 2 },
|
|
15
|
+
{ "id": "project", "hours": 16 },
|
|
16
|
+
{ "id": "agent", "hours": 20 },
|
|
17
|
+
{ "id": "tech-debt", "hours": 8 }
|
|
18
|
+
],
|
|
19
|
+
"scopeMultiplier": [
|
|
20
|
+
{ "id": "trivial", "multiplier": 0.3 },
|
|
21
|
+
{ "id": "feature", "multiplier": 1.0 },
|
|
22
|
+
{ "id": "cross-module", "multiplier": 2.0 },
|
|
23
|
+
{ "id": "architectural", "multiplier": 3.5 }
|
|
24
|
+
],
|
|
25
|
+
"difficultyMultiplier": [
|
|
26
|
+
{ "id": "1", "multiplier": 0.6 },
|
|
27
|
+
{ "id": "2", "multiplier": 0.85 },
|
|
28
|
+
{ "id": "3", "multiplier": 1.0 },
|
|
29
|
+
{ "id": "4", "multiplier": 1.4 },
|
|
30
|
+
{ "id": "5", "multiplier": 2.0 }
|
|
31
|
+
],
|
|
32
|
+
"reviewRatio": [
|
|
33
|
+
{ "id": "1", "ratio": 0.1 },
|
|
34
|
+
{ "id": "2", "ratio": 0.15 },
|
|
35
|
+
{ "id": "3", "ratio": 0.2 },
|
|
36
|
+
{ "id": "4", "ratio": 0.25 },
|
|
37
|
+
{ "id": "5", "ratio": 0.35 }
|
|
38
|
+
],
|
|
39
|
+
"tokensPerDevHour": {
|
|
40
|
+
"opus": 12000,
|
|
41
|
+
"sonnet": 25000
|
|
42
|
+
},
|
|
43
|
+
"modeReduction": [
|
|
44
|
+
{ "id": "local", "factor": 0.4 },
|
|
45
|
+
{ "id": "template", "factor": 0.2 },
|
|
46
|
+
{ "id": "light-llm", "factor": 0.7 },
|
|
47
|
+
{ "id": "full-llm", "factor": 1.0 }
|
|
48
|
+
]
|
|
49
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { LocalScriptOptions } from '../../types/index.js';
|
|
2
|
+
export declare const LOCAL_SCRIPT_PATH = "planu-check.sh";
|
|
3
|
+
/**
|
|
4
|
+
* Generate the content of planu-check.sh for local/offline spec validation.
|
|
5
|
+
* Produces the same checks as the GitHub Actions workflow, runnable without billing.
|
|
6
|
+
*/
|
|
7
|
+
export declare function generateLocalScript(options: LocalScriptOptions): string;
|
|
8
|
+
//# sourceMappingURL=local-script.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-script.d.ts","sourceRoot":"","sources":["../../../src/engine/ci-generator/local-script.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,eAAO,MAAM,iBAAiB,mBAAmB,CAAC;AAsLlD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAYvE"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
// ci-generator/local-script.ts — Generate local planu-check.sh script (SPEC-201)
|
|
2
|
+
export const LOCAL_SCRIPT_PATH = 'planu-check.sh';
|
|
3
|
+
// -- Sections -----------------------------------------------------------------
|
|
4
|
+
function buildHeader(specsDir, failOnDrift, severityThreshold, detectDrift) {
|
|
5
|
+
return [
|
|
6
|
+
'#!/usr/bin/env bash',
|
|
7
|
+
'# planu-check.sh — Local Planu spec validation (SPEC-201)',
|
|
8
|
+
'# Runs the same checks as .github/workflows/planu-check.yml without GitHub-hosted runners.',
|
|
9
|
+
'# Compatible with act (https://github.com/nektos/act) for local GitHub Actions execution.',
|
|
10
|
+
'#',
|
|
11
|
+
'# Usage:',
|
|
12
|
+
'# ./planu-check.sh # validate specs (respects configured defaults)',
|
|
13
|
+
'# ./planu-check.sh --no-fail # informational only, always exits 0',
|
|
14
|
+
'# ./planu-check.sh --severity=critical # only fail on critical issues',
|
|
15
|
+
'',
|
|
16
|
+
'set -euo pipefail',
|
|
17
|
+
'',
|
|
18
|
+
'# -- Colors (disabled when not a TTY) --------------------------------------',
|
|
19
|
+
'if [ -t 1 ]; then',
|
|
20
|
+
' RED="\\033[0;31m" YELLOW="\\033[1;33m" GREEN="\\033[0;32m" BLUE="\\033[0;34m"',
|
|
21
|
+
' BOLD="\\033[1m" RESET="\\033[0m"',
|
|
22
|
+
'else',
|
|
23
|
+
' RED="" YELLOW="" GREEN="" BLUE="" BOLD="" RESET=""',
|
|
24
|
+
'fi',
|
|
25
|
+
'',
|
|
26
|
+
'# -- Config ----------------------------------------------------------------',
|
|
27
|
+
`SPECS_DIR="${specsDir}"`,
|
|
28
|
+
`FAIL_ON_ISSUES=${failOnDrift ? 'true' : 'false'}`,
|
|
29
|
+
`SEVERITY="${severityThreshold}"`,
|
|
30
|
+
`DETECT_DRIFT=${detectDrift ? 'true' : 'false'}`,
|
|
31
|
+
'',
|
|
32
|
+
'# Parse flags',
|
|
33
|
+
'for arg in "$@"; do',
|
|
34
|
+
' case "$arg" in',
|
|
35
|
+
' --no-fail) FAIL_ON_ISSUES=false ;;',
|
|
36
|
+
' --severity=*) SEVERITY="${arg#--severity=}" ;;',
|
|
37
|
+
' esac',
|
|
38
|
+
'done',
|
|
39
|
+
];
|
|
40
|
+
}
|
|
41
|
+
function buildValidateSection() {
|
|
42
|
+
return [
|
|
43
|
+
'',
|
|
44
|
+
'# -- Header ----------------------------------------------------------------',
|
|
45
|
+
'echo -e "${BOLD}Planu Spec Check${RESET}"',
|
|
46
|
+
'echo -e "Specs dir: ${BLUE}${SPECS_DIR}${RESET}"',
|
|
47
|
+
'echo ""',
|
|
48
|
+
'',
|
|
49
|
+
'TOTAL=0',
|
|
50
|
+
'ISSUES=0',
|
|
51
|
+
'',
|
|
52
|
+
'if [ ! -d "$SPECS_DIR" ]; then',
|
|
53
|
+
' echo -e "${RED}x Specs directory not found: $SPECS_DIR${RESET}"',
|
|
54
|
+
' exit 1',
|
|
55
|
+
'fi',
|
|
56
|
+
'',
|
|
57
|
+
'# -- Validate specs --------------------------------------------------------',
|
|
58
|
+
'for spec_dir in "$SPECS_DIR"/*/; do',
|
|
59
|
+
' [ -d "$spec_dir" ] || continue',
|
|
60
|
+
' SPEC_NAME=$(basename "$spec_dir")',
|
|
61
|
+
' TOTAL=$((TOTAL + 1))',
|
|
62
|
+
'',
|
|
63
|
+
' SPEC_FILE=$(ls "$spec_dir"spec.md "$spec_dir"HU.md 2>/dev/null | head -1 || echo "")',
|
|
64
|
+
' if [ -z "$SPEC_FILE" ]; then',
|
|
65
|
+
' echo -e " ${RED}x${RESET} $SPEC_NAME - missing spec.md"',
|
|
66
|
+
' ISSUES=$((ISSUES + 1))',
|
|
67
|
+
' continue',
|
|
68
|
+
' fi',
|
|
69
|
+
'',
|
|
70
|
+
' CRITERIA=$(grep -c "^### AC-" "$SPEC_FILE" 2>/dev/null || echo "0")',
|
|
71
|
+
' SPEC_STATUS=$(grep -m1 "^status:" "$SPEC_FILE" 2>/dev/null | sed \'s/status:[[:space:]]*//\' | tr -d \'\\r\' || echo "")',
|
|
72
|
+
'',
|
|
73
|
+
' if [ "$SPEC_STATUS" = "done" ] || [ "$SPEC_STATUS" = "discarded" ]; then',
|
|
74
|
+
' echo -e " ${GREEN}ok${RESET} $SPEC_NAME - $SPEC_STATUS"',
|
|
75
|
+
' elif [ "$CRITERIA" = "0" ]; then',
|
|
76
|
+
' echo -e " ${YELLOW}warn${RESET} $SPEC_NAME - no acceptance criteria"',
|
|
77
|
+
' else',
|
|
78
|
+
' echo -e " ${BLUE}->${RESET} $SPEC_NAME - $SPEC_STATUS ($CRITERIA AC)"',
|
|
79
|
+
' ISSUES=$((ISSUES + 1))',
|
|
80
|
+
' fi',
|
|
81
|
+
'done',
|
|
82
|
+
];
|
|
83
|
+
}
|
|
84
|
+
function buildDriftSection() {
|
|
85
|
+
return [
|
|
86
|
+
'',
|
|
87
|
+
'# -- Basic drift detection ------------------------------------------------',
|
|
88
|
+
'if [ "$DETECT_DRIFT" = "true" ] && command -v git &>/dev/null && git rev-parse --git-dir &>/dev/null; then',
|
|
89
|
+
' echo ""',
|
|
90
|
+
' echo -e "${BOLD}Drift Detection${RESET}"',
|
|
91
|
+
' CHANGED_FILES=$(git diff HEAD --name-only 2>/dev/null || echo "")',
|
|
92
|
+
' for spec_dir in "$SPECS_DIR"/*/; do',
|
|
93
|
+
' [ -f "$spec_dir/technical.md" ] || continue',
|
|
94
|
+
' SPEC_FILES=$(grep -oE \'src/[a-zA-Z0-9_./-]+\' "$spec_dir/technical.md" 2>/dev/null || echo "")',
|
|
95
|
+
' for sf in $SPEC_FILES; do',
|
|
96
|
+
' if echo "$CHANGED_FILES" | grep -q "$sf"; then',
|
|
97
|
+
' SPEC_NAME=$(basename "$spec_dir")',
|
|
98
|
+
' echo -e " ${YELLOW}warn${RESET} Drift: $sf modified, belongs to $SPEC_NAME"',
|
|
99
|
+
' fi',
|
|
100
|
+
' done',
|
|
101
|
+
' done',
|
|
102
|
+
'fi',
|
|
103
|
+
];
|
|
104
|
+
}
|
|
105
|
+
function buildCleanupCheckSection() {
|
|
106
|
+
return [
|
|
107
|
+
'',
|
|
108
|
+
'# -- Git cleanup check (SPEC-203) — WARNING only, never fails CI -------------------',
|
|
109
|
+
'if command -v git &>/dev/null && git rev-parse --git-dir &>/dev/null; then',
|
|
110
|
+
' echo ""',
|
|
111
|
+
' echo -e "${BOLD}Git Health Check${RESET}"',
|
|
112
|
+
'',
|
|
113
|
+
' # Orphan worktrees: entries in .claude/worktrees/ whose branch is merged',
|
|
114
|
+
' WORKTREES_DIR=".claude/worktrees"',
|
|
115
|
+
' if [ -d "$WORKTREES_DIR" ]; then',
|
|
116
|
+
' MERGED_BRANCHES=$(git branch --merged develop 2>/dev/null || git branch --merged main 2>/dev/null || echo "")',
|
|
117
|
+
' while IFS= read -r -d "" wt_dir; do',
|
|
118
|
+
' wt_branch=$(git -C "$wt_dir" rev-parse --abbrev-ref HEAD 2>/dev/null || echo "")',
|
|
119
|
+
' if [ -n "$wt_branch" ] && echo "$MERGED_BRANCHES" | grep -qF "$wt_branch"; then',
|
|
120
|
+
' echo -e " ${YELLOW}warn${RESET} Orphan worktree: $wt_dir (branch \'$wt_branch\' merged)"',
|
|
121
|
+
' fi',
|
|
122
|
+
' done < <(find "$WORKTREES_DIR" -mindepth 1 -maxdepth 1 -type d -print0 2>/dev/null)',
|
|
123
|
+
' fi',
|
|
124
|
+
'',
|
|
125
|
+
' # Branches with gone upstream',
|
|
126
|
+
' GONE_BRANCHES=$(git branch -vv 2>/dev/null | grep ": gone\\]" | awk \'{ print $1 }\' || echo "")',
|
|
127
|
+
' if [ -n "$GONE_BRANCHES" ]; then',
|
|
128
|
+
' while IFS= read -r branch; do',
|
|
129
|
+
' [ -n "$branch" ] && echo -e " ${YELLOW}warn${RESET} Branch without upstream: $branch"',
|
|
130
|
+
' done <<< "$GONE_BRANCHES"',
|
|
131
|
+
' else',
|
|
132
|
+
' echo -e " ${GREEN}ok${RESET} No branches with gone upstream"',
|
|
133
|
+
' fi',
|
|
134
|
+
'fi',
|
|
135
|
+
];
|
|
136
|
+
}
|
|
137
|
+
function buildSummaryAndExit(failOnDrift) {
|
|
138
|
+
const lines = [
|
|
139
|
+
'',
|
|
140
|
+
'# -- Summary ---------------------------------------------------------------',
|
|
141
|
+
'echo ""',
|
|
142
|
+
'echo -e "${BOLD}Summary${RESET}"',
|
|
143
|
+
'echo "Total specs: $TOTAL"',
|
|
144
|
+
'if [ "$ISSUES" -gt 0 ]; then',
|
|
145
|
+
' echo -e "Issues found: ${RED}$ISSUES${RESET}"',
|
|
146
|
+
'else',
|
|
147
|
+
' echo -e "Issues found: ${GREEN}0${RESET}"',
|
|
148
|
+
'fi',
|
|
149
|
+
'',
|
|
150
|
+
'# -- Exit code -------------------------------------------------------------',
|
|
151
|
+
];
|
|
152
|
+
if (failOnDrift) {
|
|
153
|
+
lines.push('if [ "$FAIL_ON_ISSUES" = "true" ] && [ "$SEVERITY" != "info" ]; then', ' if [ "$ISSUES" -gt 0 ]; then', ' echo ""', ' echo -e "${RED}x Planu check failed ($ISSUES issues)${RESET}"', ' exit 1', ' fi', 'fi');
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
lines.push('# fail-on-issues disabled — always exits 0');
|
|
157
|
+
}
|
|
158
|
+
lines.push('', 'echo -e "${GREEN}ok Planu check passed${RESET}"', 'exit 0');
|
|
159
|
+
return lines;
|
|
160
|
+
}
|
|
161
|
+
// -- Public API ---------------------------------------------------------------
|
|
162
|
+
/**
|
|
163
|
+
* Generate the content of planu-check.sh for local/offline spec validation.
|
|
164
|
+
* Produces the same checks as the GitHub Actions workflow, runnable without billing.
|
|
165
|
+
*/
|
|
166
|
+
export function generateLocalScript(options) {
|
|
167
|
+
const { specsDir, detectDrift, failOnDrift, severityThreshold } = options;
|
|
168
|
+
const lines = [
|
|
169
|
+
...buildHeader(specsDir, failOnDrift, severityThreshold, detectDrift),
|
|
170
|
+
...buildValidateSection(),
|
|
171
|
+
...(detectDrift ? buildDriftSection() : []),
|
|
172
|
+
...buildCleanupCheckSection(),
|
|
173
|
+
...buildSummaryAndExit(failOnDrift),
|
|
174
|
+
];
|
|
175
|
+
return lines.join('\n') + '\n';
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=local-script.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-script.js","sourceRoot":"","sources":["../../../src/engine/ci-generator/local-script.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAIjF,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAElD,gFAAgF;AAEhF,SAAS,WAAW,CAClB,QAAgB,EAChB,WAAoB,EACpB,iBAAyB,EACzB,WAAoB;IAEpB,OAAO;QACL,qBAAqB;QACrB,2DAA2D;QAC3D,4FAA4F;QAC5F,2FAA2F;QAC3F,GAAG;QACH,UAAU;QACV,oFAAoF;QACpF,yEAAyE;QACzE,0EAA0E;QAC1E,EAAE;QACF,mBAAmB;QACnB,EAAE;QACF,8EAA8E;QAC9E,mBAAmB;QACnB,iFAAiF;QACjF,oCAAoC;QACpC,MAAM;QACN,sDAAsD;QACtD,IAAI;QACJ,EAAE;QACF,8EAA8E;QAC9E,cAAc,QAAQ,GAAG;QACzB,kBAAkB,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE;QAClD,aAAa,iBAAiB,GAAG;QACjC,gBAAgB,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE;QAChD,EAAE;QACF,eAAe;QACf,qBAAqB;QACrB,kBAAkB;QAClB,wCAAwC;QACxC,oDAAoD;QACpD,QAAQ;QACR,MAAM;KACP,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB;IAC3B,OAAO;QACL,EAAE;QACF,8EAA8E;QAC9E,2CAA2C;QAC3C,kDAAkD;QAClD,SAAS;QACT,EAAE;QACF,SAAS;QACT,UAAU;QACV,EAAE;QACF,gCAAgC;QAChC,mEAAmE;QACnE,UAAU;QACV,IAAI;QACJ,EAAE;QACF,8EAA8E;QAC9E,qCAAqC;QACrC,kCAAkC;QAClC,qCAAqC;QACrC,wBAAwB;QACxB,EAAE;QACF,wFAAwF;QACxF,gCAAgC;QAChC,8DAA8D;QAC9D,4BAA4B;QAC5B,cAAc;QACd,MAAM;QACN,EAAE;QACF,uEAAuE;QACvE,4HAA4H;QAC5H,EAAE;QACF,4EAA4E;QAC5E,8DAA8D;QAC9D,oCAAoC;QACpC,2EAA2E;QAC3E,QAAQ;QACR,4EAA4E;QAC5E,4BAA4B;QAC5B,MAAM;QACN,MAAM;KACP,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO;QACL,EAAE;QACF,6EAA6E;QAC7E,4GAA4G;QAC5G,WAAW;QACX,4CAA4C;QAC5C,qEAAqE;QACrE,uCAAuC;QACvC,iDAAiD;QACjD,qGAAqG;QACrG,+BAA+B;QAC/B,sDAAsD;QACtD,2CAA2C;QAC3C,sFAAsF;QACtF,UAAU;QACV,UAAU;QACV,QAAQ;QACR,IAAI;KACL,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB;IAC/B,OAAO;QACL,EAAE;QACF,sFAAsF;QACtF,4EAA4E;QAC5E,WAAW;QACX,6CAA6C;QAC7C,EAAE;QACF,4EAA4E;QAC5E,qCAAqC;QACrC,oCAAoC;QACpC,mHAAmH;QACnH,yCAAyC;QACzC,wFAAwF;QACxF,uFAAuF;QACvF,mGAAmG;QACnG,UAAU;QACV,yFAAyF;QACzF,MAAM;QACN,EAAE;QACF,iCAAiC;QACjC,oGAAoG;QACpG,oCAAoC;QACpC,mCAAmC;QACnC,8FAA8F;QAC9F,+BAA+B;QAC/B,QAAQ;QACR,mEAAmE;QACnE,MAAM;QACN,IAAI;KACL,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,WAAoB;IAC/C,MAAM,KAAK,GAAG;QACZ,EAAE;QACF,8EAA8E;QAC9E,SAAS;QACT,kCAAkC;QAClC,4BAA4B;QAC5B,8BAA8B;QAC9B,iDAAiD;QACjD,MAAM;QACN,6CAA6C;QAC7C,IAAI;QACJ,EAAE;QACF,8EAA8E;KAC/E,CAAC;IAEF,IAAI,WAAW,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CACR,sEAAsE,EACtE,gCAAgC,EAChC,aAAa,EACb,mEAAmE,EACnE,YAAY,EACZ,MAAM,EACN,IAAI,CACL,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,iDAAiD,EAAE,QAAQ,CAAC,CAAC;IAC5E,OAAO,KAAK,CAAC;AACf,CAAC;AAED,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAA2B;IAC7D,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC;IAE1E,MAAM,KAAK,GAAa;QACtB,GAAG,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,iBAAiB,EAAE,WAAW,CAAC;QACrE,GAAG,oBAAoB,EAAE;QACzB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,GAAG,wBAAwB,EAAE;QAC7B,GAAG,mBAAmB,CAAC,WAAW,CAAC;KACpC,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"planu-steps.d.ts","sourceRoot":"","sources":["../../../src/engine/ci-generator/planu-steps.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,oBAAoB,EACpB,qBAAqB,EAEtB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"planu-steps.d.ts","sourceRoot":"","sources":["../../../src/engine/ci-generator/planu-steps.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,oBAAoB,EACpB,qBAAqB,EAEtB,MAAM,sBAAsB,CAAC;AAa9B;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAGzE;AAoSD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,qBAAqB,CAuDlF"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// ci-generator/planu-steps.ts — Generate Planu-specific CI workflow YAML (SPEC-066 AC-02..07)
|
|
2
2
|
import { generatePlanuConfigYaml } from './planu-config.js';
|
|
3
|
+
import { generateLocalScript, LOCAL_SCRIPT_PATH } from './local-script.js';
|
|
3
4
|
// -- Constants ---------------------------------------------------------------
|
|
4
5
|
const DEFAULT_SPECS_DIR = 'planu/specs';
|
|
5
6
|
const WORKFLOW_PATH = '.github/workflows/planu-check.yml';
|
|
@@ -227,13 +228,8 @@ function buildConfigReadStep(ind) {
|
|
|
227
228
|
];
|
|
228
229
|
}
|
|
229
230
|
// -- Main generator ----------------------------------------------------------
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
* PR comments, badge generation, and configurable severity thresholds.
|
|
233
|
-
*/
|
|
234
|
-
export function generatePlanuCI(input) {
|
|
235
|
-
const { specsDir = DEFAULT_SPECS_DIR, detectDrift = true, failOnDrift = true, severityThreshold = 'warning', postComment = true, badge = true, workingDirectory = '.', } = input;
|
|
236
|
-
const features = ['validate'];
|
|
231
|
+
function buildGithubActionsYaml(input, resolvedSpecsDir, features) {
|
|
232
|
+
const { detectDrift, postComment, badge, failOnDrift, workingDirectory, severityThreshold } = input;
|
|
237
233
|
const ind = ' ';
|
|
238
234
|
const lines = buildWorkflowHeader(postComment, workingDirectory);
|
|
239
235
|
lines.push(' steps:');
|
|
@@ -243,35 +239,52 @@ export function generatePlanuCI(input) {
|
|
|
243
239
|
lines.push(`${ind} fetch-depth: 0`);
|
|
244
240
|
lines.push('');
|
|
245
241
|
features.push('planu-config');
|
|
246
|
-
lines.push(...buildConfigReadStep(ind));
|
|
247
|
-
lines.push('');
|
|
248
|
-
const resolvedSpecsDir = workingDirectory === '.' ? specsDir : `${workingDirectory}/${specsDir}`;
|
|
249
|
-
lines.push(...buildValidateStepLines(ind, resolvedSpecsDir));
|
|
250
|
-
lines.push('');
|
|
242
|
+
lines.push(...buildConfigReadStep(ind), '');
|
|
243
|
+
lines.push(...buildValidateStepLines(ind, resolvedSpecsDir), '');
|
|
251
244
|
if (detectDrift) {
|
|
252
245
|
features.push('detect-drift');
|
|
253
|
-
lines.push(...buildDriftStepLines(ind, resolvedSpecsDir));
|
|
254
|
-
lines.push('');
|
|
246
|
+
lines.push(...buildDriftStepLines(ind, resolvedSpecsDir), '');
|
|
255
247
|
}
|
|
256
248
|
if (postComment) {
|
|
257
249
|
features.push('pr-comment');
|
|
258
|
-
lines.push(...buildCommentStepLines(ind));
|
|
259
|
-
lines.push('');
|
|
250
|
+
lines.push(...buildCommentStepLines(ind), '');
|
|
260
251
|
}
|
|
261
252
|
if (badge) {
|
|
262
253
|
features.push('badge');
|
|
263
|
-
lines.push(...buildBadgeStepLines(ind));
|
|
264
|
-
lines.push('');
|
|
254
|
+
lines.push(...buildBadgeStepLines(ind), '');
|
|
265
255
|
}
|
|
266
256
|
if (failOnDrift) {
|
|
267
257
|
features.push('fail-on-drift');
|
|
268
258
|
}
|
|
269
|
-
lines.push(...buildSeverityStepLines(ind, severityThreshold, failOnDrift));
|
|
270
|
-
lines.push('');
|
|
259
|
+
lines.push(...buildSeverityStepLines(ind, severityThreshold, failOnDrift), '');
|
|
271
260
|
lines.push(' outputs:');
|
|
272
261
|
lines.push(' drift-detected: ${{ steps.drift.outputs.drift-detected }}');
|
|
273
262
|
lines.push(' issues: ${{ steps.validate.outputs.issues }}');
|
|
274
|
-
|
|
263
|
+
return lines.join('\n') + '\n';
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Generate a complete Planu CI check workflow with optional drift detection,
|
|
267
|
+
* PR comments, badge generation, and configurable severity thresholds.
|
|
268
|
+
*/
|
|
269
|
+
export function generatePlanuCI(input) {
|
|
270
|
+
const { specsDir = DEFAULT_SPECS_DIR, detectDrift = true, failOnDrift = true, severityThreshold = 'warning', postComment = true, badge = true, workingDirectory = '.', includeGithubActions = true, gitHook = false, } = input;
|
|
271
|
+
const features = ['validate'];
|
|
272
|
+
const resolvedSpecsDir = workingDirectory === '.' ? specsDir : `${workingDirectory}/${specsDir}`;
|
|
273
|
+
// Always generate local script (works without GitHub billing)
|
|
274
|
+
features.push('local-script');
|
|
275
|
+
const localScript = generateLocalScript({
|
|
276
|
+
specsDir: resolvedSpecsDir,
|
|
277
|
+
detectDrift,
|
|
278
|
+
failOnDrift,
|
|
279
|
+
severityThreshold,
|
|
280
|
+
});
|
|
281
|
+
if (gitHook) {
|
|
282
|
+
features.push('git-hook');
|
|
283
|
+
}
|
|
284
|
+
// GitHub Actions YAML (optional — requires GitHub billing for private repos)
|
|
285
|
+
const workflowYaml = includeGithubActions
|
|
286
|
+
? buildGithubActionsYaml({ detectDrift, postComment, badge, failOnDrift, workingDirectory, severityThreshold }, resolvedSpecsDir, features)
|
|
287
|
+
: '';
|
|
275
288
|
const planuConfigYaml = generatePlanuConfigYaml({
|
|
276
289
|
specsDir,
|
|
277
290
|
failOnDrift,
|
|
@@ -282,10 +295,12 @@ export function generatePlanuCI(input) {
|
|
|
282
295
|
const badgeMarkdown = generateBadgeMarkdown('{owner}', '{repo}');
|
|
283
296
|
return {
|
|
284
297
|
workflowYaml,
|
|
285
|
-
workflowPath: WORKFLOW_PATH,
|
|
298
|
+
workflowPath: includeGithubActions ? WORKFLOW_PATH : '',
|
|
286
299
|
planuConfigYaml,
|
|
287
300
|
badgeMarkdown,
|
|
288
301
|
features,
|
|
302
|
+
localScript,
|
|
303
|
+
localScriptPath: LOCAL_SCRIPT_PATH,
|
|
289
304
|
};
|
|
290
305
|
}
|
|
291
306
|
//# sourceMappingURL=planu-steps.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"planu-steps.js","sourceRoot":"","sources":["../../../src/engine/ci-generator/planu-steps.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAS9F,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"planu-steps.js","sourceRoot":"","sources":["../../../src/engine/ci-generator/planu-steps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { ZodType } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Canonical 3-layer configuration loader.
|
|
4
|
+
*
|
|
5
|
+
* Generalizes the pattern from catalog-loader.ts (SPEC-054) into a reusable
|
|
6
|
+
* class that any module can use to make its configuration extensible.
|
|
7
|
+
*
|
|
8
|
+
* @typeParam T - The type of a single configuration item (must have `id: string`)
|
|
9
|
+
*/
|
|
10
|
+
export declare class ConfigLoader<T extends {
|
|
11
|
+
id: string;
|
|
12
|
+
}> {
|
|
13
|
+
private readonly area;
|
|
14
|
+
private readonly schema;
|
|
15
|
+
private readonly require;
|
|
16
|
+
constructor(area: string, schema: ZodType<T[]>);
|
|
17
|
+
/**
|
|
18
|
+
* Synchronously load and merge all 3 config layers.
|
|
19
|
+
* Safe for module-level initialization.
|
|
20
|
+
*/
|
|
21
|
+
load(projectHash?: string): T[];
|
|
22
|
+
/**
|
|
23
|
+
* Async version of load — preferred when called from async contexts.
|
|
24
|
+
*/
|
|
25
|
+
loadAsync(projectHash?: string): Promise<T[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Validate raw data against the schema. Returns parsed items or throws
|
|
28
|
+
* a descriptive error with the exact path of the invalid field.
|
|
29
|
+
*/
|
|
30
|
+
validate(data: unknown): T[];
|
|
31
|
+
/**
|
|
32
|
+
* Load only system defaults (src/config/{area}.json).
|
|
33
|
+
*/
|
|
34
|
+
loadSystem(): T[];
|
|
35
|
+
private loadGlobalSync;
|
|
36
|
+
private loadProjectSync;
|
|
37
|
+
private loadGlobalAsync;
|
|
38
|
+
private loadProjectAsync;
|
|
39
|
+
private loadFileSync;
|
|
40
|
+
private loadFileAsync;
|
|
41
|
+
/**
|
|
42
|
+
* Merge items from 3 layers by `id`. Higher-precedence layers override
|
|
43
|
+
* lower-precedence items with the same `id`. New ids are appended.
|
|
44
|
+
*/
|
|
45
|
+
private merge;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 3-layer configuration loader for structured (object) configs.
|
|
49
|
+
*
|
|
50
|
+
* Similar to ConfigLoader but works with a single object instead of an array.
|
|
51
|
+
* Override layers are deep-merged (top-level keys only) with the system defaults.
|
|
52
|
+
*
|
|
53
|
+
* @typeParam T - The config object type
|
|
54
|
+
*/
|
|
55
|
+
export declare class ObjectConfigLoader<T extends Record<string, unknown>> {
|
|
56
|
+
private readonly area;
|
|
57
|
+
private readonly schema;
|
|
58
|
+
private readonly require;
|
|
59
|
+
constructor(area: string, schema: ZodType<T>);
|
|
60
|
+
/** Synchronously load and merge all 3 config layers. */
|
|
61
|
+
load(projectHash?: string): T;
|
|
62
|
+
/** Async version of load. */
|
|
63
|
+
loadAsync(projectHash?: string): Promise<T>;
|
|
64
|
+
/** Validate raw data against the schema. */
|
|
65
|
+
validate(data: unknown): T;
|
|
66
|
+
/** Load system defaults. */
|
|
67
|
+
loadSystem(): T;
|
|
68
|
+
private loadFileSync;
|
|
69
|
+
private loadFileAsync;
|
|
70
|
+
/** Shallow merge: system <- global <- project (top-level keys). */
|
|
71
|
+
private merge;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=config-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/engine/config-loader.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,OAAO,EAAY,MAAM,KAAK,CAAC;AAK7C;;;;;;;GAOG;AACH,qBAAa,YAAY,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE;IAChD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;gBAE7B,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;IAM9C;;;OAGG;IACH,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE;IAO/B;;OAEG;IACG,SAAS,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAOnD;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,CAAC,EAAE;IAS5B;;OAEG;IACH,UAAU,IAAI,CAAC,EAAE;IAgBjB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,eAAe;YAMT,eAAe;YAIf,gBAAgB;IAM9B,OAAO,CAAC,YAAY;YAcN,aAAa;IAa3B;;;OAGG;IACH,OAAO,CAAC,KAAK;CAad;AAED;;;;;;;GAOG;AACH,qBAAa,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC/D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;gBAE7B,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAM5C,wDAAwD;IACxD,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,CAAC;IAW7B,6BAA6B;IACvB,SAAS,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAWjD,4CAA4C;IAC5C,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,CAAC;IAS1B,4BAA4B;IAC5B,UAAU,IAAI,CAAC;IAYf,OAAO,CAAC,YAAY;YASN,aAAa;IAS3B,mEAAmE;IACnE,OAAO,CAAC,KAAK;CAUd"}
|