@forgehive/forge-cli 0.3.7 → 0.3.9
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/runner.js +14 -1
- package/dist/tasks/docs/download.d.ts +20 -0
- package/dist/tasks/docs/download.js +114 -0
- package/forge.json +4 -0
- package/package.json +1 -1
- package/src/runner.ts +18 -1
- package/src/tasks/docs/download.ts +87 -0
package/dist/runner.js
CHANGED
|
@@ -24,6 +24,7 @@ const create_1 = require("./tasks/runner/create");
|
|
|
24
24
|
const remove_2 = require("./tasks/runner/remove");
|
|
25
25
|
const bundle_1 = require("./tasks/runner/bundle");
|
|
26
26
|
const download_2 = require("./tasks/fixture/download");
|
|
27
|
+
const download_3 = require("./tasks/docs/download");
|
|
27
28
|
const add_1 = require("./tasks/auth/add");
|
|
28
29
|
const switch_1 = require("./tasks/auth/switch");
|
|
29
30
|
const list_2 = require("./tasks/auth/list");
|
|
@@ -56,6 +57,8 @@ runner.load('runner:remove', remove_2.remove);
|
|
|
56
57
|
runner.load('runner:bundle', bundle_1.bundle);
|
|
57
58
|
// Fixture commands
|
|
58
59
|
runner.load('fixture:download', download_2.download);
|
|
60
|
+
// Docs commands
|
|
61
|
+
runner.load('docs:download', download_3.download);
|
|
59
62
|
// Auth commands
|
|
60
63
|
runner.load('auth:add', add_1.add);
|
|
61
64
|
runner.load('auth:switch', switch_1.switchProfile);
|
|
@@ -115,9 +118,13 @@ runner.setHandler(async (data) => {
|
|
|
115
118
|
});
|
|
116
119
|
}
|
|
117
120
|
else if (taskName === 'task:run') {
|
|
121
|
+
const { input, ...restArgs } = args;
|
|
122
|
+
// If --input is provided, parse it as JSON and use that
|
|
123
|
+
// Otherwise, use the regular arguments spread from minimist
|
|
124
|
+
const taskArgs = input ? JSON.parse(input) : restArgs;
|
|
118
125
|
result = await task.run({
|
|
119
126
|
descriptorName: action,
|
|
120
|
-
args
|
|
127
|
+
args: taskArgs
|
|
121
128
|
});
|
|
122
129
|
}
|
|
123
130
|
else if (taskName === 'fixture:download') {
|
|
@@ -142,6 +149,12 @@ runner.setHandler(async (data) => {
|
|
|
142
149
|
profileName: action
|
|
143
150
|
});
|
|
144
151
|
}
|
|
152
|
+
else if (taskName === 'docs:download') {
|
|
153
|
+
const { path } = args;
|
|
154
|
+
result = await task.run({
|
|
155
|
+
path
|
|
156
|
+
});
|
|
157
|
+
}
|
|
145
158
|
else {
|
|
146
159
|
result = await task.run(args);
|
|
147
160
|
if (taskName === 'info') {
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare const download: import("@forgehive/task").TaskInstanceType<(argv: {
|
|
2
|
+
path?: string | undefined;
|
|
3
|
+
}, boundaries: import("@forgehive/task").WrappedBoundaries<{
|
|
4
|
+
fetchFile: (url: string) => Promise<string>;
|
|
5
|
+
getCurrentWorkingDirectory: () => Promise<string>;
|
|
6
|
+
createDirectory: (dirPath: string) => Promise<void>;
|
|
7
|
+
writeFile: (filePath: string, content: string) => Promise<void>;
|
|
8
|
+
checkFileExists: (filePath: string) => Promise<boolean>;
|
|
9
|
+
}>) => Promise<{
|
|
10
|
+
success: boolean;
|
|
11
|
+
filePath: string;
|
|
12
|
+
targetPath: string;
|
|
13
|
+
size: number;
|
|
14
|
+
}>, {
|
|
15
|
+
fetchFile: (url: string) => Promise<string>;
|
|
16
|
+
getCurrentWorkingDirectory: () => Promise<string>;
|
|
17
|
+
createDirectory: (dirPath: string) => Promise<void>;
|
|
18
|
+
writeFile: (filePath: string, content: string) => Promise<void>;
|
|
19
|
+
checkFileExists: (filePath: string) => Promise<boolean>;
|
|
20
|
+
}>;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// TASK: download
|
|
3
|
+
// Run this task with:
|
|
4
|
+
// forge task:run docs:download
|
|
5
|
+
// forge task:run docs:download --path="custom/path/forge.md"
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
40
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
41
|
+
};
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.download = void 0;
|
|
44
|
+
const task_1 = require("@forgehive/task");
|
|
45
|
+
const schema_1 = require("@forgehive/schema");
|
|
46
|
+
const path_1 = __importDefault(require("path"));
|
|
47
|
+
const name = 'docs:download';
|
|
48
|
+
const description = 'Download the ForgeHive LLM guide from GitHub to local project';
|
|
49
|
+
const LLM_GUIDE_URL = 'https://raw.githubusercontent.com/forge-and-hive/forge-mono-repo/refs/heads/main/docs/llm.md';
|
|
50
|
+
const schema = new schema_1.Schema({
|
|
51
|
+
path: schema_1.Schema.string().optional()
|
|
52
|
+
});
|
|
53
|
+
const boundaries = {
|
|
54
|
+
fetchFile: async (url) => {
|
|
55
|
+
const response = await fetch(url);
|
|
56
|
+
if (!response.ok) {
|
|
57
|
+
throw new Error(`Failed to fetch file: ${response.status} ${response.statusText}`);
|
|
58
|
+
}
|
|
59
|
+
return await response.text();
|
|
60
|
+
},
|
|
61
|
+
getCurrentWorkingDirectory: async () => {
|
|
62
|
+
return process.cwd();
|
|
63
|
+
},
|
|
64
|
+
createDirectory: async (dirPath) => {
|
|
65
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs/promises')));
|
|
66
|
+
await fs.mkdir(dirPath, { recursive: true });
|
|
67
|
+
},
|
|
68
|
+
writeFile: async (filePath, content) => {
|
|
69
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs/promises')));
|
|
70
|
+
await fs.writeFile(filePath, content, 'utf-8');
|
|
71
|
+
},
|
|
72
|
+
checkFileExists: async (filePath) => {
|
|
73
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs/promises')));
|
|
74
|
+
try {
|
|
75
|
+
await fs.access(filePath);
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
exports.download = (0, task_1.createTask)({
|
|
84
|
+
name,
|
|
85
|
+
description,
|
|
86
|
+
schema,
|
|
87
|
+
boundaries,
|
|
88
|
+
fn: async function ({ path: customPath }, { fetchFile, getCurrentWorkingDirectory, createDirectory, writeFile, checkFileExists }) {
|
|
89
|
+
// Determine the target path
|
|
90
|
+
const targetPath = customPath || 'docs/forge.md';
|
|
91
|
+
const cwd = await getCurrentWorkingDirectory();
|
|
92
|
+
const fullPath = path_1.default.resolve(cwd, targetPath);
|
|
93
|
+
const dirPath = path_1.default.dirname(fullPath);
|
|
94
|
+
console.log(`Downloading ForgeHive LLM guide to: ${targetPath}`);
|
|
95
|
+
// Check if file already exists
|
|
96
|
+
const fileExists = await checkFileExists(fullPath);
|
|
97
|
+
if (fileExists) {
|
|
98
|
+
console.log(`Warning: File already exists at ${targetPath}. It will be overwritten.`);
|
|
99
|
+
}
|
|
100
|
+
// Download the file content
|
|
101
|
+
const content = await fetchFile(LLM_GUIDE_URL);
|
|
102
|
+
// Create directory if it doesn't exist
|
|
103
|
+
await createDirectory(dirPath);
|
|
104
|
+
// Write the file
|
|
105
|
+
await writeFile(fullPath, content);
|
|
106
|
+
console.log(`✅ Successfully downloaded ForgeHive LLM guide to ${targetPath}`);
|
|
107
|
+
return {
|
|
108
|
+
success: true,
|
|
109
|
+
filePath: fullPath,
|
|
110
|
+
targetPath,
|
|
111
|
+
size: content.length
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
});
|
package/forge.json
CHANGED
package/package.json
CHANGED
package/src/runner.ts
CHANGED
|
@@ -27,6 +27,8 @@ import { bundle as bundleRunner } from './tasks/runner/bundle'
|
|
|
27
27
|
|
|
28
28
|
import { download as downloadFixture } from './tasks/fixture/download'
|
|
29
29
|
|
|
30
|
+
import { download as downloadDocs } from './tasks/docs/download'
|
|
31
|
+
|
|
30
32
|
import { add as addProfile } from './tasks/auth/add'
|
|
31
33
|
import { switchProfile } from './tasks/auth/switch'
|
|
32
34
|
import { list as listProfiles } from './tasks/auth/list'
|
|
@@ -70,6 +72,9 @@ runner.load('runner:bundle', bundleRunner)
|
|
|
70
72
|
// Fixture commands
|
|
71
73
|
runner.load('fixture:download', downloadFixture)
|
|
72
74
|
|
|
75
|
+
// Docs commands
|
|
76
|
+
runner.load('docs:download', downloadDocs)
|
|
77
|
+
|
|
73
78
|
// Auth commands
|
|
74
79
|
runner.load('auth:add', addProfile)
|
|
75
80
|
runner.load('auth:switch', switchProfile)
|
|
@@ -133,9 +138,15 @@ runner.setHandler(async (data: ParsedArgs): Promise<unknown> => {
|
|
|
133
138
|
cache
|
|
134
139
|
})
|
|
135
140
|
} else if (taskName === 'task:run') {
|
|
141
|
+
const { input, ...restArgs } = args as { input?: string }
|
|
142
|
+
|
|
143
|
+
// If --input is provided, parse it as JSON and use that
|
|
144
|
+
// Otherwise, use the regular arguments spread from minimist
|
|
145
|
+
const taskArgs = input ? JSON.parse(input) : restArgs
|
|
146
|
+
|
|
136
147
|
result = await task.run({
|
|
137
148
|
descriptorName: action,
|
|
138
|
-
args
|
|
149
|
+
args: taskArgs
|
|
139
150
|
})
|
|
140
151
|
} else if (taskName === 'fixture:download') {
|
|
141
152
|
const { uuid } = args as { uuid: string }
|
|
@@ -158,6 +169,12 @@ runner.setHandler(async (data: ParsedArgs): Promise<unknown> => {
|
|
|
158
169
|
result = await task.run({
|
|
159
170
|
profileName: action
|
|
160
171
|
})
|
|
172
|
+
} else if (taskName === 'docs:download') {
|
|
173
|
+
const { path } = args as { path?: string }
|
|
174
|
+
|
|
175
|
+
result = await task.run({
|
|
176
|
+
path
|
|
177
|
+
})
|
|
161
178
|
} else {
|
|
162
179
|
result = await task.run(args)
|
|
163
180
|
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// TASK: download
|
|
2
|
+
// Run this task with:
|
|
3
|
+
// forge task:run docs:download
|
|
4
|
+
// forge task:run docs:download --path="custom/path/forge.md"
|
|
5
|
+
|
|
6
|
+
import { createTask } from '@forgehive/task'
|
|
7
|
+
import { Schema } from '@forgehive/schema'
|
|
8
|
+
import path from 'path'
|
|
9
|
+
|
|
10
|
+
const name = 'docs:download'
|
|
11
|
+
const description = 'Download the ForgeHive LLM guide from GitHub to local project'
|
|
12
|
+
|
|
13
|
+
const LLM_GUIDE_URL = 'https://raw.githubusercontent.com/forge-and-hive/forge-mono-repo/refs/heads/main/docs/llm.md'
|
|
14
|
+
|
|
15
|
+
const schema = new Schema({
|
|
16
|
+
path: Schema.string().optional()
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
const boundaries = {
|
|
20
|
+
fetchFile: async (url: string): Promise<string> => {
|
|
21
|
+
const response = await fetch(url)
|
|
22
|
+
if (!response.ok) {
|
|
23
|
+
throw new Error(`Failed to fetch file: ${response.status} ${response.statusText}`)
|
|
24
|
+
}
|
|
25
|
+
return await response.text()
|
|
26
|
+
},
|
|
27
|
+
getCurrentWorkingDirectory: async (): Promise<string> => {
|
|
28
|
+
return process.cwd()
|
|
29
|
+
},
|
|
30
|
+
createDirectory: async (dirPath: string): Promise<void> => {
|
|
31
|
+
const fs = await import('fs/promises')
|
|
32
|
+
await fs.mkdir(dirPath, { recursive: true })
|
|
33
|
+
},
|
|
34
|
+
writeFile: async (filePath: string, content: string): Promise<void> => {
|
|
35
|
+
const fs = await import('fs/promises')
|
|
36
|
+
await fs.writeFile(filePath, content, 'utf-8')
|
|
37
|
+
},
|
|
38
|
+
checkFileExists: async (filePath: string): Promise<boolean> => {
|
|
39
|
+
const fs = await import('fs/promises')
|
|
40
|
+
try {
|
|
41
|
+
await fs.access(filePath)
|
|
42
|
+
return true
|
|
43
|
+
} catch {
|
|
44
|
+
return false
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export const download = createTask({
|
|
50
|
+
name,
|
|
51
|
+
description,
|
|
52
|
+
schema,
|
|
53
|
+
boundaries,
|
|
54
|
+
fn: async function ({ path: customPath }, { fetchFile, getCurrentWorkingDirectory, createDirectory, writeFile, checkFileExists }) {
|
|
55
|
+
// Determine the target path
|
|
56
|
+
const targetPath = customPath || 'docs/forge.md'
|
|
57
|
+
const cwd = await getCurrentWorkingDirectory()
|
|
58
|
+
const fullPath = path.resolve(cwd, targetPath)
|
|
59
|
+
const dirPath = path.dirname(fullPath)
|
|
60
|
+
|
|
61
|
+
console.log(`Downloading ForgeHive LLM guide to: ${targetPath}`)
|
|
62
|
+
|
|
63
|
+
// Check if file already exists
|
|
64
|
+
const fileExists = await checkFileExists(fullPath)
|
|
65
|
+
if (fileExists) {
|
|
66
|
+
console.log(`Warning: File already exists at ${targetPath}. It will be overwritten.`)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Download the file content
|
|
70
|
+
const content = await fetchFile(LLM_GUIDE_URL)
|
|
71
|
+
|
|
72
|
+
// Create directory if it doesn't exist
|
|
73
|
+
await createDirectory(dirPath)
|
|
74
|
+
|
|
75
|
+
// Write the file
|
|
76
|
+
await writeFile(fullPath, content)
|
|
77
|
+
|
|
78
|
+
console.log(`✅ Successfully downloaded ForgeHive LLM guide to ${targetPath}`)
|
|
79
|
+
|
|
80
|
+
return {
|
|
81
|
+
success: true,
|
|
82
|
+
filePath: fullPath,
|
|
83
|
+
targetPath,
|
|
84
|
+
size: content.length
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
})
|