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,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* P9 — stack install from the public registry.
|
|
3
|
+
*
|
|
4
|
+
* Fetches a YouStack from GET /api/v1/stacks/registry/{user}/{slug},
|
|
5
|
+
* validates the manifest, writes files to ./stacks/<slug>/ (or --dir),
|
|
6
|
+
* then runs the host-link engine to emit .claude/skills/<name>/SKILL.md.
|
|
7
|
+
*
|
|
8
|
+
* Error paths:
|
|
9
|
+
* not_found — unknown user or stack slug
|
|
10
|
+
* conflict — target dir already exists (use --force to overwrite)
|
|
11
|
+
* invalid_manifest — manifest fails validateYouStackManifest
|
|
12
|
+
*/
|
|
13
|
+
import { type YouStackManifest } from "./youstack";
|
|
14
|
+
export interface StackInstallOptions {
|
|
15
|
+
/** Override target base directory. Defaults to process.cwd(). */
|
|
16
|
+
dir?: string;
|
|
17
|
+
/** Overwrite an existing stacks/<slug>/ directory. */
|
|
18
|
+
force?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface StackInstallResult {
|
|
21
|
+
slug: string;
|
|
22
|
+
targetDir: string;
|
|
23
|
+
filesWritten: string[];
|
|
24
|
+
hostLinks: string[];
|
|
25
|
+
/** Stack manifest as parsed from the registry response. */
|
|
26
|
+
manifest: YouStackManifest;
|
|
27
|
+
}
|
|
28
|
+
export interface RegistryFile {
|
|
29
|
+
path: string;
|
|
30
|
+
size: number;
|
|
31
|
+
content: string;
|
|
32
|
+
}
|
|
33
|
+
export interface RegistryResponse {
|
|
34
|
+
user: string;
|
|
35
|
+
slug: string;
|
|
36
|
+
manifest: unknown;
|
|
37
|
+
files: RegistryFile[];
|
|
38
|
+
fileCount: number;
|
|
39
|
+
truncated: boolean;
|
|
40
|
+
syncedAt: number;
|
|
41
|
+
stale: boolean;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Fetch the registry entry for <user>/<slug> from the Convex site.
|
|
45
|
+
* Throws with a descriptive message on network error or non-2xx response.
|
|
46
|
+
*/
|
|
47
|
+
export declare function fetchRegistryEntry(user: string, slug: string): Promise<RegistryResponse>;
|
|
48
|
+
/**
|
|
49
|
+
* Install a YouStack from the public registry.
|
|
50
|
+
*
|
|
51
|
+
* 1. Fetch manifest + files from /api/v1/stacks/registry/{user}/{slug}.
|
|
52
|
+
* 2. Validate the manifest with validateYouStackManifest.
|
|
53
|
+
* 3. Write files to <baseDir>/stacks/<slug>/ (refuses if dir exists without --force).
|
|
54
|
+
* 4. Run linkYouStackAdapters to emit .claude/skills/<name>/SKILL.md.
|
|
55
|
+
*
|
|
56
|
+
* Returns StackInstallResult on success. Throws on any error.
|
|
57
|
+
*/
|
|
58
|
+
export declare function installStack(user: string, slug: string, options?: StackInstallOptions): Promise<StackInstallResult>;
|
|
59
|
+
//# sourceMappingURL=stackInstall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stackInstall.d.ts","sourceRoot":"","sources":["../../src/lib/stackInstall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,YAAY,CAAC;AAIpB,MAAM,WAAW,mBAAmB;IAClC,iEAAiE;IACjE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,2DAA2D;IAC3D,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB;AAID;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,gBAAgB,CAAC,CAiC3B;AAUD;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAuE7B"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* P9 — stack install from the public registry.
|
|
4
|
+
*
|
|
5
|
+
* Fetches a YouStack from GET /api/v1/stacks/registry/{user}/{slug},
|
|
6
|
+
* validates the manifest, writes files to ./stacks/<slug>/ (or --dir),
|
|
7
|
+
* then runs the host-link engine to emit .claude/skills/<name>/SKILL.md.
|
|
8
|
+
*
|
|
9
|
+
* Error paths:
|
|
10
|
+
* not_found — unknown user or stack slug
|
|
11
|
+
* conflict — target dir already exists (use --force to overwrite)
|
|
12
|
+
* invalid_manifest — manifest fails validateYouStackManifest
|
|
13
|
+
*/
|
|
14
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
17
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
18
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
19
|
+
}
|
|
20
|
+
Object.defineProperty(o, k2, desc);
|
|
21
|
+
}) : (function(o, m, k, k2) {
|
|
22
|
+
if (k2 === undefined) k2 = k;
|
|
23
|
+
o[k2] = m[k];
|
|
24
|
+
}));
|
|
25
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
26
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
27
|
+
}) : function(o, v) {
|
|
28
|
+
o["default"] = v;
|
|
29
|
+
});
|
|
30
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
31
|
+
var ownKeys = function(o) {
|
|
32
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
33
|
+
var ar = [];
|
|
34
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
35
|
+
return ar;
|
|
36
|
+
};
|
|
37
|
+
return ownKeys(o);
|
|
38
|
+
};
|
|
39
|
+
return function (mod) {
|
|
40
|
+
if (mod && mod.__esModule) return mod;
|
|
41
|
+
var result = {};
|
|
42
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
43
|
+
__setModuleDefault(result, mod);
|
|
44
|
+
return result;
|
|
45
|
+
};
|
|
46
|
+
})();
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.fetchRegistryEntry = fetchRegistryEntry;
|
|
49
|
+
exports.installStack = installStack;
|
|
50
|
+
const fs = __importStar(require("fs"));
|
|
51
|
+
const path = __importStar(require("path"));
|
|
52
|
+
const config_1 = require("./config");
|
|
53
|
+
const api_1 = require("./api");
|
|
54
|
+
const youstack_1 = require("./youstack");
|
|
55
|
+
// ── Registry fetch ─────────────────────────────────────────────────────────────
|
|
56
|
+
/**
|
|
57
|
+
* Fetch the registry entry for <user>/<slug> from the Convex site.
|
|
58
|
+
* Throws with a descriptive message on network error or non-2xx response.
|
|
59
|
+
*/
|
|
60
|
+
async function fetchRegistryEntry(user, slug) {
|
|
61
|
+
const base = (0, config_1.getConvexSiteUrl)();
|
|
62
|
+
const url = `${base}/api/v1/stacks/registry/${encodeURIComponent(user)}/${encodeURIComponent(slug)}`;
|
|
63
|
+
let res;
|
|
64
|
+
try {
|
|
65
|
+
res = await fetch(url, {
|
|
66
|
+
headers: { Accept: "application/json" },
|
|
67
|
+
signal: AbortSignal.timeout(15000),
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
throw new Error(err instanceof Error ? err.message : "network error fetching registry");
|
|
72
|
+
}
|
|
73
|
+
let data;
|
|
74
|
+
try {
|
|
75
|
+
data = await res.json();
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
throw new Error(`registry returned non-JSON (status ${res.status})`);
|
|
79
|
+
}
|
|
80
|
+
if (!res.ok) {
|
|
81
|
+
const msg = (0, api_1.apiErrorMessage)(data) ?? `registry error ${res.status}`;
|
|
82
|
+
const code = res.status === 404 ? "not_found" : "registry_error";
|
|
83
|
+
const err = new Error(msg);
|
|
84
|
+
err.code = code;
|
|
85
|
+
err.status = res.status;
|
|
86
|
+
throw err;
|
|
87
|
+
}
|
|
88
|
+
return data;
|
|
89
|
+
}
|
|
90
|
+
// ── Write helpers ─────────────────────────────────────────────────────────────
|
|
91
|
+
function ensureDir(dirPath) {
|
|
92
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
93
|
+
}
|
|
94
|
+
// ── Main install function ─────────────────────────────────────────────────────
|
|
95
|
+
/**
|
|
96
|
+
* Install a YouStack from the public registry.
|
|
97
|
+
*
|
|
98
|
+
* 1. Fetch manifest + files from /api/v1/stacks/registry/{user}/{slug}.
|
|
99
|
+
* 2. Validate the manifest with validateYouStackManifest.
|
|
100
|
+
* 3. Write files to <baseDir>/stacks/<slug>/ (refuses if dir exists without --force).
|
|
101
|
+
* 4. Run linkYouStackAdapters to emit .claude/skills/<name>/SKILL.md.
|
|
102
|
+
*
|
|
103
|
+
* Returns StackInstallResult on success. Throws on any error.
|
|
104
|
+
*/
|
|
105
|
+
async function installStack(user, slug, options = {}) {
|
|
106
|
+
const baseDir = path.resolve(options.dir ?? process.cwd());
|
|
107
|
+
const targetDir = path.join(baseDir, "stacks", slug);
|
|
108
|
+
// Conflict check BEFORE the network call so fast failure is instant.
|
|
109
|
+
if (!options.force && fs.existsSync(targetDir)) {
|
|
110
|
+
const err = new Error(`stacks/${slug}/ already exists. Use --force to overwrite.`);
|
|
111
|
+
err.code = "conflict";
|
|
112
|
+
throw err;
|
|
113
|
+
}
|
|
114
|
+
// Fetch from registry.
|
|
115
|
+
const entry = await fetchRegistryEntry(user, slug);
|
|
116
|
+
// Validate the manifest.
|
|
117
|
+
const validation = (0, youstack_1.validateYouStackManifest)(entry.manifest);
|
|
118
|
+
if (!validation.ok) {
|
|
119
|
+
const err = new Error(`invalid manifest: ${validation.errors.join("; ")}`);
|
|
120
|
+
err.code = "invalid_manifest";
|
|
121
|
+
err.validationErrors = validation.errors;
|
|
122
|
+
throw err;
|
|
123
|
+
}
|
|
124
|
+
const manifest = entry.manifest;
|
|
125
|
+
// Write files.
|
|
126
|
+
ensureDir(targetDir);
|
|
127
|
+
const filesWritten = [];
|
|
128
|
+
for (const file of entry.files) {
|
|
129
|
+
// Strip the leading stacks/<slug>/ prefix so paths are relative to targetDir.
|
|
130
|
+
const relPath = file.path.replace(/^stacks\/[^/]+\//, "");
|
|
131
|
+
if (!relPath)
|
|
132
|
+
continue;
|
|
133
|
+
const dest = path.join(targetDir, relPath);
|
|
134
|
+
ensureDir(path.dirname(dest));
|
|
135
|
+
fs.writeFileSync(dest, file.content, "utf8");
|
|
136
|
+
filesWritten.push(dest);
|
|
137
|
+
}
|
|
138
|
+
// Find the manifest file we just wrote.
|
|
139
|
+
const manifestPath = filesWritten.find((p) => /\/(youstack|manifest)\.(json|ya?ml)$/i.test(p)) ?? path.join(targetDir, "youstack.json");
|
|
140
|
+
// Run the host-link engine (emits .claude/skills/<name>/SKILL.md etc.).
|
|
141
|
+
const loaded = {
|
|
142
|
+
manifest,
|
|
143
|
+
manifestPath,
|
|
144
|
+
rootDir: targetDir,
|
|
145
|
+
validation,
|
|
146
|
+
};
|
|
147
|
+
const linkResults = (0, youstack_1.linkYouStackAdapters)(loaded, {
|
|
148
|
+
hosts: ["claude-code"],
|
|
149
|
+
targetDir: baseDir,
|
|
150
|
+
});
|
|
151
|
+
const hostLinks = linkResults
|
|
152
|
+
.filter((r) => r.wrote)
|
|
153
|
+
.map((r) => r.targetPath);
|
|
154
|
+
return {
|
|
155
|
+
slug,
|
|
156
|
+
targetDir,
|
|
157
|
+
filesWritten,
|
|
158
|
+
hostLinks,
|
|
159
|
+
manifest,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=stackInstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stackInstall.js","sourceRoot":"","sources":["../../src/lib/stackInstall.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stackSafety.ts — machine-checkable T0-T3 safety contract for YouStack manifests.
|
|
3
|
+
*
|
|
4
|
+
* SELF-IMPROVING-SYSTEM-DESIGN.md §4 defines the four tiers:
|
|
5
|
+
* T0 read-only suggestions (diagnostics, inspect, brief)
|
|
6
|
+
* T1 additive writes to local scratch, always logged
|
|
7
|
+
* T2 modify skills/stacks/identity sections — propose-only unless mode grants more
|
|
8
|
+
* T3 visibility widening, publishing, remote push, deletions, irreversible ops
|
|
9
|
+
*
|
|
10
|
+
* Mode semantics (enforced, not advisory):
|
|
11
|
+
* observe → read-only; smoke/guard FAIL (not warn) if write_local capability exists
|
|
12
|
+
* propose → writes only to proposals/ directory
|
|
13
|
+
* auto_pr → branch + PR, never main; requires humanGate.required === true
|
|
14
|
+
* auto_apply_local→ requires improvement.evals non-empty AND evals green
|
|
15
|
+
*/
|
|
16
|
+
import type { YouStackManifest } from "./youstack";
|
|
17
|
+
export type SafetyTier = "T0" | "T1" | "T2" | "T3";
|
|
18
|
+
export type SafetyCapabilityKey = "fs_write" | "network" | "shell" | "auto_pr";
|
|
19
|
+
export interface SafetyCapabilities {
|
|
20
|
+
fs_write?: boolean;
|
|
21
|
+
network?: boolean;
|
|
22
|
+
shell?: boolean;
|
|
23
|
+
auto_pr?: boolean;
|
|
24
|
+
}
|
|
25
|
+
export interface SafetyHumanGate {
|
|
26
|
+
required: boolean;
|
|
27
|
+
/** Scopes that always require explicit human approval (required at T3). */
|
|
28
|
+
scopes?: string[];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The `safety` section inside youstack.json.
|
|
32
|
+
* Extend YouStackManifest with this via `manifest.safety`.
|
|
33
|
+
*/
|
|
34
|
+
export interface StackSafetyContract {
|
|
35
|
+
tier: SafetyTier;
|
|
36
|
+
capabilities: SafetyCapabilities;
|
|
37
|
+
humanGate: SafetyHumanGate;
|
|
38
|
+
}
|
|
39
|
+
export interface ContractViolation {
|
|
40
|
+
capability: SafetyCapabilityKey;
|
|
41
|
+
reason: string;
|
|
42
|
+
tierRule: string;
|
|
43
|
+
}
|
|
44
|
+
export interface ContractValidationResult {
|
|
45
|
+
ok: boolean;
|
|
46
|
+
violations: ContractViolation[];
|
|
47
|
+
warnings: string[];
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Parse the `safety` section from a raw manifest object.
|
|
51
|
+
* Returns null if the section is absent.
|
|
52
|
+
*/
|
|
53
|
+
export declare function parseSafetyContract(manifest: YouStackManifest | Record<string, unknown>): StackSafetyContract | null;
|
|
54
|
+
/**
|
|
55
|
+
* Validate a safety contract against the T0-T3 tier rules.
|
|
56
|
+
*
|
|
57
|
+
* T0: no fs_write, no auto_pr, no shell.
|
|
58
|
+
* T1: no auto_pr.
|
|
59
|
+
* T2: auto_pr only if humanGate.required === true.
|
|
60
|
+
* T3: humanGate MUST list explicit scopes (non-empty).
|
|
61
|
+
*/
|
|
62
|
+
export declare function validateSafetyContract(contract: StackSafetyContract): ContractValidationResult;
|
|
63
|
+
/**
|
|
64
|
+
* Returns true if the declared contract allows the given capability.
|
|
65
|
+
* Used by the guard and runtime routing hook.
|
|
66
|
+
*/
|
|
67
|
+
export declare function tierAllows(contract: StackSafetyContract, capability: SafetyCapabilityKey): boolean;
|
|
68
|
+
export interface InferredCapabilities {
|
|
69
|
+
fs_write: boolean;
|
|
70
|
+
shell: boolean;
|
|
71
|
+
auto_pr: boolean;
|
|
72
|
+
network: boolean;
|
|
73
|
+
sources: {
|
|
74
|
+
fs_write: string[];
|
|
75
|
+
shell: string[];
|
|
76
|
+
auto_pr: string[];
|
|
77
|
+
network: string[];
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Scan a manifest's declared capabilities (and improvement policy) for hints
|
|
82
|
+
* that imply specific capability flags. Returns what was inferred and which
|
|
83
|
+
* capability IDs triggered each flag.
|
|
84
|
+
*/
|
|
85
|
+
export declare function inferCapabilitiesFromManifest(manifest: YouStackManifest): InferredCapabilities;
|
|
86
|
+
export interface GuardCheckResult {
|
|
87
|
+
capability: SafetyCapabilityKey;
|
|
88
|
+
status: "PASS" | "VIOLATION";
|
|
89
|
+
declared: boolean;
|
|
90
|
+
inferred: boolean;
|
|
91
|
+
inferredFrom: string[];
|
|
92
|
+
tierRule: string;
|
|
93
|
+
message: string;
|
|
94
|
+
}
|
|
95
|
+
export interface StackGuardResult {
|
|
96
|
+
ok: boolean;
|
|
97
|
+
tier: SafetyTier;
|
|
98
|
+
manifestPath: string;
|
|
99
|
+
checks: GuardCheckResult[];
|
|
100
|
+
contractViolations: ContractViolation[];
|
|
101
|
+
warnings: string[];
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Run the full guard check against a loaded manifest.
|
|
105
|
+
* Called from the `youmd stack guard` subcommand and from runYouStackDoctor.
|
|
106
|
+
*/
|
|
107
|
+
export declare function runStackGuard(manifest: YouStackManifest, manifestPath: string): StackGuardResult;
|
|
108
|
+
/**
|
|
109
|
+
* Mode-compatibility check: verifies the improvement.mode is consistent
|
|
110
|
+
* with the declared safety tier.
|
|
111
|
+
*
|
|
112
|
+
* `observe` → T0 or T1 only; smoke/guard FAIL if a write_local capability exists
|
|
113
|
+
* `propose` → T1 or T2; writes to proposals/ only
|
|
114
|
+
* `auto_pr` → T2 or T3; requires humanGate.required
|
|
115
|
+
* `auto_apply_local` → T2 or T3; requires non-empty evals
|
|
116
|
+
*/
|
|
117
|
+
export declare function checkModeConsistency(manifest: YouStackManifest, contract: StackSafetyContract): {
|
|
118
|
+
ok: boolean;
|
|
119
|
+
violations: string[];
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* Refusal message for runtime enforcement — the one-line message the routing
|
|
123
|
+
* hook emits when a request exceeds the declared tier.
|
|
124
|
+
*/
|
|
125
|
+
export declare function tierRefusalMessage(contract: StackSafetyContract, requestedCapability: SafetyCapabilityKey): string;
|
|
126
|
+
//# sourceMappingURL=stackSafety.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stackSafety.d.ts","sourceRoot":"","sources":["../../src/lib/stackSafety.ts"],"names":[],"mappings":"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"}
|