youmd 0.6.21 → 0.6.27
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/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +0 -1
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +283 -184
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/export.d.ts +1 -0
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +5 -0
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +21 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/keys.d.ts.map +1 -1
- package/dist/commands/keys.js +3 -3
- package/dist/commands/keys.js.map +1 -1
- package/dist/commands/link.d.ts.map +1 -1
- package/dist/commands/link.js +3 -3
- package/dist/commands/link.js.map +1 -1
- package/dist/commands/login.d.ts +29 -0
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +256 -127
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logs.js +0 -1
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/mcp.d.ts +14 -0
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +284 -28
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/okf.d.ts +12 -0
- package/dist/commands/okf.d.ts.map +1 -0
- package/dist/commands/okf.js +411 -0
- package/dist/commands/okf.js.map +1 -0
- package/dist/commands/private.d.ts.map +1 -1
- package/dist/commands/private.js +6 -5
- package/dist/commands/private.js.map +1 -1
- package/dist/commands/project.d.ts.map +1 -1
- package/dist/commands/project.js +9 -5
- package/dist/commands/project.js.map +1 -1
- package/dist/commands/publish.d.ts.map +1 -1
- package/dist/commands/publish.js +0 -1
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/pull.d.ts +24 -1
- package/dist/commands/pull.d.ts.map +1 -1
- package/dist/commands/pull.js +114 -14
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/push.d.ts +1 -0
- package/dist/commands/push.d.ts.map +1 -1
- package/dist/commands/push.js +33 -13
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/register.d.ts +6 -0
- package/dist/commands/register.d.ts.map +1 -1
- package/dist/commands/register.js +179 -79
- package/dist/commands/register.js.map +1 -1
- package/dist/commands/skill.d.ts.map +1 -1
- package/dist/commands/skill.js +121 -50
- package/dist/commands/skill.js.map +1 -1
- package/dist/commands/stack.d.ts +16 -0
- package/dist/commands/stack.d.ts.map +1 -0
- package/dist/commands/stack.js +863 -0
- package/dist/commands/stack.js.map +1 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +25 -5
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/sync.d.ts +23 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +193 -12
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +21 -16
- package/dist/commands/whoami.js.map +1 -1
- package/dist/create.js +0 -0
- package/dist/index.js +64 -7
- package/dist/index.js.map +1 -1
- package/dist/lib/api.d.ts +127 -5
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +142 -5
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/ascii.d.ts +1 -0
- package/dist/lib/ascii.d.ts.map +1 -1
- package/dist/lib/ascii.js +9 -26
- package/dist/lib/ascii.js.map +1 -1
- package/dist/lib/canonical-json.d.ts +8 -0
- package/dist/lib/canonical-json.d.ts.map +1 -0
- package/dist/lib/canonical-json.js +29 -0
- package/dist/lib/canonical-json.js.map +1 -0
- package/dist/lib/capability-router.d.ts +58 -0
- package/dist/lib/capability-router.d.ts.map +1 -0
- package/dist/lib/capability-router.js +54 -0
- package/dist/lib/capability-router.js.map +1 -0
- package/dist/lib/compiler.d.ts +32 -0
- package/dist/lib/compiler.d.ts.map +1 -1
- package/dist/lib/compiler.js +150 -0
- package/dist/lib/compiler.js.map +1 -1
- package/dist/lib/config.d.ts +71 -35
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +334 -124
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/decompile.d.ts +6 -1
- package/dist/lib/decompile.d.ts.map +1 -1
- package/dist/lib/decompile.js +120 -11
- package/dist/lib/decompile.js.map +1 -1
- package/dist/lib/hash.d.ts.map +1 -1
- package/dist/lib/hash.js +2 -19
- package/dist/lib/hash.js.map +1 -1
- package/dist/lib/heartbeat.d.ts +38 -0
- package/dist/lib/heartbeat.d.ts.map +1 -0
- package/dist/lib/heartbeat.js +70 -0
- package/dist/lib/heartbeat.js.map +1 -0
- package/dist/lib/host-link.d.ts +123 -0
- package/dist/lib/host-link.d.ts.map +1 -0
- package/dist/lib/host-link.js +350 -0
- package/dist/lib/host-link.js.map +1 -0
- package/dist/lib/merge.d.ts +50 -0
- package/dist/lib/merge.d.ts.map +1 -0
- package/dist/lib/merge.js +167 -0
- package/dist/lib/merge.js.map +1 -0
- package/dist/lib/okf-bundle.d.ts +104 -0
- package/dist/lib/okf-bundle.d.ts.map +1 -0
- package/dist/lib/okf-bundle.js +473 -0
- package/dist/lib/okf-bundle.js.map +1 -0
- package/dist/lib/okf-health.d.ts +40 -0
- package/dist/lib/okf-health.d.ts.map +1 -0
- package/dist/lib/okf-health.js +152 -0
- package/dist/lib/okf-health.js.map +1 -0
- package/dist/lib/okf-stack.d.ts +47 -0
- package/dist/lib/okf-stack.d.ts.map +1 -0
- package/dist/lib/okf-stack.js +331 -0
- package/dist/lib/okf-stack.js.map +1 -0
- package/dist/lib/okf-view.d.ts +49 -0
- package/dist/lib/okf-view.d.ts.map +1 -0
- package/dist/lib/okf-view.js +197 -0
- package/dist/lib/okf-view.js.map +1 -0
- package/dist/lib/okf.d.ts +130 -0
- package/dist/lib/okf.d.ts.map +1 -0
- package/dist/lib/okf.js +263 -0
- package/dist/lib/okf.js.map +1 -0
- package/dist/lib/onboarding.d.ts +17 -0
- package/dist/lib/onboarding.d.ts.map +1 -1
- package/dist/lib/onboarding.js +224 -207
- package/dist/lib/onboarding.js.map +1 -1
- package/dist/lib/project.d.ts +5 -0
- package/dist/lib/project.d.ts.map +1 -1
- package/dist/lib/project.js +8 -0
- package/dist/lib/project.js.map +1 -1
- package/dist/lib/projectContext.d.ts +201 -0
- package/dist/lib/projectContext.d.ts.map +1 -0
- package/dist/lib/projectContext.js +597 -0
- package/dist/lib/projectContext.js.map +1 -0
- package/dist/lib/render.d.ts +38 -1
- package/dist/lib/render.d.ts.map +1 -1
- package/dist/lib/render.js +83 -18
- package/dist/lib/render.js.map +1 -1
- package/dist/lib/skill-catalog.d.ts.map +1 -1
- package/dist/lib/skill-catalog.js +22 -2
- package/dist/lib/skill-catalog.js.map +1 -1
- package/dist/lib/skills.d.ts +20 -5
- package/dist/lib/skills.d.ts.map +1 -1
- package/dist/lib/skills.js +116 -58
- package/dist/lib/skills.js.map +1 -1
- package/dist/lib/stackEval.d.ts +87 -0
- package/dist/lib/stackEval.d.ts.map +1 -0
- package/dist/lib/stackEval.js +233 -0
- package/dist/lib/stackEval.js.map +1 -0
- package/dist/lib/stackImprove.d.ts +49 -0
- package/dist/lib/stackImprove.d.ts.map +1 -0
- package/dist/lib/stackImprove.js +313 -0
- package/dist/lib/stackImprove.js.map +1 -0
- package/dist/lib/stackInstall.d.ts +59 -0
- package/dist/lib/stackInstall.d.ts.map +1 -0
- package/dist/lib/stackInstall.js +162 -0
- package/dist/lib/stackInstall.js.map +1 -0
- package/dist/lib/stackSafety.d.ts +126 -0
- package/dist/lib/stackSafety.d.ts.map +1 -0
- package/dist/lib/stackSafety.js +486 -0
- package/dist/lib/stackSafety.js.map +1 -0
- package/dist/lib/stackUpdate.d.ts +44 -0
- package/dist/lib/stackUpdate.d.ts.map +1 -0
- package/dist/lib/stackUpdate.js +256 -0
- package/dist/lib/stackUpdate.js.map +1 -0
- package/dist/lib/stream.d.ts +116 -0
- package/dist/lib/stream.d.ts.map +1 -0
- package/dist/lib/stream.js +368 -0
- package/dist/lib/stream.js.map +1 -0
- package/dist/lib/youstack.d.ts +219 -0
- package/dist/lib/youstack.d.ts.map +1 -0
- package/dist/lib/youstack.js +1049 -0
- package/dist/lib/youstack.js.map +1 -0
- package/dist/mcp/registry.d.ts +133 -0
- package/dist/mcp/registry.d.ts.map +1 -0
- package/dist/mcp/registry.js +833 -0
- package/dist/mcp/registry.js.map +1 -0
- package/dist/mcp/server.d.ts +106 -5
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +851 -498
- package/dist/mcp/server.js.map +1 -1
- package/dist/postinstall.js +11 -2
- package/dist/postinstall.js.map +1 -1
- package/dist/you.d.ts +1 -0
- package/dist/you.js +40 -4
- package/dist/you.js.map +1 -1
- package/examples/youstack-bamfstack-public/docs/quickstart.md +34 -0
- package/examples/youstack-bamfstack-public/prompts/creator-draft-starter.md +15 -0
- package/examples/youstack-bamfstack-public/skills/bamfstack-start/SKILL.md +36 -0
- package/examples/youstack-bamfstack-public/tests/smoke.md +19 -0
- package/examples/youstack-bamfstack-public/workflows/creator-growth-workflow.md +22 -0
- package/examples/youstack-bamfstack-public/youstack.json +172 -0
- package/examples/youstack-personal/docs/quickstart.md +10 -0
- package/examples/youstack-personal/skills/youstack-start/SKILL.md +9 -0
- package/examples/youstack-personal/tests/smoke.md +9 -0
- package/examples/youstack-personal/workflows/startup.md +7 -0
- package/examples/youstack-personal/youstack.json +123 -0
- package/package.json +3 -3
- package/skills/claude-md-generator.md +1 -1
- package/skills/meta-improve.md +8 -3
- package/skills/proactive-context-fill.md +1 -1
- package/skills/youstack-maintainer.md +128 -0
- package/skills/youstack-start.md +78 -0
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* stackEval.ts — deterministic golden-prompt eval runner for YouStack.
|
|
4
|
+
*
|
|
5
|
+
* From SELF-IMPROVING-SYSTEM-DESIGN.md §4 (Tier 4 enhancements):
|
|
6
|
+
* "youmd stack eval executes prompts/*.md against route_stack_request +
|
|
7
|
+
* rendered skills, diffs expected capability/route/output assertions,
|
|
8
|
+
* writes tests/eval-results.json with timestamps. Deterministic routing
|
|
9
|
+
* assertions are a lake (routeYouStackRequest is already deterministic);
|
|
10
|
+
* LLM-judged evals are the ocean — defer."
|
|
11
|
+
*
|
|
12
|
+
* Golden file format:
|
|
13
|
+
* stacks/<slug>/tests/golden.json
|
|
14
|
+
* { version: "golden/v1", entries: GoldenEntry[] }
|
|
15
|
+
*
|
|
16
|
+
* Results file:
|
|
17
|
+
* stacks/<slug>/tests/eval-results.json
|
|
18
|
+
* { ranAt, total, passed, failures }
|
|
19
|
+
*/
|
|
20
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
23
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
24
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
25
|
+
}
|
|
26
|
+
Object.defineProperty(o, k2, desc);
|
|
27
|
+
}) : (function(o, m, k, k2) {
|
|
28
|
+
if (k2 === undefined) k2 = k;
|
|
29
|
+
o[k2] = m[k];
|
|
30
|
+
}));
|
|
31
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
32
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
33
|
+
}) : function(o, v) {
|
|
34
|
+
o["default"] = v;
|
|
35
|
+
});
|
|
36
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
37
|
+
var ownKeys = function(o) {
|
|
38
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
39
|
+
var ar = [];
|
|
40
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
41
|
+
return ar;
|
|
42
|
+
};
|
|
43
|
+
return ownKeys(o);
|
|
44
|
+
};
|
|
45
|
+
return function (mod) {
|
|
46
|
+
if (mod && mod.__esModule) return mod;
|
|
47
|
+
var result = {};
|
|
48
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
49
|
+
__setModuleDefault(result, mod);
|
|
50
|
+
return result;
|
|
51
|
+
};
|
|
52
|
+
})();
|
|
53
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
54
|
+
exports.goldenFilePath = goldenFilePath;
|
|
55
|
+
exports.evalResultsFilePath = evalResultsFilePath;
|
|
56
|
+
exports.readGoldenFile = readGoldenFile;
|
|
57
|
+
exports.writeGoldenFile = writeGoldenFile;
|
|
58
|
+
exports.writeEvalResults = writeEvalResults;
|
|
59
|
+
exports.buildInitGoldenFile = buildInitGoldenFile;
|
|
60
|
+
exports.runEval = runEval;
|
|
61
|
+
const fs = __importStar(require("fs"));
|
|
62
|
+
const path = __importStar(require("path"));
|
|
63
|
+
const youstack_1 = require("./youstack");
|
|
64
|
+
// ---------------------------------------------------------------------------
|
|
65
|
+
// Paths
|
|
66
|
+
// ---------------------------------------------------------------------------
|
|
67
|
+
function goldenFilePath(stackRootDir) {
|
|
68
|
+
return path.join(stackRootDir, "tests", "golden.json");
|
|
69
|
+
}
|
|
70
|
+
function evalResultsFilePath(stackRootDir) {
|
|
71
|
+
return path.join(stackRootDir, "tests", "eval-results.json");
|
|
72
|
+
}
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
// Golden file I/O
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
/**
|
|
77
|
+
* Read and parse a golden.json file. Throws on missing or invalid file.
|
|
78
|
+
*/
|
|
79
|
+
function readGoldenFile(stackRootDir) {
|
|
80
|
+
const filePath = goldenFilePath(stackRootDir);
|
|
81
|
+
if (!fs.existsSync(filePath)) {
|
|
82
|
+
throw new Error(`golden.json not found at ${filePath}. Run \`youmd stack eval --init\` to create it.`);
|
|
83
|
+
}
|
|
84
|
+
const raw = fs.readFileSync(filePath, "utf-8");
|
|
85
|
+
let parsed;
|
|
86
|
+
try {
|
|
87
|
+
parsed = JSON.parse(raw);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
throw new Error(`golden.json is not valid JSON: ${filePath}`);
|
|
91
|
+
}
|
|
92
|
+
if (!isRecord(parsed) || parsed["version"] !== "golden/v1") {
|
|
93
|
+
throw new Error(`golden.json must have version: "golden/v1". Got: ${JSON.stringify(parsed["version"])}`);
|
|
94
|
+
}
|
|
95
|
+
if (!Array.isArray(parsed["entries"])) {
|
|
96
|
+
throw new Error(`golden.json must have an "entries" array`);
|
|
97
|
+
}
|
|
98
|
+
return parsed;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Write a golden.json file. Creates the tests/ directory if needed.
|
|
102
|
+
*/
|
|
103
|
+
function writeGoldenFile(stackRootDir, file) {
|
|
104
|
+
const filePath = goldenFilePath(stackRootDir);
|
|
105
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
106
|
+
fs.writeFileSync(filePath, JSON.stringify(file, null, 2) + "\n");
|
|
107
|
+
return filePath;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Write eval-results.json. Creates the tests/ directory if needed.
|
|
111
|
+
*/
|
|
112
|
+
function writeEvalResults(stackRootDir, results) {
|
|
113
|
+
const filePath = evalResultsFilePath(stackRootDir);
|
|
114
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
115
|
+
fs.writeFileSync(filePath, JSON.stringify(results, null, 2) + "\n");
|
|
116
|
+
return filePath;
|
|
117
|
+
}
|
|
118
|
+
// ---------------------------------------------------------------------------
|
|
119
|
+
// Example golden entries for --init
|
|
120
|
+
// ---------------------------------------------------------------------------
|
|
121
|
+
function buildInitGoldenFile(manifest) {
|
|
122
|
+
const slug = manifest.slug;
|
|
123
|
+
const name = manifest.name;
|
|
124
|
+
// Pull actual capability IDs from the manifest (user-declared only, not built-ins)
|
|
125
|
+
const firstUserCapId = manifest.capabilities?.[0]?.id ?? "manifest.inspect";
|
|
126
|
+
const readCapId = manifest.capabilities?.find((c) => c.mutationPolicy === "read_only" || c.localOnly)?.id ?? "manifest.inspect";
|
|
127
|
+
return {
|
|
128
|
+
version: "golden/v1",
|
|
129
|
+
entries: [
|
|
130
|
+
{
|
|
131
|
+
label: `inspect ${slug}`,
|
|
132
|
+
prompt: `inspect the ${name} stack`,
|
|
133
|
+
expect: {
|
|
134
|
+
routesTo: "manifest.inspect",
|
|
135
|
+
contains: ["inspect"],
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
label: `smoke check ${slug}`,
|
|
140
|
+
prompt: `run smoke validation on ${name}`,
|
|
141
|
+
expect: {
|
|
142
|
+
routesTo: "manifest.smoke",
|
|
143
|
+
contains: ["smoke"],
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
label: `first declared capability`,
|
|
148
|
+
prompt: `use ${firstUserCapId} for ${slug}`,
|
|
149
|
+
expect: {
|
|
150
|
+
routesTo: firstUserCapId !== readCapId ? firstUserCapId : readCapId,
|
|
151
|
+
contains: [firstUserCapId.split(".")[0]],
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
],
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
// ---------------------------------------------------------------------------
|
|
158
|
+
// Runner
|
|
159
|
+
// ---------------------------------------------------------------------------
|
|
160
|
+
function capabilityText(routeResult) {
|
|
161
|
+
const cap = routeResult.capability;
|
|
162
|
+
return [
|
|
163
|
+
cap.id,
|
|
164
|
+
cap.intent,
|
|
165
|
+
cap.workflow,
|
|
166
|
+
cap.skill,
|
|
167
|
+
cap.mcpTool,
|
|
168
|
+
cap.apiEndpoint,
|
|
169
|
+
...(cap.requiredScopes || []),
|
|
170
|
+
]
|
|
171
|
+
.filter(Boolean)
|
|
172
|
+
.join(" ");
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Run all entries in a golden file against the deterministic router.
|
|
176
|
+
* No LLM calls — pure routing + string presence checks.
|
|
177
|
+
*/
|
|
178
|
+
function runEval(manifest, goldenFile) {
|
|
179
|
+
const ranAt = new Date().toISOString();
|
|
180
|
+
const failures = [];
|
|
181
|
+
let passed = 0;
|
|
182
|
+
for (const entry of goldenFile.entries) {
|
|
183
|
+
const result = (0, youstack_1.routeYouStackRequest)(manifest, entry.prompt);
|
|
184
|
+
const text = capabilityText(result);
|
|
185
|
+
const textLower = text.toLowerCase();
|
|
186
|
+
const diff = [];
|
|
187
|
+
// Check routesTo
|
|
188
|
+
if (entry.expect.routesTo !== undefined &&
|
|
189
|
+
result.capability.id !== entry.expect.routesTo) {
|
|
190
|
+
diff.push(`routesTo: expected "${entry.expect.routesTo}", got "${result.capability.id}"`);
|
|
191
|
+
}
|
|
192
|
+
// Check contains
|
|
193
|
+
for (const needle of entry.expect.contains || []) {
|
|
194
|
+
if (!textLower.includes(needle.toLowerCase())) {
|
|
195
|
+
diff.push(`contains "${needle}": not found in capability text`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Check notContains
|
|
199
|
+
for (const needle of entry.expect.notContains || []) {
|
|
200
|
+
if (textLower.includes(needle.toLowerCase())) {
|
|
201
|
+
diff.push(`notContains "${needle}": unexpectedly found in capability text`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
if (diff.length > 0) {
|
|
205
|
+
failures.push({
|
|
206
|
+
label: entry.label,
|
|
207
|
+
prompt: entry.prompt,
|
|
208
|
+
expected: entry.expect,
|
|
209
|
+
actual: {
|
|
210
|
+
routedTo: result.capability.id,
|
|
211
|
+
capabilityText: text,
|
|
212
|
+
},
|
|
213
|
+
diff,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
passed++;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return {
|
|
221
|
+
ranAt,
|
|
222
|
+
total: goldenFile.entries.length,
|
|
223
|
+
passed,
|
|
224
|
+
failures,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
// ---------------------------------------------------------------------------
|
|
228
|
+
// Helpers
|
|
229
|
+
// ---------------------------------------------------------------------------
|
|
230
|
+
function isRecord(value) {
|
|
231
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=stackEval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stackEval.js","sourceRoot":"","sources":["../../src/lib/stackEval.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stackImprove.ts — L14 local stack improvement runner.
|
|
3
|
+
*
|
|
4
|
+
* Two modes:
|
|
5
|
+
* propose — journal-only; writes to stacks/<slug>/journal/<YYYY-MM-DD>.md
|
|
6
|
+
* allowed from T1 upward (requires improvement.mode != "observe").
|
|
7
|
+
* auto_pr — opens a PR via `gh` CLI (or prints the patch if gh not found);
|
|
8
|
+
* gated by T2/T3 with humanGate.required (tierAllows auto_pr).
|
|
9
|
+
*
|
|
10
|
+
* Idempotent: re-runs on the same day append under a new ## Run block rather
|
|
11
|
+
* than creating a second file.
|
|
12
|
+
*
|
|
13
|
+
* Key contract:
|
|
14
|
+
* - Never touches main branch.
|
|
15
|
+
* - Never runs if the manifest mode is "observe" (journal-only requires at
|
|
16
|
+
* least "propose").
|
|
17
|
+
* - Always logs to the journal; auto_pr additionally creates the branch + PR.
|
|
18
|
+
* - tierAllows() from stackSafety.ts is the single gate for auto_pr.
|
|
19
|
+
*/
|
|
20
|
+
import type { YouStackManifest } from "./youstack";
|
|
21
|
+
export type ImproveMode = "propose" | "auto_pr";
|
|
22
|
+
export interface ImproveSummary {
|
|
23
|
+
/** Signals gathered from the manifest's improvement.signals list. */
|
|
24
|
+
signals: SignalEntry[];
|
|
25
|
+
/** Proposals generated (human-readable action items). */
|
|
26
|
+
proposals: ProposalEntry[];
|
|
27
|
+
}
|
|
28
|
+
export interface SignalEntry {
|
|
29
|
+
name: string;
|
|
30
|
+
value: string;
|
|
31
|
+
}
|
|
32
|
+
export interface ProposalEntry {
|
|
33
|
+
id: string;
|
|
34
|
+
description: string;
|
|
35
|
+
rationale: string;
|
|
36
|
+
}
|
|
37
|
+
export interface StackImproveResult {
|
|
38
|
+
mode: ImproveMode;
|
|
39
|
+
journalPath: string;
|
|
40
|
+
/** true if the entry was appended to an existing file (idempotent re-run). */
|
|
41
|
+
appended: boolean;
|
|
42
|
+
summary: ImproveSummary;
|
|
43
|
+
/** Only present in auto_pr mode — the pr URL or "no-gh" if gh CLI absent. */
|
|
44
|
+
prUrl?: string;
|
|
45
|
+
/** Refusal reason when the manifest contract blocks the requested mode. */
|
|
46
|
+
refused?: string;
|
|
47
|
+
}
|
|
48
|
+
export declare function runStackImprove(manifest: YouStackManifest, rootDir: string, mode: ImproveMode): StackImproveResult;
|
|
49
|
+
//# sourceMappingURL=stackImprove.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stackImprove.d.ts","sourceRoot":"","sources":["../../src/lib/stackImprove.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAOnD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,yDAAyD;IACzD,SAAS,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,cAAc,CAAC;IACxB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAwPD,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,WAAW,GAChB,kBAAkB,CAqDpB"}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* stackImprove.ts — L14 local stack improvement runner.
|
|
4
|
+
*
|
|
5
|
+
* Two modes:
|
|
6
|
+
* propose — journal-only; writes to stacks/<slug>/journal/<YYYY-MM-DD>.md
|
|
7
|
+
* allowed from T1 upward (requires improvement.mode != "observe").
|
|
8
|
+
* auto_pr — opens a PR via `gh` CLI (or prints the patch if gh not found);
|
|
9
|
+
* gated by T2/T3 with humanGate.required (tierAllows auto_pr).
|
|
10
|
+
*
|
|
11
|
+
* Idempotent: re-runs on the same day append under a new ## Run block rather
|
|
12
|
+
* than creating a second file.
|
|
13
|
+
*
|
|
14
|
+
* Key contract:
|
|
15
|
+
* - Never touches main branch.
|
|
16
|
+
* - Never runs if the manifest mode is "observe" (journal-only requires at
|
|
17
|
+
* least "propose").
|
|
18
|
+
* - Always logs to the journal; auto_pr additionally creates the branch + PR.
|
|
19
|
+
* - tierAllows() from stackSafety.ts is the single gate for auto_pr.
|
|
20
|
+
*/
|
|
21
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
22
|
+
if (k2 === undefined) k2 = k;
|
|
23
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
24
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
25
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
26
|
+
}
|
|
27
|
+
Object.defineProperty(o, k2, desc);
|
|
28
|
+
}) : (function(o, m, k, k2) {
|
|
29
|
+
if (k2 === undefined) k2 = k;
|
|
30
|
+
o[k2] = m[k];
|
|
31
|
+
}));
|
|
32
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
33
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
34
|
+
}) : function(o, v) {
|
|
35
|
+
o["default"] = v;
|
|
36
|
+
});
|
|
37
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
38
|
+
var ownKeys = function(o) {
|
|
39
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
40
|
+
var ar = [];
|
|
41
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
42
|
+
return ar;
|
|
43
|
+
};
|
|
44
|
+
return ownKeys(o);
|
|
45
|
+
};
|
|
46
|
+
return function (mod) {
|
|
47
|
+
if (mod && mod.__esModule) return mod;
|
|
48
|
+
var result = {};
|
|
49
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
50
|
+
__setModuleDefault(result, mod);
|
|
51
|
+
return result;
|
|
52
|
+
};
|
|
53
|
+
})();
|
|
54
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
55
|
+
exports.runStackImprove = runStackImprove;
|
|
56
|
+
const fs = __importStar(require("fs"));
|
|
57
|
+
const path = __importStar(require("path"));
|
|
58
|
+
const child_process_1 = require("child_process");
|
|
59
|
+
const stackSafety_1 = require("./stackSafety");
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
// Signal gathering
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
function gatherSignals(manifest, rootDir) {
|
|
64
|
+
const signals = [];
|
|
65
|
+
const declaredSignals = manifest.improvement?.signals ?? [];
|
|
66
|
+
// Always include the declared mode as a signal.
|
|
67
|
+
signals.push({
|
|
68
|
+
name: "improvement.mode",
|
|
69
|
+
value: manifest.improvement?.mode ?? "observe",
|
|
70
|
+
});
|
|
71
|
+
// eval file check
|
|
72
|
+
const evalsDecl = manifest.improvement?.evals ?? [];
|
|
73
|
+
for (const evalPath of evalsDecl) {
|
|
74
|
+
const full = path.isAbsolute(evalPath)
|
|
75
|
+
? evalPath
|
|
76
|
+
: path.join(rootDir, evalPath);
|
|
77
|
+
const exists = fs.existsSync(full);
|
|
78
|
+
signals.push({ name: `eval:${evalPath}`, value: exists ? "present" : "missing" });
|
|
79
|
+
}
|
|
80
|
+
// Journal entry count (approximate health of the journal)
|
|
81
|
+
const journalDir = path.join(rootDir, "journal");
|
|
82
|
+
if (fs.existsSync(journalDir)) {
|
|
83
|
+
const entries = fs.readdirSync(journalDir).filter((f) => f.endsWith(".md"));
|
|
84
|
+
signals.push({ name: "journal.entries", value: String(entries.length) });
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
signals.push({ name: "journal.entries", value: "0 (no journal dir yet)" });
|
|
88
|
+
}
|
|
89
|
+
// File completeness
|
|
90
|
+
const files = manifest.files ?? [];
|
|
91
|
+
const missingFiles = files.filter((f) => {
|
|
92
|
+
const full = path.isAbsolute(f.path) ? f.path : path.join(rootDir, f.path);
|
|
93
|
+
return f.required && !fs.existsSync(full);
|
|
94
|
+
});
|
|
95
|
+
if (missingFiles.length > 0) {
|
|
96
|
+
signals.push({ name: "missing.required.files", value: missingFiles.map((f) => f.path).join(", ") });
|
|
97
|
+
}
|
|
98
|
+
else if (files.length > 0) {
|
|
99
|
+
signals.push({ name: "required.files", value: `all ${files.length} present` });
|
|
100
|
+
}
|
|
101
|
+
// Capability count
|
|
102
|
+
const caps = manifest.capabilities ?? [];
|
|
103
|
+
signals.push({ name: "capabilities.count", value: String(caps.length) });
|
|
104
|
+
// Declared signals from the manifest (capture them as-is; real implementations
|
|
105
|
+
// would resolve these against activity logs, journal entries, etc.)
|
|
106
|
+
for (const sig of declaredSignals) {
|
|
107
|
+
if (!signals.find((s) => s.name === sig)) {
|
|
108
|
+
signals.push({ name: sig, value: "declared (not yet instrumented)" });
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return signals;
|
|
112
|
+
}
|
|
113
|
+
// ---------------------------------------------------------------------------
|
|
114
|
+
// Proposal generation
|
|
115
|
+
// ---------------------------------------------------------------------------
|
|
116
|
+
function generateProposals(manifest, signals) {
|
|
117
|
+
const proposals = [];
|
|
118
|
+
// Missing required files
|
|
119
|
+
const missingFilesSig = signals.find((s) => s.name === "missing.required.files");
|
|
120
|
+
if (missingFilesSig) {
|
|
121
|
+
proposals.push({
|
|
122
|
+
id: "fill-missing-files",
|
|
123
|
+
description: `Add missing required files: ${missingFilesSig.value}`,
|
|
124
|
+
rationale: "Required files declared in the manifest are not present on disk.",
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
// No evals declared
|
|
128
|
+
if (!manifest.improvement?.evals || manifest.improvement.evals.length === 0) {
|
|
129
|
+
proposals.push({
|
|
130
|
+
id: "add-evals",
|
|
131
|
+
description: 'Add improvement.evals to the manifest (e.g. "youmd stack smoke", "youmd stack eval")',
|
|
132
|
+
rationale: "Evals gate auto-apply; without them, the stack cannot safely self-apply changes.",
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
// Missing evals files
|
|
136
|
+
const missingEvals = signals.filter((s) => s.name.startsWith("eval:") && s.value === "missing");
|
|
137
|
+
for (const sig of missingEvals) {
|
|
138
|
+
proposals.push({
|
|
139
|
+
id: `create-eval-${sig.name.replace("eval:", "").replace(/\W+/g, "-")}`,
|
|
140
|
+
description: `Create the declared eval file: ${sig.name.replace("eval:", "")}`,
|
|
141
|
+
rationale: "The eval is declared in improvement.evals but the file does not exist.",
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
// No capabilities
|
|
145
|
+
if ((manifest.capabilities?.length ?? 0) === 0) {
|
|
146
|
+
proposals.push({
|
|
147
|
+
id: "declare-capabilities",
|
|
148
|
+
description: "Declare at least one capability in the manifest",
|
|
149
|
+
rationale: "No capabilities means youmd stack route cannot match any request.",
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
// Observe mode warning
|
|
153
|
+
if (manifest.improvement?.mode === "observe") {
|
|
154
|
+
proposals.push({
|
|
155
|
+
id: "upgrade-improvement-mode",
|
|
156
|
+
description: 'Consider upgrading improvement.mode from "observe" to "propose" to enable journal writes',
|
|
157
|
+
rationale: 'Mode "observe" prevents any journal writes, including proposals.',
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
return proposals;
|
|
161
|
+
}
|
|
162
|
+
// ---------------------------------------------------------------------------
|
|
163
|
+
// Journal writing
|
|
164
|
+
// ---------------------------------------------------------------------------
|
|
165
|
+
function utcDate() {
|
|
166
|
+
return new Date().toISOString().slice(0, 10);
|
|
167
|
+
}
|
|
168
|
+
function utcTimestamp() {
|
|
169
|
+
return new Date().toISOString();
|
|
170
|
+
}
|
|
171
|
+
function journalFilePath(rootDir) {
|
|
172
|
+
const journalDir = path.join(rootDir, "journal");
|
|
173
|
+
return path.join(journalDir, `${utcDate()}.md`);
|
|
174
|
+
}
|
|
175
|
+
function renderJournalEntry(summary, mode, runTs) {
|
|
176
|
+
const lines = [];
|
|
177
|
+
lines.push(`## Run — ${runTs}`);
|
|
178
|
+
lines.push(`Mode: ${mode}`);
|
|
179
|
+
lines.push("");
|
|
180
|
+
lines.push("### Signals");
|
|
181
|
+
for (const sig of summary.signals) {
|
|
182
|
+
lines.push(`- **${sig.name}**: ${sig.value}`);
|
|
183
|
+
}
|
|
184
|
+
lines.push("");
|
|
185
|
+
lines.push("### Proposals");
|
|
186
|
+
if (summary.proposals.length === 0) {
|
|
187
|
+
lines.push("No proposals generated.");
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
for (const p of summary.proposals) {
|
|
191
|
+
lines.push(`#### ${p.id}`);
|
|
192
|
+
lines.push(`> ${p.description}`);
|
|
193
|
+
lines.push(`> *Rationale:* ${p.rationale}`);
|
|
194
|
+
lines.push("");
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
lines.push("---");
|
|
198
|
+
lines.push("");
|
|
199
|
+
return lines.join("\n");
|
|
200
|
+
}
|
|
201
|
+
function ensureJournalFile(journalPath, slug) {
|
|
202
|
+
const journalDir = path.dirname(journalPath);
|
|
203
|
+
if (!fs.existsSync(journalDir)) {
|
|
204
|
+
fs.mkdirSync(journalDir, { recursive: true });
|
|
205
|
+
}
|
|
206
|
+
const existed = fs.existsSync(journalPath);
|
|
207
|
+
if (!existed) {
|
|
208
|
+
const header = `# Stack Journal — ${slug}\n\nDate: ${utcDate()}\n\n`;
|
|
209
|
+
fs.writeFileSync(journalPath, header, "utf-8");
|
|
210
|
+
}
|
|
211
|
+
return { existed };
|
|
212
|
+
}
|
|
213
|
+
// ---------------------------------------------------------------------------
|
|
214
|
+
// auto_pr implementation
|
|
215
|
+
// ---------------------------------------------------------------------------
|
|
216
|
+
function ghAvailable() {
|
|
217
|
+
try {
|
|
218
|
+
(0, child_process_1.execFileSync)("gh", ["--version"], { stdio: "ignore" });
|
|
219
|
+
return true;
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
function renderPatchText(summary, slug) {
|
|
226
|
+
const lines = [];
|
|
227
|
+
lines.push(`# Stack Improvement Proposals — ${slug}`);
|
|
228
|
+
lines.push(`Generated: ${utcTimestamp()}`);
|
|
229
|
+
lines.push("");
|
|
230
|
+
for (const p of summary.proposals) {
|
|
231
|
+
lines.push(`## ${p.id}`);
|
|
232
|
+
lines.push(`**Action:** ${p.description}`);
|
|
233
|
+
lines.push(`**Rationale:** ${p.rationale}`);
|
|
234
|
+
lines.push("");
|
|
235
|
+
}
|
|
236
|
+
return lines.join("\n");
|
|
237
|
+
}
|
|
238
|
+
function openAutoPr(rootDir, slug, summary, journalPath) {
|
|
239
|
+
if (!ghAvailable()) {
|
|
240
|
+
// Print patch to stdout; caller surfaces it.
|
|
241
|
+
return "no-gh";
|
|
242
|
+
}
|
|
243
|
+
const branch = `stack-improve/${slug}/${utcDate()}`;
|
|
244
|
+
// Attempt to create the branch and push the journal.
|
|
245
|
+
try {
|
|
246
|
+
// Create branch from current HEAD (never modifies main directly).
|
|
247
|
+
(0, child_process_1.execSync)(`git checkout -b "${branch}"`, { cwd: rootDir, stdio: "pipe" });
|
|
248
|
+
(0, child_process_1.execSync)(`git add "${journalPath}"`, { cwd: rootDir, stdio: "pipe" });
|
|
249
|
+
(0, child_process_1.execSync)(`git commit -m "feat(stack): ${slug} improvement proposals ${utcDate()}"`, { cwd: rootDir, stdio: "pipe" });
|
|
250
|
+
(0, child_process_1.execSync)(`git push origin "${branch}"`, { cwd: rootDir, stdio: "pipe" });
|
|
251
|
+
const prTitle = `stack-improve: ${slug} ${utcDate()}`;
|
|
252
|
+
const prBody = `Auto-generated by \`youmd stack improve --mode auto_pr\`.\n\n${renderPatchText(summary, slug)}`;
|
|
253
|
+
const result = (0, child_process_1.execSync)(`gh pr create --title "${prTitle}" --body "${prBody.replace(/"/g, '\\"')}" --base main --head "${branch}"`, { cwd: rootDir, encoding: "utf-8" });
|
|
254
|
+
return result.trim();
|
|
255
|
+
}
|
|
256
|
+
catch (err) {
|
|
257
|
+
// Return a descriptive error string; caller surfaces it.
|
|
258
|
+
return `pr-failed: ${err instanceof Error ? err.message : String(err)}`;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
// ---------------------------------------------------------------------------
|
|
262
|
+
// Main entry point
|
|
263
|
+
// ---------------------------------------------------------------------------
|
|
264
|
+
function runStackImprove(manifest, rootDir, mode) {
|
|
265
|
+
// ── Gate 1: mode must be at least "propose" in the manifest ──────────
|
|
266
|
+
const declaredMode = manifest.improvement?.mode ?? "observe";
|
|
267
|
+
if (declaredMode === "observe") {
|
|
268
|
+
return {
|
|
269
|
+
mode,
|
|
270
|
+
journalPath: journalFilePath(rootDir),
|
|
271
|
+
appended: false,
|
|
272
|
+
summary: { signals: [], proposals: [] },
|
|
273
|
+
refused: `improvement.mode is "observe" in the manifest; journal writes require at least "propose"`,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
// ── Gate 2: auto_pr requires tierAllows("auto_pr") ───────────────────
|
|
277
|
+
if (mode === "auto_pr") {
|
|
278
|
+
const contract = (0, stackSafety_1.parseSafetyContract)(manifest);
|
|
279
|
+
if (!contract || !(0, stackSafety_1.tierAllows)(contract, "auto_pr")) {
|
|
280
|
+
const tier = contract?.tier ?? "(no safety contract)";
|
|
281
|
+
return {
|
|
282
|
+
mode,
|
|
283
|
+
journalPath: journalFilePath(rootDir),
|
|
284
|
+
appended: false,
|
|
285
|
+
summary: { signals: [], proposals: [] },
|
|
286
|
+
refused: `auto_pr blocked: tier ${tier} does not allow auto_pr (requires T2 with humanGate.required, or T3)`,
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
// ── Gather signals + proposals ────────────────────────────────────────
|
|
291
|
+
const signals = gatherSignals(manifest, rootDir);
|
|
292
|
+
const proposals = generateProposals(manifest, signals);
|
|
293
|
+
const summary = { signals, proposals };
|
|
294
|
+
const runTs = utcTimestamp();
|
|
295
|
+
// ── Write journal ─────────────────────────────────────────────────────
|
|
296
|
+
const journalPath = journalFilePath(rootDir);
|
|
297
|
+
const { existed } = ensureJournalFile(journalPath, manifest.slug);
|
|
298
|
+
const entry = renderJournalEntry(summary, mode, runTs);
|
|
299
|
+
fs.appendFileSync(journalPath, entry, "utf-8");
|
|
300
|
+
// ── auto_pr branch ───────────────────────────────────────────────────
|
|
301
|
+
let prUrl;
|
|
302
|
+
if (mode === "auto_pr") {
|
|
303
|
+
prUrl = openAutoPr(rootDir, manifest.slug, summary, journalPath);
|
|
304
|
+
}
|
|
305
|
+
return {
|
|
306
|
+
mode,
|
|
307
|
+
journalPath,
|
|
308
|
+
appended: existed,
|
|
309
|
+
summary,
|
|
310
|
+
prUrl,
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
//# sourceMappingURL=stackImprove.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stackImprove.js","sourceRoot":"","sources":["../../src/lib/stackImprove.ts"],"names":[],"mappings":"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"}
|