whale-igniter 1.1.0 → 1.2.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 CHANGED
@@ -133,6 +133,12 @@ Available client snippets: `--client claude-code | cursor | zed | raw`.
133
133
  | `whale adopt review` | Walk through pending proposals interactively. |
134
134
  | `whale adopt status` | List proposals without entering review. |
135
135
  | `whale sync` | Regenerate CLAUDE.md + wiki from `intelligence/*.json`. |
136
+ | `whale remember` | Friendly alias for `sync`: update project memory for AI assistants. |
137
+ | `whale check` | Friendly health check: run `validate` and then `insights`. |
138
+ | `whale improve` | Friendly Selene entry point: suggest project-wide improvements. |
139
+ | `whale explain` | Friendly docs entry point: generate reports and wiki/context. |
140
+ | `whale team` | Show active and available AI teammates. |
141
+ | `whale team add <name>` | Add atlas, forge, scribe, lighthouse, or selene as an AI teammate. |
136
142
  | `whale watch` | Auto-regenerate on changes. Flags: `--once`, `--verbose`, `--debounce`. |
137
143
  | `whale validate` | Run validators. Non-zero exit on errors. |
138
144
  | `whale insights` | Local analyzers + recommendations. Flags: `--json`, `--category`, `--min-severity`. |
@@ -0,0 +1,39 @@
1
+ import { docsCommand } from "./docs.js";
2
+ import { insightsCommand } from "./insights.js";
3
+ import { seleneSuggestCommand } from "./selene.js";
4
+ import { syncCommand } from "./sync.js";
5
+ import { validateCommand } from "./validate.js";
6
+ import { wikiCommand } from "./wiki.js";
7
+ import { ui } from "../ui/index.js";
8
+ export async function rememberCommand(target) {
9
+ console.log();
10
+ console.log(ui.header("Whale Igniter", "remember"));
11
+ console.log(ui.muted("Updating project memory for AI assistants."));
12
+ await syncCommand(target);
13
+ }
14
+ export async function checkCommand(target) {
15
+ console.log();
16
+ console.log(ui.header("Whale Igniter", "check"));
17
+ console.log(ui.muted("Checking project health, then looking for useful recommendations."));
18
+ console.log();
19
+ await validateCommand(target);
20
+ const validationExit = process.exitCode;
21
+ await insightsCommand(target, {});
22
+ if (validationExit !== undefined) {
23
+ process.exitCode = validationExit;
24
+ }
25
+ }
26
+ export async function improveCommand() {
27
+ console.log();
28
+ console.log(ui.header("Whale Igniter", "improve"));
29
+ console.log(ui.muted("Asking Selene for project-wide improvement suggestions."));
30
+ await seleneSuggestCommand({ focus: "all" });
31
+ }
32
+ export async function explainCommand(target) {
33
+ console.log();
34
+ console.log(ui.header("Whale Igniter", "explain"));
35
+ console.log(ui.muted("Generating human-facing docs and AI-readable project context."));
36
+ console.log();
37
+ await docsCommand(target);
38
+ await wikiCommand(target);
39
+ }
@@ -0,0 +1,83 @@
1
+ import { resolveTarget } from "../utils/paths.js";
2
+ import { loadConfig, saveConfig } from "../utils/config.js";
3
+ import { getPack } from "../utils/registry.js";
4
+ import { ui } from "../ui/index.js";
5
+ const PERSONAS = {
6
+ atlas: {
7
+ role: "Product strategy",
8
+ verb: "decides",
9
+ next: "whale decision"
10
+ },
11
+ forge: {
12
+ role: "Implementation architecture",
13
+ verb: "builds",
14
+ next: "whale create component Hero"
15
+ },
16
+ scribe: {
17
+ role: "Documentation and project memory",
18
+ verb: "documents",
19
+ next: "whale explain"
20
+ },
21
+ lighthouse: {
22
+ role: "Quality and validation",
23
+ verb: "guards",
24
+ next: "whale check"
25
+ },
26
+ selene: {
27
+ role: "AI suggestions and audits",
28
+ verb: "enriches",
29
+ next: "whale improve"
30
+ }
31
+ };
32
+ function isPersonaName(name) {
33
+ return Object.prototype.hasOwnProperty.call(PERSONAS, name);
34
+ }
35
+ export async function teamListCommand(targetArg) {
36
+ const target = resolveTarget(targetArg);
37
+ const config = await loadConfig(target);
38
+ const installed = new Set(config.packs ?? []);
39
+ console.log();
40
+ console.log(ui.header("Whale Igniter", "team"));
41
+ console.log();
42
+ console.log(ui.section("Your AI team"));
43
+ for (const [name, persona] of Object.entries(PERSONAS)) {
44
+ const mark = installed.has(name) ? ui.ok(name) : ui.muted(`${ui.glyph.bullet} ${name}`);
45
+ const state = installed.has(name) ? ui.muted("active") : ui.muted("available");
46
+ console.log(` ${mark.padEnd(18)} ${persona.role} ${ui.muted("— " + persona.verb)} ${state}`);
47
+ }
48
+ console.log();
49
+ console.log(ui.next("whale team add atlas add a teammate"));
50
+ console.log(ui.next("whale remember update project memory"));
51
+ }
52
+ export async function teamAddCommand(name) {
53
+ const personaName = name.toLowerCase();
54
+ if (!isPersonaName(personaName)) {
55
+ console.log(ui.fail(`Unknown teammate: "${name}"`));
56
+ console.log(ui.muted("Available teammates: atlas, forge, scribe, lighthouse, selene"));
57
+ process.exitCode = 1;
58
+ return;
59
+ }
60
+ const target = resolveTarget();
61
+ const pack = getPack(personaName);
62
+ const persona = PERSONAS[personaName];
63
+ if (!pack) {
64
+ console.log(ui.fail(`No pack found for teammate "${personaName}".`));
65
+ process.exitCode = 1;
66
+ return;
67
+ }
68
+ const config = await loadConfig(target);
69
+ config.packs = config.packs ?? [];
70
+ if (config.packs.includes(personaName)) {
71
+ console.log(ui.warn(`${personaName} is already on your AI team.`));
72
+ console.log(ui.next(persona.next));
73
+ return;
74
+ }
75
+ config.packs.push(personaName);
76
+ await saveConfig(target, config);
77
+ console.log(ui.ok(`${ui.code(personaName)} joined your AI team`));
78
+ console.log(` ${ui.kv("role", persona.role, { keyWidth: 8 })}`);
79
+ console.log(` ${ui.kv("pack", pack.kind, { keyWidth: 8 })}`);
80
+ console.log();
81
+ console.log(ui.next(`${persona.next} ${ui.muted("try this next")}`));
82
+ console.log(ui.next(`whale remember ${ui.muted("update project memory for agents")}`));
83
+ }
package/dist/index.js CHANGED
@@ -17,6 +17,8 @@ import { createComponentCommand } from "./commands/createComponent.js";
17
17
  import { seleneDescribeCommand, seleneAuditCommand, seleneSuggestCommand, seleneApplyCommand, seleneStatusCommand, seleneCacheClearCommand } from "./commands/selene.js";
