@actalk/inkos 0.3.0 → 0.3.4
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/audit.d.ts.map +1 -1
- package/dist/commands/audit.js +14 -4
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/book.js +56 -11
- package/dist/commands/book.js.map +1 -1
- package/dist/commands/config.js +54 -3
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +47 -11
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/draft.d.ts.map +1 -1
- package/dist/commands/draft.js +4 -3
- package/dist/commands/draft.js.map +1 -1
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +25 -8
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +72 -21
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/radar.js +27 -14
- package/dist/commands/radar.js.map +1 -1
- package/dist/commands/review.js +109 -30
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/revise.d.ts.map +1 -1
- package/dist/commands/revise.js +13 -4
- package/dist/commands/revise.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +46 -13
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +32 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/write.d.ts.map +1 -1
- package/dist/commands/write.js +75 -25
- package/dist/commands/write.js.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/utils.d.ts +8 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +44 -6
- package/dist/utils.js.map +1 -1
- package/package.json +11 -13
- package/LICENSE +0 -21
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,aAAa,SA6BtB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { execSync } from "node:child_process";
|
|
3
|
+
import { log, logError } from "../utils.js";
|
|
4
|
+
export const updateCommand = new Command("update")
|
|
5
|
+
.description("Update InkOS to the latest version")
|
|
6
|
+
.action(async () => {
|
|
7
|
+
try {
|
|
8
|
+
log("Checking for updates...");
|
|
9
|
+
const current = execSync("npm list -g @actalk/inkos --depth=0 --json 2>/dev/null", {
|
|
10
|
+
encoding: "utf-8",
|
|
11
|
+
});
|
|
12
|
+
const currentVersion = JSON.parse(current)?.dependencies?.["@actalk/inkos"]?.version ?? "unknown";
|
|
13
|
+
log(`Current version: ${currentVersion}`);
|
|
14
|
+
log("Installing latest version...");
|
|
15
|
+
execSync("npm install -g @actalk/inkos@latest", {
|
|
16
|
+
stdio: "inherit",
|
|
17
|
+
});
|
|
18
|
+
const updated = execSync("inkos --version", { encoding: "utf-8" }).trim();
|
|
19
|
+
if (updated === currentVersion) {
|
|
20
|
+
log(`Already up to date (${updated}).`);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
log(`Updated: ${currentVersion} → ${updated}`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
logError(`Update failed: ${e}`);
|
|
28
|
+
log("You can also update manually: npm install -g @actalk/inkos@latest");
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,GAAG,CAAC,yBAAyB,CAAC,CAAC;QAE/B,MAAM,OAAO,GAAG,QAAQ,CAAC,wDAAwD,EAAE;YACjF,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC,eAAe,CAAC,EAAE,OAAO,IAAI,SAAS,CAAC;QAElG,GAAG,CAAC,oBAAoB,cAAc,EAAE,CAAC,CAAC;QAC1C,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAEpC,QAAQ,CAAC,qCAAqC,EAAE;YAC9C,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,QAAQ,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1E,IAAI,OAAO,KAAK,cAAc,EAAE,CAAC;YAC/B,GAAG,CAAC,uBAAuB,OAAO,IAAI,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,YAAY,cAAc,MAAM,OAAO,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;QAChC,GAAG,CAAC,mEAAmE,CAAC,CAAC;QACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/commands/write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/commands/write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,YAAY,SACO,CAAC"}
|
package/dist/commands/write.js
CHANGED
|
@@ -2,22 +2,24 @@ import { Command } from "commander";
|
|
|
2
2
|
import { PipelineRunner, StateManager } from "@actalk/inkos-core";
|
|
3
3
|
import { readdir, unlink } from "node:fs/promises";
|
|
4
4
|
import { join } from "node:path";
|
|
5
|
-
import {
|
|
5
|
+
import { createInterface } from "node:readline";
|
|
6
|
+
import { loadConfig, createClient, findProjectRoot, resolveContext, resolveBookId, log, logError } from "../utils.js";
|
|
6
7
|
export const writeCommand = new Command("write")
|
|
7
8
|
.description("Write chapters");
|
|
8
9
|
writeCommand
|
|
9
10
|
.command("next")
|
|
10
11
|
.description("Write the next chapter for a book")
|
|
11
|
-
.argument("
|
|
12
|
+
.argument("[book-id]", "Book ID (auto-detected if only one book)")
|
|
12
13
|
.option("--count <n>", "Number of chapters to write", "1")
|
|
13
14
|
.option("--context <text>", "Creative guidance (natural language)")
|
|
14
15
|
.option("--context-file <path>", "Read guidance from file")
|
|
15
16
|
.option("--json", "Output JSON")
|
|
16
|
-
.action(async (
|
|
17
|
+
.action(async (bookIdArg, opts) => {
|
|
17
18
|
try {
|
|
18
19
|
const config = await loadConfig();
|
|
19
20
|
const client = createClient(config);
|
|
20
21
|
const root = findProjectRoot();
|
|
22
|
+
const bookId = await resolveBookId(bookIdArg, root);
|
|
21
23
|
const context = await resolveContext(opts);
|
|
22
24
|
const pipeline = new PipelineRunner({
|
|
23
25
|
client,
|
|
@@ -30,7 +32,7 @@ writeCommand
|
|
|
30
32
|
const results = [];
|
|
31
33
|
for (let i = 0; i < count; i++) {
|
|
32
34
|
if (!opts.json)
|
|
33
|
-
log(`Writing chapter for "${bookId}"...`);
|
|
35
|
+
log(`[${i + 1}/${count}] Writing chapter for "${bookId}"...`);
|
|
34
36
|
const result = await pipeline.writeNextChapter(bookId);
|
|
35
37
|
results.push(result);
|
|
36
38
|
if (!opts.json) {
|
|
@@ -58,56 +60,94 @@ writeCommand
|
|
|
58
60
|
}
|
|
59
61
|
}
|
|
60
62
|
catch (e) {
|
|
61
|
-
|
|
63
|
+
if (opts.json) {
|
|
64
|
+
log(JSON.stringify({ error: String(e) }));
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
logError(`Failed to write chapter: ${e}`);
|
|
68
|
+
}
|
|
62
69
|
process.exit(1);
|
|
63
70
|
}
|
|
64
71
|
});
|
|
65
72
|
writeCommand
|
|
66
73
|
.command("rewrite")
|
|
67
|
-
.description("Re-generate a specific chapter
|
|
68
|
-
.argument("<
|
|
69
|
-
.
|
|
70
|
-
.
|
|
74
|
+
.description("Re-generate a specific chapter: rewrite [book-id] <chapter>")
|
|
75
|
+
.argument("<args...>", "Book ID (optional) and chapter number")
|
|
76
|
+
.option("--force", "Skip confirmation prompt")
|
|
77
|
+
.option("--json", "Output JSON")
|
|
78
|
+
.action(async (args, opts) => {
|
|
71
79
|
try {
|
|
72
80
|
const config = await loadConfig();
|
|
73
81
|
const client = createClient(config);
|
|
74
82
|
const root = findProjectRoot();
|
|
75
|
-
|
|
83
|
+
let bookId;
|
|
84
|
+
let chapter;
|
|
85
|
+
if (args.length === 1) {
|
|
86
|
+
chapter = parseInt(args[0], 10);
|
|
87
|
+
if (isNaN(chapter))
|
|
88
|
+
throw new Error(`Expected chapter number, got "${args[0]}"`);
|
|
89
|
+
bookId = await resolveBookId(undefined, root);
|
|
90
|
+
}
|
|
91
|
+
else if (args.length === 2) {
|
|
92
|
+
chapter = parseInt(args[1], 10);
|
|
93
|
+
if (isNaN(chapter))
|
|
94
|
+
throw new Error(`Expected chapter number, got "${args[1]}"`);
|
|
95
|
+
bookId = await resolveBookId(args[0], root);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
throw new Error("Usage: inkos write rewrite [book-id] <chapter>");
|
|
99
|
+
}
|
|
100
|
+
if (!opts.force) {
|
|
101
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
102
|
+
const answer = await new Promise((resolve) => {
|
|
103
|
+
rl.question(`Rewrite chapter ${chapter} of "${bookId}"? This will delete chapter ${chapter} and all later chapters. (y/N) `, resolve);
|
|
104
|
+
});
|
|
105
|
+
rl.close();
|
|
106
|
+
if (answer.toLowerCase() !== "y") {
|
|
107
|
+
log("Cancelled.");
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
76
111
|
const state = new StateManager(root);
|
|
77
112
|
const bookDir = state.bookDir(bookId);
|
|
78
113
|
const chaptersDir = join(bookDir, "chapters");
|
|
79
114
|
// Remove existing chapter file
|
|
80
115
|
const files = await readdir(chaptersDir);
|
|
81
|
-
const paddedNum = String(
|
|
116
|
+
const paddedNum = String(chapter).padStart(4, "0");
|
|
82
117
|
const existing = files.filter((f) => f.startsWith(paddedNum) && f.endsWith(".md"));
|
|
83
118
|
for (const f of existing) {
|
|
84
119
|
await unlink(join(chaptersDir, f));
|
|
85
|
-
|
|
120
|
+
if (!opts.json)
|
|
121
|
+
log(`Removed: ${f}`);
|
|
86
122
|
}
|
|
87
123
|
// Remove from index (and all chapters after it)
|
|
88
124
|
const index = await state.loadChapterIndex(bookId);
|
|
89
|
-
const trimmed = index.filter((ch) => ch.number <
|
|
125
|
+
const trimmed = index.filter((ch) => ch.number < chapter);
|
|
90
126
|
await state.saveChapterIndex(bookId, trimmed);
|
|
91
127
|
// Also remove later chapter files since state will be rolled back
|
|
92
128
|
const laterFiles = files.filter((f) => {
|
|
93
129
|
const num = parseInt(f.slice(0, 4), 10);
|
|
94
|
-
return num >
|
|
130
|
+
return num > chapter && f.endsWith(".md");
|
|
95
131
|
});
|
|
96
132
|
for (const f of laterFiles) {
|
|
97
133
|
await unlink(join(chaptersDir, f));
|
|
98
|
-
|
|
134
|
+
if (!opts.json)
|
|
135
|
+
log(`Removed later chapter: ${f}`);
|
|
99
136
|
}
|
|
100
137
|
// Restore state to previous chapter's end-state
|
|
101
|
-
if (
|
|
102
|
-
const restored = await state.restoreState(bookId,
|
|
138
|
+
if (chapter > 1) {
|
|
139
|
+
const restored = await state.restoreState(bookId, chapter - 1);
|
|
103
140
|
if (restored) {
|
|
104
|
-
|
|
141
|
+
if (!opts.json)
|
|
142
|
+
log(`State restored from chapter ${chapter - 1} snapshot.`);
|
|
105
143
|
}
|
|
106
144
|
else {
|
|
107
|
-
|
|
145
|
+
if (!opts.json)
|
|
146
|
+
log(`Warning: no snapshot for chapter ${chapter - 1}. Using current state.`);
|
|
108
147
|
}
|
|
109
148
|
}
|
|
110
|
-
|
|
149
|
+
if (!opts.json)
|
|
150
|
+
log(`Regenerating chapter ${chapter}...`);
|
|
111
151
|
const pipeline = new PipelineRunner({
|
|
112
152
|
client,
|
|
113
153
|
model: config.llm.model,
|
|
@@ -115,13 +155,23 @@ writeCommand
|
|
|
115
155
|
notifyChannels: config.notify,
|
|
116
156
|
});
|
|
117
157
|
const result = await pipeline.writeNextChapter(bookId);
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
158
|
+
if (opts.json) {
|
|
159
|
+
log(JSON.stringify(result, null, 2));
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
log(` Chapter ${result.chapterNumber}: ${result.title}`);
|
|
163
|
+
log(` Words: ${result.wordCount}`);
|
|
164
|
+
log(` Audit: ${result.auditResult.passed ? "PASSED" : "NEEDS REVIEW"}`);
|
|
165
|
+
log(` Status: ${result.status}`);
|
|
166
|
+
}
|
|
122
167
|
}
|
|
123
168
|
catch (e) {
|
|
124
|
-
|
|
169
|
+
if (opts.json) {
|
|
170
|
+
log(JSON.stringify({ error: String(e) }));
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
logError(`Failed to rewrite chapter: ${e}`);
|
|
174
|
+
}
|
|
125
175
|
process.exit(1);
|
|
126
176
|
}
|
|
127
177
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/commands/write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/commands/write.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -15,11 +15,12 @@ import { auditCommand } from "./commands/audit.js";
|
|
|
15
15
|
import { reviseCommand } from "./commands/revise.js";
|
|
16
16
|
import { agentCommand } from "./commands/agent.js";
|
|
17
17
|
import { genreCommand } from "./commands/genre.js";
|
|
18
|
+
import { updateCommand } from "./commands/update.js";
|
|
18
19
|
const program = new Command();
|
|
19
20
|
program
|
|
20
21
|
.name("inkos")
|
|
21
22
|
.description("InkOS — Multi-agent novel production system")
|
|
22
|
-
.version("0.
|
|
23
|
+
.version("0.3.4");
|
|
23
24
|
program.addCommand(initCommand);
|
|
24
25
|
program.addCommand(configCommand);
|
|
25
26
|
program.addCommand(bookCommand);
|
|
@@ -36,5 +37,6 @@ program.addCommand(auditCommand);
|
|
|
36
37
|
program.addCommand(reviseCommand);
|
|
37
38
|
program.addCommand(agentCommand);
|
|
38
39
|
program.addCommand(genreCommand);
|
|
40
|
+
program.addCommand(updateCommand);
|
|
39
41
|
program.parse();
|
|
40
42
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,6CAA6C,CAAC;KAC1D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAC9B,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAElC,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/dist/utils.d.ts
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
import { type ProjectConfig } from "@actalk/inkos-core";
|
|
2
|
+
export declare const GLOBAL_CONFIG_DIR: string;
|
|
3
|
+
export declare const GLOBAL_ENV_PATH: string;
|
|
2
4
|
export declare function resolveContext(opts: {
|
|
3
5
|
readonly context?: string;
|
|
4
6
|
readonly contextFile?: string;
|
|
5
7
|
}): Promise<string | undefined>;
|
|
6
8
|
export declare function findProjectRoot(): string;
|
|
7
9
|
export declare function loadConfig(): Promise<ProjectConfig>;
|
|
8
|
-
export declare function createClient(config: ProjectConfig): import("
|
|
10
|
+
export declare function createClient(config: ProjectConfig): import("@actalk/inkos-core").LLMClient;
|
|
9
11
|
export declare function log(message: string): void;
|
|
10
12
|
export declare function logError(message: string): void;
|
|
13
|
+
/**
|
|
14
|
+
* Resolve book-id: if provided use it, otherwise auto-detect when exactly one book exists.
|
|
15
|
+
* Validates that the book actually exists.
|
|
16
|
+
*/
|
|
17
|
+
export declare function resolveBookId(bookIdArg: string | undefined, root: string): Promise<string>;
|
|
11
18
|
//# sourceMappingURL=utils.d.ts.map
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAIA,OAAO,EAAiC,KAAK,aAAa,EAAuB,MAAM,oBAAoB,CAAC;AAE5G,eAAO,MAAM,iBAAiB,QAA4B,CAAC;AAC3D,eAAO,MAAM,eAAe,QAAkC,CAAC;AAE/D,wBAAsB,cAAc,CAAC,IAAI,EAAE;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAe9B;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,aAAa,CAAC,CAqCzD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,0CAEjD;AAED,wBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEzC;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,CAyBjB"}
|
package/dist/utils.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
2
3
|
import { join, resolve } from "node:path";
|
|
3
4
|
import { config as loadEnv } from "dotenv";
|
|
4
|
-
import { createLLMClient, ProjectConfigSchema } from "@actalk/inkos-core";
|
|
5
|
+
import { createLLMClient, StateManager, ProjectConfigSchema } from "@actalk/inkos-core";
|
|
6
|
+
export const GLOBAL_CONFIG_DIR = join(homedir(), ".inkos");
|
|
7
|
+
export const GLOBAL_ENV_PATH = join(GLOBAL_CONFIG_DIR, ".env");
|
|
5
8
|
export async function resolveContext(opts) {
|
|
6
9
|
if (opts.context)
|
|
7
10
|
return opts.context;
|
|
@@ -25,8 +28,9 @@ export function findProjectRoot() {
|
|
|
25
28
|
}
|
|
26
29
|
export async function loadConfig() {
|
|
27
30
|
const root = findProjectRoot();
|
|
28
|
-
// Load
|
|
29
|
-
loadEnv({ path:
|
|
31
|
+
// Load global ~/.inkos/.env first, then project .env overrides
|
|
32
|
+
loadEnv({ path: GLOBAL_ENV_PATH });
|
|
33
|
+
loadEnv({ path: join(root, ".env"), override: true });
|
|
30
34
|
const configPath = join(root, "inkos.json");
|
|
31
35
|
try {
|
|
32
36
|
const raw = await readFile(configPath, "utf-8");
|
|
@@ -37,14 +41,26 @@ export async function loadConfig() {
|
|
|
37
41
|
config.llm.provider = env.INKOS_LLM_PROVIDER;
|
|
38
42
|
if (env.INKOS_LLM_BASE_URL)
|
|
39
43
|
config.llm.baseUrl = env.INKOS_LLM_BASE_URL;
|
|
40
|
-
if (env.INKOS_LLM_API_KEY)
|
|
41
|
-
config.llm.apiKey = env.INKOS_LLM_API_KEY;
|
|
42
44
|
if (env.INKOS_LLM_MODEL)
|
|
43
45
|
config.llm.model = env.INKOS_LLM_MODEL;
|
|
46
|
+
if (env.INKOS_LLM_TEMPERATURE)
|
|
47
|
+
config.llm.temperature = parseFloat(env.INKOS_LLM_TEMPERATURE);
|
|
48
|
+
if (env.INKOS_LLM_MAX_TOKENS)
|
|
49
|
+
config.llm.maxTokens = parseInt(env.INKOS_LLM_MAX_TOKENS, 10);
|
|
50
|
+
if (env.INKOS_LLM_THINKING_BUDGET)
|
|
51
|
+
config.llm.thinkingBudget = parseInt(env.INKOS_LLM_THINKING_BUDGET, 10);
|
|
52
|
+
if (env.INKOS_LLM_API_FORMAT)
|
|
53
|
+
config.llm.apiFormat = env.INKOS_LLM_API_FORMAT;
|
|
54
|
+
// API key ONLY from env — never stored in inkos.json
|
|
55
|
+
const apiKey = env.INKOS_LLM_API_KEY;
|
|
56
|
+
if (!apiKey) {
|
|
57
|
+
throw new Error("INKOS_LLM_API_KEY not set. Run 'inkos config set-global' or add it to project .env file.");
|
|
58
|
+
}
|
|
59
|
+
config.llm.apiKey = apiKey;
|
|
44
60
|
return ProjectConfigSchema.parse(config);
|
|
45
61
|
}
|
|
46
62
|
catch (e) {
|
|
47
|
-
throw new Error(`
|
|
63
|
+
throw new Error(`inkos.json not found in ${root}.\nMake sure you are inside an InkOS project directory (cd into the project created by 'inkos init').`);
|
|
48
64
|
}
|
|
49
65
|
}
|
|
50
66
|
export function createClient(config) {
|
|
@@ -56,4 +72,26 @@ export function log(message) {
|
|
|
56
72
|
export function logError(message) {
|
|
57
73
|
process.stderr.write(`[ERROR] ${message}\n`);
|
|
58
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* Resolve book-id: if provided use it, otherwise auto-detect when exactly one book exists.
|
|
77
|
+
* Validates that the book actually exists.
|
|
78
|
+
*/
|
|
79
|
+
export async function resolveBookId(bookIdArg, root) {
|
|
80
|
+
const state = new StateManager(root);
|
|
81
|
+
const books = await state.listBooks();
|
|
82
|
+
if (bookIdArg) {
|
|
83
|
+
if (!books.includes(bookIdArg)) {
|
|
84
|
+
const available = books.length > 0 ? books.join(", ") : "(none)";
|
|
85
|
+
throw new Error(`Book "${bookIdArg}" not found. Available books: ${available}`);
|
|
86
|
+
}
|
|
87
|
+
return bookIdArg;
|
|
88
|
+
}
|
|
89
|
+
if (books.length === 0) {
|
|
90
|
+
throw new Error("No books found. Create one first:\n inkos book create --title '...' --genre xuanhuan");
|
|
91
|
+
}
|
|
92
|
+
if (books.length === 1) {
|
|
93
|
+
return books[0];
|
|
94
|
+
}
|
|
95
|
+
throw new Error(`Multiple books found: ${books.join(", ")}\nPlease specify a book-id.`);
|
|
96
|
+
}
|
|
59
97
|
//# sourceMappingURL=utils.js.map
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAsB,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,34 +1,32 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@actalk/inkos",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.4",
|
|
4
4
|
"description": "InkOS CLI — multi-agent novel production system",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"inkos": "dist/index.js"
|
|
8
8
|
},
|
|
9
|
-
"files": [
|
|
10
|
-
"dist"
|
|
11
|
-
],
|
|
9
|
+
"files": ["dist"],
|
|
12
10
|
"license": "MIT",
|
|
13
11
|
"repository": {
|
|
14
12
|
"type": "git",
|
|
15
13
|
"url": "https://github.com/Narcooo/inkos.git",
|
|
16
14
|
"directory": "packages/cli"
|
|
17
15
|
},
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc",
|
|
18
|
+
"dev": "tsc --watch",
|
|
19
|
+
"test": "vitest run --passWithNoTests",
|
|
20
|
+
"typecheck": "tsc --noEmit"
|
|
21
|
+
},
|
|
18
22
|
"dependencies": {
|
|
23
|
+
"@actalk/inkos-core": "workspace:*",
|
|
19
24
|
"commander": "^13.0.0",
|
|
20
|
-
"dotenv": "^16.4.0"
|
|
21
|
-
"@actalk/inkos-core": "0.3.0"
|
|
25
|
+
"dotenv": "^16.4.0"
|
|
22
26
|
},
|
|
23
27
|
"devDependencies": {
|
|
24
28
|
"typescript": "^5.8.0",
|
|
25
29
|
"vitest": "^3.0.0",
|
|
26
30
|
"@types/node": "^22.0.0"
|
|
27
|
-
},
|
|
28
|
-
"scripts": {
|
|
29
|
-
"build": "tsc",
|
|
30
|
-
"dev": "tsc --watch",
|
|
31
|
-
"test": "vitest run --passWithNoTests",
|
|
32
|
-
"typecheck": "tsc --noEmit"
|
|
33
31
|
}
|
|
34
|
-
}
|
|
32
|
+
}
|
package/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 InkOS Contributors
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|