/settings-flow
Complete guide for adding, updating, and removing settings in OrcaQ. Covers the full data flow — type → constant → store → component — for all settings panels (Appearance, Editor, Quick Query, Agent). Load this skill for any task involving user preferences, persistent configs,
$ npx -y skills add cin12211/orca-q --skill settings-flow --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/settings-flow
Context preview
The summary Claude sees to decide when to auto-load this skill.
Complete guide for adding, updating, and removing settings in OrcaQ. Covers the full data flow — type → constant → store → component — for all settings panels (Appearance, Editor, Quick Query, Agent). Load this skill for any task involving user preferences, persistent configs,
SKILL.md
settings-flow.SKILL.mdname: settings-flow
description: Complete guide for adding, updating, and removing settings in OrcaQ. Covers the full data flow — type → constant → store → component — for all settings panels (Appearance, Editor, Quick Query, Agent). Load this skill for any task involving user preferences, persistent configs, or the settings modal.
Settings Flow — OrcaQ
Architecture Overview
Settings in OrcaQ follow a strict 4-layer flow:
types/settings.types.ts ← Define the shape / enum
constants/settings.constants.ts ← Default values & UI option arrays
core/stores/appConfigStore.ts ← Reactive state + reset actions (persisted)
components/modules/settings/ ← UI panels that read/write the store
All state is persisted automatically via `{ persist: true }` on the Pinia store — no manual localStorage calls needed.
---
File Locations
| Purpose | File | | ------------------------- | ------------------------------------------------------------------ | | Types & enums | `components/modules/settings/types/settings.types.ts` | | Constants & defaults | `components/modules/settings/constants/settings.constants.ts` | | Pinia store | `core/stores/appConfigStore.ts` | | Settings modal controller | `core/contexts/useSettingsModal.ts` | | Container (modal shell) | `components/modules/settings/containers/SettingsContainer.vue` | | Appearance panel | `components/modules/settings/components/AppearanceConfig.vue` | | Editor panel | `components/modules/settings/components/EditorConfig.vue` | | Quick Query panel | `components/modules/settings/components/QuickQueryConfig.vue` | | Agent panel | `components/modules/settings/components/AgentConfig.vue` | | Table Appearance panel | `components/modules/settings/components/TableAppearanceConfig.vue` | | Public module API | `components/modules/settings/index.ts` |
---
How to Add a New Setting
Step 1 — Define the type
In `components/modules/settings/types/settings.types.ts`:
// For a simple value — add a field to an existing interface
export interface CodeEditorConfigs {
theme: EditorTheme;
fontSize: number;
showMiniMap: boolean;
indentation: boolean;
wordWrap: boolean; // ← new field
}
// For an enum setting — add an enum
export enum WordWrapMode {
Off = 'off',
On = 'on',
Bounded = 'bounded',
}Step 2 — Add default value and options constant
In `components/modules/settings/constants/settings.constants.ts`:
// Default value (used in store initialisation and reset)
export const DEFAULT_EDITOR_CONFIG = {
...existingDefaults,
wordWrap: WordWrapMode.Off,
};
// Option array for UI dropdowns / toggles
export const WORD_WRAP_OPTIONS: Array<{ label: string; value: WordWrapMode }> =
[
{ label: 'Off', value: WordWrapMode.Off },
{ label: 'On', value: WordWrapMode.On },
{ label: 'Bounded', value: WordWrapMode.Bounded },
];Step 3 — Add to the Pinia store
In `core/stores/appConfigStore.ts`:
// Inside the store factory function, add the reactive field
const codeEditorConfigs = reactive<CodeEditorConfigs>({
...
wordWrap: DEFAULT_EDITOR_CONFIG.wordWrap, // ← new field
});
// Update the reset action
const resetCodeEditorConfigs = () => {
Object.assign(codeEditorConfigs, {
...
wordWrap: DEFAULT_EDITOR_CONFIG.wordWrap, // ← include in reset
});
};
// Make sure it is included in the return object (it already is if using the reactive object)Step 4 — Add UI in the correct panel component
In the relevant `*Config.vue` under `components/modules/settings/components/`:
<script setup lang="ts">
import { WORD_WRAP_OPTIONS } from '../constants';
const appConfigStore = useAppConfigStore();
</script>
<template>
<!-- Follow the standard settings row pattern -->
<div class="flex items-center justify-between gap-4">
<div class="flex flex-col gap-0.5">
<p class="text-sm">Word wrap</p>
<p class="text-xs text-muted-foreground">
Control how long lines are handled in the editor
</p>
</div>
<Select
:modelValue="appConfigStore.codeEditorConfigs.wordWrap"
@update:modelValue="appConfigStore.codeEditorConfigs.wordWrap = $event"
>
<SelectTrigger size="sm" class="h-6! cursor-pointer">
<SelectValue placeholder="Select word wrap mode" />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectItem
class="cursor-pointer h-6!"
v-for="opt in WORD_WRAP_OPTIONS"
:key="opt.value"
:value="opt.value"
>
{{ opt.label }}
</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
</div>
</template>---
How to Add a Brand New Settings Panel Tab
Step 1 — Add the component key enum value
// settings.types.ts
export enum SettingsComponentKey {
EditorConfig = 'EditorConfig',
QuickQueryConfig = 'QuickQueryConfig',
AgentConfig = 'AgentConfig',
AppearanceConfig = 'AppearanceConfig',
TableAppearanceConfig = 'TableAppearanceConfig',
MyNewConfig = 'MyNewConfig', // ← new
}Step 2 — Add to the nav items constant
// settings.constants.ts
export const SETTINGS_NAV_ITEMS: SettingsNavItem[] = [
...existingItems,
{
name: 'My New Section',
icon: 'hugeicons:some-icon',
componentKey: SettingsComponentKey.MyNewConfig,
},
];Step 3 — Create the panel component
Create `components/modules/settings/components/MyNewConfig.vue` following the standard visual pattern (see Standard UI Pattern below).
Step 4 — Register in the container
In `components/modules/settings/containers/SettingsContainer.vue`:
import M
Read more
name: settings-flow description: Complete guide for adding, updating, and removing settings in OrcaQ. Covers the full data flow — type → constant → store → component — for all settings panels (Appearance, Editor, Quick Query, Agent). Load this skill for any task involving user preferences, persistent configs, or the settings modal.
Settings Flow — OrcaQ
Architecture Overview
Settings in OrcaQ follow a strict 4-layer flow:
types/settings.types.ts ← Define the shape / enum constants/settings.constants.ts ← Default values & UI option arrays core/stores/appConfigStore.ts ← Reactive state + reset actions (persisted) components/modules/settings/ ← UI panels that read/write the store
All state is persisted automatically via `{ persist: true }` on the Pinia store — no manual localStorage calls needed.
---
File Locations
| Purpose | File | | ------------------------- | ------------------------------------------------------------------ | | Types & enums | `components/modules/settings/types/settings.types.ts` | | Constants & defaults | `components/modules/settings/constants/settings.constants.ts` | | Pinia store | `core/stores/appConfigStore.ts` | | Settings modal controller | `core/contexts/useSettingsModal.ts` | | Container (modal shell) | `components/modules/settings/containers/SettingsContainer.vue` | | Appearance panel | `components/modules/settings/components/AppearanceConfig.vue` | | Editor panel | `components/modules/settings/components/EditorConfig.vue` | | Quick Query panel | `components/modules/settings/components/QuickQueryConfig.vue` | | Agent panel | `components/modules/settings/components/AgentConfig.vue` | | Table Appearance panel | `components/modules/settings/components/TableAppearanceConfig.vue` | | Public module API | `components/modules/settings/index.ts` |
---
How to Add a New Setting
Step 1 — Define the type
In `components/modules/settings/types/settings.types.ts`:
// For a simple value — add a field to an existing interface
export interface CodeEditorConfigs {
theme: EditorTheme;
fontSize: number;
showMiniMap: boolean;
indentation: boolean;
wordWrap: boolean; // ← new field
}
// For an enum setting — add an enum
export enum WordWrapMode {
Off = 'off',
On = 'on',
Bounded = 'bounded',
}Step 2 — Add default value and options constant
In `components/modules/settings/constants/settings.constants.ts`:
// Default value (used in store initialisation and reset)
export const DEFAULT_EDITOR_CONFIG = {
...existingDefaults,
wordWrap: WordWrapMode.Off,
};
// Option array for UI dropdowns / toggles
export const WORD_WRAP_OPTIONS: Array<{ label: string; value: WordWrapMode }> =
[
{ label: 'Off', value: WordWrapMode.Off },
{ label: 'On', value: WordWrapMode.On },
{ label: 'Bounded', value: WordWrapMode.Bounded },
];Step 3 — Add to the Pinia store
In `core/stores/appConfigStore.ts`:
// Inside the store factory function, add the reactive field
const codeEditorConfigs = reactive<CodeEditorConfigs>({
...
wordWrap: DEFAULT_EDITOR_CONFIG.wordWrap, // ← new field
});
// Update the reset action
const resetCodeEditorConfigs = () => {
Object.assign(codeEditorConfigs, {
...
wordWrap: DEFAULT_EDITOR_CONFIG.wordWrap, // ← include in reset
});
};
// Make sure it is included in the return object (it already is if using the reactive object)Step 4 — Add UI in the correct panel component
In the relevant `*Config.vue` under `components/modules/settings/components/`:
<script setup lang="ts">
import { WORD_WRAP_OPTIONS } from '../constants';
const appConfigStore = useAppConfigStore();
</script>
<template>
<!-- Follow the standard settings row pattern -->
<div class="flex items-center justify-between gap-4">
<div class="flex flex-col gap-0.5">
<p class="text-sm">Word wrap</p>
<p class="text-xs text-muted-foreground">
Control how long lines are handled in the editor
</p>
</div>
<Select
:modelValue="appConfigStore.codeEditorConfigs.wordWrap"
@update:modelValue="appConfigStore.codeEditorConfigs.wordWrap = $event"
>
<SelectTrigger size="sm" class="h-6! cursor-pointer">
<SelectValue placeholder="Select word wrap mode" />
</SelectTrigger>
<SelectContent>
<SelectGroup>
<SelectItem
class="cursor-pointer h-6!"
v-for="opt in WORD_WRAP_OPTIONS"
:key="opt.value"
:value="opt.value"
>
{{ opt.label }}
</SelectItem>
</SelectGroup>
</SelectContent>
</Select>
</div>
</template>---
How to Add a Brand New Settings Panel Tab
Step 1 — Add the component key enum value
// settings.types.ts
export enum SettingsComponentKey {
EditorConfig = 'EditorConfig',
QuickQueryConfig = 'QuickQueryConfig',
AgentConfig = 'AgentConfig',
AppearanceConfig = 'AppearanceConfig',
TableAppearanceConfig = 'TableAppearanceConfig',
MyNewConfig = 'MyNewConfig', // ← new
}Step 2 — Add to the nav items constant
// settings.constants.ts
export const SETTINGS_NAV_ITEMS: SettingsNavItem[] = [
...existingItems,
{
name: 'My New Section',
icon: 'hugeicons:some-icon',
componentKey: SettingsComponentKey.MyNewConfig,
},
];Step 3 — Create the panel component
Create `components/modules/settings/components/MyNewConfig.vue` following the standard visual pattern (see Standard UI Pattern below).
Step 4 — Register in the container
In `components/modules/settings/containers/SettingsContainer.vue`:
import M
Repo: cin12211/orca-q
Other skills on orca-q.
- /accessibility-expert
WCAG 2.1/2.2 compliance, WAI-ARIA implementation, screen reader optimization, keyboard navigation, and accessibility testing expert. Use PROACTIVELY for accessibility violations, ARIA errors, keyboard navigation issues, screen reader compatibility problems, or accessibility
Open skill - /css-expert
CSS architecture and styling expert with deep knowledge of modern CSS features, responsive design, CSS-in-JS optimization, performance, accessibility, and design systems. Use PROACTIVELY for CSS layout issues, styling architecture, responsive design problems, CSS-in-JS
Open skill - /database-expert
Database performance optimization, schema design, query analysis, and connection management across PostgreSQL, MySQL, MongoDB, and SQLite with ORM integration. Use this skill for queries, indexes, connection pooling, transactions, and database architecture decisions.
Open skill - /documentation-expert
Expert in documentation structure, cohesion, flow, audience targeting, and information architecture. Use PROACTIVELY for documentation quality issues, content organization, duplication, navigation problems, or readability concerns. Detects documentation anti-patterns and
Open skill - /git-expert
Git expert with deep knowledge of merge conflicts, branching strategies, repository recovery, performance optimization, and security patterns. Use PROACTIVELY for any Git workflow issues including complex merge conflicts, history rewriting, collaboration patterns, and repository
Open skill - /graphify
Use for any question about a codebase, its architecture, file relationships, or project content — especially when graphify-out/ exists, where the question should be treated as a graphify query first. Turns any input (code, docs, papers, images, videos) into a persistent
Open skill