18
18
  import { mcpServeCommand, mcpConfigCommand } from "./commands/mcp.js";
19
19
  import { watchCommand } from "./commands/watch.js";
20
+ import { rememberCommand, checkCommand, improveCommand, explainCommand } from "./commands/friendly.js";
21
+ import { teamAddCommand, teamListCommand } from "./commands/team.js";
20
22
  import { PACKAGE_VERSION } from "./version.js";
21
23
  const program = new Command();
22
24
  program
@@ -40,6 +42,22 @@ program
40
42
  .command("sync [target]")
41
43
  .description("Regenerate CLAUDE.md and the LLM Wiki from intelligence/*.json.")
42
44
  .action(syncCommand);
45
+ program
46
+ .command("remember [target]")
47
+ .description("Update project memory for AI assistants (friendly alias for sync).")
48
+ .action((target) => rememberCommand(target));
49
+ program
50
+ .command("check [target]")
51
+ .description("Check project health and recommendations (validate + insights).")
52
+ .action((target) => checkCommand(target));
53
+ program
54
+ .command("improve")
55
+ .description("Ask Selene for project-wide improvement suggestions.")
56
+ .action(() => improveCommand());
57
+ program
58
+ .command("explain [target]")
59
+ .description("Generate human docs and AI-readable context (docs + wiki).")
60
+ .action((target) => explainCommand(target));
43
61
  program
44
62
  .command("add <pack>")
45
63
  .description("Install a Whale operational pack.")
@@ -190,6 +208,19 @@ component
190
208
  .command("list")
191
209
  .description("List components registered in the catalog.")
192
210
  .action(componentListCommand);
211
+ const team = program
212
+ .command("team")
213
+ .description("Manage your AI team (friendly layer for operational packs).");
214
+ team
215
+ .command("add <teammate>")
216
+ .description("Add atlas, forge, scribe, lighthouse, or selene to this project.")
217
+ .action((name) => teamAddCommand(name));
218
+ team
219
+ .command("list [target]")
220
+ .description("Show available and active teammates.")
221
+ .action((target) => teamListCommand(target));
222
+ team
223
+ .action(() => teamListCommand());
193
224
  const mcp = program
194
225
  .command("mcp")
195
226
  .description("Run or configure the Whale MCP server (for Claude Code, Cursor, Zed, etc.).");
package/dist/version.js CHANGED
@@ -1 +1 @@
1
- export const PACKAGE_VERSION = "1.1.0";
1
+ export const PACKAGE_VERSION = "1.2.0";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "whale-igniter",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "CLI-first operational intelligence. Bootstraps and adopts AI-readable project context so agents like Claude Code, Codex and Cursor understand your design system from the first commit. Includes an MCP server, a file watcher, deterministic insights, and an opt-in AI bridge (Selene).",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",