@zhuk/spego 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +190 -0
- package/README.md +49 -0
- package/dist/artifacts/engine.d.ts +45 -0
- package/dist/artifacts/engine.js +209 -0
- package/dist/artifacts/engine.js.map +1 -0
- package/dist/artifacts/schemas.d.ts +4 -0
- package/dist/artifacts/schemas.js +79 -0
- package/dist/artifacts/schemas.js.map +1 -0
- package/dist/artifacts/slug.d.ts +9 -0
- package/dist/artifacts/slug.js +24 -0
- package/dist/artifacts/slug.js.map +1 -0
- package/dist/artifacts/storage.d.ts +18 -0
- package/dist/artifacts/storage.js +94 -0
- package/dist/artifacts/storage.js.map +1 -0
- package/dist/artifacts/types.d.ts +52 -0
- package/dist/artifacts/types.js +42 -0
- package/dist/artifacts/types.js.map +1 -0
- package/dist/artifacts/validation.d.ts +46 -0
- package/dist/artifacts/validation.js +72 -0
- package/dist/artifacts/validation.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +461 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/registry.d.ts +18 -0
- package/dist/commands/registry.js +127 -0
- package/dist/commands/registry.js.map +1 -0
- package/dist/delivery/index.d.ts +2 -0
- package/dist/delivery/index.js +2 -0
- package/dist/delivery/index.js.map +1 -0
- package/dist/delivery/openspec-adapter.d.ts +2 -0
- package/dist/delivery/openspec-adapter.js +86 -0
- package/dist/delivery/openspec-adapter.js.map +1 -0
- package/dist/delivery/openspec-discover.d.ts +8 -0
- package/dist/delivery/openspec-discover.js +80 -0
- package/dist/delivery/openspec-discover.js.map +1 -0
- package/dist/delivery/openspec-parse.d.ts +9 -0
- package/dist/delivery/openspec-parse.js +63 -0
- package/dist/delivery/openspec-parse.js.map +1 -0
- package/dist/delivery/resolve.d.ts +3 -0
- package/dist/delivery/resolve.js +14 -0
- package/dist/delivery/resolve.js.map +1 -0
- package/dist/delivery/types.d.ts +27 -0
- package/dist/delivery/types.js +2 -0
- package/dist/delivery/types.js.map +1 -0
- package/dist/errors.d.ts +18 -0
- package/dist/errors.js +14 -0
- package/dist/errors.js.map +1 -0
- package/dist/export/view.d.ts +54 -0
- package/dist/export/view.js +74 -0
- package/dist/export/view.js.map +1 -0
- package/dist/generator/claude.d.ts +5 -0
- package/dist/generator/claude.js +85 -0
- package/dist/generator/claude.js.map +1 -0
- package/dist/generator/index.d.ts +5 -0
- package/dist/generator/index.js +23 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/markers.d.ts +3 -0
- package/dist/generator/markers.js +8 -0
- package/dist/generator/markers.js.map +1 -0
- package/dist/generator/types.d.ts +15 -0
- package/dist/generator/types.js +2 -0
- package/dist/generator/types.js.map +1 -0
- package/dist/generator/write.d.ts +2 -0
- package/dist/generator/write.js +28 -0
- package/dist/generator/write.js.map +1 -0
- package/dist/index/db.d.ts +17 -0
- package/dist/index/db.js +95 -0
- package/dist/index/db.js.map +1 -0
- package/dist/index/indexer.d.ts +42 -0
- package/dist/index/indexer.js +219 -0
- package/dist/index/indexer.js.map +1 -0
- package/dist/index/revisions.d.ts +13 -0
- package/dist/index/revisions.js +31 -0
- package/dist/index/revisions.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/workspace/config.d.ts +47 -0
- package/dist/workspace/config.js +64 -0
- package/dist/workspace/config.js.map +1 -0
- package/dist/workspace/init.d.ts +37 -0
- package/dist/workspace/init.js +114 -0
- package/dist/workspace/init.js.map +1 -0
- package/dist/workspace/paths.d.ts +30 -0
- package/dist/workspace/paths.js +34 -0
- package/dist/workspace/paths.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import YAML from 'yaml';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { SpegoError } from '../errors.js';
|
|
5
|
+
import { BUILTIN_ARTIFACT_TYPES } from '../artifacts/types.js';
|
|
6
|
+
export const SUPPORTED_AGENTS = ['claude', 'cursor', 'opencode', 'amp'];
|
|
7
|
+
export const workspaceConfigSchema = z
|
|
8
|
+
.object({
|
|
9
|
+
/** Schema version. Bump when config layout changes. */
|
|
10
|
+
version: z.literal(1).default(1),
|
|
11
|
+
/** Agent toolchains the workspace targets. */
|
|
12
|
+
agents: z.array(z.string()).default(['claude']),
|
|
13
|
+
/** Whether init seeded demo artifacts. */
|
|
14
|
+
demo: z.boolean().default(false),
|
|
15
|
+
/** Built-in types are always allowed; this list extends them. */
|
|
16
|
+
extraArtifactTypes: z.array(z.string().min(1).regex(/^[a-z0-9][a-z0-9-]*$/, {
|
|
17
|
+
message: 'Artifact type must be lowercase alphanumeric with hyphens, starting with alphanumeric',
|
|
18
|
+
})).default([]),
|
|
19
|
+
deliveryAdapter: z.object({
|
|
20
|
+
name: z.string().default('openspec'),
|
|
21
|
+
options: z.record(z.string(), z.unknown()).default({}),
|
|
22
|
+
}).default({ name: 'openspec', options: {} }),
|
|
23
|
+
})
|
|
24
|
+
.strict();
|
|
25
|
+
export function defaultConfig(overrides = {}) {
|
|
26
|
+
return workspaceConfigSchema.parse({
|
|
27
|
+
version: 1,
|
|
28
|
+
agents: overrides.agents ?? ['claude'],
|
|
29
|
+
demo: overrides.demo ?? false,
|
|
30
|
+
extraArtifactTypes: overrides.extraArtifactTypes ?? [],
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
export async function readConfig(configPath) {
|
|
34
|
+
let raw;
|
|
35
|
+
try {
|
|
36
|
+
raw = await fs.readFile(configPath, 'utf8');
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
if (err.code === 'ENOENT') {
|
|
40
|
+
throw new SpegoError('WORKSPACE_NOT_FOUND', `No spego workspace config at ${configPath}`, {
|
|
41
|
+
path: configPath,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
throw err;
|
|
45
|
+
}
|
|
46
|
+
const data = YAML.parse(raw) ?? {};
|
|
47
|
+
const parsed = workspaceConfigSchema.safeParse(data);
|
|
48
|
+
if (!parsed.success) {
|
|
49
|
+
throw new SpegoError('VALIDATION_FAILED', 'Invalid workspace config', {
|
|
50
|
+
path: configPath,
|
|
51
|
+
issues: parsed.error.issues,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return parsed.data;
|
|
55
|
+
}
|
|
56
|
+
export async function writeConfig(configPath, config) {
|
|
57
|
+
const yaml = YAML.stringify(config, { lineWidth: 0 });
|
|
58
|
+
await fs.writeFile(configPath, yaml, 'utf8');
|
|
59
|
+
}
|
|
60
|
+
/** Returns the union of built-in and user-extended artifact types. */
|
|
61
|
+
export function knownArtifactTypes(config) {
|
|
62
|
+
return new Set([...BUILTIN_ARTIFACT_TYPES, ...config.extraArtifactTypes]);
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/workspace/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type WorkspaceConfig } from './config.js';
|
|
2
|
+
import type { GenerationReport } from '../generator/types.js';
|
|
3
|
+
export interface InitOptions {
|
|
4
|
+
/** Project root containing (or to contain) `.spego/`. Defaults to cwd. */
|
|
5
|
+
projectRoot?: string;
|
|
6
|
+
/** Agents to register skills for (informational in MVP). */
|
|
7
|
+
agents?: string[];
|
|
8
|
+
/** Seed demo content (placeholder for future demo bundle). */
|
|
9
|
+
demo?: boolean;
|
|
10
|
+
/** Re-create files even if they exist. Does not delete user artifacts. */
|
|
11
|
+
force?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface InitSummary {
|
|
14
|
+
projectRoot: string;
|
|
15
|
+
workspaceRoot: string;
|
|
16
|
+
configPath: string;
|
|
17
|
+
artifactsRoot: string;
|
|
18
|
+
revisionsRoot: string;
|
|
19
|
+
indexPath: string;
|
|
20
|
+
createdPaths: string[];
|
|
21
|
+
alreadyInitialized: boolean;
|
|
22
|
+
config: WorkspaceConfig;
|
|
23
|
+
generationReports: GenerationReport[];
|
|
24
|
+
}
|
|
25
|
+
export declare function initWorkspace(options?: InitOptions): Promise<InitSummary>;
|
|
26
|
+
export interface WorkspaceStatus {
|
|
27
|
+
initialized: boolean;
|
|
28
|
+
projectRoot: string;
|
|
29
|
+
workspaceRoot: string;
|
|
30
|
+
configPath?: string;
|
|
31
|
+
artifactsRoot?: string;
|
|
32
|
+
indexPath?: string;
|
|
33
|
+
agents?: string[];
|
|
34
|
+
/** Hint command to run when not initialized. */
|
|
35
|
+
initCommand?: string;
|
|
36
|
+
}
|
|
37
|
+
export declare function workspaceStatus(projectRoot?: string): Promise<WorkspaceStatus>;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { resolveWorkspacePaths } from './paths.js';
|
|
4
|
+
import { defaultConfig, readConfig, writeConfig } from './config.js';
|
|
5
|
+
import { BUILTIN_ARTIFACT_TYPES } from '../artifacts/types.js';
|
|
6
|
+
import { openIndexDb, ensureIndexSchema, closeIndexDb } from '../index/db.js';
|
|
7
|
+
import { generateAll } from '../generator/index.js';
|
|
8
|
+
async function ensureDir(dir, created) {
|
|
9
|
+
try {
|
|
10
|
+
await fs.mkdir(dir, { recursive: false });
|
|
11
|
+
created.push(dir);
|
|
12
|
+
}
|
|
13
|
+
catch (err) {
|
|
14
|
+
if (err.code === 'EEXIST')
|
|
15
|
+
return;
|
|
16
|
+
if (err.code === 'ENOENT') {
|
|
17
|
+
// Parent does not exist yet; create recursively then mark.
|
|
18
|
+
await fs.mkdir(dir, { recursive: true });
|
|
19
|
+
created.push(dir);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
throw err;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export async function initWorkspace(options = {}) {
|
|
26
|
+
const projectRoot = path.resolve(options.projectRoot ?? process.cwd());
|
|
27
|
+
const paths = resolveWorkspacePaths(projectRoot);
|
|
28
|
+
const created = [];
|
|
29
|
+
// Detect prior workspace state before any side effects.
|
|
30
|
+
let existingConfig = null;
|
|
31
|
+
try {
|
|
32
|
+
existingConfig = await readConfig(paths.configPath);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
existingConfig = null;
|
|
36
|
+
}
|
|
37
|
+
// Workspace + subdirs.
|
|
38
|
+
await ensureDir(paths.workspaceRoot, created);
|
|
39
|
+
await ensureDir(paths.artifactsRoot, created);
|
|
40
|
+
await ensureDir(paths.revisionsRoot, created);
|
|
41
|
+
await ensureDir(paths.indexRoot, created);
|
|
42
|
+
// Per-type directories so a fresh workspace is browsable.
|
|
43
|
+
for (const type of BUILTIN_ARTIFACT_TYPES) {
|
|
44
|
+
await ensureDir(path.join(paths.artifactsRoot, type), created);
|
|
45
|
+
await ensureDir(path.join(paths.revisionsRoot, type), created);
|
|
46
|
+
}
|
|
47
|
+
// Config: write only if missing or force.
|
|
48
|
+
let config;
|
|
49
|
+
if (existingConfig && !options.force) {
|
|
50
|
+
config = existingConfig;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
config = defaultConfig({
|
|
54
|
+
agents: options.agents ?? existingConfig?.agents ?? ['claude'],
|
|
55
|
+
demo: options.demo ?? existingConfig?.demo ?? false,
|
|
56
|
+
extraArtifactTypes: existingConfig?.extraArtifactTypes ?? [],
|
|
57
|
+
});
|
|
58
|
+
await writeConfig(paths.configPath, config);
|
|
59
|
+
if (!existingConfig)
|
|
60
|
+
created.push(paths.configPath);
|
|
61
|
+
}
|
|
62
|
+
// SQLite index: create file + schema.
|
|
63
|
+
const db = openIndexDb(paths.indexDbPath);
|
|
64
|
+
try {
|
|
65
|
+
ensureIndexSchema(db);
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
closeIndexDb(db);
|
|
69
|
+
}
|
|
70
|
+
// We can't easily detect "newly created" for the db file without a stat
|
|
71
|
+
// beforehand; treat its presence as informational rather than tracked.
|
|
72
|
+
let generationReports = [];
|
|
73
|
+
if (config.agents.length > 0) {
|
|
74
|
+
generationReports = await generateAll(projectRoot, config.agents);
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
projectRoot: paths.projectRoot,
|
|
78
|
+
workspaceRoot: paths.workspaceRoot,
|
|
79
|
+
configPath: paths.configPath,
|
|
80
|
+
artifactsRoot: paths.artifactsRoot,
|
|
81
|
+
revisionsRoot: paths.revisionsRoot,
|
|
82
|
+
indexPath: paths.indexDbPath,
|
|
83
|
+
createdPaths: created,
|
|
84
|
+
alreadyInitialized: existingConfig !== null,
|
|
85
|
+
config,
|
|
86
|
+
generationReports,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
export async function workspaceStatus(projectRoot = process.cwd()) {
|
|
90
|
+
const paths = resolveWorkspacePaths(projectRoot);
|
|
91
|
+
try {
|
|
92
|
+
const config = await readConfig(paths.configPath);
|
|
93
|
+
await fs.stat(paths.artifactsRoot);
|
|
94
|
+
await fs.stat(paths.indexDbPath);
|
|
95
|
+
return {
|
|
96
|
+
initialized: true,
|
|
97
|
+
projectRoot: paths.projectRoot,
|
|
98
|
+
workspaceRoot: paths.workspaceRoot,
|
|
99
|
+
configPath: paths.configPath,
|
|
100
|
+
artifactsRoot: paths.artifactsRoot,
|
|
101
|
+
indexPath: paths.indexDbPath,
|
|
102
|
+
agents: config.agents,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return {
|
|
107
|
+
initialized: false,
|
|
108
|
+
projectRoot: paths.projectRoot,
|
|
109
|
+
workspaceRoot: paths.workspaceRoot,
|
|
110
|
+
initCommand: 'spego init',
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/workspace/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `.spego/` workspace layout. Markdown files are the source of truth;
|
|
3
|
+
* SQLite under `index/` is a rebuildable cache.
|
|
4
|
+
*/
|
|
5
|
+
export declare const WORKSPACE_DIR_NAME = ".spego";
|
|
6
|
+
export declare const ARTIFACTS_DIR_NAME = "artifacts";
|
|
7
|
+
export declare const REVISIONS_DIR_NAME = "revisions";
|
|
8
|
+
export declare const INDEX_DIR_NAME = "index";
|
|
9
|
+
export declare const CONFIG_FILE_NAME = "config.yaml";
|
|
10
|
+
export declare const INDEX_DB_FILE_NAME = "spego.db";
|
|
11
|
+
export interface WorkspacePaths {
|
|
12
|
+
/** Absolute project root (the directory containing `.spego/`). */
|
|
13
|
+
projectRoot: string;
|
|
14
|
+
/** Absolute path to `.spego/`. */
|
|
15
|
+
workspaceRoot: string;
|
|
16
|
+
/** Absolute path to `.spego/config.yaml`. */
|
|
17
|
+
configPath: string;
|
|
18
|
+
/** Absolute path to `.spego/artifacts/`. */
|
|
19
|
+
artifactsRoot: string;
|
|
20
|
+
/** Absolute path to `.spego/revisions/`. */
|
|
21
|
+
revisionsRoot: string;
|
|
22
|
+
/** Absolute path to `.spego/index/`. */
|
|
23
|
+
indexRoot: string;
|
|
24
|
+
/** Absolute path to `.spego/index/spego.db`. */
|
|
25
|
+
indexDbPath: string;
|
|
26
|
+
}
|
|
27
|
+
export declare function resolveWorkspacePaths(projectRoot: string): WorkspacePaths;
|
|
28
|
+
export declare function artifactTypeDir(paths: WorkspacePaths, type: string): string;
|
|
29
|
+
export declare function artifactFilePath(paths: WorkspacePaths, type: string, slug: string): string;
|
|
30
|
+
export declare function revisionFilePath(paths: WorkspacePaths, type: string, slug: string, revision: number): string;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
/**
|
|
3
|
+
* `.spego/` workspace layout. Markdown files are the source of truth;
|
|
4
|
+
* SQLite under `index/` is a rebuildable cache.
|
|
5
|
+
*/
|
|
6
|
+
export const WORKSPACE_DIR_NAME = '.spego';
|
|
7
|
+
export const ARTIFACTS_DIR_NAME = 'artifacts';
|
|
8
|
+
export const REVISIONS_DIR_NAME = 'revisions';
|
|
9
|
+
export const INDEX_DIR_NAME = 'index';
|
|
10
|
+
export const CONFIG_FILE_NAME = 'config.yaml';
|
|
11
|
+
export const INDEX_DB_FILE_NAME = 'spego.db';
|
|
12
|
+
export function resolveWorkspacePaths(projectRoot) {
|
|
13
|
+
const root = path.resolve(projectRoot);
|
|
14
|
+
const workspaceRoot = path.join(root, WORKSPACE_DIR_NAME);
|
|
15
|
+
return {
|
|
16
|
+
projectRoot: root,
|
|
17
|
+
workspaceRoot,
|
|
18
|
+
configPath: path.join(workspaceRoot, CONFIG_FILE_NAME),
|
|
19
|
+
artifactsRoot: path.join(workspaceRoot, ARTIFACTS_DIR_NAME),
|
|
20
|
+
revisionsRoot: path.join(workspaceRoot, REVISIONS_DIR_NAME),
|
|
21
|
+
indexRoot: path.join(workspaceRoot, INDEX_DIR_NAME),
|
|
22
|
+
indexDbPath: path.join(workspaceRoot, INDEX_DIR_NAME, INDEX_DB_FILE_NAME),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export function artifactTypeDir(paths, type) {
|
|
26
|
+
return path.join(paths.artifactsRoot, type);
|
|
27
|
+
}
|
|
28
|
+
export function artifactFilePath(paths, type, slug) {
|
|
29
|
+
return path.join(paths.artifactsRoot, type, `${slug}.md`);
|
|
30
|
+
}
|
|
31
|
+
export function revisionFilePath(paths, type, slug, revision) {
|
|
32
|
+
return path.join(paths.revisionsRoot, type, `${slug}.r${revision}.md`);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/workspace/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,QAAQ,CAAC;AAC3C,MAAM,CAAC,MAAM,kBAAkB,GAAG,WAAW,CAAC;AAC9C,MAAM,CAAC,MAAM,kBAAkB,GAAG,WAAW,CAAC;AAC9C,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AACtC,MAAM,CAAC,MAAM,gBAAgB,GAAG,aAAa,CAAC;AAC9C,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAmB7C,MAAM,UAAU,qBAAqB,CAAC,WAAmB;IACvD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACvC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IAC1D,OAAO;QACL,WAAW,EAAE,IAAI;QACjB,aAAa;QACb,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,gBAAgB,CAAC;QACtD,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,kBAAkB,CAAC;QAC3D,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,kBAAkB,CAAC;QAC3D,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC;QACnD,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,EAAE,kBAAkB,CAAC;KAC1E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAqB,EAAE,IAAY;IACjE,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAqB,EAAE,IAAY,EAAE,IAAY;IAChF,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,KAAqB,EACrB,IAAY,EACZ,IAAY,EACZ,QAAgB;IAEhB,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,EAAE,GAAG,IAAI,KAAK,QAAQ,KAAK,CAAC,CAAC;AACzE,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@zhuk/spego",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Agent-first product orchestration: markdown-first artifact engine with SQLite indexing.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"spego": "./dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc -p tsconfig.json",
|
|
17
|
+
"spego": "tsx src/cli.ts",
|
|
18
|
+
"test": "vitest run",
|
|
19
|
+
"test:watch": "vitest",
|
|
20
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
21
|
+
"lint": "eslint src test"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"commander": "^12.1.0",
|
|
25
|
+
"slugify": "^1.6.6",
|
|
26
|
+
"yaml": "^2.5.1",
|
|
27
|
+
"zod": "^3.23.8"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@eslint/js": "^10.0.1",
|
|
31
|
+
"@types/node": "^22.7.4",
|
|
32
|
+
"eslint": "^10.3.0",
|
|
33
|
+
"tsx": "^4.19.1",
|
|
34
|
+
"typescript": "^5.6.2",
|
|
35
|
+
"typescript-eslint": "^8.59.2",
|
|
36
|
+
"vitest": "^2.1.1"
|
|
37
|
+
},
|
|
38
|
+
"engines": {
|
|
39
|
+
"node": ">=22.14.0"
|
|
40
|
+
},
|
|
41
|
+
"license": "MIT",
|
|
42
|
+
"repository": {
|
|
43
|
+
"type": "git",
|
|
44
|
+
"url": "git+https://github.com/victorzhuk/spego.git"
|
|
45
|
+
},
|
|
46
|
+
"publishConfig": {
|
|
47
|
+
"access": "public",
|
|
48
|
+
"registry": "https://registry.npmjs.org"
|
|
49
|
+
}
|
|
50
|
+
}
|