@gajae-code/coding-agent 0.2.3 → 0.2.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/CHANGELOG.md +34 -8600
- package/README.md +1 -1
- package/dist/types/async/job-manager.d.ts +61 -0
- package/dist/types/cli/update-cli.d.ts +3 -0
- package/dist/types/config/settings-schema.d.ts +27 -3
- package/dist/types/config/settings.d.ts +1 -1
- package/dist/types/defaults/gjc-defaults.d.ts +19 -6
- package/dist/types/discovery/helpers.d.ts +1 -0
- package/dist/types/exec/bash-executor.d.ts +8 -1
- package/dist/types/gjc-runtime/restricted-role-agent-bash.d.ts +2 -0
- package/dist/types/modes/acp/acp-client-bridge.d.ts +1 -1
- package/dist/types/modes/components/settings-selector.d.ts +4 -0
- package/dist/types/modes/components/skill-hud/render.d.ts +1 -1
- package/dist/types/modes/controllers/selector-controller.d.ts +1 -0
- package/dist/types/modes/interactive-mode.d.ts +2 -0
- package/dist/types/modes/theme/defaults/index.d.ts +45 -9351
- package/dist/types/modes/theme/theme.d.ts +6 -5
- package/dist/types/modes/types.d.ts +2 -0
- package/dist/types/sdk.d.ts +2 -0
- package/dist/types/session/streaming-output.d.ts +11 -0
- package/dist/types/skill-state/active-state.d.ts +1 -0
- package/dist/types/task/types.d.ts +1 -0
- package/dist/types/tools/bash-allowed-prefixes.d.ts +5 -0
- package/dist/types/tools/bash.d.ts +24 -0
- package/dist/types/tools/cron.d.ts +110 -0
- package/dist/types/tools/index.d.ts +4 -0
- package/dist/types/tools/monitor.d.ts +54 -0
- package/dist/types/web/search/index.d.ts +1 -0
- package/dist/types/web/search/provider.d.ts +11 -4
- package/dist/types/web/search/providers/duckduckgo.d.ts +57 -0
- package/dist/types/web/search/types.d.ts +1 -1
- package/package.json +7 -7
- package/src/async/job-manager.ts +224 -0
- package/src/cli/agents-cli.ts +3 -0
- package/src/cli/update-cli.ts +67 -16
- package/src/config/settings-schema.ts +30 -2
- package/src/config/settings.ts +44 -7
- package/src/defaults/gjc/skills/deep-interview/SKILL.md +48 -6
- package/src/defaults/gjc/skills/deep-interview/auto-answer-uncertain.md +37 -0
- package/src/defaults/gjc/skills/deep-interview/auto-research-greenfield.md +42 -0
- package/src/defaults/gjc/skills/ralplan/SKILL.md +8 -4
- package/src/defaults/gjc/skills/ultragoal/SKILL.md +9 -6
- package/src/defaults/gjc-defaults.ts +68 -16
- package/src/discovery/helpers.ts +5 -0
- package/src/eval/js/shared/rewrite-imports.ts +1 -2
- package/src/exec/bash-executor.ts +20 -9
- package/src/gjc-runtime/deep-interview-runtime.ts +44 -0
- package/src/gjc-runtime/ralplan-runtime.ts +2 -0
- package/src/gjc-runtime/restricted-role-agent-bash.ts +5 -0
- package/src/gjc-runtime/state-runtime.ts +3 -2
- package/src/goals/tools/goal-tool.ts +5 -1
- package/src/hooks/skill-state.ts +1 -1
- package/src/internal-urls/docs-index.generated.ts +8 -4
- package/src/lsp/render.ts +1 -1
- package/src/memories/index.ts +5 -4
- package/src/modes/acp/acp-agent.ts +1 -1
- package/src/modes/acp/acp-client-bridge.ts +1 -1
- package/src/modes/components/agent-dashboard.ts +1 -1
- package/src/modes/components/diff.ts +2 -2
- package/src/modes/components/settings-selector.ts +25 -14
- package/src/modes/components/skill-hud/render.ts +7 -2
- package/src/modes/controllers/command-controller.ts +1 -1
- package/src/modes/controllers/input-controller.ts +10 -2
- package/src/modes/controllers/selector-controller.ts +67 -0
- package/src/modes/interactive-mode.ts +34 -3
- package/src/modes/theme/defaults/blue-crab.json +126 -0
- package/src/modes/theme/defaults/index.ts +2 -196
- package/src/modes/theme/theme.ts +75 -36
- package/src/modes/types.ts +2 -0
- package/src/prompts/agents/architect.md +5 -1
- package/src/prompts/agents/critic.md +5 -1
- package/src/prompts/agents/frontmatter.md +1 -0
- package/src/prompts/agents/planner.md +5 -1
- package/src/prompts/memories/unavailable.md +9 -0
- package/src/prompts/tools/bash.md +9 -0
- package/src/prompts/tools/cron.md +25 -0
- package/src/prompts/tools/monitor.md +30 -0
- package/src/runtime-mcp/oauth-flow.ts +4 -2
- package/src/sdk.ts +7 -0
- package/src/session/agent-session.ts +16 -5
- package/src/session/streaming-output.ts +21 -0
- package/src/skill-state/active-state.ts +163 -12
- package/src/slash-commands/builtin-registry.ts +11 -1
- package/src/task/agents.ts +1 -0
- package/src/task/executor.ts +1 -0
- package/src/task/types.ts +1 -0
- package/src/tools/bash-allowed-prefixes.ts +169 -0
- package/src/tools/bash.ts +190 -29
- package/src/tools/browser/tab-worker.ts +1 -1
- package/src/tools/cron.ts +665 -0
- package/src/tools/index.ts +20 -2
- package/src/tools/monitor.ts +136 -0
- package/src/vim/engine.ts +3 -3
- package/src/web/search/index.ts +31 -18
- package/src/web/search/provider.ts +57 -12
- package/src/web/search/providers/duckduckgo.ts +279 -0
- package/src/web/search/types.ts +2 -0
- package/src/modes/theme/dark.json +0 -95
- package/src/modes/theme/defaults/alabaster.json +0 -93
- package/src/modes/theme/defaults/amethyst.json +0 -96
- package/src/modes/theme/defaults/anthracite.json +0 -93
- package/src/modes/theme/defaults/basalt.json +0 -91
- package/src/modes/theme/defaults/birch.json +0 -95
- package/src/modes/theme/defaults/dark-abyss.json +0 -91
- package/src/modes/theme/defaults/dark-arctic.json +0 -104
- package/src/modes/theme/defaults/dark-aurora.json +0 -95
- package/src/modes/theme/defaults/dark-catppuccin.json +0 -107
- package/src/modes/theme/defaults/dark-cavern.json +0 -91
- package/src/modes/theme/defaults/dark-copper.json +0 -95
- package/src/modes/theme/defaults/dark-cosmos.json +0 -90
- package/src/modes/theme/defaults/dark-cyberpunk.json +0 -102
- package/src/modes/theme/defaults/dark-dracula.json +0 -98
- package/src/modes/theme/defaults/dark-eclipse.json +0 -91
- package/src/modes/theme/defaults/dark-ember.json +0 -95
- package/src/modes/theme/defaults/dark-equinox.json +0 -90
- package/src/modes/theme/defaults/dark-forest.json +0 -96
- package/src/modes/theme/defaults/dark-github.json +0 -105
- package/src/modes/theme/defaults/dark-gruvbox.json +0 -112
- package/src/modes/theme/defaults/dark-lavender.json +0 -95
- package/src/modes/theme/defaults/dark-lunar.json +0 -89
- package/src/modes/theme/defaults/dark-midnight.json +0 -95
- package/src/modes/theme/defaults/dark-monochrome.json +0 -94
- package/src/modes/theme/defaults/dark-monokai.json +0 -98
- package/src/modes/theme/defaults/dark-nebula.json +0 -90
- package/src/modes/theme/defaults/dark-nord.json +0 -97
- package/src/modes/theme/defaults/dark-ocean.json +0 -101
- package/src/modes/theme/defaults/dark-one.json +0 -100
- package/src/modes/theme/defaults/dark-poimandres.json +0 -141
- package/src/modes/theme/defaults/dark-rainforest.json +0 -91
- package/src/modes/theme/defaults/dark-reef.json +0 -91
- package/src/modes/theme/defaults/dark-retro.json +0 -92
- package/src/modes/theme/defaults/dark-rose-pine.json +0 -96
- package/src/modes/theme/defaults/dark-sakura.json +0 -95
- package/src/modes/theme/defaults/dark-slate.json +0 -95
- package/src/modes/theme/defaults/dark-solarized.json +0 -97
- package/src/modes/theme/defaults/dark-solstice.json +0 -90
- package/src/modes/theme/defaults/dark-starfall.json +0 -91
- package/src/modes/theme/defaults/dark-sunset.json +0 -99
- package/src/modes/theme/defaults/dark-swamp.json +0 -90
- package/src/modes/theme/defaults/dark-synthwave.json +0 -103
- package/src/modes/theme/defaults/dark-taiga.json +0 -91
- package/src/modes/theme/defaults/dark-terminal.json +0 -95
- package/src/modes/theme/defaults/dark-tokyo-night.json +0 -101
- package/src/modes/theme/defaults/dark-tundra.json +0 -91
- package/src/modes/theme/defaults/dark-twilight.json +0 -91
- package/src/modes/theme/defaults/dark-volcanic.json +0 -91
- package/src/modes/theme/defaults/graphite.json +0 -92
- package/src/modes/theme/defaults/light-arctic.json +0 -107
- package/src/modes/theme/defaults/light-aurora-day.json +0 -91
- package/src/modes/theme/defaults/light-canyon.json +0 -91
- package/src/modes/theme/defaults/light-catppuccin.json +0 -106
- package/src/modes/theme/defaults/light-cirrus.json +0 -90
- package/src/modes/theme/defaults/light-coral.json +0 -95
- package/src/modes/theme/defaults/light-cyberpunk.json +0 -96
- package/src/modes/theme/defaults/light-dawn.json +0 -90
- package/src/modes/theme/defaults/light-dunes.json +0 -91
- package/src/modes/theme/defaults/light-eucalyptus.json +0 -95
- package/src/modes/theme/defaults/light-forest.json +0 -100
- package/src/modes/theme/defaults/light-frost.json +0 -95
- package/src/modes/theme/defaults/light-github.json +0 -115
- package/src/modes/theme/defaults/light-glacier.json +0 -91
- package/src/modes/theme/defaults/light-gruvbox.json +0 -108
- package/src/modes/theme/defaults/light-haze.json +0 -90
- package/src/modes/theme/defaults/light-honeycomb.json +0 -95
- package/src/modes/theme/defaults/light-lagoon.json +0 -91
- package/src/modes/theme/defaults/light-lavender.json +0 -95
- package/src/modes/theme/defaults/light-meadow.json +0 -91
- package/src/modes/theme/defaults/light-mint.json +0 -95
- package/src/modes/theme/defaults/light-monochrome.json +0 -101
- package/src/modes/theme/defaults/light-ocean.json +0 -99
- package/src/modes/theme/defaults/light-one.json +0 -99
- package/src/modes/theme/defaults/light-opal.json +0 -91
- package/src/modes/theme/defaults/light-orchard.json +0 -91
- package/src/modes/theme/defaults/light-paper.json +0 -95
- package/src/modes/theme/defaults/light-poimandres.json +0 -141
- package/src/modes/theme/defaults/light-prism.json +0 -90
- package/src/modes/theme/defaults/light-retro.json +0 -98
- package/src/modes/theme/defaults/light-sand.json +0 -95
- package/src/modes/theme/defaults/light-savanna.json +0 -91
- package/src/modes/theme/defaults/light-solarized.json +0 -102
- package/src/modes/theme/defaults/light-soleil.json +0 -90
- package/src/modes/theme/defaults/light-sunset.json +0 -99
- package/src/modes/theme/defaults/light-synthwave.json +0 -98
- package/src/modes/theme/defaults/light-tokyo-night.json +0 -111
- package/src/modes/theme/defaults/light-wetland.json +0 -91
- package/src/modes/theme/defaults/light-zenith.json +0 -89
- package/src/modes/theme/defaults/limestone.json +0 -94
- package/src/modes/theme/defaults/mahogany.json +0 -97
- package/src/modes/theme/defaults/marble.json +0 -93
- package/src/modes/theme/defaults/obsidian.json +0 -91
- package/src/modes/theme/defaults/onyx.json +0 -91
- package/src/modes/theme/defaults/pearl.json +0 -93
- package/src/modes/theme/defaults/porcelain.json +0 -91
- package/src/modes/theme/defaults/quartz.json +0 -96
- package/src/modes/theme/defaults/sandstone.json +0 -95
- package/src/modes/theme/defaults/titanium.json +0 -90
- package/src/modes/theme/light.json +0 -93
|
@@ -1,201 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
import amethyst from "./amethyst.json" with { type: "json" };
|
|
3
|
-
import anthracite from "./anthracite.json" with { type: "json" };
|
|
4
|
-
import basalt from "./basalt.json" with { type: "json" };
|
|
5
|
-
import birch from "./birch.json" with { type: "json" };
|
|
6
|
-
import dark_abyss from "./dark-abyss.json" with { type: "json" };
|
|
7
|
-
import dark_arctic from "./dark-arctic.json" with { type: "json" };
|
|
8
|
-
import dark_aurora from "./dark-aurora.json" with { type: "json" };
|
|
9
|
-
import dark_catppuccin from "./dark-catppuccin.json" with { type: "json" };
|
|
10
|
-
import dark_cavern from "./dark-cavern.json" with { type: "json" };
|
|
11
|
-
import dark_copper from "./dark-copper.json" with { type: "json" };
|
|
12
|
-
import dark_cosmos from "./dark-cosmos.json" with { type: "json" };
|
|
13
|
-
import dark_cyberpunk from "./dark-cyberpunk.json" with { type: "json" };
|
|
14
|
-
import dark_dracula from "./dark-dracula.json" with { type: "json" };
|
|
15
|
-
import dark_eclipse from "./dark-eclipse.json" with { type: "json" };
|
|
16
|
-
import dark_ember from "./dark-ember.json" with { type: "json" };
|
|
17
|
-
import dark_equinox from "./dark-equinox.json" with { type: "json" };
|
|
18
|
-
import dark_forest from "./dark-forest.json" with { type: "json" };
|
|
19
|
-
import dark_github from "./dark-github.json" with { type: "json" };
|
|
20
|
-
import dark_gruvbox from "./dark-gruvbox.json" with { type: "json" };
|
|
21
|
-
import dark_lavender from "./dark-lavender.json" with { type: "json" };
|
|
22
|
-
import dark_lunar from "./dark-lunar.json" with { type: "json" };
|
|
23
|
-
import dark_midnight from "./dark-midnight.json" with { type: "json" };
|
|
24
|
-
import dark_monochrome from "./dark-monochrome.json" with { type: "json" };
|
|
25
|
-
import dark_monokai from "./dark-monokai.json" with { type: "json" };
|
|
26
|
-
import dark_nebula from "./dark-nebula.json" with { type: "json" };
|
|
27
|
-
import dark_nord from "./dark-nord.json" with { type: "json" };
|
|
28
|
-
import dark_ocean from "./dark-ocean.json" with { type: "json" };
|
|
29
|
-
import dark_one from "./dark-one.json" with { type: "json" };
|
|
30
|
-
import dark_poimandres from "./dark-poimandres.json" with { type: "json" };
|
|
31
|
-
import dark_rainforest from "./dark-rainforest.json" with { type: "json" };
|
|
32
|
-
import dark_reef from "./dark-reef.json" with { type: "json" };
|
|
33
|
-
import dark_retro from "./dark-retro.json" with { type: "json" };
|
|
34
|
-
import dark_rose_pine from "./dark-rose-pine.json" with { type: "json" };
|
|
35
|
-
import dark_sakura from "./dark-sakura.json" with { type: "json" };
|
|
36
|
-
import dark_slate from "./dark-slate.json" with { type: "json" };
|
|
37
|
-
import dark_solarized from "./dark-solarized.json" with { type: "json" };
|
|
38
|
-
import dark_solstice from "./dark-solstice.json" with { type: "json" };
|
|
39
|
-
import dark_starfall from "./dark-starfall.json" with { type: "json" };
|
|
40
|
-
import dark_sunset from "./dark-sunset.json" with { type: "json" };
|
|
41
|
-
import dark_swamp from "./dark-swamp.json" with { type: "json" };
|
|
42
|
-
import dark_synthwave from "./dark-synthwave.json" with { type: "json" };
|
|
43
|
-
import dark_taiga from "./dark-taiga.json" with { type: "json" };
|
|
44
|
-
import dark_terminal from "./dark-terminal.json" with { type: "json" };
|
|
45
|
-
import dark_tokyo_night from "./dark-tokyo-night.json" with { type: "json" };
|
|
46
|
-
import dark_tundra from "./dark-tundra.json" with { type: "json" };
|
|
47
|
-
import dark_twilight from "./dark-twilight.json" with { type: "json" };
|
|
48
|
-
import dark_volcanic from "./dark-volcanic.json" with { type: "json" };
|
|
49
|
-
import graphite from "./graphite.json" with { type: "json" };
|
|
50
|
-
import light_arctic from "./light-arctic.json" with { type: "json" };
|
|
51
|
-
import light_aurora_day from "./light-aurora-day.json" with { type: "json" };
|
|
52
|
-
import light_canyon from "./light-canyon.json" with { type: "json" };
|
|
53
|
-
import light_catppuccin from "./light-catppuccin.json" with { type: "json" };
|
|
54
|
-
import light_cirrus from "./light-cirrus.json" with { type: "json" };
|
|
55
|
-
import light_coral from "./light-coral.json" with { type: "json" };
|
|
56
|
-
import light_cyberpunk from "./light-cyberpunk.json" with { type: "json" };
|
|
57
|
-
import light_dawn from "./light-dawn.json" with { type: "json" };
|
|
58
|
-
import light_dunes from "./light-dunes.json" with { type: "json" };
|
|
59
|
-
import light_eucalyptus from "./light-eucalyptus.json" with { type: "json" };
|
|
60
|
-
import light_forest from "./light-forest.json" with { type: "json" };
|
|
61
|
-
import light_frost from "./light-frost.json" with { type: "json" };
|
|
62
|
-
import light_github from "./light-github.json" with { type: "json" };
|
|
63
|
-
import light_glacier from "./light-glacier.json" with { type: "json" };
|
|
64
|
-
import light_gruvbox from "./light-gruvbox.json" with { type: "json" };
|
|
65
|
-
import light_haze from "./light-haze.json" with { type: "json" };
|
|
66
|
-
import light_honeycomb from "./light-honeycomb.json" with { type: "json" };
|
|
67
|
-
import light_lagoon from "./light-lagoon.json" with { type: "json" };
|
|
68
|
-
import light_lavender from "./light-lavender.json" with { type: "json" };
|
|
69
|
-
import light_meadow from "./light-meadow.json" with { type: "json" };
|
|
70
|
-
import light_mint from "./light-mint.json" with { type: "json" };
|
|
71
|
-
import light_monochrome from "./light-monochrome.json" with { type: "json" };
|
|
72
|
-
import light_ocean from "./light-ocean.json" with { type: "json" };
|
|
73
|
-
import light_one from "./light-one.json" with { type: "json" };
|
|
74
|
-
import light_opal from "./light-opal.json" with { type: "json" };
|
|
75
|
-
import light_orchard from "./light-orchard.json" with { type: "json" };
|
|
76
|
-
import light_paper from "./light-paper.json" with { type: "json" };
|
|
77
|
-
import light_poimandres from "./light-poimandres.json" with { type: "json" };
|
|
78
|
-
import light_prism from "./light-prism.json" with { type: "json" };
|
|
79
|
-
import light_retro from "./light-retro.json" with { type: "json" };
|
|
80
|
-
import light_sand from "./light-sand.json" with { type: "json" };
|
|
81
|
-
import light_savanna from "./light-savanna.json" with { type: "json" };
|
|
82
|
-
import light_solarized from "./light-solarized.json" with { type: "json" };
|
|
83
|
-
import light_soleil from "./light-soleil.json" with { type: "json" };
|
|
84
|
-
import light_sunset from "./light-sunset.json" with { type: "json" };
|
|
85
|
-
import light_synthwave from "./light-synthwave.json" with { type: "json" };
|
|
86
|
-
import light_tokyo_night from "./light-tokyo-night.json" with { type: "json" };
|
|
87
|
-
import light_wetland from "./light-wetland.json" with { type: "json" };
|
|
88
|
-
import light_zenith from "./light-zenith.json" with { type: "json" };
|
|
89
|
-
import limestone from "./limestone.json" with { type: "json" };
|
|
90
|
-
import mahogany from "./mahogany.json" with { type: "json" };
|
|
91
|
-
import marble from "./marble.json" with { type: "json" };
|
|
92
|
-
import obsidian from "./obsidian.json" with { type: "json" };
|
|
93
|
-
import onyx from "./onyx.json" with { type: "json" };
|
|
94
|
-
import pearl from "./pearl.json" with { type: "json" };
|
|
95
|
-
import porcelain from "./porcelain.json" with { type: "json" };
|
|
96
|
-
import quartz from "./quartz.json" with { type: "json" };
|
|
1
|
+
import blue_crab from "./blue-crab.json" with { type: "json" };
|
|
97
2
|
import red_claw from "./red-claw.json" with { type: "json" };
|
|
98
|
-
import sandstone from "./sandstone.json" with { type: "json" };
|
|
99
|
-
import titanium from "./titanium.json" with { type: "json" };
|
|
100
3
|
|
|
101
4
|
export const defaultThemes = {
|
|
102
|
-
|
|
103
|
-
amethyst: amethyst,
|
|
104
|
-
anthracite: anthracite,
|
|
105
|
-
basalt: basalt,
|
|
106
|
-
birch: birch,
|
|
107
|
-
"dark-abyss": dark_abyss,
|
|
108
|
-
"dark-arctic": dark_arctic,
|
|
109
|
-
"dark-aurora": dark_aurora,
|
|
110
|
-
"dark-catppuccin": dark_catppuccin,
|
|
111
|
-
"dark-cavern": dark_cavern,
|
|
112
|
-
"dark-copper": dark_copper,
|
|
113
|
-
"dark-cosmos": dark_cosmos,
|
|
114
|
-
"dark-cyberpunk": dark_cyberpunk,
|
|
115
|
-
"dark-dracula": dark_dracula,
|
|
116
|
-
"dark-eclipse": dark_eclipse,
|
|
117
|
-
"dark-ember": dark_ember,
|
|
118
|
-
"dark-equinox": dark_equinox,
|
|
119
|
-
"dark-forest": dark_forest,
|
|
120
|
-
"dark-github": dark_github,
|
|
121
|
-
"dark-gruvbox": dark_gruvbox,
|
|
122
|
-
"dark-lavender": dark_lavender,
|
|
123
|
-
"dark-lunar": dark_lunar,
|
|
124
|
-
"dark-midnight": dark_midnight,
|
|
125
|
-
"dark-monochrome": dark_monochrome,
|
|
126
|
-
"dark-monokai": dark_monokai,
|
|
127
|
-
"dark-nebula": dark_nebula,
|
|
128
|
-
"dark-nord": dark_nord,
|
|
129
|
-
"dark-ocean": dark_ocean,
|
|
130
|
-
"dark-one": dark_one,
|
|
131
|
-
"dark-poimandres": dark_poimandres,
|
|
132
|
-
"dark-rainforest": dark_rainforest,
|
|
133
|
-
"dark-reef": dark_reef,
|
|
134
|
-
"dark-retro": dark_retro,
|
|
135
|
-
"dark-rose-pine": dark_rose_pine,
|
|
136
|
-
"dark-sakura": dark_sakura,
|
|
137
|
-
"dark-slate": dark_slate,
|
|
138
|
-
"dark-solarized": dark_solarized,
|
|
139
|
-
"dark-solstice": dark_solstice,
|
|
140
|
-
"dark-starfall": dark_starfall,
|
|
141
|
-
"dark-sunset": dark_sunset,
|
|
142
|
-
"dark-swamp": dark_swamp,
|
|
143
|
-
"dark-synthwave": dark_synthwave,
|
|
144
|
-
"dark-taiga": dark_taiga,
|
|
145
|
-
"dark-terminal": dark_terminal,
|
|
146
|
-
"dark-tokyo-night": dark_tokyo_night,
|
|
147
|
-
"dark-tundra": dark_tundra,
|
|
148
|
-
"dark-twilight": dark_twilight,
|
|
149
|
-
"dark-volcanic": dark_volcanic,
|
|
150
|
-
graphite: graphite,
|
|
151
|
-
"light-arctic": light_arctic,
|
|
152
|
-
"light-aurora-day": light_aurora_day,
|
|
153
|
-
"light-canyon": light_canyon,
|
|
154
|
-
"light-catppuccin": light_catppuccin,
|
|
155
|
-
"light-cirrus": light_cirrus,
|
|
156
|
-
"light-coral": light_coral,
|
|
157
|
-
"light-cyberpunk": light_cyberpunk,
|
|
158
|
-
"light-dawn": light_dawn,
|
|
159
|
-
"light-dunes": light_dunes,
|
|
160
|
-
"light-eucalyptus": light_eucalyptus,
|
|
161
|
-
"light-forest": light_forest,
|
|
162
|
-
"light-frost": light_frost,
|
|
163
|
-
"light-github": light_github,
|
|
164
|
-
"light-glacier": light_glacier,
|
|
165
|
-
"light-gruvbox": light_gruvbox,
|
|
166
|
-
"light-haze": light_haze,
|
|
167
|
-
"light-honeycomb": light_honeycomb,
|
|
168
|
-
"light-lagoon": light_lagoon,
|
|
169
|
-
"light-lavender": light_lavender,
|
|
170
|
-
"light-meadow": light_meadow,
|
|
171
|
-
"light-mint": light_mint,
|
|
172
|
-
"light-monochrome": light_monochrome,
|
|
173
|
-
"light-ocean": light_ocean,
|
|
174
|
-
"light-one": light_one,
|
|
175
|
-
"light-opal": light_opal,
|
|
176
|
-
"light-orchard": light_orchard,
|
|
177
|
-
"light-paper": light_paper,
|
|
178
|
-
"light-poimandres": light_poimandres,
|
|
179
|
-
"light-prism": light_prism,
|
|
180
|
-
"light-retro": light_retro,
|
|
181
|
-
"light-sand": light_sand,
|
|
182
|
-
"light-savanna": light_savanna,
|
|
183
|
-
"light-solarized": light_solarized,
|
|
184
|
-
"light-soleil": light_soleil,
|
|
185
|
-
"light-sunset": light_sunset,
|
|
186
|
-
"light-synthwave": light_synthwave,
|
|
187
|
-
"light-tokyo-night": light_tokyo_night,
|
|
188
|
-
"light-wetland": light_wetland,
|
|
189
|
-
"light-zenith": light_zenith,
|
|
190
|
-
limestone: limestone,
|
|
191
|
-
mahogany: mahogany,
|
|
192
|
-
marble: marble,
|
|
193
|
-
obsidian: obsidian,
|
|
194
|
-
onyx: onyx,
|
|
195
|
-
pearl: pearl,
|
|
196
|
-
porcelain: porcelain,
|
|
197
|
-
quartz: quartz,
|
|
5
|
+
"blue-crab": blue_crab,
|
|
198
6
|
"red-claw": red_claw,
|
|
199
|
-
sandstone: sandstone,
|
|
200
|
-
titanium: titanium,
|
|
201
7
|
};
|
package/src/modes/theme/theme.ts
CHANGED
|
@@ -14,9 +14,7 @@ import { adjustHsv, getCustomThemesDir, isEnoent, logger } from "@gajae-code/uti
|
|
|
14
14
|
import chalk from "chalk";
|
|
15
15
|
import * as z from "zod/v4";
|
|
16
16
|
// Embed theme JSON files at build time
|
|
17
|
-
import darkThemeJson from "./dark.json" with { type: "json" };
|
|
18
17
|
import { defaultThemes } from "./defaults";
|
|
19
|
-
import lightThemeJson from "./light.json" with { type: "json" };
|
|
20
18
|
import { resolveMermaidAscii } from "./mermaid-cache";
|
|
21
19
|
|
|
22
20
|
export { getLanguageFromPath } from "../../utils/lang-from-path";
|
|
@@ -1547,8 +1545,6 @@ export class Theme {
|
|
|
1547
1545
|
// ============================================================================
|
|
1548
1546
|
|
|
1549
1547
|
const BUILTIN_THEMES: Record<string, ThemeJson> = {
|
|
1550
|
-
dark: darkThemeJson as ThemeJson,
|
|
1551
|
-
light: lightThemeJson as ThemeJson,
|
|
1552
1548
|
...(defaultThemes as Record<string, ThemeJson>),
|
|
1553
1549
|
};
|
|
1554
1550
|
|
|
@@ -1646,7 +1642,7 @@ async function loadThemeJson(name: string): Promise<ThemeJson> {
|
|
|
1646
1642
|
errorMessage += `\nMissing required color tokens:\n`;
|
|
1647
1643
|
errorMessage += missingColors.map(c => ` - ${c}`).join("\n");
|
|
1648
1644
|
errorMessage += `\n\nPlease add these colors to your theme's "colors" object.`;
|
|
1649
|
-
errorMessage += `\nSee the built-in themes (
|
|
1645
|
+
errorMessage += `\nSee the built-in themes (red-claw.json, blue-crab.json) for reference values.`;
|
|
1650
1646
|
}
|
|
1651
1647
|
if (otherErrors.length > 0) {
|
|
1652
1648
|
errorMessage += `\n\nOther errors:\n${otherErrors.join("\n")}`;
|
|
@@ -1758,6 +1754,10 @@ function getDefaultTheme(): string {
|
|
|
1758
1754
|
return bg === "light" ? autoLightTheme : autoDarkTheme;
|
|
1759
1755
|
}
|
|
1760
1756
|
|
|
1757
|
+
export function getDetectedThemeSettingsPath(): "theme.dark" | "theme.light" {
|
|
1758
|
+
return detectTerminalBackground() === "light" ? "theme.light" : "theme.dark";
|
|
1759
|
+
}
|
|
1760
|
+
|
|
1761
1761
|
// ============================================================================
|
|
1762
1762
|
// Global Theme Instance
|
|
1763
1763
|
// ============================================================================
|
|
@@ -1776,9 +1776,10 @@ var themeReloadTimer: NodeJS.Timeout | undefined;
|
|
|
1776
1776
|
var sigwinchHandler: (() => void) | undefined;
|
|
1777
1777
|
var autoDetectedTheme: boolean = false;
|
|
1778
1778
|
var autoDarkTheme: string = "red-claw";
|
|
1779
|
-
var autoLightTheme: string = "
|
|
1779
|
+
var autoLightTheme: string = "blue-crab";
|
|
1780
1780
|
var onThemeChangeCallback: (() => void) | undefined;
|
|
1781
1781
|
var themeLoadRequestId: number = 0;
|
|
1782
|
+
var previewThemeActive: boolean = false;
|
|
1782
1783
|
|
|
1783
1784
|
function getCurrentThemeOptions(): CreateThemeOptions {
|
|
1784
1785
|
return {
|
|
@@ -1796,8 +1797,9 @@ export async function initTheme(
|
|
|
1796
1797
|
): Promise<void> {
|
|
1797
1798
|
autoDetectedTheme = true;
|
|
1798
1799
|
autoDarkTheme = darkTheme ?? "red-claw";
|
|
1799
|
-
autoLightTheme = lightTheme ?? "
|
|
1800
|
+
autoLightTheme = lightTheme ?? "blue-crab";
|
|
1800
1801
|
const name = getDefaultTheme();
|
|
1802
|
+
previewThemeActive = false;
|
|
1801
1803
|
currentThemeName = name;
|
|
1802
1804
|
currentSymbolPresetOverride = symbolPreset;
|
|
1803
1805
|
currentColorBlindMode = colorBlindMode ?? false;
|
|
@@ -1808,9 +1810,9 @@ export async function initTheme(
|
|
|
1808
1810
|
startSigwinchListener();
|
|
1809
1811
|
}
|
|
1810
1812
|
} catch (err) {
|
|
1811
|
-
logger.debug("Theme loading failed, falling back to
|
|
1812
|
-
currentThemeName = "
|
|
1813
|
-
theme = await loadTheme("
|
|
1813
|
+
logger.debug("Theme loading failed, falling back to red-claw theme", { error: String(err) });
|
|
1814
|
+
currentThemeName = "red-claw";
|
|
1815
|
+
theme = await loadTheme("red-claw", getCurrentThemeOptions());
|
|
1814
1816
|
// Don't start watcher for fallback theme
|
|
1815
1817
|
}
|
|
1816
1818
|
}
|
|
@@ -1820,6 +1822,7 @@ export async function setTheme(
|
|
|
1820
1822
|
enableWatcher: boolean = false,
|
|
1821
1823
|
): Promise<{ success: boolean; error?: string }> {
|
|
1822
1824
|
autoDetectedTheme = false;
|
|
1825
|
+
previewThemeActive = false;
|
|
1823
1826
|
currentThemeName = name;
|
|
1824
1827
|
const requestId = ++themeLoadRequestId;
|
|
1825
1828
|
try {
|
|
@@ -1839,9 +1842,9 @@ export async function setTheme(
|
|
|
1839
1842
|
if (requestId !== themeLoadRequestId) {
|
|
1840
1843
|
return { success: false, error: "Theme change superseded by a newer request" };
|
|
1841
1844
|
}
|
|
1842
|
-
// Theme is invalid - fall back to
|
|
1843
|
-
currentThemeName = "
|
|
1844
|
-
theme = await loadTheme("
|
|
1845
|
+
// Theme is invalid - fall back to red-claw theme
|
|
1846
|
+
currentThemeName = "red-claw";
|
|
1847
|
+
theme = await loadTheme("red-claw", getCurrentThemeOptions());
|
|
1845
1848
|
// Don't start watcher for fallback theme
|
|
1846
1849
|
return {
|
|
1847
1850
|
success: false,
|
|
@@ -1858,6 +1861,7 @@ export async function previewTheme(name: string): Promise<{ success: boolean; er
|
|
|
1858
1861
|
return { success: false, error: "Theme preview superseded by a newer request" };
|
|
1859
1862
|
}
|
|
1860
1863
|
theme = loadedTheme;
|
|
1864
|
+
previewThemeActive = true;
|
|
1861
1865
|
if (onThemeChangeCallback) {
|
|
1862
1866
|
onThemeChangeCallback();
|
|
1863
1867
|
}
|
|
@@ -1873,6 +1877,32 @@ export async function previewTheme(name: string): Promise<{ success: boolean; er
|
|
|
1873
1877
|
}
|
|
1874
1878
|
}
|
|
1875
1879
|
|
|
1880
|
+
export async function restoreThemePreview(name: string): Promise<{ success: boolean; error?: string }> {
|
|
1881
|
+
const resolvedName = autoDetectedTheme ? getDefaultTheme() : name;
|
|
1882
|
+
const requestId = ++themeLoadRequestId;
|
|
1883
|
+
try {
|
|
1884
|
+
const loadedTheme = await loadTheme(resolvedName, getCurrentThemeOptions());
|
|
1885
|
+
if (requestId !== themeLoadRequestId) {
|
|
1886
|
+
return { success: false, error: "Theme preview restore superseded by a newer request" };
|
|
1887
|
+
}
|
|
1888
|
+
theme = loadedTheme;
|
|
1889
|
+
currentThemeName = resolvedName;
|
|
1890
|
+
previewThemeActive = false;
|
|
1891
|
+
if (onThemeChangeCallback) {
|
|
1892
|
+
onThemeChangeCallback();
|
|
1893
|
+
}
|
|
1894
|
+
return { success: true };
|
|
1895
|
+
} catch (error) {
|
|
1896
|
+
if (requestId !== themeLoadRequestId) {
|
|
1897
|
+
return { success: false, error: "Theme preview restore superseded by a newer request" };
|
|
1898
|
+
}
|
|
1899
|
+
return {
|
|
1900
|
+
success: false,
|
|
1901
|
+
error: error instanceof Error ? error.message : String(error),
|
|
1902
|
+
};
|
|
1903
|
+
}
|
|
1904
|
+
}
|
|
1905
|
+
|
|
1876
1906
|
/**
|
|
1877
1907
|
* Enable auto-detection mode, switching to the appropriate dark/light theme.
|
|
1878
1908
|
*/
|
|
@@ -1904,6 +1934,7 @@ export function onTerminalAppearanceChange(mode: "dark" | "light"): void {
|
|
|
1904
1934
|
|
|
1905
1935
|
export function setThemeInstance(themeInstance: Theme): void {
|
|
1906
1936
|
autoDetectedTheme = false;
|
|
1937
|
+
previewThemeActive = false;
|
|
1907
1938
|
theme = themeInstance;
|
|
1908
1939
|
currentThemeName = "<in-memory>";
|
|
1909
1940
|
stopThemeWatcher();
|
|
@@ -1921,8 +1952,8 @@ export async function setSymbolPreset(preset: SymbolPreset): Promise<void> {
|
|
|
1921
1952
|
try {
|
|
1922
1953
|
theme = await loadTheme(currentThemeName, getCurrentThemeOptions());
|
|
1923
1954
|
} catch {
|
|
1924
|
-
// Fall back to
|
|
1925
|
-
theme = await loadTheme("
|
|
1955
|
+
// Fall back to red-claw theme with new preset
|
|
1956
|
+
theme = await loadTheme("red-claw", getCurrentThemeOptions());
|
|
1926
1957
|
}
|
|
1927
1958
|
if (onThemeChangeCallback) {
|
|
1928
1959
|
onThemeChangeCallback();
|
|
@@ -1947,8 +1978,8 @@ export async function setColorBlindMode(enabled: boolean): Promise<void> {
|
|
|
1947
1978
|
try {
|
|
1948
1979
|
theme = await loadTheme(currentThemeName, getCurrentThemeOptions());
|
|
1949
1980
|
} catch {
|
|
1950
|
-
// Fall back to
|
|
1951
|
-
theme = await loadTheme("
|
|
1981
|
+
// Fall back to red-claw theme
|
|
1982
|
+
theme = await loadTheme("red-claw", getCurrentThemeOptions());
|
|
1952
1983
|
}
|
|
1953
1984
|
if (onThemeChangeCallback) {
|
|
1954
1985
|
onThemeChangeCallback();
|
|
@@ -1984,8 +2015,8 @@ export function isValidSymbolPreset(preset: string): preset is SymbolPreset {
|
|
|
1984
2015
|
async function startThemeWatcher(): Promise<void> {
|
|
1985
2016
|
stopThemeWatcher();
|
|
1986
2017
|
|
|
1987
|
-
// Only watch
|
|
1988
|
-
if (!currentThemeName || currentThemeName
|
|
2018
|
+
// Only watch custom themes (not built-ins)
|
|
2019
|
+
if (!currentThemeName || currentThemeName in getBuiltinThemes()) {
|
|
1989
2020
|
return;
|
|
1990
2021
|
}
|
|
1991
2022
|
|
|
@@ -2056,16 +2087,20 @@ async function startThemeWatcher(): Promise<void> {
|
|
|
2056
2087
|
function reevaluateAutoTheme(debugLabel: string): void {
|
|
2057
2088
|
if (!autoDetectedTheme) return;
|
|
2058
2089
|
const resolved = getDefaultTheme();
|
|
2059
|
-
|
|
2090
|
+
const requestId = ++themeLoadRequestId;
|
|
2091
|
+
if (resolved === currentThemeName && !previewThemeActive) return;
|
|
2060
2092
|
currentThemeName = resolved;
|
|
2061
2093
|
loadTheme(resolved, getCurrentThemeOptions())
|
|
2062
2094
|
.then(loadedTheme => {
|
|
2095
|
+
if (requestId !== themeLoadRequestId) return;
|
|
2063
2096
|
theme = loadedTheme;
|
|
2097
|
+
previewThemeActive = false;
|
|
2064
2098
|
if (onThemeChangeCallback) {
|
|
2065
2099
|
onThemeChangeCallback();
|
|
2066
2100
|
}
|
|
2067
2101
|
})
|
|
2068
2102
|
.catch(err => {
|
|
2103
|
+
if (requestId !== themeLoadRequestId) return;
|
|
2069
2104
|
logger.debug(`Theme switch on ${debugLabel} failed`, { error: String(err) });
|
|
2070
2105
|
});
|
|
2071
2106
|
}
|
|
@@ -2191,8 +2226,8 @@ function ansi256ToHex(index: number): string {
|
|
|
2191
2226
|
*/
|
|
2192
2227
|
export async function getResolvedThemeColors(themeName?: string): Promise<Record<string, string>> {
|
|
2193
2228
|
const name = themeName ?? getDefaultTheme();
|
|
2194
|
-
const isLight = name === "light";
|
|
2195
2229
|
const themeJson = await loadThemeJson(name);
|
|
2230
|
+
const isLight = isThemeJsonLight(themeJson);
|
|
2196
2231
|
const resolved = resolveThemeColors(themeJson.colors, themeJson.vars);
|
|
2197
2232
|
|
|
2198
2233
|
// Default text color for empty values (terminal uses default fg color)
|
|
@@ -2216,21 +2251,7 @@ export async function getResolvedThemeColors(themeName?: string): Promise<Record
|
|
|
2216
2251
|
* Check if a theme is a "light" theme by analyzing its background color luminance.
|
|
2217
2252
|
* Loads theme JSON synchronously (built-in or custom file) and resolves userMessageBg.
|
|
2218
2253
|
*/
|
|
2219
|
-
|
|
2220
|
-
const name = themeName ?? "dark";
|
|
2221
|
-
const builtinThemes = getBuiltinThemes();
|
|
2222
|
-
let themeJson: ThemeJson | undefined;
|
|
2223
|
-
if (name in builtinThemes) {
|
|
2224
|
-
themeJson = builtinThemes[name];
|
|
2225
|
-
} else {
|
|
2226
|
-
try {
|
|
2227
|
-
const customPath = path.join(getCustomThemesDir(), `${name}.json`);
|
|
2228
|
-
const content = fs.readFileSync(customPath, "utf-8");
|
|
2229
|
-
themeJson = JSON.parse(content) as ThemeJson;
|
|
2230
|
-
} catch {
|
|
2231
|
-
return false;
|
|
2232
|
-
}
|
|
2233
|
-
}
|
|
2254
|
+
function isThemeJsonLight(themeJson: ThemeJson): boolean {
|
|
2234
2255
|
try {
|
|
2235
2256
|
const resolved = resolveVarRefs(themeJson.colors.userMessageBg, themeJson.vars ?? {});
|
|
2236
2257
|
if (typeof resolved !== "string" || !resolved.startsWith("#") || resolved.length !== 7) return false;
|
|
@@ -2245,6 +2266,24 @@ export function isLightTheme(themeName?: string): boolean {
|
|
|
2245
2266
|
}
|
|
2246
2267
|
}
|
|
2247
2268
|
|
|
2269
|
+
export function isLightTheme(themeName?: string, agentDir?: string): boolean {
|
|
2270
|
+
const name = themeName ?? "red-claw";
|
|
2271
|
+
const builtinThemes = getBuiltinThemes();
|
|
2272
|
+
let themeJson: ThemeJson | undefined;
|
|
2273
|
+
if (name in builtinThemes) {
|
|
2274
|
+
themeJson = builtinThemes[name];
|
|
2275
|
+
} else {
|
|
2276
|
+
try {
|
|
2277
|
+
const customPath = path.join(getCustomThemesDir(agentDir), `${name}.json`);
|
|
2278
|
+
const content = fs.readFileSync(customPath, "utf-8");
|
|
2279
|
+
themeJson = JSON.parse(content) as ThemeJson;
|
|
2280
|
+
} catch {
|
|
2281
|
+
return false;
|
|
2282
|
+
}
|
|
2283
|
+
}
|
|
2284
|
+
return isThemeJsonLight(themeJson);
|
|
2285
|
+
}
|
|
2286
|
+
|
|
2248
2287
|
/**
|
|
2249
2288
|
* Get explicit export colors from theme JSON, if specified.
|
|
2250
2289
|
* Returns undefined for each color that isn't explicitly set.
|
package/src/modes/types.ts
CHANGED
|
@@ -86,6 +86,7 @@ export interface InteractiveModeContext {
|
|
|
86
86
|
isInitialized: boolean;
|
|
87
87
|
isBackgrounded: boolean;
|
|
88
88
|
isBashMode: boolean;
|
|
89
|
+
isBashNoContext: boolean;
|
|
89
90
|
toolOutputExpanded: boolean;
|
|
90
91
|
todoExpanded: boolean;
|
|
91
92
|
planModeEnabled: boolean;
|
|
@@ -231,6 +232,7 @@ export interface InteractiveModeContext {
|
|
|
231
232
|
|
|
232
233
|
// Selector handling
|
|
233
234
|
showSettingsSelector(): void;
|
|
235
|
+
showThemeSelector(): void;
|
|
234
236
|
showHistorySearch(): void;
|
|
235
237
|
showExtensionsDashboard(): void;
|
|
236
238
|
showAgentsDashboard(): void;
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: architect
|
|
3
3
|
description: Read-only architecture and code-review agent with severity-rated findings and status verdicts
|
|
4
|
-
tools: read, search, find, lsp, ast_grep, web_search, report_finding
|
|
4
|
+
tools: read, search, find, lsp, ast_grep, web_search, bash, report_finding
|
|
5
5
|
thinking-level: high
|
|
6
6
|
blocking: true
|
|
7
7
|
forkContext: allowed
|
|
8
|
+
bashAllowedPrefixes:
|
|
9
|
+
- gjc ralplan --write
|
|
10
|
+
- gjc state
|
|
8
11
|
---
|
|
9
12
|
<identity>
|
|
10
13
|
You are Architect. You combine system architecture review with code-review discipline. Diagnose, analyze, and recommend with file-backed evidence. You are read-only.
|
|
@@ -22,6 +25,7 @@ You may receive a forked parent-conversation snapshot as background. Your read-o
|
|
|
22
25
|
|
|
23
26
|
<constraints>
|
|
24
27
|
- Read-only: never write, edit, format, commit, push, or mutate files.
|
|
28
|
+
- Exception: you may use the restricted `bash` tool only for sanctioned GJC workflow CLI persistence (`gjc ralplan --write ...`) and GJC workflow state read/write/contract commands (`gjc state ...`). For `gjc ralplan --write`, pass the verdict markdown inline in `--artifact`, not as a file path. Do not use bash for product-source writes, direct handoffs, state clears, or general shell work.
|
|
25
29
|
- Never approve code or plans you have not grounded in inspected files.
|
|
26
30
|
- Never give generic advice detached from this codebase.
|
|
27
31
|
- Never approve CRITICAL or HIGH severity issues.
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: critic
|
|
3
3
|
description: Read-only plan critic that approves only actionable, verifiable execution plans
|
|
4
|
-
tools: read, search, find, lsp, ast_grep, web_search
|
|
4
|
+
tools: read, search, find, lsp, ast_grep, web_search, bash
|
|
5
5
|
thinking-level: high
|
|
6
|
+
bashAllowedPrefixes:
|
|
7
|
+
- gjc ralplan --write
|
|
8
|
+
- gjc state
|
|
6
9
|
---
|
|
7
10
|
<identity>
|
|
8
11
|
You are Critic. Decide whether a work plan is actionable before execution begins.
|
|
@@ -14,6 +17,7 @@ Review plan clarity, completeness, verification, big-picture fit, referenced fil
|
|
|
14
17
|
|
|
15
18
|
<constraints>
|
|
16
19
|
- Read-only: do not write, edit, format, commit, push, or mutate files.
|
|
20
|
+
- Exception: you may use the restricted `bash` tool only for sanctioned GJC workflow CLI persistence (`gjc ralplan --write ...`) and GJC workflow state read/write/contract commands (`gjc state ...`). For `gjc ralplan --write`, pass the evaluation markdown inline in `--artifact`, not as a file path. Do not use bash for product-source writes, direct handoffs, state clears, or general shell work.
|
|
17
21
|
- A lone file path is valid input; read and evaluate it.
|
|
18
22
|
- Reject YAML-only plans as invalid plan format when a human-readable plan is required.
|
|
19
23
|
- Do not invent problems; report no issues found when the plan passes.
|
|
@@ -9,5 +9,6 @@ description: {{jsonStringify description}}
|
|
|
9
9
|
{{/if}}{{#if hide}}hide: true
|
|
10
10
|
{{/if}}{{#if autoloadSkills}}autoloadSkills: {{jsonStringify autoloadSkills}}
|
|
11
11
|
{{/if}}{{#if forkContext}}forkContext: {{jsonStringify forkContext}}
|
|
12
|
+
{{/if}}{{#if bashAllowedPrefixes}}bashAllowedPrefixes: {{jsonStringify bashAllowedPrefixes}}
|
|
12
13
|
{{/if}}---
|
|
13
14
|
{{body}}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: planner
|
|
3
3
|
description: Read-only planning agent for sequencing, acceptance criteria, risks, and handoff shape
|
|
4
|
-
tools: read, search, find, lsp, ast_grep, web_search
|
|
4
|
+
tools: read, search, find, lsp, ast_grep, web_search, bash
|
|
5
5
|
thinking-level: medium
|
|
6
|
+
bashAllowedPrefixes:
|
|
7
|
+
- gjc ralplan --write
|
|
8
|
+
- gjc state
|
|
6
9
|
---
|
|
7
10
|
<identity>
|
|
8
11
|
You are Planner. Turn requests into actionable work plans. You plan; you do not implement.
|
|
@@ -14,6 +17,7 @@ Leave execution with a right-sized, evidence-grounded plan: scope, steps, accept
|
|
|
14
17
|
|
|
15
18
|
<constraints>
|
|
16
19
|
- Read-only: never write, edit, format, commit, push, or mutate files.
|
|
20
|
+
- Exception: you may use the restricted `bash` tool only for sanctioned GJC workflow CLI persistence (`gjc ralplan --write ...`) and GJC workflow state read/write/contract commands (`gjc state ...`). For `gjc ralplan --write`, pass the plan markdown inline in `--artifact`, not as a file path. Do not use bash for product-source writes, direct handoffs, state clears, or general shell work.
|
|
17
21
|
- Inspect the repository before asking about code facts.
|
|
18
22
|
- Ask only about priorities, tradeoffs, scope decisions, timelines, or preferences that repository inspection cannot resolve.
|
|
19
23
|
- Right-size the step count to the task; do not default to a fixed number of steps.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Memory Guidance
|
|
2
|
+
Memory root: memory://root
|
|
3
|
+
Status: local memory is enabled, but no confirmed memory payload is available for this project yet.
|
|
4
|
+
|
|
5
|
+
Operational rules:
|
|
6
|
+
1) Do not claim that a user preference, fact, or instruction has been saved, remembered, or persisted unless a backend operation or a non-empty memory payload confirms it.
|
|
7
|
+
2) If the user asks you to save or remember something now, explain that durable memory is not confirmed because local memory has no available payload/readback yet. You may use the instruction for the current session only.
|
|
8
|
+
3) If reading `memory://root` or `memory://root/memory_summary.md` fails, treat that as no confirmed memory, not as successful persistence.
|
|
9
|
+
4) The local backend consolidates prior session rollouts asynchronously; an empty payload is a degraded/unconfirmed state, not a successful save.
|
|
@@ -11,6 +11,15 @@ Executes bash command in shell session for terminal operations like git, bun, ca
|
|
|
11
11
|
- Use `async: true` for long-running commands when you don't need immediate output; the call returns a background job ID and the result is delivered automatically as a follow-up.
|
|
12
12
|
{{/if}}
|
|
13
13
|
</instruction>
|
|
14
|
+
{{#if restrictedAllowedPrefixes}}
|
|
15
|
+
<restricted-role-agent-mode>
|
|
16
|
+
This session's bash tool is restricted. It only accepts commands beginning with:
|
|
17
|
+
{{#each restrictedAllowedPrefixes}}
|
|
18
|
+
- `{{this}}`
|
|
19
|
+
{{/each}}
|
|
20
|
+
Use it only for sanctioned GJC workflow CLI persistence or state read/write/contract operations; per-command env overrides and all other shell command shapes are blocked before execution.
|
|
21
|
+
</restricted-role-agent-mode>
|
|
22
|
+
{{/if}}
|
|
14
23
|
|
|
15
24
|
<critical>
|
|
16
25
|
- NEVER use Linux coreutils (`cat`, `head`, `tail`, `less`, `more`, `ls`, `grep`, `rg`, `awk`, `sed`, `find`, `fd`, etc.) when a dedicated tool suffices — ALWAYS prefer `read`, `search`, `find`, `edit`, `write`.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
Schedule a prompt to fire on a recurring cron schedule, or one-shot at the next match. Cron tasks let you re-run a prompt automatically on an interval — poll a deployment, babysit a PR, check back on a long-running build, or remind yourself to do something later in the session.
|
|
2
|
+
|
|
3
|
+
`CronCreate` accepts a standard 5-field cron expression in your local timezone, the prompt to run, and whether the job recurs or fires once. It returns an 8-character job id you can pass to `CronDelete`. Each session can hold up to 50 scheduled tasks. Recurring tasks auto-expire 7 days after creation; one-shot tasks self-delete after firing.
|
|
4
|
+
|
|
5
|
+
`CronList` enumerates every scheduled task in the session. `CronDelete` cancels a task by id.
|
|
6
|
+
|
|
7
|
+
## Cron expressions
|
|
8
|
+
|
|
9
|
+
`CronCreate` accepts 5-field cron: `minute hour day-of-month month day-of-week`. All fields support `*`, single values (`5`), steps (`*/15`), ranges (`1-5`), and comma lists (`1,15,30`). Day-of-week uses `0`/`7` for Sunday through `6` for Saturday. Extended syntax like `L`, `W`, `?`, or month/weekday names is not supported.
|
|
10
|
+
|
|
11
|
+
| Example | Meaning |
|
|
12
|
+
| :------------ | :--------------------------- |
|
|
13
|
+
| `*/5 * * * *` | Every 5 minutes |
|
|
14
|
+
| `0 * * * *` | Every hour on the hour |
|
|
15
|
+
| `0 9 * * *` | Every day at 9am local |
|
|
16
|
+
| `0 9 * * 1-5` | Weekdays at 9am local |
|
|
17
|
+
|
|
18
|
+
## Lifecycle
|
|
19
|
+
|
|
20
|
+
- Tasks fire between turns, never mid-response.
|
|
21
|
+
- All times are interpreted in the local timezone.
|
|
22
|
+
- Recurring tasks fire with up to 30 minutes of deterministic jitter (or up to half their interval for sub-hourly tasks). One-shot tasks scheduled for `:00` or `:30` may fire up to 90 s early. Pick an off-minute if exact timing matters.
|
|
23
|
+
- Closing or replacing the session clears every scheduled task.
|
|
24
|
+
|
|
25
|
+
Disable the scheduler entirely via `CLAUDE_CODE_DISABLE_CRON=1`.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
Start a background monitor that streams events from a long-running script. Each stdout line is an event — you keep working and notifications arrive in the chat. Events arrive on their own schedule and are not replies from the user, even if one lands while you're waiting for the user to answer a question.
|
|
2
|
+
|
|
3
|
+
Pick by how many notifications you need:
|
|
4
|
+
- **One** ("tell me when the server is ready / the build finishes") → use `bash` with `async: true`. That returns a single completion notification when the command exits.
|
|
5
|
+
- **Many ongoing events** (logs, polling, file watching) → use `monitor`. The script keeps running and every new line of stdout becomes one event delivered into the conversation between turns.
|
|
6
|
+
|
|
7
|
+
`monitor` uses the same permission rules as `bash`. To stop a monitor, cancel its background task via `job` with the returned `task_id`, or end the session.
|
|
8
|
+
|
|
9
|
+
## When to reach for `monitor`
|
|
10
|
+
|
|
11
|
+
- Tail a log file and flag errors as they appear (`tail -F server.log | grep -i error`).
|
|
12
|
+
- Poll a PR or CI job and report when its status changes.
|
|
13
|
+
- Watch a directory for file changes (`fswatch -r dist/`).
|
|
14
|
+
- Track output from any long-running script you point it at.
|
|
15
|
+
|
|
16
|
+
## Inputs
|
|
17
|
+
|
|
18
|
+
- `command` (required): shell command to run as a background monitor. Each stdout line is delivered as a separate task-notification event.
|
|
19
|
+
- `kind` (required): one of `"log"`, `"poll"`, `"watch"`, `"other"`. Describes the monitoring strategy so listings can surface useful categories.
|
|
20
|
+
- `description` (required): short human-readable description of what is being monitored. Appears in task listings.
|
|
21
|
+
- `timeout` (optional): maximum wall-clock seconds the monitor may run before automatic shutdown. Omit for the session lifetime.
|
|
22
|
+
- `persistent` (optional, default `false`): keep the monitor running past the current turn. Persistent monitors survive until session end or until cancelled via `job`.
|
|
23
|
+
|
|
24
|
+
## Output
|
|
25
|
+
|
|
26
|
+
Returns `Monitor started · task <task_id>` plus a task entry visible via `job({op:"list"})`. Each stdout line of the monitored command becomes a `<task-notification>` event delivered between turns.
|
|
27
|
+
|
|
28
|
+
## Cancellation
|
|
29
|
+
|
|
30
|
+
There is no separate `monitor` kill tool. Cancel a running monitor with `job` using the returned `task_id`. Disposing the session also cancels every monitor the calling agent started.
|