atcoder-gui 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/dist/analyzer/analyzer.d.ts +16 -0
- package/dist/analyzer/analyzer.d.ts.map +1 -0
- package/dist/analyzer/analyzer.js +379 -0
- package/dist/analyzer/analyzer.js.map +1 -0
- package/dist/analyzer/html-parser.d.ts +24 -0
- package/dist/analyzer/html-parser.d.ts.map +1 -0
- package/dist/analyzer/html-parser.js +214 -0
- package/dist/analyzer/html-parser.js.map +1 -0
- package/dist/analyzer/index.d.ts +7 -0
- package/dist/analyzer/index.d.ts.map +1 -0
- package/dist/analyzer/index.js +7 -0
- package/dist/analyzer/index.js.map +1 -0
- package/dist/analyzer/lexer.d.ts +14 -0
- package/dist/analyzer/lexer.d.ts.map +1 -0
- package/dist/analyzer/lexer.js +133 -0
- package/dist/analyzer/lexer.js.map +1 -0
- package/dist/analyzer/match.d.ts +7 -0
- package/dist/analyzer/match.d.ts.map +1 -0
- package/dist/analyzer/match.js +133 -0
- package/dist/analyzer/match.js.map +1 -0
- package/dist/analyzer/parser.d.ts +20 -0
- package/dist/analyzer/parser.d.ts.map +1 -0
- package/dist/analyzer/parser.js +135 -0
- package/dist/analyzer/parser.js.map +1 -0
- package/dist/analyzer/types.d.ts +54 -0
- package/dist/analyzer/types.d.ts.map +1 -0
- package/dist/analyzer/types.js +10 -0
- package/dist/analyzer/types.js.map +1 -0
- package/dist/analyzer/typing.d.ts +10 -0
- package/dist/analyzer/typing.d.ts.map +1 -0
- package/dist/analyzer/typing.js +246 -0
- package/dist/analyzer/typing.js.map +1 -0
- package/dist/browser.d.ts +12 -0
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +26 -1
- package/dist/browser.js.map +1 -1
- package/dist/build.d.ts +7 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/build.js +40 -0
- package/dist/build.js.map +1 -0
- package/dist/config.d.ts +10 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +31 -18
- package/dist/config.js.map +1 -1
- package/dist/config.json5 +16 -1
- package/dist/gen.d.ts +6 -12
- package/dist/gen.d.ts.map +1 -1
- package/dist/gen.js +153 -66
- package/dist/gen.js.map +1 -1
- package/dist/generator/checker.d.ts +2 -0
- package/dist/generator/checker.d.ts.map +1 -0
- package/dist/generator/checker.js +64 -0
- package/dist/generator/checker.js.map +1 -0
- package/dist/generator/cplusplus.d.ts +14 -0
- package/dist/generator/cplusplus.d.ts.map +1 -0
- package/dist/generator/cplusplus.js +43 -0
- package/dist/generator/cplusplus.js.map +1 -0
- package/dist/generator/fetcher.d.ts +2 -0
- package/dist/generator/fetcher.d.ts.map +1 -0
- package/dist/generator/fetcher.js +39 -0
- package/dist/generator/fetcher.js.map +1 -0
- package/dist/generator/pipeline.d.ts +25 -0
- package/dist/generator/pipeline.d.ts.map +1 -0
- package/dist/generator/pipeline.js +85 -0
- package/dist/generator/pipeline.js.map +1 -0
- package/dist/generator/python.d.ts +14 -0
- package/dist/generator/python.d.ts.map +1 -0
- package/dist/generator/python.js +41 -0
- package/dist/generator/python.js.map +1 -0
- package/dist/generator/types.d.ts +79 -0
- package/dist/generator/types.d.ts.map +1 -0
- package/dist/generator/types.js +2 -0
- package/dist/generator/types.js.map +1 -0
- package/dist/generator/universal.d.ts +35 -0
- package/dist/generator/universal.d.ts.map +1 -0
- package/dist/generator/universal.js +524 -0
- package/dist/generator/universal.js.map +1 -0
- package/dist/generator/variable-extractor.d.ts +16 -0
- package/dist/generator/variable-extractor.d.ts.map +1 -0
- package/dist/generator/variable-extractor.js +103 -0
- package/dist/generator/variable-extractor.js.map +1 -0
- package/dist/main.d.ts +3 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +99 -100
- package/dist/main.js.map +1 -1
- package/dist/submit.d.ts +1 -1
- package/dist/submit.d.ts.map +1 -1
- package/dist/submit.js +17 -17
- package/dist/submit.js.map +1 -1
- package/dist/test.d.ts +10 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +127 -0
- package/dist/test.js.map +1 -0
- package/dist/tests/batch_check.d.ts +2 -0
- package/dist/tests/batch_check.d.ts.map +1 -0
- package/dist/tests/batch_check.js +46 -0
- package/dist/tests/batch_check.js.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +12 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +32 -0
- package/dist/utils.js.map +1 -1
- package/package.json +21 -4
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { VarType, } from "../analyzer/types.js";
|
|
2
|
+
export class VariableExtractor {
|
|
3
|
+
vars = new Map();
|
|
4
|
+
collapsedVars = new Set();
|
|
5
|
+
setCollapsedVars(collapsedVars) {
|
|
6
|
+
this.collapsedVars = collapsedVars;
|
|
7
|
+
}
|
|
8
|
+
extract(node) {
|
|
9
|
+
this.visit(node, []);
|
|
10
|
+
}
|
|
11
|
+
visit(node, loops) {
|
|
12
|
+
if (!node)
|
|
13
|
+
return;
|
|
14
|
+
if (node.type === "format") {
|
|
15
|
+
node.children.forEach((c) => this.visit(c, loops));
|
|
16
|
+
}
|
|
17
|
+
else if (node.type === "loop") {
|
|
18
|
+
const loop = node;
|
|
19
|
+
// Visit bounds first
|
|
20
|
+
this.visit(loop.start, loops);
|
|
21
|
+
this.visit(loop.end, loops);
|
|
22
|
+
// Visit body with updated loop stack
|
|
23
|
+
loop.body.forEach((c) => this.visit(c, [...loops, loop]));
|
|
24
|
+
}
|
|
25
|
+
else if (node.type === "item") {
|
|
26
|
+
const item = node;
|
|
27
|
+
const existing = this.vars.get(item.name) || {
|
|
28
|
+
dims: 0,
|
|
29
|
+
indices: [],
|
|
30
|
+
loopDepth: 0,
|
|
31
|
+
};
|
|
32
|
+
const currentLoopDepth = loops.length;
|
|
33
|
+
// We only update if we find a usage with MORE dimensions, or if it's new.
|
|
34
|
+
// Usually the usage with most dimensions defines the array.
|
|
35
|
+
// E.g. A_i ... A_N implies A is vector.
|
|
36
|
+
if (item.indices.length >= existing.dims) {
|
|
37
|
+
const indices = [];
|
|
38
|
+
for (const idx of item.indices) {
|
|
39
|
+
let resolvedSize = idx;
|
|
40
|
+
// Try to resolve index to a loop bound
|
|
41
|
+
// Heuristic: if index is a simple variable and matches a loop variable, use loop end
|
|
42
|
+
if (idx.type === "item") {
|
|
43
|
+
const idxName = idx.name;
|
|
44
|
+
const loop = loops.find((l) => l.variable === idxName);
|
|
45
|
+
if (loop) {
|
|
46
|
+
resolvedSize = loop.end;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
indices.push(resolvedSize);
|
|
50
|
+
}
|
|
51
|
+
// Keep the MAX loop depth seen for this variable (or should we strictly bind depth to definition?)
|
|
52
|
+
// If defined in Loop, depth is > 0.
|
|
53
|
+
// We use the depth at the point of definition (maximum dimensions).
|
|
54
|
+
this.vars.set(item.name, {
|
|
55
|
+
dims: item.indices.length,
|
|
56
|
+
indices,
|
|
57
|
+
loopDepth: currentLoopDepth,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else if (node.type === "binop") {
|
|
62
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
63
|
+
const bin = node;
|
|
64
|
+
this.visit(bin.left, loops);
|
|
65
|
+
this.visit(bin.right, loops);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
getVariables(types) {
|
|
69
|
+
return Array.from(this.vars.entries()).map(([name, info]) => {
|
|
70
|
+
let dims = info.dims;
|
|
71
|
+
let indices = info.indices;
|
|
72
|
+
const type = types[name] || VarType.ValueInt;
|
|
73
|
+
// Rule 1: Explicitly collapsed variables (Standard match failed, Collapse succeeded)
|
|
74
|
+
if (this.collapsedVars.has(name) && dims > 0) {
|
|
75
|
+
dims -= 1;
|
|
76
|
+
indices = indices.slice(0, -1);
|
|
77
|
+
}
|
|
78
|
+
// Rule 2: String anomaly (Standard match succeeded, but Analyzer produced disconnected dimensions)
|
|
79
|
+
// If type is String, and dimensions exceed the loop depth, it implies we are indexing implicitly into the string.
|
|
80
|
+
// e.g. loops=1, indices=2 (S[N][i]). This means S[i] is a string. We drop the extra index.
|
|
81
|
+
else if (type === VarType.String && dims > info.loopDepth) {
|
|
82
|
+
// const excess = dims - info.loopDepth;
|
|
83
|
+
dims = info.loopDepth;
|
|
84
|
+
// Keep the last 'dims' indices (assuming loop vars are inner)
|
|
85
|
+
// E.g. [N, i], depth=1. excess=1. slice(-1) -> [i].
|
|
86
|
+
// If depth=0 (scalar usage outside loop), but indices=1? -> dims=0.
|
|
87
|
+
if (dims === 0) {
|
|
88
|
+
indices = [];
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
indices = indices.slice(-dims);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
name,
|
|
96
|
+
type,
|
|
97
|
+
dims,
|
|
98
|
+
indices,
|
|
99
|
+
};
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=variable-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variable-extractor.js","sourceRoot":"","sources":["../../src/generator/variable-extractor.ts"],"names":[],"mappings":"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"}
|
package/dist/main.d.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { AppConfig } from
|
|
2
|
+
import { AppConfig } from "./config.js";
|
|
3
3
|
export declare class AtCoderGUI {
|
|
4
4
|
private browserManager;
|
|
5
5
|
private configManager;
|
|
6
6
|
private submitManager;
|
|
7
7
|
private cookieExporter;
|
|
8
8
|
private genManager;
|
|
9
|
+
private buildManager;
|
|
10
|
+
private testManager;
|
|
9
11
|
private problemManager;
|
|
10
12
|
private rl;
|
|
11
13
|
constructor();
|
package/dist/main.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AAMA,OAAO,EAAiB,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AAMA,OAAO,EAAiB,SAAS,EAAE,MAAM,aAAa,CAAC;AAUvD,qBAAa,UAAU;IACrB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,EAAE,CAAmC;;IAa7C;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B;;OAEG;IACG,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAazC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B;;OAEG;IACH,SAAS,IAAI,SAAS;IAItB;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAiD1C;;OAEG;YACW,aAAa;IAoI3B;;OAEG;IACH,OAAO,CAAC,QAAQ;CA+BjB"}
|
package/dist/main.js
CHANGED
|
@@ -1,37 +1,49 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import * as readline from
|
|
3
|
-
import { pathToFileURL } from
|
|
4
|
-
import * as fs from
|
|
5
|
-
import { BrowserManager } from
|
|
6
|
-
import { ConfigManager } from
|
|
7
|
-
import { SubmitManager } from
|
|
8
|
-
import { CookieExporter } from
|
|
9
|
-
import { GenManager } from
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
2
|
+
import * as readline from "readline";
|
|
3
|
+
import { pathToFileURL } from "url";
|
|
4
|
+
import * as fs from "fs";
|
|
5
|
+
import { BrowserManager } from "./browser.js";
|
|
6
|
+
import { ConfigManager } from "./config.js";
|
|
7
|
+
import { SubmitManager } from "./submit.js";
|
|
8
|
+
import { CookieExporter } from "./cookie-export.js";
|
|
9
|
+
import { GenManager } from "./gen.js";
|
|
10
|
+
import { BuildManager } from "./build.js";
|
|
11
|
+
import { TestManager } from "./test.js";
|
|
12
|
+
import { ProblemManager } from "./problem.js";
|
|
13
|
+
import { expandHomeDir, compactHomeDir } from "./utils.js";
|
|
14
|
+
import { execSync } from "child_process";
|
|
12
15
|
export class AtCoderGUI {
|
|
13
16
|
browserManager;
|
|
14
17
|
configManager;
|
|
15
18
|
submitManager;
|
|
16
19
|
cookieExporter;
|
|
17
20
|
genManager;
|
|
21
|
+
buildManager;
|
|
22
|
+
testManager;
|
|
18
23
|
problemManager;
|
|
19
24
|
rl = null;
|
|
20
25
|
constructor() {
|
|
21
26
|
this.browserManager = new BrowserManager();
|
|
22
|
-
this.configManager = new ConfigManager();
|
|
27
|
+
this.configManager = new ConfigManager(true);
|
|
23
28
|
this.submitManager = new SubmitManager(this.browserManager);
|
|
24
29
|
this.cookieExporter = new CookieExporter(this.browserManager);
|
|
25
|
-
this.genManager = new GenManager(this.browserManager);
|
|
30
|
+
this.genManager = new GenManager(this.browserManager, this.configManager);
|
|
31
|
+
this.buildManager = new BuildManager(this.configManager);
|
|
32
|
+
this.testManager = new TestManager(this.configManager, this.buildManager);
|
|
26
33
|
this.problemManager = new ProblemManager(this.browserManager);
|
|
27
34
|
}
|
|
28
35
|
/**
|
|
29
36
|
* Initialize the application
|
|
30
37
|
*/
|
|
31
38
|
async init() {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
39
|
+
try {
|
|
40
|
+
await this.browserManager.launch(this.getConfig());
|
|
41
|
+
const url = this.getConfig().defaultUrl || "https://atcoder.jp";
|
|
42
|
+
await this.browserManager.openUrl(url);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
console.warn("Warning: Failed to launch browser. Some commands may not work.", error);
|
|
46
|
+
}
|
|
35
47
|
}
|
|
36
48
|
/**
|
|
37
49
|
* Open a URL in the browser
|
|
@@ -72,30 +84,35 @@ export class AtCoderGUI {
|
|
|
72
84
|
this.rl = readline.createInterface({
|
|
73
85
|
input: process.stdin,
|
|
74
86
|
output: process.stdout,
|
|
75
|
-
prompt:
|
|
87
|
+
prompt: "command> ",
|
|
76
88
|
});
|
|
77
89
|
this.browserManager.setOnPageClose(() => {
|
|
78
90
|
this.rl?.close();
|
|
79
91
|
});
|
|
92
|
+
const workspaceDir = this.getConfig().workspaceDir;
|
|
93
|
+
if (workspaceDir) {
|
|
94
|
+
process.chdir(expandHomeDir(workspaceDir));
|
|
95
|
+
console.log(`Current directory: ${compactHomeDir(process.cwd())}`);
|
|
96
|
+
}
|
|
80
97
|
console.log('Type "help" for available commands or "exit" to quit');
|
|
81
98
|
this.rl.prompt();
|
|
82
|
-
this.rl.on(
|
|
99
|
+
this.rl.on("line", async (input) => {
|
|
83
100
|
const trimmedInput = input.trim();
|
|
84
|
-
if (trimmedInput ===
|
|
101
|
+
if (trimmedInput === "") {
|
|
85
102
|
this.rl.prompt();
|
|
86
103
|
return;
|
|
87
104
|
}
|
|
88
105
|
await this.handleCommand(trimmedInput);
|
|
89
106
|
this.rl.prompt();
|
|
90
107
|
});
|
|
91
|
-
this.rl.on(
|
|
92
|
-
console.log(
|
|
108
|
+
this.rl.on("close", async () => {
|
|
109
|
+
console.log("\nGoodbye!");
|
|
93
110
|
await this.close();
|
|
94
111
|
process.exit(0);
|
|
95
112
|
});
|
|
96
113
|
// Handle Ctrl+C
|
|
97
|
-
process.on(
|
|
98
|
-
console.log(
|
|
114
|
+
process.on("SIGINT", async () => {
|
|
115
|
+
console.log("\nShutting down...");
|
|
99
116
|
await this.close();
|
|
100
117
|
process.exit(0);
|
|
101
118
|
});
|
|
@@ -104,9 +121,9 @@ export class AtCoderGUI {
|
|
|
104
121
|
* Handle CLI commands
|
|
105
122
|
*/
|
|
106
123
|
async handleCommand(input) {
|
|
107
|
-
const args = input.split(
|
|
124
|
+
const args = input.split(" ").filter((arg) => arg.length > 0);
|
|
108
125
|
const command = args[0].toLowerCase();
|
|
109
|
-
if (command ==
|
|
126
|
+
if (command == "") {
|
|
110
127
|
return;
|
|
111
128
|
}
|
|
112
129
|
// Try to navigate to problem directory if command is a single letter
|
|
@@ -115,131 +132,113 @@ export class AtCoderGUI {
|
|
|
115
132
|
}
|
|
116
133
|
try {
|
|
117
134
|
switch (command) {
|
|
118
|
-
case
|
|
135
|
+
case "open":
|
|
119
136
|
if (args.length < 2) {
|
|
120
|
-
console.log(
|
|
121
|
-
console.log(
|
|
137
|
+
console.log("Error: URL is required for open command");
|
|
138
|
+
console.log("Usage: open <URL>");
|
|
122
139
|
return;
|
|
123
140
|
}
|
|
124
141
|
await this.openUrl(args[1]);
|
|
125
142
|
break;
|
|
126
|
-
case
|
|
127
|
-
console.log(
|
|
143
|
+
case "config":
|
|
144
|
+
console.log("Current configuration:");
|
|
128
145
|
console.log(JSON.stringify(this.getConfig(), null, 2));
|
|
129
146
|
break;
|
|
130
|
-
case
|
|
147
|
+
case "help":
|
|
131
148
|
this.showHelp();
|
|
132
149
|
break;
|
|
133
|
-
case
|
|
134
|
-
case
|
|
150
|
+
case "exit":
|
|
151
|
+
case "quit":
|
|
135
152
|
this.rl?.close();
|
|
136
153
|
break;
|
|
137
|
-
case
|
|
138
|
-
case
|
|
154
|
+
case "acc":
|
|
155
|
+
case "oj":
|
|
139
156
|
{
|
|
140
|
-
const command_line = args.join(
|
|
157
|
+
const command_line = args.join(" ");
|
|
141
158
|
try {
|
|
142
|
-
execSync(command_line, { encoding:
|
|
143
|
-
}
|
|
144
|
-
catch (_) {
|
|
145
|
-
;
|
|
159
|
+
execSync(command_line, { encoding: "utf-8", stdio: "inherit" });
|
|
146
160
|
}
|
|
161
|
+
catch (_) { }
|
|
147
162
|
}
|
|
148
163
|
break;
|
|
149
|
-
case
|
|
164
|
+
case "export":
|
|
150
165
|
if (args.length < 2) {
|
|
151
|
-
console.log(
|
|
152
|
-
console.log(
|
|
153
|
-
console.log(
|
|
154
|
-
console.log(
|
|
155
|
-
console.log(
|
|
156
|
-
console.log(
|
|
166
|
+
console.log("Error: Target is required for export command");
|
|
167
|
+
console.log("Usage: export <target>");
|
|
168
|
+
console.log("Available targets:");
|
|
169
|
+
console.log(" atcoder-tools Export cookies to atcoder-tools cookie.txt");
|
|
170
|
+
console.log(" atcoder-cli Export cookies to atcoder-cli session.json");
|
|
171
|
+
console.log(" oj Export cookies to online-judge-tools cookie.jar");
|
|
157
172
|
return;
|
|
158
173
|
}
|
|
159
174
|
{
|
|
160
175
|
const target = args[1].toLowerCase();
|
|
161
176
|
switch (target) {
|
|
162
|
-
case
|
|
177
|
+
case "atcoder-tools":
|
|
163
178
|
await this.cookieExporter.exportCookiesForAtCoderTools();
|
|
164
179
|
break;
|
|
165
|
-
case
|
|
180
|
+
case "atcoder-cli":
|
|
166
181
|
await this.cookieExporter.exportCookiesForAtCoderCli();
|
|
167
182
|
break;
|
|
168
|
-
case
|
|
183
|
+
case "oj":
|
|
169
184
|
await this.cookieExporter.exportCookiesForOj();
|
|
170
185
|
break;
|
|
171
186
|
default:
|
|
172
187
|
console.log(`Unknown export target: ${target}`);
|
|
173
|
-
console.log(
|
|
188
|
+
console.log("Available targets: atcoder-tools, atcoder-cli, oj");
|
|
174
189
|
}
|
|
175
190
|
}
|
|
176
191
|
break;
|
|
177
|
-
case
|
|
178
|
-
this.
|
|
192
|
+
case "build":
|
|
193
|
+
await this.buildManager.run(args);
|
|
179
194
|
break;
|
|
180
|
-
case
|
|
181
|
-
this.genManager.
|
|
195
|
+
case "gen":
|
|
196
|
+
await this.genManager.run(args);
|
|
182
197
|
break;
|
|
183
|
-
case
|
|
184
|
-
case
|
|
185
|
-
case
|
|
186
|
-
case
|
|
187
|
-
case
|
|
188
|
-
case
|
|
189
|
-
case
|
|
190
|
-
case
|
|
198
|
+
case "cp":
|
|
199
|
+
case "copy":
|
|
200
|
+
case "del":
|
|
201
|
+
case "dir":
|
|
202
|
+
case "ls":
|
|
203
|
+
case "make":
|
|
204
|
+
case "pwd":
|
|
205
|
+
case "rm":
|
|
191
206
|
{
|
|
192
|
-
const command_line = args.join(
|
|
207
|
+
const command_line = args.join(" ");
|
|
193
208
|
try {
|
|
194
|
-
execSync(command_line, { encoding:
|
|
195
|
-
}
|
|
196
|
-
catch (_) {
|
|
197
|
-
;
|
|
209
|
+
execSync(command_line, { encoding: "utf-8", stdio: "inherit" });
|
|
198
210
|
}
|
|
211
|
+
catch (_) { }
|
|
199
212
|
}
|
|
200
213
|
break;
|
|
201
|
-
case
|
|
214
|
+
case "submit":
|
|
202
215
|
if (!(await this.submitManager.submitSolution(args[1]))) {
|
|
203
216
|
break;
|
|
204
217
|
}
|
|
205
218
|
// eslint-disable-next-line no-fallthrough
|
|
206
|
-
case
|
|
219
|
+
case "test":
|
|
220
|
+
await this.testManager.run(args);
|
|
221
|
+
break;
|
|
222
|
+
case "cd":
|
|
207
223
|
{
|
|
208
|
-
const
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
}
|
|
213
|
-
catch (_) {
|
|
214
|
-
;
|
|
215
|
-
}
|
|
224
|
+
const dir = args.length >= 2 ? args[1] : this.getConfig().workspaceDir || "~";
|
|
225
|
+
const expandedDir = expandHomeDir(dir);
|
|
226
|
+
try {
|
|
227
|
+
process.chdir(expandedDir);
|
|
228
|
+
console.log(`Current directory: ${compactHomeDir(process.cwd())}`);
|
|
216
229
|
}
|
|
217
|
-
|
|
218
|
-
console.
|
|
230
|
+
catch (err) {
|
|
231
|
+
console.error(`Error changing directory: ${err}`);
|
|
219
232
|
}
|
|
220
233
|
}
|
|
221
234
|
break;
|
|
222
|
-
case 'cd':
|
|
223
|
-
if (args.length < 2) {
|
|
224
|
-
console.log('Error: Directory is required for cd command');
|
|
225
|
-
console.log('Usage: cd <directory>');
|
|
226
|
-
return;
|
|
227
|
-
}
|
|
228
|
-
try {
|
|
229
|
-
process.chdir(args[1]);
|
|
230
|
-
console.log(`Current directory: ${process.cwd()}`);
|
|
231
|
-
}
|
|
232
|
-
catch (err) {
|
|
233
|
-
console.error(`Error changing directory: ${err}`);
|
|
234
|
-
}
|
|
235
|
-
break;
|
|
236
235
|
default:
|
|
237
236
|
console.log(`Unknown command: ${command}`);
|
|
238
237
|
console.log('Type "help" for available commands');
|
|
239
238
|
}
|
|
240
239
|
}
|
|
241
240
|
catch (error) {
|
|
242
|
-
console.error(
|
|
241
|
+
console.error("Error:", error);
|
|
243
242
|
}
|
|
244
243
|
}
|
|
245
244
|
/**
|
|
@@ -251,10 +250,10 @@ Available commands:
|
|
|
251
250
|
open <URL> Open a URL in the browser
|
|
252
251
|
config Show current configuration
|
|
253
252
|
submit <filename> Submit solution to AtCoder
|
|
254
|
-
gen <contest-id> Generate
|
|
255
|
-
new <contest-id> Generate sample cases using atcoder-cli
|
|
253
|
+
gen <contest-id> Generate main.cpp from current problem page or contest ID
|
|
256
254
|
make <args> Execute make command
|
|
257
255
|
test Execute test command
|
|
256
|
+
build Build the source code specified in metadata.json
|
|
258
257
|
export <target> Export data to external tools
|
|
259
258
|
cd <directory> Change current directory
|
|
260
259
|
close Close the browser (if running)
|
|
@@ -289,12 +288,12 @@ async function ui_main() {
|
|
|
289
288
|
*/
|
|
290
289
|
async function main() {
|
|
291
290
|
const args = process.argv.slice(2);
|
|
292
|
-
const configManager = new ConfigManager();
|
|
293
|
-
if (args.includes(
|
|
291
|
+
const configManager = new ConfigManager(true);
|
|
292
|
+
if (args.includes("version") || args.includes("--version") || args.includes("-v")) {
|
|
294
293
|
console.log(configManager.getVersion());
|
|
295
294
|
return;
|
|
296
295
|
}
|
|
297
|
-
if (args.includes(
|
|
296
|
+
if (args.includes("config-dir") || args.includes("--config-dir")) {
|
|
298
297
|
console.log(configManager.getConfigDirPath());
|
|
299
298
|
return;
|
|
300
299
|
}
|
|
@@ -303,7 +302,7 @@ async function main() {
|
|
|
303
302
|
// Run the CLI if this file is executed directly
|
|
304
303
|
if (import.meta.url === pathToFileURL(fs.realpathSync(process.argv[1])).href) {
|
|
305
304
|
main().catch((error) => {
|
|
306
|
-
console.error(
|
|
305
|
+
console.error("Fatal error:", error);
|
|
307
306
|
process.exit(1);
|
|
308
307
|
});
|
|
309
308
|
}
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAa,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,OAAO,UAAU;IACb,cAAc,CAAiB;IAC/B,aAAa,CAAgB;IAC7B,aAAa,CAAgB;IAC7B,cAAc,CAAiB;IAC/B,UAAU,CAAa;IACvB,cAAc,CAAiB;IAC/B,EAAE,GAA8B,IAAI,CAAC;IAE7C;QACE,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;QAC3C,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
package/dist/submit.d.ts
CHANGED
package/dist/submit.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submit.d.ts","sourceRoot":"","sources":["../src/submit.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"submit.d.ts","sourceRoot":"","sources":["../src/submit.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9C,qBAAa,aAAa;IACxB,OAAO,CAAC,cAAc,CAAiB;gBAE3B,cAAc,EAAE,cAAc;IAI1C;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;YAsCtD,cAAc;IAqB5B;;OAEG;IACH,OAAO,CAAC,aAAa;IAkBrB;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;OAEG;YACW,kBAAkB;CAyBjC"}
|
package/dist/submit.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { readFileSync, existsSync } from
|
|
2
|
-
import * as path from
|
|
1
|
+
import { readFileSync, existsSync } from "fs";
|
|
2
|
+
import * as path from "path";
|
|
3
3
|
export class SubmitManager {
|
|
4
4
|
browserManager;
|
|
5
5
|
constructor(browserManager) {
|
|
@@ -10,19 +10,19 @@ export class SubmitManager {
|
|
|
10
10
|
*/
|
|
11
11
|
async submitSolution(filename) {
|
|
12
12
|
try {
|
|
13
|
-
const atcoderToolsMetadataPath =
|
|
14
|
-
const atcoderCliMetadataPath =
|
|
13
|
+
const atcoderToolsMetadataPath = "./metadata.json";
|
|
14
|
+
const atcoderCliMetadataPath = "../contest.acc.json";
|
|
15
15
|
if (existsSync(atcoderToolsMetadataPath)) {
|
|
16
|
-
const metadata = JSON.parse(readFileSync(atcoderToolsMetadataPath,
|
|
16
|
+
const metadata = JSON.parse(readFileSync(atcoderToolsMetadataPath, "utf-8"));
|
|
17
17
|
this.pasteToBrowser(metadata.problem.contest.contest_id, metadata.problem.problem_id, filename || metadata.code_filename);
|
|
18
18
|
return true;
|
|
19
19
|
}
|
|
20
20
|
else if (existsSync(atcoderCliMetadataPath)) {
|
|
21
21
|
if (!filename) {
|
|
22
|
-
console.error(
|
|
22
|
+
console.error("Error: filename is required");
|
|
23
23
|
return false;
|
|
24
24
|
}
|
|
25
|
-
const metadata = JSON.parse(readFileSync(atcoderCliMetadataPath,
|
|
25
|
+
const metadata = JSON.parse(readFileSync(atcoderCliMetadataPath, "utf-8"));
|
|
26
26
|
const problem_id = path.basename(process.cwd());
|
|
27
27
|
for (const task of metadata.tasks) {
|
|
28
28
|
if (task.directory?.path == problem_id) {
|
|
@@ -32,11 +32,11 @@ export class SubmitManager {
|
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
34
|
else {
|
|
35
|
-
console.error(
|
|
35
|
+
console.error("Error: metadata not found in current directory");
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
catch (error) {
|
|
39
|
-
console.error(
|
|
39
|
+
console.error("Error during submission:", error);
|
|
40
40
|
}
|
|
41
41
|
return false;
|
|
42
42
|
}
|
|
@@ -58,12 +58,12 @@ export class SubmitManager {
|
|
|
58
58
|
*/
|
|
59
59
|
parseMetadata(metadataPath) {
|
|
60
60
|
try {
|
|
61
|
-
const metadataContent = readFileSync(metadataPath,
|
|
61
|
+
const metadataContent = readFileSync(metadataPath, "utf-8");
|
|
62
62
|
const metadata = JSON.parse(metadataContent);
|
|
63
63
|
const contestId = metadata.problem.contest.contest_id;
|
|
64
64
|
const problemId = metadata.problem.problem_id;
|
|
65
65
|
if (!contestId || !problemId) {
|
|
66
|
-
throw new Error(
|
|
66
|
+
throw new Error("contest_id or problem_id not found in metadata.json");
|
|
67
67
|
}
|
|
68
68
|
return { contestId, problemId };
|
|
69
69
|
}
|
|
@@ -76,7 +76,7 @@ export class SubmitManager {
|
|
|
76
76
|
*/
|
|
77
77
|
readSourceCode(mainCppPath) {
|
|
78
78
|
try {
|
|
79
|
-
return readFileSync(mainCppPath,
|
|
79
|
+
return readFileSync(mainCppPath, "utf-8");
|
|
80
80
|
}
|
|
81
81
|
catch (error) {
|
|
82
82
|
throw new Error(`Failed to read main.cpp: ${error}`);
|
|
@@ -89,21 +89,21 @@ export class SubmitManager {
|
|
|
89
89
|
try {
|
|
90
90
|
const page = this.browserManager.getCurrentPage();
|
|
91
91
|
if (!page) {
|
|
92
|
-
throw new Error(
|
|
92
|
+
throw new Error("No active page found");
|
|
93
93
|
}
|
|
94
94
|
// Wait for the page to load
|
|
95
|
-
await page.waitForLoadState(
|
|
95
|
+
await page.waitForLoadState("domcontentloaded");
|
|
96
96
|
// Find the source code textarea (common selectors for AtCoder)
|
|
97
|
-
const textareaSelector =
|
|
97
|
+
const textareaSelector = "#editor .ace_text-input";
|
|
98
98
|
await page.waitForSelector(textareaSelector, { timeout: 10000 });
|
|
99
99
|
// Set min-height for the editor textarea
|
|
100
100
|
await page.addStyleTag({ content: `div#editor { min-height: 200px !important; }` });
|
|
101
101
|
// Clear existing content and paste source code
|
|
102
102
|
await page.fill(textareaSelector, sourceCode);
|
|
103
|
-
console.log(
|
|
103
|
+
console.log("✓ Copied!");
|
|
104
104
|
}
|
|
105
105
|
catch (error) {
|
|
106
|
-
console.error(
|
|
106
|
+
console.error("Failed to fill source code area:", error);
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
}
|