Skip to content

Commit 985340d

Browse files
Refine QuickShell project setup and UI flows
1 parent 00d5c56 commit 985340d

132 files changed

Lines changed: 9374 additions & 1090 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.bob/mcp.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"mcpServers": {}
3+
}

.bobignore

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ _NCrunch_*/
161161
Thumbs.db
162162
desktop.ini
163163

164-
# Bob configuration always include
164+
# Bob configuration - always include
165165
!.bob/mcp.json
166166
!.bob/settings.json
167167

@@ -194,3 +194,7 @@ Podfile.lock
194194
Package.resolved
195195
packages.lock.json
196196
**/packages.lock.json
197+
198+
# Worktree files must be readable by Bob tools
199+
!.claude/
200+
!.claude/**

.codex/config.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,8 @@
66
type = "stdio"
77
command = "tessl"
88
args = [ "mcp", "start" ]
9+
10+
[mcp_servers.serena]
11+
type = "stdio"
12+
command = "serena"
13+
args = [ "start-mcp-server", "--context=codex", "--project-from-cwd" ]

.cursor/settings.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"plugins": {
3+
"cloudflare": {
4+
"enabled": true
5+
},
6+
"redis-development": {
7+
"enabled": true
8+
}
9+
}
10+
}

.gitignore

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,16 @@ pr9-review.md
4141
pr8-threads.json
4242
pr9-threads.json
4343
/.bob/.bob-errors
44+
/.bob/tmp
45+
/.bob/notes
4446
pr9-comments-latest.json
4547
tessl.json
4648
/.tmp/tasks
49+
tmp-dump.csx
50+
51+
# --- ltm-power ---
52+
ltm/store/*.jsonl
53+
ltm/runtime/*
54+
ltm/reports/*
55+
ltm/snapshots/*
56+
# --- /ltm-power ---
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"name": "LTM Post-Turn Capture",
3+
"version": "1.0.0",
4+
"description": "Records agent activity to LTM memory store after each turn",
5+
"when": { "type": "agentStop" },
6+
"then": {
7+
"type": "runCommand",
8+
"command": "python ltm/bin/ltm.py capture-turn"
9+
}
10+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
---
2+
inclusion: fileMatch
3+
fileMatchPattern: "ltm/**/*"
4+
---
5+
6+
## LTM record formats
7+
8+
### events.jsonl
9+
Each line: {"id": "evt_NNNNNN", "ts": "ISO-8601", "type": "file_write|checkpoint|manual_note", "summary": "", "files_changed_count": N, "files_sample": ["path", ...], "branch": "string", "session_id": "sess_...", "source": "hook:agentStop|agent:checkpoint|user:manual", "git_status": "ok|unavailable|not_repo|timeout|error", "tags": [], "redacted": false}
10+
11+
### checkpoints.jsonl
12+
Each line: {"id": "chk_NNNNNN", "ts": "ISO-8601", "summary": "text", "changed_files": [], "decisions": [{"decision": "text", "rationale": "text"}], "open_threads": ["thread_id"], "next_actions": ["text"], "session_id": "sess_..."}
13+
14+
### sessions.jsonl
15+
Each line: {"session_id": "sess_...", "started_at": "ISO-8601", "ended_at": "ISO-8601", "summary": "text", "recent_files": [], "checkpoints_created": [], "unresolved_items": [], "next_recommended_action": "text"}
16+
17+
### open_threads.jsonl
18+
Each line: {"thread_id": "thread_NNNNNN", "ts_opened": "ISO-8601", "summary": "text", "status": "open|resolved", "linked_files": [], "last_touched": "ISO-8601"}
19+
20+
### Secret redaction
21+
Check for: sk_live_, sk_test_, AKIA, ghp_, gho_, -----BEGIN, Bearer, base64 strings 40+ chars. Replace with [REDACTED].

.kiro/steering/ltm-operations.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
---
2+
inclusion: auto
3+
name: ltm-operations
4+
description: "LTM memory operations. Activates when the user asks to resume work, continue previous tasks, recall past decisions, or reference project memory."
5+
---
6+
7+
## Recall
8+
9+
1. Run `python ltm/bin/ltm.py files --limit 10` and `python ltm/bin/ltm.py sessions --limit 5`.
10+
2. For specific past work: `python ltm/bin/ltm.py search "term"` or `python ltm/bin/ltm.py checkpoints --days 3`.
11+
3. For a specific session: `python ltm/bin/ltm.py show <session_id>`.
12+
4. Fallback: read `ltm/runtime/active-context.json` and `ltm/runtime/last-recall.md`.
13+
5. Optional: `git status --short` and `git log --oneline -5`.
14+
6. Use recall to orient. Do not explore broadly if recall is sufficient.
15+
16+
## Checkpoints
17+
18+
1. Read recent events from `ltm/store/events.jsonl` (last 20 entries).
19+
2. Prepare checkpoint JSON with summary, changed_files, decisions, open_threads, next_actions.
20+
3. Run `python ltm/bin/ltm.py checkpoint --from-json <path>`.
21+
4. Fallback: write directly to `ltm/store/checkpoints.jsonl` per `ltm-memory-format.md`.
22+
5. Regenerate: `python ltm/bin/ltm.py regenerate`.
23+
24+
## Caps
25+
26+
- `last-recall.md`: max 400 words.
27+
- `active-context.json`: max 8KB (preferred 2KB).
28+
- Never inject raw ledger files into context.
29+
30+
## Maintenance
31+
32+
- Health: `python ltm/bin/ltm.py health`
33+
- Validate: `python ltm/bin/ltm.py validate`
34+
- Repair: `python ltm/bin/ltm.py repair`
35+
- Purge last: `python ltm/bin/ltm.py purge-last --confirm`
36+
- Purge all: `python ltm/bin/ltm.py purge-all --confirm`
37+
- Teardown: `python ltm/bin/ltm.py teardown --confirm`
38+
39+
Read `python_cmd` from `ltm/config.json`.

