1---2name: ase-meta-config3description: List, get, set, or delete the layered ASE configuration values across the user/project/task/session scope chain. Use when the user wants to "configure" ASE, or to inspect or change a configuration key like `agent.persona`, `agent.guidance`, `agent.task`, or `project.boxing`.4---5
6@${CLAUDE_SKILL_DIR}/../../meta/ase-control.md
7@${CLAUDE_SKILL_DIR}/../../meta/ase-skill.md
8@${CLAUDE_SKILL_DIR}/../../meta/ase-getopt.md
9
10<skill name="ase-meta-config">
11Configuration Management
12</skill>
13
14<expand name="getopt"
15 arg1="ase-meta-config"
16 arg2="--scope|-s=">
17 $ARGUMENTS
18</expand>
19
20<objective>
21*List*, *get*, *set*, or *delete* the values of the *layered
22configuration* of ASE, mirroring the non-interactive `ase config
23<operation>` CLI subcommands *exclusively* through the `ase` MCP server.
24</objective>
25
26Procedure
27---------
28
291. **Determine Operation:**
30
31 1. Set <arguments><getopt-arguments/></arguments>, with any leading
32 and trailing whitespace stripped. Split <arguments/> into
33 whitespace-separated tokens, honoring single and double quotes
34 (a quoted token is *one* token, with its surrounding quotes
35 removed). Set <operation/> to the *first* token, lower-cased,
36 and <operands/> to the list of the *remaining* tokens. If
37 <arguments/> is empty, set <operation>(none)</operation> and
38 <operands/> to the empty list. Inherit the always existing
39 <ase-session-id/> from the current context.
40 Do not output anything.
41
42 2. Determine the target scope chain:
43
44 <if condition="<getopt-option-scope/> is empty">
45 Set <scope>session:<ase-session-id/></scope>. Reads then cascade
46 `user` -> `project` -> `session`, and writes land on the *session*
47 layer -- the only layer on which the `agent.task` and `agent.skill`
48 keys are writable at all.
49 </if>
50 <else>
51 Set <scope><getopt-option-scope/></scope>, forwarding the given
52 scope chain verbatim.
53 </else>
54
55 Do not output anything.
56
57 3. You *MUST* *NOT* use `Bash`, `Read`, `Write`, `Edit`, or any
58 other filesystem-touching tool anywhere in this skill. *Every*
59 configuration access is performed *exclusively* through the
60 `ase_config_*` tools of the `ase` MCP server.
61 Do not output anything.
62
632. **Dispatch Operation:**
64
65 1. <if condition="<operation/> is `list` AND <operands/> is empty">
66 Call the `ase_config_list(scope: "<scope/>")` tool from the `ase`
67 MCP server. The result is a structured object with an `entries`
68 array where each entry has a `key`, a `value`, and a `scope` field.
69
70 - If the `entries` array is empty, output the following <template/>:
71
72 <template>
73 ⧉ **ASE**: ⚙ config (scope: `<scope/>`): *(none)*
74 </template>
75
76 - Else output the following <template/>, where each <key/>,
77 <value/>, and <entry-scope/> correspond to one entry of the
78 `entries` array, in the given order:
79
80 <template>
81 ⧉ **ASE**: ⚙ config (scope: `<scope/>`):
82
83 | *Key* | *Value* | *Scope* |
84 |------------------|------------------|------------------|
85 | `<key/>` | **<value/>** | `<entry-scope/>` |
86 | [...] | [...] | [...] |
87
88 </template>
89 </if>
90
91 2. <elseif condition="<operation/> is `get` AND <operands/> has exactly one token">
92 Set <key/> to the single token of <operands/>. Call the
93 `ase_config_get(key: "<key/>", scope: "<scope/>")` tool from the
94 `ase` MCP server and set <text/> to its `text` output field.
95
96 - If <text/> is empty, the key is not set at all. Output the
97 following <template/>:
98
99 <template>
100 ⧉ **ASE**: ⚙ config: `<key/>` (scope: `<scope/>`): *(not set)*
101 </template>
102
103 - Else set <value/> to the JSON-decoded <text/> and output the
104 following <template/>:
105
106 <template>
107 ⧉ **ASE**: ⚙ config: `<key/>` (scope: `<scope/>`): **<value/>**
108 </template>
109 </elseif>
110
111 3. <elseif condition="<operation/> is `set` AND <operands/> has exactly two tokens">
112 Set <key/> to the *first* and <value/> to the *second* token of
113 <operands/>. Call the `ase_config_set(key: "<key/>", val:
114 "<value/>", scope: "<scope/>")` tool from the `ase` MCP server.
115
116 Then, if <key/> is one of the three keys steering your *own*
117 behaviour, you *MUST* immediately adopt the new <value/> for
118 the remainder of the session -- *including* the output of this
119 very skill run -- by re-evaluating and internalizing the
120 corresponding rules of the constitution: for `agent.persona` set
121 <ase-persona-style><value/></ase-persona-style> and re-evaluate
122 the `Persona Communication Style` rules, for `agent.guidance` set
123 <ase-guidance-level><value/></ase-guidance-level> and re-evaluate
124 the `Guidance Hint Level` rules, and for `project.boxing` set
125 <ase-project-boxing><value/></ase-project-boxing> and re-evaluate
126 the `Artifact Boxing Transparency` rules. Do not output anything
127 for this.
128
129 Then only output the following <template/>:
130
131 <template>
132 ⧉ **ASE**: ⚙ config: `<key/>` (scope: `<scope/>`): **<value/>** (*updated*)
133 </template>
134 </elseif>
135
136 4. <elseif condition="<operation/> is `delete` AND <operands/> has exactly one token">
137 Set <key/> to the single token of <operands/>. Call the
138 `ase_config_delete(key: "<key/>", scope: "<scope/>")` tool from
139 the `ase` MCP server. Then only output the following <template/>:
140
141 <template>
142 ⧉ **ASE**: ⚙ config: `<key/>` (scope: `<scope/>`): (*deleted*)
143 </template>
144 </elseif>
145
146 5. <else>
147 The <operation/> is either missing, unknown, or was given with
148 the wrong number of operands. Notice that the `init` and `edit`
149 subcommands of the `ase config` CLI are deliberately *not*
150 mirrored by this skill. Only output the following <template/>
151 and then immediately *STOP* processing the entire current skill:
152
153 <template>
154 ⧉ **ASE**: ☻ skill: **ase-meta-config**, ▶ ERROR: invalid operation: **<operation/>** (expected `list`, `get <key>`, `set <key> <value>`, or `delete <key>`)
155 </template>
156 </else>