@rse/ase 0.0.7 → 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.1 CHANGED
@@ -3,7 +3,7 @@
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]\fB-d\fR|\fB--debug\fR\[rB] \[lB]\fIcommand\fR \[lB]\fIoptions\fR \[lB]...\[rB]\[rB] \[lB]\fIargs\fR \[lB]...\[rB]\[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
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.
@@ -16,37 +16,48 @@ The following top-level command-line options exist:
16
16
  .IP \(bu 4
17
17
  \[lB]\fB-V\fR|\fB--version\fR\[rB]: Show program version information only.
18
18
  .IP \(bu 4
19
- \[lB]\fB-d\fR|\fB--debug\fR\[rB]: Enable debug output. The flag is inherited by all subcommands and can be inspected inside handlers via \fBcmd.optsWithGlobals()\fR.
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.
20
22
  .RE 0
21
23
 
22
24
  .SH "COMMANDS"
23
25
  .P
24
- The following top-level commands exist:
26
+ The following top-level commands exist for configuration handling:
25
27
  .RS 0
26
28
  .IP \(bu 4
27
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.
28
30
  .IP \(bu 4
29
- \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.
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).
30
32
  .IP \(bu 4
31
- \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.
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.
32
34
  .IP \(bu 4
33
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.
34
36
  .IP \(bu 4
35
- \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.
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
36
45
  .IP \(bu 4
37
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.
38
47
  .IP \(bu 4
39
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.
40
49
  .IP \(bu 4
41
- \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.
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.
42
51
  .IP \(bu 4
43
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.
44
55
  .RE 0
45
56
 
46
57
  .SH "FILES"
47
58
  .RS 0
48
59
  .IP \(bu 4
49
- \fB.ase/config.yaml\fR: Per-project \fIASE\fR configuration. Read upward from the current working directory. Recognized key: \fBproject.id\fR (non-empty string).
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).
50
61
  .IP \(bu 4
51
62
  \fB.ase/service.yaml\fR: Per-project service state. Recognized key: \fBport\fR (integer in \fB1024\fR..\fB65535\fR).
52
63
  .IP \(bu 4
package/dst/ase.js CHANGED
@@ -4,29 +4,46 @@
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 { Command, CommanderError } from "commander";
8
- import registerConfigCommand from "./ase-config.js";
9
- import registerServiceCommand from "./ase-service.js";
10
- /* parse CLI arguments */
11
- try {
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();
12
19
  /* establish top-level program */
13
20
  const program = new Command();
14
21
  program
15
22
  .name("ase")
16
23
  .usage("<command> [options]")
17
- .option("-d, --debug", "enable debug output", false)
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", "-")
18
28
  .showHelpAfterError()
19
29
  .enablePositionalOptions()
20
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
+ });
21
38
  /* register top-level commands */
22
- registerConfigCommand(program);
23
- registerServiceCommand(program);
39
+ new ConfigCommand(log).register(program);
40
+ new ServiceCommand(log).register(program);
24
41
  /* parse program arguments */
25
42
  await program.parseAsync(process.argv);
26
43
  /* gracefully terminate */
27
44
  process.exit(0);
28
- }
29
- catch (err) {
45
+ };
46
+ main().catch((err) => {
30
47
  if (err instanceof CommanderError) {
31
48
  if (err.exitCode !== 0)
32
49
  process.exit(err.exitCode);
@@ -34,6 +51,6 @@ catch (err) {
34
51
  process.exit(0);
35
52
  }
36
53
  const message = err instanceof Error ? err.message : String(err);
37
- process.stderr.write(`ase: ERROR: ${message}\n`);
54
+ log.write("error", message);
38
55
  process.exit(1);
39
- }
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.7",
9
+ "version": "0.0.8",
10
10
  "license": "GPL-3.0-only",
11
11
  "author": {
12
12
  "name": "Dr. Ralf S. Engelschall",
@@ -34,7 +34,8 @@
34
34
  "remark": "15.0.1",
35
35
  "remark-man": "9.0.0",
36
36
 
37
- "@types/node": "25.6.0"
37
+ "@types/node": "25.6.0",
38
+ "@types/luxon": "3.7.1"
38
39
  },
39
40
  "dependencies": {
40
41
  "commander": "14.0.3",
@@ -43,8 +44,11 @@
43
44
  "execa": "9.6.1",
44
45
  "mkdirp": "3.0.1",
45
46
  "@hapi/hapi": "21.4.8",
46
- "axios": "1.15.0",
47
- "cli-table3": "0.6.5"
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"
48
52
  },
49
53
  "engines": {
50
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
-