busy-cli 0.1.2
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/README.md +129 -0
- package/dist/builders/context.d.ts +50 -0
- package/dist/builders/context.d.ts.map +1 -0
- package/dist/builders/context.js +190 -0
- package/dist/cache/index.d.ts +100 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +270 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +463 -0
- package/dist/commands/package.d.ts +96 -0
- package/dist/commands/package.d.ts.map +1 -0
- package/dist/commands/package.js +285 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/loader.d.ts +6 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +361 -0
- package/dist/merge.d.ts +16 -0
- package/dist/merge.d.ts.map +1 -0
- package/dist/merge.js +102 -0
- package/dist/package/manifest.d.ts +59 -0
- package/dist/package/manifest.d.ts.map +1 -0
- package/dist/package/manifest.js +265 -0
- package/dist/parser.d.ts +28 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +220 -0
- package/dist/parsers/frontmatter.d.ts +14 -0
- package/dist/parsers/frontmatter.d.ts.map +1 -0
- package/dist/parsers/frontmatter.js +110 -0
- package/dist/parsers/imports.d.ts +48 -0
- package/dist/parsers/imports.d.ts.map +1 -0
- package/dist/parsers/imports.js +147 -0
- package/dist/parsers/links.d.ts +12 -0
- package/dist/parsers/links.d.ts.map +1 -0
- package/dist/parsers/links.js +79 -0
- package/dist/parsers/localdefs.d.ts +6 -0
- package/dist/parsers/localdefs.d.ts.map +1 -0
- package/dist/parsers/localdefs.js +132 -0
- package/dist/parsers/operations.d.ts +32 -0
- package/dist/parsers/operations.d.ts.map +1 -0
- package/dist/parsers/operations.js +313 -0
- package/dist/parsers/sections.d.ts +15 -0
- package/dist/parsers/sections.d.ts.map +1 -0
- package/dist/parsers/sections.js +173 -0
- package/dist/parsers/tools.d.ts +30 -0
- package/dist/parsers/tools.d.ts.map +1 -0
- package/dist/parsers/tools.js +178 -0
- package/dist/parsers/triggers.d.ts +35 -0
- package/dist/parsers/triggers.d.ts.map +1 -0
- package/dist/parsers/triggers.js +219 -0
- package/dist/providers/base.d.ts +60 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +34 -0
- package/dist/providers/github.d.ts +18 -0
- package/dist/providers/github.d.ts.map +1 -0
- package/dist/providers/github.js +109 -0
- package/dist/providers/gitlab.d.ts +18 -0
- package/dist/providers/gitlab.d.ts.map +1 -0
- package/dist/providers/gitlab.js +101 -0
- package/dist/providers/index.d.ts +13 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +17 -0
- package/dist/providers/local.d.ts +31 -0
- package/dist/providers/local.d.ts.map +1 -0
- package/dist/providers/local.js +116 -0
- package/dist/providers/url.d.ts +16 -0
- package/dist/providers/url.d.ts.map +1 -0
- package/dist/providers/url.js +45 -0
- package/dist/registry/index.d.ts +99 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +320 -0
- package/dist/types/schema.d.ts +3259 -0
- package/dist/types/schema.d.ts.map +1 -0
- package/dist/types/schema.js +258 -0
- package/dist/utils/logger.d.ts +19 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +23 -0
- package/dist/utils/slugify.d.ts +14 -0
- package/dist/utils/slugify.d.ts.map +1 -0
- package/dist/utils/slugify.js +28 -0
- package/package.json +61 -0
- package/src/__tests__/cache.test.ts +393 -0
- package/src/__tests__/cli-package.test.ts +667 -0
- package/src/__tests__/fixtures/automated-workflow.busy.md +84 -0
- package/src/__tests__/fixtures/concept.busy.md +30 -0
- package/src/__tests__/fixtures/document.busy.md +44 -0
- package/src/__tests__/fixtures/simple-operation.busy.md +45 -0
- package/src/__tests__/fixtures/tool-document.busy.md +71 -0
- package/src/__tests__/fixtures/tool.busy.md +54 -0
- package/src/__tests__/imports.test.ts +244 -0
- package/src/__tests__/integration.test.ts +432 -0
- package/src/__tests__/operations.test.ts +408 -0
- package/src/__tests__/package-manifest.test.ts +455 -0
- package/src/__tests__/providers.test.ts +672 -0
- package/src/__tests__/registry.test.ts +402 -0
- package/src/__tests__/schema.test.ts +467 -0
- package/src/__tests__/tools.test.ts +376 -0
- package/src/__tests__/triggers.test.ts +312 -0
- package/src/builders/context.ts +294 -0
- package/src/cache/index.ts +312 -0
- package/src/cli/index.ts +514 -0
- package/src/commands/package.ts +392 -0
- package/src/index.ts +46 -0
- package/src/loader.ts +474 -0
- package/src/merge.ts +126 -0
- package/src/package/manifest.ts +349 -0
- package/src/parser.ts +278 -0
- package/src/parsers/frontmatter.ts +135 -0
- package/src/parsers/imports.ts +196 -0
- package/src/parsers/links.ts +108 -0
- package/src/parsers/localdefs.ts +166 -0
- package/src/parsers/operations.ts +404 -0
- package/src/parsers/sections.ts +230 -0
- package/src/parsers/tools.ts +215 -0
- package/src/parsers/triggers.ts +252 -0
- package/src/providers/base.ts +77 -0
- package/src/providers/github.ts +129 -0
- package/src/providers/gitlab.ts +121 -0
- package/src/providers/index.ts +25 -0
- package/src/providers/local.ts +129 -0
- package/src/providers/url.ts +56 -0
- package/src/registry/index.ts +408 -0
- package/src/types/schema.ts +369 -0
- package/src/utils/logger.ts +25 -0
- package/src/utils/slugify.ts +31 -0
- package/tsconfig.json +21 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitLab URL provider
|
|
3
|
+
*
|
|
4
|
+
* Handles URLs like:
|
|
5
|
+
* - https://gitlab.com/org/repo/-/blob/ref/path/to/file.md
|
|
6
|
+
* - https://gitlab.com/org/repo/-/tree/ref/path/to/dir
|
|
7
|
+
*/
|
|
8
|
+
import { providerRegistry } from './base.js';
|
|
9
|
+
// Pattern for GitLab blob URLs
|
|
10
|
+
const BLOB_PATTERN = /gitlab\.com\/([^/]+)\/([^/]+)\/-\/blob\/([^/]+)\/(.+)/;
|
|
11
|
+
// Pattern for GitLab tree URLs
|
|
12
|
+
const TREE_PATTERN = /gitlab\.com\/([^/]+)\/([^/]+)\/-\/tree\/([^/]+)\/(.+)/;
|
|
13
|
+
// Pattern for GitLab raw URLs
|
|
14
|
+
const RAW_PATTERN = /gitlab\.com\/([^/]+)\/([^/]+)\/-\/raw\/([^/]+)\/(.+)/;
|
|
15
|
+
export class GitLabProvider {
|
|
16
|
+
name = 'gitlab';
|
|
17
|
+
matches(url) {
|
|
18
|
+
// Use proper URL parsing to check the hostname
|
|
19
|
+
try {
|
|
20
|
+
const parsed = new URL(url);
|
|
21
|
+
return parsed.hostname === 'gitlab.com';
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
parse(url) {
|
|
28
|
+
// Extract anchor if present
|
|
29
|
+
const [urlWithoutAnchor, anchor] = url.split('#');
|
|
30
|
+
// Try blob pattern first
|
|
31
|
+
let match = urlWithoutAnchor.match(BLOB_PATTERN);
|
|
32
|
+
if (match) {
|
|
33
|
+
return {
|
|
34
|
+
provider: 'gitlab',
|
|
35
|
+
org: match[1],
|
|
36
|
+
repo: match[2],
|
|
37
|
+
ref: match[3],
|
|
38
|
+
path: match[4],
|
|
39
|
+
anchor,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
// Try tree pattern
|
|
43
|
+
match = urlWithoutAnchor.match(TREE_PATTERN);
|
|
44
|
+
if (match) {
|
|
45
|
+
return {
|
|
46
|
+
provider: 'gitlab',
|
|
47
|
+
org: match[1],
|
|
48
|
+
repo: match[2],
|
|
49
|
+
ref: match[3],
|
|
50
|
+
path: match[4],
|
|
51
|
+
anchor,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
// Try raw pattern
|
|
55
|
+
match = urlWithoutAnchor.match(RAW_PATTERN);
|
|
56
|
+
if (match) {
|
|
57
|
+
return {
|
|
58
|
+
provider: 'gitlab',
|
|
59
|
+
org: match[1],
|
|
60
|
+
repo: match[2],
|
|
61
|
+
ref: match[3],
|
|
62
|
+
path: match[4],
|
|
63
|
+
anchor,
|
|
64
|
+
rawUrl: urlWithoutAnchor,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
throw new Error(`Cannot parse GitLab URL: ${url}`);
|
|
68
|
+
}
|
|
69
|
+
getRawUrl(parsed) {
|
|
70
|
+
if (parsed.rawUrl) {
|
|
71
|
+
return parsed.rawUrl;
|
|
72
|
+
}
|
|
73
|
+
return `https://gitlab.com/${parsed.org}/${parsed.repo}/-/raw/${parsed.ref}/${parsed.path}`;
|
|
74
|
+
}
|
|
75
|
+
async fetch(url) {
|
|
76
|
+
const parsed = this.parse(url);
|
|
77
|
+
const rawUrl = this.getRawUrl(parsed);
|
|
78
|
+
const response = await fetch(rawUrl);
|
|
79
|
+
if (!response.ok) {
|
|
80
|
+
throw new Error(`Failed to fetch ${rawUrl}: ${response.status} ${response.statusText}`);
|
|
81
|
+
}
|
|
82
|
+
return response.text();
|
|
83
|
+
}
|
|
84
|
+
async getLatestVersion(parsed) {
|
|
85
|
+
// GitLab API for tags
|
|
86
|
+
const apiUrl = `https://gitlab.com/api/v4/projects/${encodeURIComponent(`${parsed.org}/${parsed.repo}`)}/repository/tags`;
|
|
87
|
+
const response = await fetch(apiUrl);
|
|
88
|
+
if (!response.ok) {
|
|
89
|
+
throw new Error(`Failed to fetch tags from GitLab API: ${response.status}`);
|
|
90
|
+
}
|
|
91
|
+
const tags = await response.json();
|
|
92
|
+
if (tags.length === 0) {
|
|
93
|
+
throw new Error(`No tags found for ${parsed.org}/${parsed.repo}`);
|
|
94
|
+
}
|
|
95
|
+
return tags[0].name;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Create and register the GitLab provider
|
|
99
|
+
export const gitlabProvider = new GitLabProvider();
|
|
100
|
+
providerRegistry.register(gitlabProvider);
|
|
101
|
+
//# sourceMappingURL=gitlab.js.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider System Exports
|
|
3
|
+
*
|
|
4
|
+
* URL providers for fetching content from different sources.
|
|
5
|
+
* Registration order matters - specific providers (GitHub, GitLab)
|
|
6
|
+
* should be registered before the generic URL provider.
|
|
7
|
+
*/
|
|
8
|
+
export { Provider, ParsedURL, ProviderRegistry, providerRegistry, } from './base.js';
|
|
9
|
+
export { LocalProvider, localProvider } from './local.js';
|
|
10
|
+
export { GitHubProvider, githubProvider } from './github.js';
|
|
11
|
+
export { GitLabProvider, gitlabProvider } from './gitlab.js';
|
|
12
|
+
export { URLProvider, urlProvider } from './url.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,QAAQ,EACR,SAAS,EACT,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG1D,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider System Exports
|
|
3
|
+
*
|
|
4
|
+
* URL providers for fetching content from different sources.
|
|
5
|
+
* Registration order matters - specific providers (GitHub, GitLab)
|
|
6
|
+
* should be registered before the generic URL provider.
|
|
7
|
+
*/
|
|
8
|
+
// Base types and registry
|
|
9
|
+
export { ProviderRegistry, providerRegistry, } from './base.js';
|
|
10
|
+
// Local file provider (registered first for priority)
|
|
11
|
+
export { LocalProvider, localProvider } from './local.js';
|
|
12
|
+
// Specific providers
|
|
13
|
+
export { GitHubProvider, githubProvider } from './github.js';
|
|
14
|
+
export { GitLabProvider, gitlabProvider } from './gitlab.js';
|
|
15
|
+
// Generic URL provider (registered last as fallback)
|
|
16
|
+
export { URLProvider, urlProvider } from './url.js';
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local File Provider
|
|
3
|
+
*
|
|
4
|
+
* Provider for local file system paths (relative or absolute).
|
|
5
|
+
* Handles both individual files and directories containing package.busy.md.
|
|
6
|
+
*/
|
|
7
|
+
import { Provider, ParsedURL } from './base.js';
|
|
8
|
+
export declare class LocalProvider implements Provider {
|
|
9
|
+
name: string;
|
|
10
|
+
/**
|
|
11
|
+
* Working directory for resolving relative paths
|
|
12
|
+
*/
|
|
13
|
+
private workingDir;
|
|
14
|
+
constructor(workingDir?: string);
|
|
15
|
+
setWorkingDir(dir: string): void;
|
|
16
|
+
matches(url: string): boolean;
|
|
17
|
+
parse(url: string): ParsedURL;
|
|
18
|
+
getRawUrl(parsed: ParsedURL): string;
|
|
19
|
+
fetch(url: string): Promise<string>;
|
|
20
|
+
/**
|
|
21
|
+
* Resolve a path to an absolute path
|
|
22
|
+
*/
|
|
23
|
+
resolvePath(relativePath: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* Check if a path points to a package directory (contains package.busy.md)
|
|
26
|
+
*/
|
|
27
|
+
isPackageDirectory(dirPath: string): Promise<boolean>;
|
|
28
|
+
getLatestVersion(_parsed: ParsedURL): Promise<string>;
|
|
29
|
+
}
|
|
30
|
+
export declare const localProvider: LocalProvider;
|
|
31
|
+
//# sourceMappingURL=local.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/providers/local.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAoB,MAAM,WAAW,CAAC;AAElE,qBAAa,aAAc,YAAW,QAAQ;IAC5C,IAAI,SAAW;IAEf;;OAEG;IACH,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,CAAC,EAAE,MAAM;IAI/B,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIhC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAmB7B,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS;IAiB7B,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM;IAU9B,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAwBzC;;OAEG;IACH,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAOzC;;OAEG;IACG,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWrD,gBAAgB,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;CAG5D;AAGD,eAAO,MAAM,aAAa,eAAsB,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local File Provider
|
|
3
|
+
*
|
|
4
|
+
* Provider for local file system paths (relative or absolute).
|
|
5
|
+
* Handles both individual files and directories containing package.busy.md.
|
|
6
|
+
*/
|
|
7
|
+
import { promises as fs } from 'node:fs';
|
|
8
|
+
import * as path from 'node:path';
|
|
9
|
+
import { providerRegistry } from './base.js';
|
|
10
|
+
export class LocalProvider {
|
|
11
|
+
name = 'local';
|
|
12
|
+
/**
|
|
13
|
+
* Working directory for resolving relative paths
|
|
14
|
+
*/
|
|
15
|
+
workingDir;
|
|
16
|
+
constructor(workingDir) {
|
|
17
|
+
this.workingDir = workingDir || process.cwd();
|
|
18
|
+
}
|
|
19
|
+
setWorkingDir(dir) {
|
|
20
|
+
this.workingDir = dir;
|
|
21
|
+
}
|
|
22
|
+
matches(url) {
|
|
23
|
+
// Match relative paths (./ ../)
|
|
24
|
+
if (url.startsWith('./') || url.startsWith('../')) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
// Match absolute paths
|
|
28
|
+
if (url.startsWith('/')) {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
// Match paths that look like local directories or files (no protocol)
|
|
32
|
+
if (!url.includes('://') && !url.startsWith('http')) {
|
|
33
|
+
// Check if it looks like a path (contains / or ends with .md or .busy.md)
|
|
34
|
+
if (url.includes('/') || url.endsWith('.md') || url.endsWith('.busy')) {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
parse(url) {
|
|
41
|
+
// Extract anchor if present
|
|
42
|
+
const [pathWithoutAnchor, anchor] = url.split('#');
|
|
43
|
+
// Resolve to absolute path
|
|
44
|
+
let absolutePath = path.isAbsolute(pathWithoutAnchor)
|
|
45
|
+
? pathWithoutAnchor
|
|
46
|
+
: path.resolve(this.workingDir, pathWithoutAnchor);
|
|
47
|
+
return {
|
|
48
|
+
provider: 'local',
|
|
49
|
+
path: absolutePath,
|
|
50
|
+
anchor,
|
|
51
|
+
rawUrl: url,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
getRawUrl(parsed) {
|
|
55
|
+
// If path is a directory, return path to package.busy.md
|
|
56
|
+
// This is checked synchronously by checking if path ends with .md or .busy
|
|
57
|
+
const p = parsed.path;
|
|
58
|
+
if (!p.endsWith('.md') && !p.endsWith('.busy')) {
|
|
59
|
+
return path.join(p, 'package.busy.md');
|
|
60
|
+
}
|
|
61
|
+
return p;
|
|
62
|
+
}
|
|
63
|
+
async fetch(url) {
|
|
64
|
+
const parsed = this.parse(url);
|
|
65
|
+
let targetPath = parsed.path;
|
|
66
|
+
// Check if path is a directory
|
|
67
|
+
try {
|
|
68
|
+
const stat = await fs.stat(targetPath);
|
|
69
|
+
if (stat.isDirectory()) {
|
|
70
|
+
// Look for package.busy.md in the directory
|
|
71
|
+
targetPath = path.join(targetPath, 'package.busy.md');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Path doesn't exist yet, try as-is
|
|
76
|
+
}
|
|
77
|
+
// Read the file
|
|
78
|
+
try {
|
|
79
|
+
const content = await fs.readFile(targetPath, 'utf-8');
|
|
80
|
+
return content;
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
throw new Error(`Failed to read local file ${targetPath}: ${error instanceof Error ? error.message : error}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Resolve a path to an absolute path
|
|
88
|
+
*/
|
|
89
|
+
resolvePath(relativePath) {
|
|
90
|
+
if (path.isAbsolute(relativePath)) {
|
|
91
|
+
return relativePath;
|
|
92
|
+
}
|
|
93
|
+
return path.resolve(this.workingDir, relativePath);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Check if a path points to a package directory (contains package.busy.md)
|
|
97
|
+
*/
|
|
98
|
+
async isPackageDirectory(dirPath) {
|
|
99
|
+
const manifestPath = path.join(dirPath, 'package.busy.md');
|
|
100
|
+
try {
|
|
101
|
+
await fs.access(manifestPath);
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Local files don't support version resolution
|
|
109
|
+
async getLatestVersion(_parsed) {
|
|
110
|
+
throw new Error('Local provider does not support version resolution');
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Create and register the local provider (registered first for priority)
|
|
114
|
+
export const localProvider = new LocalProvider();
|
|
115
|
+
providerRegistry.register(localProvider);
|
|
116
|
+
//# sourceMappingURL=local.js.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic URL provider
|
|
3
|
+
*
|
|
4
|
+
* Fallback provider for direct HTTP(S) URLs that don't match specific providers.
|
|
5
|
+
*/
|
|
6
|
+
import { Provider, ParsedURL } from './base.js';
|
|
7
|
+
export declare class URLProvider implements Provider {
|
|
8
|
+
name: string;
|
|
9
|
+
matches(url: string): boolean;
|
|
10
|
+
parse(url: string): ParsedURL;
|
|
11
|
+
getRawUrl(parsed: ParsedURL): string;
|
|
12
|
+
fetch(url: string): Promise<string>;
|
|
13
|
+
getLatestVersion(_parsed: ParsedURL): Promise<string>;
|
|
14
|
+
}
|
|
15
|
+
export declare const urlProvider: URLProvider;
|
|
16
|
+
//# sourceMappingURL=url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/providers/url.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAoB,MAAM,WAAW,CAAC;AAElE,qBAAa,WAAY,YAAW,QAAQ;IAC1C,IAAI,SAAS;IAEb,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAK7B,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS;IAe7B,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM;IAI9B,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAanC,gBAAgB,CAAC,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;CAG5D;AAGD,eAAO,MAAM,WAAW,aAAoB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic URL provider
|
|
3
|
+
*
|
|
4
|
+
* Fallback provider for direct HTTP(S) URLs that don't match specific providers.
|
|
5
|
+
*/
|
|
6
|
+
import { providerRegistry } from './base.js';
|
|
7
|
+
export class URLProvider {
|
|
8
|
+
name = 'url';
|
|
9
|
+
matches(url) {
|
|
10
|
+
// Match any HTTP(S) URL as fallback
|
|
11
|
+
return url.startsWith('http://') || url.startsWith('https://');
|
|
12
|
+
}
|
|
13
|
+
parse(url) {
|
|
14
|
+
// Extract anchor if present
|
|
15
|
+
const [urlWithoutAnchor, anchor] = url.split('#');
|
|
16
|
+
// Parse URL to extract path
|
|
17
|
+
const urlObj = new URL(urlWithoutAnchor);
|
|
18
|
+
return {
|
|
19
|
+
provider: 'url',
|
|
20
|
+
path: urlObj.pathname,
|
|
21
|
+
anchor,
|
|
22
|
+
rawUrl: urlWithoutAnchor,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
getRawUrl(parsed) {
|
|
26
|
+
return parsed.rawUrl || parsed.path;
|
|
27
|
+
}
|
|
28
|
+
async fetch(url) {
|
|
29
|
+
const parsed = this.parse(url);
|
|
30
|
+
const fetchUrl = parsed.rawUrl || url;
|
|
31
|
+
const response = await fetch(fetchUrl);
|
|
32
|
+
if (!response.ok) {
|
|
33
|
+
throw new Error(`Failed to fetch ${fetchUrl}: ${response.status} ${response.statusText}`);
|
|
34
|
+
}
|
|
35
|
+
return response.text();
|
|
36
|
+
}
|
|
37
|
+
// Generic URLs don't support version resolution
|
|
38
|
+
async getLatestVersion(_parsed) {
|
|
39
|
+
throw new Error('Generic URL provider does not support version resolution');
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Create and register the URL provider (registered last as fallback)
|
|
43
|
+
export const urlProvider = new URLProvider();
|
|
44
|
+
providerRegistry.register(urlProvider);
|
|
45
|
+
//# sourceMappingURL=url.js.map
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package Registry for package.busy.md
|
|
3
|
+
*
|
|
4
|
+
* Parses and manages the package registry file.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Package entry in the registry
|
|
8
|
+
*/
|
|
9
|
+
export interface PackageEntry {
|
|
10
|
+
id: string;
|
|
11
|
+
description: string;
|
|
12
|
+
source: string;
|
|
13
|
+
provider: string;
|
|
14
|
+
cached: string;
|
|
15
|
+
version: string;
|
|
16
|
+
fetched: string;
|
|
17
|
+
integrity?: string;
|
|
18
|
+
category: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Registry metadata from frontmatter
|
|
22
|
+
*/
|
|
23
|
+
export interface RegistryMetadata {
|
|
24
|
+
name: string;
|
|
25
|
+
type: string;
|
|
26
|
+
description: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Parsed package registry
|
|
30
|
+
*/
|
|
31
|
+
export interface ParsedRegistry {
|
|
32
|
+
metadata: RegistryMetadata;
|
|
33
|
+
packages: PackageEntry[];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Derive entry ID from URL
|
|
37
|
+
*
|
|
38
|
+
* If URL has #anchor, use anchor as ID
|
|
39
|
+
* Else, use filename without extension
|
|
40
|
+
* Slugify result (lowercase, hyphens)
|
|
41
|
+
*/
|
|
42
|
+
export declare function deriveEntryId(url: string): string;
|
|
43
|
+
/**
|
|
44
|
+
* Derive category from URL path
|
|
45
|
+
*/
|
|
46
|
+
export declare function deriveCategory(url: string): string;
|
|
47
|
+
/**
|
|
48
|
+
* Parse package.busy.md content
|
|
49
|
+
*/
|
|
50
|
+
export declare function parsePackageRegistry(content: string): ParsedRegistry;
|
|
51
|
+
/**
|
|
52
|
+
* Package Registry Manager
|
|
53
|
+
*
|
|
54
|
+
* Manages the package.busy.md file in a workspace.
|
|
55
|
+
*/
|
|
56
|
+
export declare class PackageRegistry {
|
|
57
|
+
private workspaceRoot;
|
|
58
|
+
private registryPath;
|
|
59
|
+
private metadata;
|
|
60
|
+
private packages;
|
|
61
|
+
constructor(workspaceRoot: string);
|
|
62
|
+
/**
|
|
63
|
+
* Initialize a new package.busy.md if it doesn't exist
|
|
64
|
+
*/
|
|
65
|
+
init(): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Load existing package.busy.md
|
|
68
|
+
*/
|
|
69
|
+
load(): Promise<void>;
|
|
70
|
+
/**
|
|
71
|
+
* Save changes to package.busy.md
|
|
72
|
+
*/
|
|
73
|
+
save(): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Get all packages
|
|
76
|
+
*/
|
|
77
|
+
getPackages(): PackageEntry[];
|
|
78
|
+
/**
|
|
79
|
+
* Get package by ID
|
|
80
|
+
*/
|
|
81
|
+
getPackage(id: string): PackageEntry | undefined;
|
|
82
|
+
/**
|
|
83
|
+
* Add or update a package
|
|
84
|
+
*/
|
|
85
|
+
addPackage(entry: PackageEntry): void;
|
|
86
|
+
/**
|
|
87
|
+
* Remove a package by ID
|
|
88
|
+
*/
|
|
89
|
+
removePackage(id: string): boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Get packages by category
|
|
92
|
+
*/
|
|
93
|
+
getPackagesByCategory(category: string): PackageEntry[];
|
|
94
|
+
/**
|
|
95
|
+
* Get all unique categories
|
|
96
|
+
*/
|
|
97
|
+
getCategories(): string[];
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/registry/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAajD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAclD;AAuCD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CA0FpE;AA+FD;;;;GAIG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,QAAQ,CAA4B;gBAEhC,aAAa,EAAE,MAAM;IAWjC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B;;OAEG;IACH,WAAW,IAAI,YAAY,EAAE;IAI7B;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIhD;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAIrC;;OAEG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIlC;;OAEG;IACH,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE;IAIvD;;OAEG;IACH,aAAa,IAAI,MAAM,EAAE;CAO1B"}
|