.mcp.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
{
22
"mcpServers": {
3+
"serena": {
4+
"type": "stdio",
5+
"command": "serena",
6+
"args": [
7+
"start-mcp-server",
8+
"--context=codex",
9+
"--project-from-cwd"
10+
],
11+
"directTools": true
12+
},
313
"tessl": {
414
"type": "stdio",
515
"command": "tessl",
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
using QuickShell.Services;
2+
3+
namespace QuickShell.Core.Tests;
4+
5+
public sealed class CompanionAppArgumentValidationTests
6+
{
7+
[Fact]
8+
public void ShouldShowArgumentsField_HiddenForNoneAndCustomWithoutPath()
9+
{
10+
Assert.False(CompanionAppArgumentValidation.ShouldShowArgumentsField(
11+
CompanionAppCatalog.PresetNone,
12+
path: null));
13+
Assert.False(CompanionAppArgumentValidation.ShouldShowArgumentsField(
14+
CompanionAppCatalog.PresetCustom,
15+
path: null));
16+
}
17+
18+
[Fact]
19+
public void ShouldShowArgumentsField_VisibleForCustomWithPath()
20+
{
21+
Assert.True(CompanionAppArgumentValidation.ShouldShowArgumentsField(
22+
CompanionAppCatalog.PresetCustom,
23+
@"C:\Apps\Code.exe"));
24+
}
25+
26+
[Fact]
27+
public void NormalizeForSave_EmptyUsesPresetDefault()
28+
{
29+
Assert.Equal(".", CompanionAppArgumentValidation.NormalizeForSave(
30+
CompanionAppCatalog.PresetVsCode,
31+
@"C:\Apps\Code.exe",
32+
arguments: null));
33+
Assert.Equal("{solution}", CompanionAppArgumentValidation.NormalizeForSave(
34+
CompanionAppCatalog.PresetVs2022,
35+
@"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\devenv.exe",
36+
arguments: " "));
37+
}
38+
39+
[Fact]
40+
public void TryValidateForSave_RejectsUnknownPlaceholder()
41+
{
42+
Assert.False(CompanionAppArgumentValidation.TryValidateForSave(
43+
CompanionAppCatalog.PresetVsCode,
44+
@"C:\Apps\Code.exe",
45+
"{workspace}",
46+
out var error));
47+
Assert.Contains("folder", error, StringComparison.OrdinalIgnoreCase);
48+
}
49+
50+
[Fact]
51+
public void BuildArgumentWarning_SuggestsSolutionForVisualStudio()
52+
{
53+
var root = Path.Combine(Path.GetTempPath(), "quickshell-args-" + Guid.NewGuid().ToString("N"));
54+
Directory.CreateDirectory(root);
55+
File.WriteAllText(Path.Combine(root, "App.sln"), string.Empty);
56+
57+
try
58+
{
59+
var warning = CompanionAppArgumentValidation.BuildArgumentWarning(
60+
CompanionAppCatalog.PresetVs2022,
61+
@"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\devenv.exe",
62+
".",
63+
root);
64+
65+
Assert.NotNull(warning);
66+
Assert.Contains("{solution}", warning, StringComparison.Ordinal);
67+
}
68+
finally
69+
{
70+
try
71+
{
72+
Directory.Delete(root, recursive: true);
73+
}
74+
catch
75+
{
76+
}
77+
}
78+
}
79+
80+
[Fact]
81+
public void BuildArgumentWarning_SuggestsDotForEditorPresets()
82+
{
83+
var warning = CompanionAppArgumentValidation.BuildArgumentWarning(
84+
CompanionAppCatalog.PresetCursor,
85+
@"C:\Apps\Cursor.exe",
86+
"--new-window",
87+
@"C:\Projects\demo");
88+
89+
Assert.NotNull(warning);
90+
Assert.Contains(".", warning, StringComparison.Ordinal);
91+
}
92+
}

0 commit comments

Comments
 (0)