@actalk/inkos 0.3.1 → 0.3.5
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/__tests__/publish-package.test.d.ts +2 -0
- package/dist/__tests__/publish-package.test.d.ts.map +1 -0
- package/dist/__tests__/publish-package.test.js +38 -0
- package/dist/__tests__/publish-package.test.js.map +1 -0
- 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/detect.d.ts +3 -0
- package/dist/commands/detect.d.ts.map +1 -0
- package/dist/commands/detect.js +104 -0
- package/dist/commands/detect.js.map +1 -0
- 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 +69 -25
- 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/style.d.ts +3 -0
- package/dist/commands/style.d.ts.map +1 -0
- package/dist/commands/style.js +67 -0
- package/dist/commands/style.js.map +1 -0
- 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 +7 -1
- package/dist/index.js.map +1 -1
- package/dist/utils.d.ts +7 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +44 -6
- package/dist/utils.js.map +1 -1
- package/package.json +3 -3
package/dist/commands/status.js
CHANGED
|
@@ -3,14 +3,23 @@ import { StateManager } from "@actalk/inkos-core";
|
|
|
3
3
|
import { findProjectRoot, log, logError } from "../utils.js";
|
|
4
4
|
export const statusCommand = new Command("status")
|
|
5
5
|
.description("Show project status")
|
|
6
|
-
.
|
|
6
|
+
.argument("[book-id]", "Book ID (optional, shows all if omitted)")
|
|
7
|
+
.option("--json", "Output JSON")
|
|
8
|
+
.action(async (bookIdArg, opts) => {
|
|
7
9
|
try {
|
|
8
10
|
const root = findProjectRoot();
|
|
9
11
|
const state = new StateManager(root);
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
const allBookIds = await state.listBooks();
|
|
13
|
+
const bookIds = bookIdArg ? [bookIdArg] : allBookIds;
|
|
14
|
+
if (bookIdArg && !allBookIds.includes(bookIdArg)) {
|
|
15
|
+
throw new Error(`Book "${bookIdArg}" not found. Available: ${allBookIds.join(", ") || "(none)"}`);
|
|
16
|
+
}
|
|
17
|
+
const booksData = [];
|
|
18
|
+
if (!opts.json) {
|
|
19
|
+
log(`InkOS Project: ${root}`);
|
|
20
|
+
log(`Books: ${allBookIds.length}`);
|
|
21
|
+
log("");
|
|
22
|
+
}
|
|
14
23
|
for (const id of bookIds) {
|
|
15
24
|
const book = await state.loadBookConfig(id);
|
|
16
25
|
const index = await state.loadChapterIndex(id);
|
|
@@ -18,19 +27,43 @@ export const statusCommand = new Command("status")
|
|
|
18
27
|
const approved = index.filter((ch) => ch.status === "approved").length;
|
|
19
28
|
const pending = index.filter((ch) => ch.status === "ready-for-review").length;
|
|
20
29
|
const failed = index.filter((ch) => ch.status === "audit-failed").length;
|
|
21
|
-
log(` ${book.title} (${id})`);
|
|
22
|
-
log(` Status: ${book.status}`);
|
|
23
|
-
log(` Platform: ${book.platform} | Genre: ${book.genre}`);
|
|
24
30
|
const totalWords = index.reduce((sum, ch) => sum + ch.wordCount, 0);
|
|
25
31
|
const avgWords = index.length > 0 ? Math.round(totalWords / index.length) : 0;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
32
|
+
booksData.push({
|
|
33
|
+
id,
|
|
34
|
+
title: book.title,
|
|
35
|
+
status: book.status,
|
|
36
|
+
genre: book.genre,
|
|
37
|
+
platform: book.platform,
|
|
38
|
+
chapters: nextChapter - 1,
|
|
39
|
+
targetChapters: book.targetChapters,
|
|
40
|
+
totalWords,
|
|
41
|
+
avgWordsPerChapter: avgWords,
|
|
42
|
+
approved,
|
|
43
|
+
pending,
|
|
44
|
+
failed,
|
|
45
|
+
});
|
|
46
|
+
if (!opts.json) {
|
|
47
|
+
log(` ${book.title} (${id})`);
|
|
48
|
+
log(` Status: ${book.status}`);
|
|
49
|
+
log(` Platform: ${book.platform} | Genre: ${book.genre}`);
|
|
50
|
+
log(` Chapters: ${nextChapter - 1} / ${book.targetChapters}`);
|
|
51
|
+
log(` Words: ${totalWords.toLocaleString()} (avg ${avgWords}/ch)`);
|
|
52
|
+
log(` Approved: ${approved} | Pending: ${pending} | Failed: ${failed}`);
|
|
53
|
+
log("");
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (opts.json) {
|
|
57
|
+
log(JSON.stringify({ project: root, books: booksData }, null, 2));
|
|
30
58
|
}
|
|
31
59
|
}
|
|
32
60
|
catch (e) {
|
|
33
|
-
|
|
61
|
+
if (opts.json) {
|
|
62
|
+
log(JSON.stringify({ error: String(e) }));
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
logError(`Failed to get status: ${e}`);
|
|
66
|
+
}
|
|
34
67
|
process.exit(1);
|
|
35
68
|
}
|
|
36
69
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE7D,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,qBAAqB,CAAC;KAClC,MAAM,CAAC,KAAK,IAAI,EAAE;
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../src/commands/style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,YAAY,SAC8B,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { StateManager, analyzeStyle } from "@actalk/inkos-core";
|
|
3
|
+
import { findProjectRoot, resolveBookId, log, logError } from "../utils.js";
|
|
4
|
+
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
5
|
+
import { join, resolve } from "node:path";
|
|
6
|
+
export const styleCommand = new Command("style")
|
|
7
|
+
.description("Style fingerprint analysis and import");
|
|
8
|
+
styleCommand
|
|
9
|
+
.command("analyze")
|
|
10
|
+
.description("Analyze a text file and extract style profile")
|
|
11
|
+
.argument("<file>", "Text file to analyze")
|
|
12
|
+
.option("--name <name>", "Source name for the profile")
|
|
13
|
+
.option("--json", "Output JSON only")
|
|
14
|
+
.action(async (file, opts) => {
|
|
15
|
+
try {
|
|
16
|
+
const text = await readFile(resolve(file), "utf-8");
|
|
17
|
+
const profile = analyzeStyle(text, opts.name ?? file);
|
|
18
|
+
if (opts.json) {
|
|
19
|
+
log(JSON.stringify(profile, null, 2));
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
log("Style Profile:");
|
|
23
|
+
log(` Source: ${profile.sourceName ?? "unknown"}`);
|
|
24
|
+
log(` Avg sentence length: ${profile.avgSentenceLength} chars`);
|
|
25
|
+
log(` Sentence length std dev: ${profile.sentenceLengthStdDev}`);
|
|
26
|
+
log(` Avg paragraph length: ${profile.avgParagraphLength} chars`);
|
|
27
|
+
log(` Paragraph range: ${profile.paragraphLengthRange.min}-${profile.paragraphLengthRange.max} chars`);
|
|
28
|
+
log(` Vocabulary diversity (TTR): ${profile.vocabularyDiversity}`);
|
|
29
|
+
if (profile.topPatterns.length > 0) {
|
|
30
|
+
log(` Top patterns: ${profile.topPatterns.join(", ")}`);
|
|
31
|
+
}
|
|
32
|
+
if (profile.rhetoricalFeatures.length > 0) {
|
|
33
|
+
log(` Rhetorical features: ${profile.rhetoricalFeatures.join(", ")}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
logError(`Analysis failed: ${e}`);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
styleCommand
|
|
43
|
+
.command("import")
|
|
44
|
+
.description("Import a style profile into a book")
|
|
45
|
+
.argument("<file>", "Text file to analyze and import")
|
|
46
|
+
.argument("[book-id]", "Book ID (auto-detected if only one book)")
|
|
47
|
+
.option("--name <name>", "Source name for the profile")
|
|
48
|
+
.action(async (file, bookIdArg, opts) => {
|
|
49
|
+
try {
|
|
50
|
+
const root = findProjectRoot();
|
|
51
|
+
const bookId = await resolveBookId(bookIdArg, root);
|
|
52
|
+
const state = new StateManager(root);
|
|
53
|
+
const bookDir = state.bookDir(bookId);
|
|
54
|
+
const text = await readFile(resolve(file), "utf-8");
|
|
55
|
+
const profile = analyzeStyle(text, opts.name ?? file);
|
|
56
|
+
const storyDir = join(bookDir, "story");
|
|
57
|
+
await mkdir(storyDir, { recursive: true });
|
|
58
|
+
await writeFile(join(storyDir, "style_profile.json"), JSON.stringify(profile, null, 2), "utf-8");
|
|
59
|
+
log(`Style profile imported to "${bookId}" from "${file}"`);
|
|
60
|
+
log(` Avg sentence: ${profile.avgSentenceLength} chars, TTR: ${profile.vocabularyDiversity}`);
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
logError(`Import failed: ${e}`);
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=style.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/commands/style.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,14 @@ 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";
|
|
19
|
+
import { detectCommand } from "./commands/detect.js";
|
|
20
|
+
import { styleCommand } from "./commands/style.js";
|
|
18
21
|
const program = new Command();
|
|
19
22
|
program
|
|
20
23
|
.name("inkos")
|
|
21
24
|
.description("InkOS — Multi-agent novel production system")
|
|
22
|
-
.version("0.
|
|
25
|
+
.version("0.3.5");
|
|
23
26
|
program.addCommand(initCommand);
|
|
24
27
|
program.addCommand(configCommand);
|
|
25
28
|
program.addCommand(bookCommand);
|
|
@@ -36,5 +39,8 @@ program.addCommand(auditCommand);
|
|
|
36
39
|
program.addCommand(reviseCommand);
|
|
37
40
|
program.addCommand(agentCommand);
|
|
38
41
|
program.addCommand(genreCommand);
|
|
42
|
+
program.addCommand(updateCommand);
|
|
43
|
+
program.addCommand(detectCommand);
|
|
44
|
+
program.addCommand(styleCommand);
|
|
39
45
|
program.parse();
|
|
40
46
|
//# 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;AAEnD,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;AAEjC,OAAO,CAAC,KAAK,EAAE,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;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,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;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AAEjC,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/dist/utils.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
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;
|
|
@@ -8,4 +10,9 @@ export declare function loadConfig(): Promise<ProjectConfig>;
|
|
|
8
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,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@actalk/inkos",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.5",
|
|
4
4
|
"description": "InkOS CLI — multi-agent novel production system",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -16,9 +16,9 @@
|
|
|
16
16
|
"directory": "packages/cli"
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
|
+
"@actalk/inkos-core": "0.3.5",
|
|
19
20
|
"commander": "^13.0.0",
|
|
20
|
-
"dotenv": "^16.4.0"
|
|
21
|
-
"@actalk/inkos-core": "0.3.1"
|
|
21
|
+
"dotenv": "^16.4.0"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"typescript": "^5.8.0",
|