@rse/ase 0.0.6 → 0.0.8
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/dst/ase-agent-base.js +16 -25
- package/dst/ase-agent-biz.js +18 -27
- package/dst/ase-agent-dev.js +18 -27
- package/dst/ase-agent-ops.js +18 -27
- package/dst/ase-agent-prd.js +18 -27
- package/dst/ase-agent-prj.js +18 -27
- package/dst/ase-agent.js +19 -29
- package/dst/ase-config.js +375 -44
- package/dst/ase-log.js +69 -0
- package/dst/ase-service.js +376 -216
- package/dst/ase-setup.js +9 -10
- package/dst/ase.1 +51 -4
- package/dst/ase.js +48 -35
- package/package.json +9 -4
- package/README.md +0 -42
package/dst/ase-setup.js
CHANGED
|
@@ -3,17 +3,16 @@
|
|
|
3
3
|
** Copyright (c) 2025-2026 Dr. Ralf S. Engelschall <rse@engelschall.com>
|
|
4
4
|
** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
|
|
5
5
|
*/
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
if (argv.debug)
|
|
6
|
+
const registerSetupCommand = (program) => {
|
|
7
|
+
program
|
|
8
|
+
.command("setup")
|
|
9
|
+
.description("Setup ASE")
|
|
10
|
+
.action((_opts, cmd) => {
|
|
11
|
+
const debug = Boolean(cmd.optsWithGlobals().debug);
|
|
12
|
+
if (debug)
|
|
14
13
|
console.log("DEBUG: setup command");
|
|
15
14
|
console.log("Setup ASE...");
|
|
16
15
|
/* TODO: implement setup logic */
|
|
17
|
-
}
|
|
16
|
+
});
|
|
18
17
|
};
|
|
19
|
-
export default
|
|
18
|
+
export default registerSetupCommand;
|
package/dst/ase.1
CHANGED
|
@@ -3,23 +3,70 @@
|
|
|
3
3
|
\fBase\fR - Agentic Software Engineering (ASE)
|
|
4
4
|
.SH "SYNOPSIS"
|
|
5
5
|
.P
|
|
6
|
-
\fBase\fR \[lB]\fB-h\fR|\fB--help\fR\[rB] \[lB]\fB-V\fR|\fB--version\fR\[rB] \[lB]\fIcommand\fR \[lB]\fIoptions\fR \[lB]...\[rB]\[rB]
|
|
6
|
+
\fBase\fR \[lB]\fB-h\fR|\fB--help\fR\[rB] \[lB]\fB-V\fR|\fB--version\fR\[rB] \[lB]\fB-l\fR|\fB--log-level\fR \fIlevel\fR\[rB] \[lB]\fB-L\fR|\fB--log-file\fR \fIfile\fR\[rB] \[lB]\fIcommand\fR \[lB]\fIoptions\fR \[lB]...\[rB]\[rB] \[lB]\fIargs\fR \[lB]...\[rB]\[rB]\[rB]
|
|
7
7
|
.SH "DESCRIPTION"
|
|
8
8
|
.P
|
|
9
|
-
\fBase\fR, \fIAgentic Software
|
|
9
|
+
\fBase\fR, \fIAgentic Software Engineering (ASE)\fR, is the command-line companion tool to the \fIASE\fR Claude Code plugin. It provides project-level configuration management and a small per-project background HTTP service for dispatching commands.
|
|
10
10
|
.SH "OPTIONS"
|
|
11
11
|
.P
|
|
12
|
-
The following command-line options
|
|
12
|
+
The following top-level command-line options exist:
|
|
13
13
|
.RS 0
|
|
14
14
|
.IP \(bu 4
|
|
15
15
|
\[lB]\fB-h\fR|\fB--help\fR\[rB]: Show program usage information only.
|
|
16
16
|
.IP \(bu 4
|
|
17
17
|
\[lB]\fB-V\fR|\fB--version\fR\[rB]: Show program version information only.
|
|
18
|
+
.IP \(bu 4
|
|
19
|
+
\[lB]\fB-l\fR|\fB--log-level\fR \fIlevel\fR\[rB]: Set the logging verbosity. Supported \fIlevel\fR values are \fBerror\fR, \fBwarning\fR (default), \fBinfo\fR, and \fBdebug\fR.
|
|
20
|
+
.IP \(bu 4
|
|
21
|
+
\[lB]\fB-L\fR|\fB--log-file\fR \fIfile\fR\[rB]: Redirect log output to \fIfile\fR (appended). Use \fB-\fR (default) to write log messages to standard output. If \fIfile\fR is connected to a TTY, colors are used in the output.
|
|
22
|
+
.RE 0
|
|
23
|
+
|
|
24
|
+
.SH "COMMANDS"
|
|
25
|
+
.P
|
|
26
|
+
The following top-level commands exist for configuration handling:
|
|
27
|
+
.RS 0
|
|
28
|
+
.IP \(bu 4
|
|
29
|
+
\fBase config\fR: Manage \fIASE\fR configuration stored in \fB.ase/config.yaml\fR. Without a subcommand, prints usage information. The file is validated against a schema: on read, unknown or invalid entries are warned about and silently dropped from the in-memory view; on set/write, they cause a fatal error.
|
|
30
|
+
.IP \(bu 4
|
|
31
|
+
\fBase config init\fR \fItype\fR: Initialize \fB.ase/config.yaml\fR with preset values for all recognized keys. The \fItype\fR argument selects the preset: \fBvibe\fR (solo rookie: small black-box prototype, bare code, fully agent-driven, spec-driven, engineer ambition), \fBpro\fR (solo expert: medium white-box product, framework-based, human-controlled, code-driven, artist ambition), or \fBindustry\fR (team crew: large grey-box MVP, framework-based, human-in-the-loop, code-driven, craftsman ambition).
|
|
32
|
+
.IP \(bu 4
|
|
33
|
+
\fBase config edit\fR: Open \fB.ase/config.yaml\fR in the editor defined by the \fB$EDITOR\fR or \fB$VISUAL\fR environment variable (falling back to \fBvi\fR). The file and its parent directory are created if missing. After the editor exits, the file is re-read and schema warnings are reported.
|
|
34
|
+
.IP \(bu 4
|
|
35
|
+
\fBase config list\fR: List all configured values as flat dotted keys, rendered as a two-column table of \fBkey\fR and \fBvalue\fR.
|
|
36
|
+
.IP \(bu 4
|
|
37
|
+
\fBase config get\fR \fIkey\fR: Print the value at the given dotted \fIkey\fR. Fails with an error if \fIkey\fR does not resolve to a leaf value.
|
|
38
|
+
.IP \(bu 4
|
|
39
|
+
\fBase config set\fR \fIkey\fR \fIvalue\fR: Set the value at the given dotted \fIkey\fR (creating intermediate maps as needed) and persist the file.
|
|
40
|
+
.RE 0
|
|
41
|
+
|
|
42
|
+
.P
|
|
43
|
+
The following top-level commands exist for service management:
|
|
44
|
+
.RS 0
|
|
45
|
+
.IP \(bu 4
|
|
46
|
+
\fBase service\fR: Manage the per-project background HTTP service. The service is bound to \fB127.0.0.1\fR on a port persisted in \fB.ase/service.yaml\fR and stops itself after 30 minutes of idle time. Without a subcommand, the help text is shown.
|
|
47
|
+
.IP \(bu 4
|
|
48
|
+
\fBase service start\fR: Start the background service (detached). Allocates a random port in the range \fB42000\fR..\fB44000\fR if none is persisted yet, writes it to \fB.ase/service.yaml\fR, and probes readiness. Exits silently with status 0 if the service is already running; prints \fBase: service: started on port <port>\fR on a fresh start.
|
|
49
|
+
.IP \(bu 4
|
|
50
|
+
\fBase service status\fR: Report whether the background service is running. Probes the persisted port via HTTP \fBGET /ping\fR and verifies that the responding service belongs to the current project. Prints \fBase: service: running on port <port>\fR and exits with status 0 if a matching service is reachable; otherwise prints a diagnostic message (no port configured, port not responding, or port in use by a foreign service) and exits with status 1.
|
|
51
|
+
.IP \(bu 4
|
|
52
|
+
\fBase service send\fR \fIcmd\fR: Dispatch the \fIcmd\fR token as a passthrough command to the running service via HTTP \fBPOST /command\fR; if the service is not running, it is auto-started first.
|
|
53
|
+
.IP \(bu 4
|
|
54
|
+
\fBase service stop\fR: Stop the background service via HTTP \fBGET /stop\fR. Exits silently with status 0 on successful stop. If no port is configured or the port is not responding, prints an informational message and exits with status 0.
|
|
55
|
+
.RE 0
|
|
56
|
+
|
|
57
|
+
.SH "FILES"
|
|
58
|
+
.RS 0
|
|
59
|
+
.IP \(bu 4
|
|
60
|
+
\fB.ase/config.yaml\fR: Per-project \fIASE\fR configuration. Read upward from the current working directory. Recognized keys: \fBproject.id\fR (non-empty string, uniqued project id), \fBproject.name\fR (non-empty string, descriptive project name), \fBproject.source.ambition\fR (\fBartist\fR|\fBcraftsman\fR|\fBengineer\fR), \fBproject.source.boxing\fR (\fBwhite\fR|\fBgrey\fR|\fBblack\fR), \fBproject.source.size\fR (\fBsmall\fR|\fBmedium\fR|\fBlarge\fR), \fBproject.source.structure\fR (\fBbare\fR|\fBlibrary\fR|\fBframework\fR), \fBproject.process.actors\fR (\fBperson\fR|\fBteam\fR|\fBcrew\fR), \fBproject.process.control\fR (\fBhuman\fR|\fBhitl\fR|\fBagent\fR), \fBproject.process.drive\fR (\fBspec\fR|\fBcode\fR|\fBtest\fR), and \fBproject.result.target\fR (\fBprototype\fR|\fBmvp\fR|\fBproduct\fR).
|
|
61
|
+
.IP \(bu 4
|
|
62
|
+
\fB.ase/service.yaml\fR: Per-project service state. Recognized key: \fBport\fR (integer in \fB1024\fR..\fB65535\fR).
|
|
63
|
+
.IP \(bu 4
|
|
64
|
+
\fB.ase/service.log\fR: Stdout/stderr log of the detached background service.
|
|
18
65
|
.RE 0
|
|
19
66
|
|
|
20
67
|
.SH "HISTORY"
|
|
21
68
|
.P
|
|
22
|
-
\fBase\fR was started to be developed in October 2025
|
|
69
|
+
\fBase\fR was started to be developed in October 2025.
|
|
23
70
|
.SH "AUTHOR"
|
|
24
71
|
.P
|
|
25
72
|
Dr. Ralf S. Engelschall \fI\(larse@engelschall.com\(ra\fR
|
package/dst/ase.js
CHANGED
|
@@ -4,40 +4,53 @@
|
|
|
4
4
|
** Copyright (c) 2025-2026 Dr. Ralf S. Engelschall <rse@engelschall.com>
|
|
5
5
|
** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
|
|
6
6
|
*/
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
/*
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
.command
|
|
24
|
-
.
|
|
25
|
-
.
|
|
26
|
-
.
|
|
27
|
-
.
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
.
|
|
35
|
-
.
|
|
36
|
-
.
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
7
|
+
import { Command, CommanderError, Option } from "commander";
|
|
8
|
+
import Log from "./ase-log.js";
|
|
9
|
+
import ConfigCommand from "./ase-config.js";
|
|
10
|
+
import ServiceCommand from "./ase-service.js";
|
|
11
|
+
import pkg from "../package.json" with { type: "json" };
|
|
12
|
+
/* globally initialize logger */
|
|
13
|
+
const log = new Log("ase", "warning", "-");
|
|
14
|
+
/* main entry point (wrapped in a regular async function to avoid
|
|
15
|
+
top-level await, which would be reported as "unsettled" by Node in
|
|
16
|
+
the long-running daemon process spawned by "ase service start") */
|
|
17
|
+
const main = async () => {
|
|
18
|
+
await log.init();
|
|
19
|
+
/* establish top-level program */
|
|
20
|
+
const program = new Command();
|
|
21
|
+
program
|
|
22
|
+
.name("ase")
|
|
23
|
+
.usage("<command> [options]")
|
|
24
|
+
.version(`ASE ${pkg.version}`, "-V, --version", "show version information")
|
|
25
|
+
.addOption(new Option("-l, --log-level <level>", "log level")
|
|
26
|
+
.choices(["error", "warning", "info", "debug"]).default("warning"))
|
|
27
|
+
.option("-L, --log-file <file>", "log file path, or \"-\" for stdout", "-")
|
|
28
|
+
.showHelpAfterError()
|
|
29
|
+
.enablePositionalOptions()
|
|
30
|
+
.exitOverride();
|
|
31
|
+
/* establish shared logger with defaults and then apply parsed
|
|
32
|
+
global options to the logger before any subcommand action */
|
|
33
|
+
program.hook("preAction", async () => {
|
|
34
|
+
const opts = program.opts();
|
|
35
|
+
log.logLevel(opts.logLevel);
|
|
36
|
+
log.logFile(opts.logFile);
|
|
37
|
+
});
|
|
38
|
+
/* register top-level commands */
|
|
39
|
+
new ConfigCommand(log).register(program);
|
|
40
|
+
new ServiceCommand(log).register(program);
|
|
41
|
+
/* parse program arguments */
|
|
42
|
+
await program.parseAsync(process.argv);
|
|
43
|
+
/* gracefully terminate */
|
|
44
|
+
process.exit(0);
|
|
45
|
+
};
|
|
46
|
+
main().catch((err) => {
|
|
47
|
+
if (err instanceof CommanderError) {
|
|
48
|
+
if (err.exitCode !== 0)
|
|
49
|
+
process.exit(err.exitCode);
|
|
50
|
+
else
|
|
51
|
+
process.exit(0);
|
|
52
|
+
}
|
|
40
53
|
const message = err instanceof Error ? err.message : String(err);
|
|
41
|
-
|
|
54
|
+
log.write("error", message);
|
|
42
55
|
process.exit(1);
|
|
43
|
-
}
|
|
56
|
+
});
|
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"homepage": "http://github.com/rse/ase",
|
|
7
7
|
"repository": { "url": "git+https://github.com/rse/ase.git", "type": "git" },
|
|
8
8
|
"bugs": { "url": "http://github.com/rse/ase/issues" },
|
|
9
|
-
"version": "0.0.
|
|
9
|
+
"version": "0.0.8",
|
|
10
10
|
"license": "GPL-3.0-only",
|
|
11
11
|
"author": {
|
|
12
12
|
"name": "Dr. Ralf S. Engelschall",
|
|
@@ -35,15 +35,20 @@
|
|
|
35
35
|
"remark-man": "9.0.0",
|
|
36
36
|
|
|
37
37
|
"@types/node": "25.6.0",
|
|
38
|
-
"@types/
|
|
38
|
+
"@types/luxon": "3.7.1"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"
|
|
41
|
+
"commander": "14.0.3",
|
|
42
42
|
"yaml": "2.8.3",
|
|
43
|
+
"valibot": "1.3.1",
|
|
43
44
|
"execa": "9.6.1",
|
|
44
45
|
"mkdirp": "3.0.1",
|
|
45
46
|
"@hapi/hapi": "21.4.8",
|
|
46
|
-
"axios": "1.15.
|
|
47
|
+
"axios": "1.15.1",
|
|
48
|
+
"cli-table3": "0.6.5",
|
|
49
|
+
"chalk": "5.6.2",
|
|
50
|
+
"pretty-ms": "9.3.0",
|
|
51
|
+
"luxon": "3.7.2"
|
|
47
52
|
},
|
|
48
53
|
"engines": {
|
|
49
54
|
"npm": ">=10.0.0",
|
package/README.md
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
$ npx @rse/ase init
|
|
3
|
-
$ npx @rse/ase config agent.dev.llm.type=anthropic-claude-sonnet-4.5
|
|
4
|
-
$ npx @rse/ase config agent.dev.llm.key=<foo>
|
|
5
|
-
$ npx @rse/ase agent dev start
|
|
6
|
-
|
|
7
|
-
Agents
|
|
8
|
-
------
|
|
9
|
-
|
|
10
|
-
- PRJ (Project)
|
|
11
|
-
Objective: Project Steering
|
|
12
|
-
Input: time, cost, scope
|
|
13
|
-
Output: tasks
|
|
14
|
-
|
|
15
|
-
- PRD (Product)
|
|
16
|
-
Objective: Product Life-Cycle
|
|
17
|
-
Input: vision
|
|
18
|
-
Output: product roadmap
|
|
19
|
-
|
|
20
|
-
- BIZ (Business)
|
|
21
|
-
Objective: Product Specification
|
|
22
|
-
Input: product roadmap
|
|
23
|
-
Output: requirements specification
|
|
24
|
-
|
|
25
|
-
- ARC (Architecture)
|
|
26
|
-
Objective: Product Development
|
|
27
|
-
Input: requirements specification
|
|
28
|
-
Output: architecture description
|
|
29
|
-
|
|
30
|
-
- DEV (Development)
|
|
31
|
-
Objective: Product Development
|
|
32
|
-
Input: requirements specification, architecture description
|
|
33
|
-
Output: source code, deployment units
|
|
34
|
-
|
|
35
|
-
- OPS (Operations)
|
|
36
|
-
Objective: Solution Operations
|
|
37
|
-
|
|
38
|
-
- spec req
|
|
39
|
-
- arch arc
|
|
40
|
-
- code src
|
|
41
|
-
- docs doc
|
|
42
|
-
|