@plainconceptsplatform/loop-task 2.6.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/LICENSE +21 -0
- package/README.md +534 -0
- package/dist/app/App.js +132 -0
- package/dist/app/BoardLayout.js +5 -0
- package/dist/app/index.js +48 -0
- package/dist/app/providers/index.js +1 -0
- package/dist/app/router/index.js +16 -0
- package/dist/app/types.js +1 -0
- package/dist/cli/import-validator.js +152 -0
- package/dist/cli/import-writer.js +81 -0
- package/dist/cli.js +573 -0
- package/dist/client/cli-format.js +7 -0
- package/dist/client/commands.js +162 -0
- package/dist/client/ipc.js +96 -0
- package/dist/client/project-commands.js +164 -0
- package/dist/core/command/command-runner.js +300 -0
- package/dist/core/command/process-tree.js +73 -0
- package/dist/core/command/resolve-cwd.js +8 -0
- package/dist/core/command/stdout-capture-transform.js +73 -0
- package/dist/core/context/context-parser.js +65 -0
- package/dist/core/context/log-context.js +3 -0
- package/dist/core/context/template.js +20 -0
- package/dist/core/context/validate-context.js +19 -0
- package/dist/core/foreground/index.js +81 -0
- package/dist/core/logging/bounded-log-reader.js +368 -0
- package/dist/core/logging/log-follower.js +26 -0
- package/dist/core/logging/log-parser.js +29 -0
- package/dist/core/logging/log-rotator.js +34 -0
- package/dist/core/logging/rotating-log-stream.js +137 -0
- package/dist/core/loop/chain-executor.js +171 -0
- package/dist/core/loop/delay-utils.js +65 -0
- package/dist/core/loop/loop-controller.js +240 -0
- package/dist/core/loop/loop-runner.js +194 -0
- package/dist/core/loop/run-executor.js +144 -0
- package/dist/core/loop/types.js +1 -0
- package/dist/core/scheduling/index.js +16 -0
- package/dist/daemon/daemon-log.js +11 -0
- package/dist/daemon/diagnostics.js +85 -0
- package/dist/daemon/http/helpers.js +81 -0
- package/dist/daemon/http/openapi.js +119 -0
- package/dist/daemon/http/route-loops.js +311 -0
- package/dist/daemon/http/route-misc.js +60 -0
- package/dist/daemon/http/route-projects.js +55 -0
- package/dist/daemon/http/route-tasks.js +141 -0
- package/dist/daemon/http/routes.js +19 -0
- package/dist/daemon/http/server.js +82 -0
- package/dist/daemon/http/sse.js +36 -0
- package/dist/daemon/index.js +189 -0
- package/dist/daemon/ipc/send.js +5 -0
- package/dist/daemon/managers/loop-entry.js +27 -0
- package/dist/daemon/managers/loop-manager.js +346 -0
- package/dist/daemon/managers/loop-options.js +17 -0
- package/dist/daemon/managers/loop-serialization.js +53 -0
- package/dist/daemon/managers/project-manager.js +170 -0
- package/dist/daemon/managers/task-manager.js +94 -0
- package/dist/daemon/mcp/index.js +2 -0
- package/dist/daemon/mcp/openapi-sync.js +50 -0
- package/dist/daemon/mcp/server.js +167 -0
- package/dist/daemon/mcp/tools.js +382 -0
- package/dist/daemon/recipe/deferred-reload.js +32 -0
- package/dist/daemon/recipe/diagram-reader.js +26 -0
- package/dist/daemon/recipe/file-writer.js +52 -0
- package/dist/daemon/recipe/id-remapper.js +46 -0
- package/dist/daemon/recipe/runtime-state.js +23 -0
- package/dist/daemon/recipe/scanner.js +165 -0
- package/dist/daemon/recipe/task-store.js +33 -0
- package/dist/daemon/recipe/validator.js +35 -0
- package/dist/daemon/server/handlers/diagnostics-handlers.js +7 -0
- package/dist/daemon/server/handlers/index.js +101 -0
- package/dist/daemon/server/handlers/log-handlers.js +129 -0
- package/dist/daemon/server/handlers/loop-handlers.js +64 -0
- package/dist/daemon/server/handlers/project-handlers.js +42 -0
- package/dist/daemon/server/handlers/settings-handlers.js +8 -0
- package/dist/daemon/server/handlers/task-handlers.js +20 -0
- package/dist/daemon/server/handlers/telemetry-handlers.js +5 -0
- package/dist/daemon/server/index.js +117 -0
- package/dist/daemon/settings-manager.js +73 -0
- package/dist/daemon/spawner/index.js +204 -0
- package/dist/daemon/state/index.js +209 -0
- package/dist/daemon/telemetry/agent-integrations/agent-integration.js +1 -0
- package/dist/daemon/telemetry/agent-integrations/claude-code-integration.js +55 -0
- package/dist/daemon/telemetry/agent-integrations/detect-agent-integration.js +20 -0
- package/dist/daemon/telemetry/agent-integrations/index.js +3 -0
- package/dist/daemon/telemetry/agent-integrations/opencode-integration.js +72 -0
- package/dist/daemon/telemetry/index.js +6 -0
- package/dist/daemon/telemetry/noop-telemetry-adapter.js +53 -0
- package/dist/daemon/telemetry/open-telemetry-adapter.js +464 -0
- package/dist/daemon/telemetry/telemetry-manager.js +147 -0
- package/dist/daemon/telemetry/telemetry-redaction.js +67 -0
- package/dist/daemon/telemetry/telemetry-types.js +45 -0
- package/dist/daemon/telemetry/telemetry.js +1 -0
- package/dist/daemon/watcher/index.js +250 -0
- package/dist/duration.js +24 -0
- package/dist/entities/loops/filters.js +109 -0
- package/dist/entities/loops/index.js +1 -0
- package/dist/entities/projects/filters.js +69 -0
- package/dist/entities/projects/index.js +1 -0
- package/dist/entities/tasks/filters.js +41 -0
- package/dist/entities/tasks/index.js +1 -0
- package/dist/entry.js +16 -0
- package/dist/esm-loader.js +39 -0
- package/dist/features/chain-editor/ChainEditor.js +116 -0
- package/dist/features/chain-editor/mermaidToAscii.js +375 -0
- package/dist/features/chain-editor/renderChainDiagram.js +106 -0
- package/dist/features/code-editor/CodeEditorModal.js +84 -0
- package/dist/features/code-editor/CodeEditorPreview.js +14 -0
- package/dist/features/code-editor/useEditorKeyboard.js +150 -0
- package/dist/features/code-editor/useModalDimensions.js +9 -0
- package/dist/features/commands/commands.js +132 -0
- package/dist/features/commands/useCommandHandlers.js +280 -0
- package/dist/features/commands/useContextualActions.js +78 -0
- package/dist/features/commands/useGlobalShortcuts.js +154 -0
- package/dist/features/forms/FormRouter.js +46 -0
- package/dist/features/overlays/ContextHelpModal.js +8 -0
- package/dist/features/overlays/DiagramModal.js +45 -0
- package/dist/features/overlays/ExportModal.js +51 -0
- package/dist/features/overlays/HelpGuideModal.js +23 -0
- package/dist/features/overlays/HelpModal.js +59 -0
- package/dist/features/overlays/OverlayStack.js +10 -0
- package/dist/features/overlays/ProjectsModal.js +42 -0
- package/dist/features/overlays/TaskPickerModal.js +62 -0
- package/dist/features/overlays/WelcomeScreen.js +74 -0
- package/dist/features/overlays/useOverlayStack.js +55 -0
- package/dist/features/state/useAppState.js +151 -0
- package/dist/logger.js +25 -0
- package/dist/loop-config.js +152 -0
- package/dist/shared/clipboard.js +111 -0
- package/dist/shared/config/constants.js +104 -0
- package/dist/shared/config/paths.js +67 -0
- package/dist/shared/container/index.js +24 -0
- package/dist/shared/fs-utils.js +44 -0
- package/dist/shared/hooks/useBreakpoint.js +11 -0
- package/dist/shared/hooks/useDaemonSettings.js +41 -0
- package/dist/shared/hooks/useInject.js +6 -0
- package/dist/shared/hooks/useLogStream.js +37 -0
- package/dist/shared/hooks/useLoopFormValidation.js +131 -0
- package/dist/shared/hooks/useLoopPolling.js +30 -0
- package/dist/shared/hooks/useMouseScroll.js +56 -0
- package/dist/shared/hooks/useUndoRedo.js +77 -0
- package/dist/shared/i18n/en.json +709 -0
- package/dist/shared/i18n/index.js +11 -0
- package/dist/shared/providers/InversifyProvider.js +6 -0
- package/dist/shared/services/export-service.js +43 -0
- package/dist/shared/services/log-service.js +28 -0
- package/dist/shared/services/loop-service.js +78 -0
- package/dist/shared/services/project-service.js +39 -0
- package/dist/shared/services/settings-service.js +102 -0
- package/dist/shared/services/task-service.js +41 -0
- package/dist/shared/services/types.js +8 -0
- package/dist/shared/sleep.js +17 -0
- package/dist/shared/tail.js +4 -0
- package/dist/shared/ui/Button.js +18 -0
- package/dist/shared/ui/DebugPanel.js +9 -0
- package/dist/shared/ui/FocusableButton.js +18 -0
- package/dist/shared/ui/FocusableInput.js +72 -0
- package/dist/shared/ui/FocusableList.js +48 -0
- package/dist/shared/ui/Modal.js +13 -0
- package/dist/shared/ui/SelectModal.js +78 -0
- package/dist/shared/ui/Toast.js +37 -0
- package/dist/shared/ui/format.js +117 -0
- package/dist/shared/ui/hooks/useHoverState.js +11 -0
- package/dist/shared/ui/state.js +9 -0
- package/dist/shared/ui/theme.js +96 -0
- package/dist/shared/utils/log-lines.js +13 -0
- package/dist/shared/utils/paste.js +37 -0
- package/dist/shared/utils/syntax.js +128 -0
- package/dist/shared/utils/validation.js +56 -0
- package/dist/types.js +1 -0
- package/dist/visual-evidence/capture.js +51 -0
- package/dist/visual-evidence/cli.js +85 -0
- package/dist/visual-evidence/evidence-required.js +71 -0
- package/dist/visual-evidence/index.js +10 -0
- package/dist/visual-evidence/launch.js +61 -0
- package/dist/visual-evidence/manifest.js +32 -0
- package/dist/visual-evidence/openspec-resolver.js +45 -0
- package/dist/visual-evidence/publish.js +126 -0
- package/dist/visual-evidence/run.js +121 -0
- package/dist/visual-evidence/scenario-registry.js +132 -0
- package/dist/widgets/command-input/CommandDropdown.js +69 -0
- package/dist/widgets/command-input/CommandInput.js +133 -0
- package/dist/widgets/command-input/HintBar.js +9 -0
- package/dist/widgets/command-input/InputModes.js +72 -0
- package/dist/widgets/commands-browser/CommandsBrowserModal.js +85 -0
- package/dist/widgets/header/Header.js +54 -0
- package/dist/widgets/header/TabBar.js +20 -0
- package/dist/widgets/left-panel/LeftPanel.js +34 -0
- package/dist/widgets/left-panel/Navigator.js +107 -0
- package/dist/widgets/left-panel/ProjectsPage.js +76 -0
- package/dist/widgets/left-panel/ProjectsPageParts.js +34 -0
- package/dist/widgets/left-panel/TaskBrowser.js +132 -0
- package/dist/widgets/log-modal/LogModal.js +211 -0
- package/dist/widgets/loop-form/CreateForm.js +82 -0
- package/dist/widgets/loop-form/TextField.js +9 -0
- package/dist/widgets/loop-form/WizardForm.js +199 -0
- package/dist/widgets/loop-form/useCreateSteps.js +135 -0
- package/dist/widgets/loop-form/useHandleComplete.js +94 -0
- package/dist/widgets/project-form/ProjectForm.js +83 -0
- package/dist/widgets/right-panel/Inspector.js +41 -0
- package/dist/widgets/right-panel/RightPanel.js +38 -0
- package/dist/widgets/right-panel/RunHistory.js +187 -0
- package/dist/widgets/task-form/TaskForm.js +272 -0
- package/package.json +119 -0
|
@@ -0,0 +1,709 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cli.error": "Error: {message}",
|
|
3
|
+
"cli.programDescription": "Open the loop board or start loops in the background.",
|
|
4
|
+
"cli.startDescription": "Start the background daemon (restores persisted loops)",
|
|
5
|
+
"cli.newDescription": "Create a new loop in the background",
|
|
6
|
+
"cli.runDescription": "Run a loop in the foreground",
|
|
7
|
+
"cli.argInterval": "Interval between runs (e.g. 30s, 5m, 1h, or manual)",
|
|
8
|
+
"cli.argCommand": "Command to execute",
|
|
9
|
+
"cli.optNow": "Run immediately before waiting",
|
|
10
|
+
"cli.optMaxRuns": "Stop after N executions",
|
|
11
|
+
"cli.optVerbose": "Show execution details",
|
|
12
|
+
"cli.optCwd": "Working directory for the command",
|
|
13
|
+
"cli.daemonStarted": "Daemon started. Loops restored.",
|
|
14
|
+
"cli.startedTitle": "Loop started in background",
|
|
15
|
+
"cli.startedId": " ID: {id}",
|
|
16
|
+
"cli.startedCommand": " Command: {command}",
|
|
17
|
+
"cli.startedInterval": " Interval: {interval}",
|
|
18
|
+
"cli.startedStatus": " Status: running",
|
|
19
|
+
"cli.startedHint": " loop-task new ... # create another loop\n loop-task # open the board",
|
|
20
|
+
"cli.noLoops": "No background loops running.",
|
|
21
|
+
"cli.headerId": "ID",
|
|
22
|
+
"cli.headerCommand": "COMMAND",
|
|
23
|
+
"cli.headerInterval": "INTERVAL",
|
|
24
|
+
"cli.headerStatus": "STATUS",
|
|
25
|
+
"cli.headerRuns": "RUNS",
|
|
26
|
+
"cli.headerLastExit": "LAST EXIT",
|
|
27
|
+
"cli.statusTitle": "Loop: {id}",
|
|
28
|
+
"cli.statusCommand": " Command: {command}",
|
|
29
|
+
"cli.statusInterval": " Interval: {interval} ({duration})",
|
|
30
|
+
"cli.statusStatus": " Status: {status}",
|
|
31
|
+
"cli.statusRuns": " Runs: {runs} / {maxRuns}",
|
|
32
|
+
"cli.statusSilentChains": " Silent: {count} silent-chain runs",
|
|
33
|
+
"cli.statusCreated": " Created: {created}",
|
|
34
|
+
"cli.statusLastRun": " Last run: {lastRun} {exit} {duration}",
|
|
35
|
+
"cli.statusNextRun": " Next run: {nextRun}",
|
|
36
|
+
"cli.exitInfo": "exit {code}",
|
|
37
|
+
"cli.unlimited": "∞",
|
|
38
|
+
"cli.paused": "Loop {id} paused.",
|
|
39
|
+
"cli.resumed": "Loop {id} resumed.",
|
|
40
|
+
"cli.deleted": "Loop {id} deleted.",
|
|
41
|
+
"cli.attaching": "Attaching to loop {id}... (Ctrl+C to detach)\n",
|
|
42
|
+
"cli.detached": "\nDetached.",
|
|
43
|
+
"cli.optProject": "Assign the loop to a project (name or id)",
|
|
44
|
+
"cli.projectDescription": "Manage projects",
|
|
45
|
+
"cli.projectListDescription": "List all projects",
|
|
46
|
+
"cli.projectNewDescription": "Create a new project",
|
|
47
|
+
"cli.projectRenameDescription": "Rename a project",
|
|
48
|
+
"cli.projectColorDescription": "Change a project's color",
|
|
49
|
+
"cli.projectDeleteDescription": "Delete a project (loops move to Default)",
|
|
50
|
+
"cli.optProjectColor": "Project color (name or #hex)",
|
|
51
|
+
"cli.optProjectDirectory": "Project working directory",
|
|
52
|
+
"cli.optProjectGithubSource": "GitHub repository in owner/repo format",
|
|
53
|
+
"cli.projectArgName": "Project name",
|
|
54
|
+
"cli.projectArgNewName": "New project name",
|
|
55
|
+
"cli.projectArgIdOrName": "Project id or name",
|
|
56
|
+
"cli.projectArgColor": "Color name or #hex",
|
|
57
|
+
"cli.noProjects": "No projects.",
|
|
58
|
+
"cli.projectHeaderName": "NAME",
|
|
59
|
+
"cli.projectHeaderId": "ID",
|
|
60
|
+
"cli.projectHeaderColor": "COLOR",
|
|
61
|
+
"cli.projectHeaderLoops": "LOOPS",
|
|
62
|
+
"cli.projectHeaderSystem": "SYSTEM",
|
|
63
|
+
"cli.projectCreated": "Project \"{name}\" created (id: {id})",
|
|
64
|
+
"cli.projectRenamed": "Project renamed to \"{name}\"",
|
|
65
|
+
"cli.projectColorSet": "Project \"{name}\" color set to {color}",
|
|
66
|
+
"cli.projectDeleted": "Project \"{name}\" deleted (loops moved to Default)",
|
|
67
|
+
"cli.projectNotFound": "Project not found: {name}",
|
|
68
|
+
"cli.projectAmbiguous": "Multiple projects named \"{name}\" - use the id instead",
|
|
69
|
+
"cli.projectInvalidColor": "Invalid color \"{color}\". Valid names: {valid}, or a #rrggbb hex",
|
|
70
|
+
"loop.runHeader": "\n[Run #{runNumber} - {timestamp}]\n",
|
|
71
|
+
"loop.commandLine": "$ {command}\n",
|
|
72
|
+
"loop.cwdLine": " cwd: {cwd}\n",
|
|
73
|
+
"loop.chainHeader": "\n--- Chain: {name} ({branch}, prev exit {prevExit}) ---\n",
|
|
74
|
+
"loop.exitMarker": "[exit {code} · {duration}]\n",
|
|
75
|
+
"loop.cwdMissingLog": "[error] working directory does not exist: {cwd}\n",
|
|
76
|
+
"loop.cwdMissing": "Working directory does not exist: {cwd}",
|
|
77
|
+
"loop.executing": "Executing: {command}",
|
|
78
|
+
"loop.shuttingDown": "\nShutting down gracefully...",
|
|
79
|
+
"loop.completed": "Completed {runs} run(s). Exiting.",
|
|
80
|
+
"loop.waitingFirst": "Waiting {duration} before first run...",
|
|
81
|
+
"loop.runSeparator": "\n--- Run {run}{maxRuns} ---",
|
|
82
|
+
"loop.commandFailed": "Command failed with exit code {code}",
|
|
83
|
+
"loop.debugStartedAt": "Started at: {timestamp}",
|
|
84
|
+
"loop.debugEndedAt": "Ended at: {timestamp}",
|
|
85
|
+
"loop.debugExitCode": "Exit code: {code}",
|
|
86
|
+
"loop.debugDuration": "Duration: {duration}",
|
|
87
|
+
"loop.nextRun": "Next run in {duration} (at {time})",
|
|
88
|
+
"errors.durationEmpty": "Duration cannot be empty",
|
|
89
|
+
"errors.durationInvalid": "Invalid duration: \"{input}\". Use formats like 10s, 5m, 1h, 1d, 1w, or manual",
|
|
90
|
+
"errors.durationNotPositive": "Duration must be positive, got: \"{input}\"",
|
|
91
|
+
"errors.maxRunsInvalid": "--max-runs must be a positive integer",
|
|
92
|
+
"errors.unbalancedQuote": "Unbalanced quote in command",
|
|
93
|
+
"errors.commandEmpty": "Command cannot be empty",
|
|
94
|
+
"errors.descriptionEmpty": "Description cannot be empty",
|
|
95
|
+
"errors.loopNotFound": "Loop {id} not found",
|
|
96
|
+
"errors.invalidJson": "Invalid JSON",
|
|
97
|
+
"errors.noLogsYet": "No logs yet",
|
|
98
|
+
"errors.invalidResponse": "Invalid response from daemon",
|
|
99
|
+
"errors.connectionClosed": "Connection closed before response",
|
|
100
|
+
"errors.cannotConnect": "Cannot connect to daemon: {message}",
|
|
101
|
+
"errors.requestTimedOut": "Daemon request timed out",
|
|
102
|
+
"errors.daemonFailedToStart": "Daemon failed to start within 5 seconds",
|
|
103
|
+
"errors.daemonUncaught": "Daemon uncaught exception:",
|
|
104
|
+
"errors.daemonFailed": "Daemon failed to start:",
|
|
105
|
+
"errors.pauseFailed": "pause failed",
|
|
106
|
+
"errors.resumeFailed": "resume failed",
|
|
107
|
+
"errors.forceRunFailed": "force run failed",
|
|
108
|
+
"errors.deleteFailed": "delete failed",
|
|
109
|
+
"errors.maxRunsReached": "Max runs reached - edit the loop and increase 'Max runs' to continue",
|
|
110
|
+
"errors.triggerWhileRunning": "Loop is already running - force run skipped",
|
|
111
|
+
"format.dash": "-",
|
|
112
|
+
"format.justNow": "just now",
|
|
113
|
+
"format.secsAgo": "{secs}s ago",
|
|
114
|
+
"format.minsAgo": "{mins}m ago",
|
|
115
|
+
"format.hrsAgo": "{hrs}h ago",
|
|
116
|
+
"format.daysAgo": "{days}d ago",
|
|
117
|
+
"format.secsAhead": "{secs}s",
|
|
118
|
+
"format.minsAhead": "{mins}m",
|
|
119
|
+
"format.hrsAhead": "{hrs}h",
|
|
120
|
+
"format.daysAhead": "{days}d",
|
|
121
|
+
"format.timingPaused": "paused",
|
|
122
|
+
"format.timingIdle": "not scheduled",
|
|
123
|
+
"format.durationManual": "manual trigger only",
|
|
124
|
+
"format.timingNext": "in {timeAgo}",
|
|
125
|
+
"format.timingLast": "last {timeAgo}",
|
|
126
|
+
"format.timingNew": "new",
|
|
127
|
+
"board.appName": "loop-task",
|
|
128
|
+
"board.appTagline": " background task loops",
|
|
129
|
+
"board.daemonLabel": "Daemon: ",
|
|
130
|
+
"board.loopsLabel": " Loops: ",
|
|
131
|
+
"board.runningLabel": " Running: ",
|
|
132
|
+
"board.waitingLabel": " Waiting: ",
|
|
133
|
+
"board.pausedLabel": " Paused: ",
|
|
134
|
+
"board.idleLabel": " Stopped: ",
|
|
135
|
+
"board.searchTitle": " Search / ",
|
|
136
|
+
"board.searchPlaceholder": "type to filter, enter to apply",
|
|
137
|
+
"board.searchSelectPlaceholder": "type to filter...",
|
|
138
|
+
"board.searchEmpty": "press / to search",
|
|
139
|
+
"board.statusFilterTitle": " Status x ",
|
|
140
|
+
"board.sortTitle": " Order o ",
|
|
141
|
+
"board.newLoopTitle": "",
|
|
142
|
+
"board.newLoopLabel": "Add Loop",
|
|
143
|
+
"board.viewTasksTitle": "",
|
|
144
|
+
"board.viewTasksLabel": "View Tasks",
|
|
145
|
+
"board.viewLoopsTitle": " Loops ",
|
|
146
|
+
"board.viewLoopsLabel": "View Loops",
|
|
147
|
+
"board.headerSince": "SINCE",
|
|
148
|
+
"board.headerRuns": "RUNS",
|
|
149
|
+
"board.headerStatus": "STATUS",
|
|
150
|
+
"board.headerDescription": "DESCRIPTION",
|
|
151
|
+
"board.headerTiming": "TIMING",
|
|
152
|
+
"board.headerExitRuns": "EXIT RUNS",
|
|
153
|
+
"board.navigatorTitle": " Loops {visible}/{total} sort:{sort} status:{status} ",
|
|
154
|
+
"board.navigatorCount": " Loops {visible}/{total} ",
|
|
155
|
+
"board.chipFilter": "filter: {query}",
|
|
156
|
+
"board.chipProject": "project:",
|
|
157
|
+
"board.chipStatus": "status:",
|
|
158
|
+
"board.chipSort": "sort:",
|
|
159
|
+
"board.chipAll": "all",
|
|
160
|
+
"board.chipSearch": "search: {query}",
|
|
161
|
+
"board.chipLoops": "loops:",
|
|
162
|
+
"board.chipType": "type:",
|
|
163
|
+
"board.runHistoryFailStreak": "streak:{count} fail",
|
|
164
|
+
"board.runHistoryLastFail": "last fail:{ago}",
|
|
165
|
+
"board.noMatch": " No loops match the current view",
|
|
166
|
+
"board.inspectorTitle": " Inspector ",
|
|
167
|
+
"board.inspectorEmpty": " Select a loop to view details",
|
|
168
|
+
"board.fieldId": "ID:",
|
|
169
|
+
"board.fieldDesc": "Desc:",
|
|
170
|
+
"board.fieldCommand": "Command:",
|
|
171
|
+
"board.fieldTask": "Task:",
|
|
172
|
+
"board.fieldDir": "Dir:",
|
|
173
|
+
"board.fieldInterval": "Interval:",
|
|
174
|
+
"board.fieldStatus": "Status:",
|
|
175
|
+
"board.fieldRuns": "Runs:",
|
|
176
|
+
"board.fieldLastRun": "Last run:",
|
|
177
|
+
"board.fieldLastExit": "Last exit:",
|
|
178
|
+
"board.fieldNextRun": "Next run:",
|
|
179
|
+
"board.fieldSilentChains": "Silent:",
|
|
180
|
+
"board.fieldPid": "PID:",
|
|
181
|
+
"board.inherit": "(inherit)",
|
|
182
|
+
"board.unlimited": "∞",
|
|
183
|
+
"board.timelineTitle": " Timeline ",
|
|
184
|
+
"board.timelineEmpty": " No output yet.",
|
|
185
|
+
"board.runHistoryTitle": " Run History ",
|
|
186
|
+
"board.runHistoryTitleHint": " Run History (Enter to view log) ",
|
|
187
|
+
"board.runHistoryEmpty": " No runs yet.",
|
|
188
|
+
"board.runHistoryTime": "TIME",
|
|
189
|
+
"board.runHistoryDesc": "DESCRIPTION",
|
|
190
|
+
"board.runHistoryDuration": "DURATION",
|
|
191
|
+
"board.runHistorySize": "SIZE",
|
|
192
|
+
"board.logModalTitle": " Run Log {icon} {time} ",
|
|
193
|
+
"board.logModalLoading": " Loading...",
|
|
194
|
+
"board.logModalEmpty": " No output captured.",
|
|
195
|
+
"board.logModalNoMatches": "No matches",
|
|
196
|
+
"board.logModalRunning": "Running",
|
|
197
|
+
"board.logModalExit": "exit {code}",
|
|
198
|
+
"board.logModalDuration": "duration",
|
|
199
|
+
"board.logModalSearchHint": "type to filter, enter to apply, esc to exit search",
|
|
200
|
+
"board.logModalFooterHints": "/:search ctrl+x:copy up/down:scroll ctrl+t:top ctrl+b:bottom esc:close",
|
|
201
|
+
"board.logModalEscClose": "esc to close",
|
|
202
|
+
"board.logModalRunning": "running…",
|
|
203
|
+
"board.detailTitle": " Loop Detail ",
|
|
204
|
+
"board.detailFieldId": "ID: ",
|
|
205
|
+
"board.detailFieldDesc": "Desc: ",
|
|
206
|
+
"board.detailFieldCommand": "Command: ",
|
|
207
|
+
"board.detailFieldDir": "Dir: ",
|
|
208
|
+
"board.detailFieldInterval": "Interval: ",
|
|
209
|
+
"board.detailFieldStatus": "Status: ",
|
|
210
|
+
"board.detailFieldRuns": "Runs: ",
|
|
211
|
+
"board.detailFieldCreated": "Created: ",
|
|
212
|
+
"board.detailFieldLastRun": "Last run: ",
|
|
213
|
+
"board.detailFieldLastExit": "Last exit: ",
|
|
214
|
+
"board.detailFieldNextRun": "Next run: ",
|
|
215
|
+
"board.detailFieldPid": "PID: ",
|
|
216
|
+
"board.detailFieldSilentChains": "Silent: ",
|
|
217
|
+
"board.detailSummaryStatus": "status",
|
|
218
|
+
"board.detailSummaryTiming": "next",
|
|
219
|
+
"board.detailSummaryInterval": "every",
|
|
220
|
+
"board.detailSummaryRuns": "runs",
|
|
221
|
+
"board.detailSummaryExit": "exit",
|
|
222
|
+
"board.liveOutputTitle": " Live Output ",
|
|
223
|
+
"board.helpTitle": " Help ",
|
|
224
|
+
"board.helpMoveSelection": "move selection",
|
|
225
|
+
"board.helpToggleDetail": "toggle loop detail",
|
|
226
|
+
"board.helpCreate": "create loop",
|
|
227
|
+
"board.helpCreateTask": "create task",
|
|
228
|
+
"board.helpEdit": "edit loop (pauses it)",
|
|
229
|
+
"board.helpPauseResume": "pause/resume selected loop",
|
|
230
|
+
"board.helpStopPlay": "stop/play selected loop (resets schedule)",
|
|
231
|
+
"board.helpForceRun": "force run selected loop now",
|
|
232
|
+
"board.helpDelete": "delete selected loop",
|
|
233
|
+
"board.helpSearch": "search loops",
|
|
234
|
+
"board.helpCycleFilter": "cycle status filter",
|
|
235
|
+
"board.helpCycleSort": "cycle sort mode",
|
|
236
|
+
"board.helpRunHistory": "navigate run history",
|
|
237
|
+
"board.helpOpenRunLog": "open run log",
|
|
238
|
+
"board.helpSwitchPanel": "switch panel focus",
|
|
239
|
+
"board.helpKeyLeftRight": "←/→",
|
|
240
|
+
"board.helpToggleHelp": "toggle help",
|
|
241
|
+
"board.helpBack": "back to board",
|
|
242
|
+
"board.helpQuit": "quit",
|
|
243
|
+
"board.labelInterval": "Interval",
|
|
244
|
+
"board.labelCommand": "Command",
|
|
245
|
+
"board.labelDescription": "Description",
|
|
246
|
+
"board.labelCwd": "Working dir",
|
|
247
|
+
"board.labelRunNow": "Run immediately?",
|
|
248
|
+
"board.labelMaxRuns": "Max runs",
|
|
249
|
+
"board.labelTaskMode": "Task",
|
|
250
|
+
"board.labelTask": "Select task",
|
|
251
|
+
"board.taskModeInline": "Inline command",
|
|
252
|
+
"board.taskModeExisting": "Existing task",
|
|
253
|
+
"board.selectTask": "(select a task)",
|
|
254
|
+
"board.taskLabelName": "Name",
|
|
255
|
+
"board.taskLabelCommand": "Command",
|
|
256
|
+
"board.taskLabelOnSuccess": "On success",
|
|
257
|
+
"board.taskLabelOnFailure": "On failure",
|
|
258
|
+
"board.taskHintName": "A short name for this task",
|
|
259
|
+
"board.taskHintOnSuccess": "Task to run when this one succeeds (optional)",
|
|
260
|
+
"board.taskHintOnFailure": "Task to run when this one fails (optional)",
|
|
261
|
+
"board.taskNone": "(none)",
|
|
262
|
+
"board.taskCreateTitle": " New Task ",
|
|
263
|
+
"board.taskEditTitle": " Edit Task ",
|
|
264
|
+
"board.hintTaskMode": "type a command inline, or pick an existing task",
|
|
265
|
+
"board.hintInterval": "How often to run, e.g. 30s, 5m, 30m, 1h, 1d, or manual",
|
|
266
|
+
"board.hintCommand": "Full command line. Quote args with spaces",
|
|
267
|
+
"board.hintDescription": "Short label shown in the list. Blank uses the command",
|
|
268
|
+
"board.hintCwd": "Leave blank to inherit from project directory, or set a specific path",
|
|
269
|
+
"board.hintRunNow": "run once now then every interval, or wait the first interval",
|
|
270
|
+
"board.hintMaxRuns": "Stop after N runs. Leave blank to run forever",
|
|
271
|
+
"board.hintTask": "Pick a previously defined task",
|
|
272
|
+
"wizard.taskPickerHint": "Press {action} to browse and search tasks",
|
|
273
|
+
"wizard.cmdEditorHint": "Press {action} to open the command editor",
|
|
274
|
+
"taskPicker.title": "Choose a task",
|
|
275
|
+
"taskPicker.searchPlaceholder": "Type to search tasks...",
|
|
276
|
+
"taskPicker.empty": "No tasks found",
|
|
277
|
+
"taskPicker.hint": "up/down to navigate, enter to select, esc to cancel",
|
|
278
|
+
"selectModal.searchPlaceholder": "Type to filter...",
|
|
279
|
+
"selectModal.empty": "No matches",
|
|
280
|
+
"selectModal.hint": "up/down to navigate, enter to select, esc to cancel",
|
|
281
|
+
"selectModal.fieldHint": "Press {action} to change",
|
|
282
|
+
"cmdEditor.title": "Command Editor",
|
|
283
|
+
"cmdEditor.hint": "enter: new line . ctrl+s: save . esc: cancel",
|
|
284
|
+
"cmdEditor.lines": "lines",
|
|
285
|
+
"cmdEditor.inlineHint": "enter: new line . ctrl+v: paste . ctrl+y: copy . tab: next field . ctrl+s: save",
|
|
286
|
+
"codeEditor.title": "Command Editor",
|
|
287
|
+
"codeEditor.hint": "ctrl+s save . esc cancel . ctrl+z/ctrl+shift+z undo/redo . && sequential . || parallel",
|
|
288
|
+
"codeEditor.buttonCopy": "Copy",
|
|
289
|
+
"codeEditor.buttonPaste": "Paste",
|
|
290
|
+
"codeEditor.buttonClear": "Clear",
|
|
291
|
+
"codeEditor.buttonSave": "Save",
|
|
292
|
+
"codeEditor.previewLabel": "Will execute:",
|
|
293
|
+
"codeEditor.previewTruncated": "…",
|
|
294
|
+
"codeEditor.emptyPlaceholder": "Enter command...",
|
|
295
|
+
"codeEditor.fieldHint": "press enter to open editor",
|
|
296
|
+
"codeEditor.copied": "Copied!",
|
|
297
|
+
"codeEditor.cleared": "Cleared",
|
|
298
|
+
"codeEditor.clipboardEmpty": "Clipboard empty, right-click to paste",
|
|
299
|
+
"codeEditor.commandsTitle": "Parallel Commands",
|
|
300
|
+
"codeEditor.commandsHint": "tab: next . shift+tab: prev . ctrl+s: save all . esc: cancel",
|
|
301
|
+
"codeEditor.commandLabel": "Command",
|
|
302
|
+
"codeEditor.commandEmpty": "empty = deleted",
|
|
303
|
+
"codeEditor.commandMax": "max 4",
|
|
304
|
+
"wizard.taskCommandsPrompt": "Commands to run (parallel)",
|
|
305
|
+
"wizard.taskCommandsHint": "Multiple commands run at once, merge JSON output",
|
|
306
|
+
"board.exampleInterval": "30m",
|
|
307
|
+
"board.exampleCommand": "opencode run \"search missing translations and translate them, 3 maximum\" --model \"opencode/big-pickle\"",
|
|
308
|
+
"board.exampleDescription": "translate missing strings",
|
|
309
|
+
"board.runNowNo": "No",
|
|
310
|
+
"board.runNowYes": "Yes - run now",
|
|
311
|
+
"board.cwdMissing": "Working directory does not exist: {cwd}",
|
|
312
|
+
"board.createTitle": " New Loop ",
|
|
313
|
+
"board.editTitle": " Edit Loop (will pause) ",
|
|
314
|
+
"board.exampleHeading": "Full example of the loop you are building:",
|
|
315
|
+
"board.exampleFull": "loop-task start 30m --now -- opencode run \"search missing translations and translate them, 3 maximum\" --model \"opencode/big-pickle\"",
|
|
316
|
+
"board.placeholderExample": "e.g. {example}",
|
|
317
|
+
"board.placeholderBlank": "(blank)",
|
|
318
|
+
"board.saving": "Saving...",
|
|
319
|
+
"board.save": "Save",
|
|
320
|
+
"board.create": "Create",
|
|
321
|
+
"board.cancel": "Cancel",
|
|
322
|
+
"board.formNav": "Tab/Shift+Tab to move | Enter advances or activates | Esc cancels",
|
|
323
|
+
"board.badgeNormal": "Loops",
|
|
324
|
+
"board.badgeSearch": "SEARCH",
|
|
325
|
+
"board.badgeCreate": "CREATE",
|
|
326
|
+
"board.badgeTask": "TASK",
|
|
327
|
+
"board.badgeHelp": "HELP",
|
|
328
|
+
"board.badgeDetail": "DETAIL",
|
|
329
|
+
"board.badgeConfirm": "CONFIRM",
|
|
330
|
+
"board.confirmTitle": " Confirm ",
|
|
331
|
+
"board.yes": "Yes",
|
|
332
|
+
"board.no": "No",
|
|
333
|
+
"board.actionEdit": "Edit",
|
|
334
|
+
"board.actionDelete": "Delete",
|
|
335
|
+
"board.actionPause": "Pause",
|
|
336
|
+
"board.actionStop": "Stop",
|
|
337
|
+
"board.actionPlay": "Play",
|
|
338
|
+
"board.actionClone": "Clone",
|
|
339
|
+
"board.actionTrigger": "Force Run",
|
|
340
|
+
"board.noActions": "Select a loop to see actions",
|
|
341
|
+
"board.confirmPause": "Pause loop \"{desc}\"?",
|
|
342
|
+
"board.confirmStop": "Stop loop \"{desc}\"? (schedule will reset on Play)",
|
|
343
|
+
"board.confirmPlay": "Play loop \"{desc}\"? (starts fresh interval from now)",
|
|
344
|
+
"board.confirmResume": "Resume loop \"{desc}\"?",
|
|
345
|
+
"board.confirmTrigger": "Force run loop \"{desc}\"?",
|
|
346
|
+
"board.confirmDelete": "Delete loop \"{desc}\"?",
|
|
347
|
+
"board.toastPaused": "Paused \"{desc}\"",
|
|
348
|
+
"board.toastStopped": "Stopped \"{desc}\"",
|
|
349
|
+
"board.toastPlayed": "Playing \"{desc}\"",
|
|
350
|
+
"board.toastResumed": "Resumed \"{desc}\"",
|
|
351
|
+
"board.toastDeleted": "Deleted \"{desc}\"",
|
|
352
|
+
"board.toastUpdated": "Updated \"{desc}\" (paused)",
|
|
353
|
+
"board.toastTriggered": "Triggered \"{desc}\"",
|
|
354
|
+
"board.toastStarted": "Started \"{desc}\"",
|
|
355
|
+
"board.toastTaskCreated": "Task created {id}",
|
|
356
|
+
"board.toastTaskUpdated": "Task updated {id}",
|
|
357
|
+
"board.toastTaskSelected": "Selected task \"{desc}\"",
|
|
358
|
+
"board.toastCopied": "Copied to clipboard",
|
|
359
|
+
"board.toastTextCopied": "Text Copied",
|
|
360
|
+
"board.copyCommand": "Copy",
|
|
361
|
+
"board.logWaiting": " Waiting for live output...",
|
|
362
|
+
"board.logStreamError": "Log stream error: {message}",
|
|
363
|
+
"board.hintSearch": "search",
|
|
364
|
+
"board.hintRunHistory": "runs",
|
|
365
|
+
"board.hintOpenRun": "select loop / open log",
|
|
366
|
+
"board.hintSwitchPanel": "panel",
|
|
367
|
+
"board.hintHelp": "help",
|
|
368
|
+
"board.hintQuit": "quit",
|
|
369
|
+
"board.hintApply": "apply",
|
|
370
|
+
"board.hintCancel": "cancel",
|
|
371
|
+
"board.hintNextField": "next field",
|
|
372
|
+
"board.hintCreate": "create",
|
|
373
|
+
"board.hintBack": "back",
|
|
374
|
+
"board.hintChoose": "choose",
|
|
375
|
+
"board.hintConfirm": "confirm",
|
|
376
|
+
"board.hintYesNo": "yes/no",
|
|
377
|
+
"board.helpKeyMove": "up/down, j/k",
|
|
378
|
+
"board.helpKeyEnter": "enter",
|
|
379
|
+
"board.helpKeyN": "n",
|
|
380
|
+
"board.helpKeyE": "e",
|
|
381
|
+
"board.helpKeyP": "p",
|
|
382
|
+
"board.helpKeyX": "x",
|
|
383
|
+
"board.helpKeyD": "d",
|
|
384
|
+
"board.helpKeySlash": "/",
|
|
385
|
+
"board.helpKeyF": "f",
|
|
386
|
+
"board.helpKeyS": "s",
|
|
387
|
+
"board.helpKeyH": "h",
|
|
388
|
+
"board.helpKeyEsc": "esc",
|
|
389
|
+
"board.helpKeyQ": "q",
|
|
390
|
+
"board.hintKeySlash": "/",
|
|
391
|
+
"board.hintKeyH": "h",
|
|
392
|
+
"board.hintKeyQ": "q",
|
|
393
|
+
"board.hintKeyEnter": "enter",
|
|
394
|
+
"board.hintKeyEsc": "esc",
|
|
395
|
+
"board.hintKeyTab": "tab",
|
|
396
|
+
"board.hintKeyHelpEsc": "h/esc",
|
|
397
|
+
"board.hintKeyArrows": "←/→",
|
|
398
|
+
"board.hintKeyYN": "y/n",
|
|
399
|
+
"board.taskBrowserTitle": " Tasks {visible}/{total} ",
|
|
400
|
+
"board.taskBrowserEmpty": " No tasks defined yet. Press n to create one.",
|
|
401
|
+
"board.taskInspectorTitle": " Task Inspector ",
|
|
402
|
+
"board.taskInspectorEmpty": " Select a task to inspect",
|
|
403
|
+
"board.taskFieldName": "Name:",
|
|
404
|
+
"board.taskFieldId": "ID:",
|
|
405
|
+
"board.taskFieldCommand": "Command:",
|
|
406
|
+
"board.taskFieldChain": "Chain:",
|
|
407
|
+
"board.taskFieldSilent": "Silent:",
|
|
408
|
+
"board.taskFieldCreated": "Created:",
|
|
409
|
+
"board.taskHeaderName": "NAME",
|
|
410
|
+
"board.taskHeaderCommand": "COMMAND",
|
|
411
|
+
"board.taskHeaderChains": "CHAINS",
|
|
412
|
+
"board.taskActionSelect": "Select",
|
|
413
|
+
"board.taskActionNew": "+ New Task",
|
|
414
|
+
"board.newTaskTitle": " New ",
|
|
415
|
+
"board.taskActionEdit": "Edit",
|
|
416
|
+
"board.taskActionDelete": "Delete",
|
|
417
|
+
"board.confirmDeleteTask": "Delete task \"{desc}\"?",
|
|
418
|
+
"board.toastTaskDeleted": "Deleted task \"{desc}\"",
|
|
419
|
+
"board.chooseTask": "Choose Task",
|
|
420
|
+
"board.selectedTask": "Task: {name}",
|
|
421
|
+
"board.taskChainsNone": "-",
|
|
422
|
+
"board.taskChainsFormat": "✓:{success} ✗:{failure}",
|
|
423
|
+
"board.silentChainCount": "{count} silent-chain runs",
|
|
424
|
+
"board.silentChainYes": "yes",
|
|
425
|
+
"board.silentChainNo": "no",
|
|
426
|
+
"board.logModalCopied": "Log copied to clipboard",
|
|
427
|
+
"project.selectProject": " Select Project ",
|
|
428
|
+
"project.projectsLabel": "Projects",
|
|
429
|
+
"project.projectsTitle": " Projects ",
|
|
430
|
+
"project.filterTitle": " Project r ",
|
|
431
|
+
"project.newProjectLabel": "+ New Project",
|
|
432
|
+
"project.manageLabel": "View Projects",
|
|
433
|
+
"project.showAll": "Show All",
|
|
434
|
+
"project.showAllLoops": "All loops",
|
|
435
|
+
"project.manageTitle": "",
|
|
436
|
+
"project.createTitle": " New Project ",
|
|
437
|
+
"project.editTitle": " Edit Project ",
|
|
438
|
+
"project.deleteTitle": " Delete Project ",
|
|
439
|
+
"project.labelName": "Name",
|
|
440
|
+
"project.labelColor": "Color",
|
|
441
|
+
"project.hintName": "A short name for this project",
|
|
442
|
+
"project.hintColor": "Pick a color for this project",
|
|
443
|
+
"project.systemLabel": "System project",
|
|
444
|
+
"project.editProjectLabel": "Edit",
|
|
445
|
+
"project.deleteProjectLabel": "Delete",
|
|
446
|
+
"project.loopCount": "{count} loop(s)",
|
|
447
|
+
"project.noLoops": "No loops",
|
|
448
|
+
"project.deleteConfirm": "Delete project \"{name}\"?",
|
|
449
|
+
"project.deleteWarning": "This project has {count} loop(s). Loops will be moved to Default.",
|
|
450
|
+
"project.moveToDefault": "Yes, move to Default",
|
|
451
|
+
"project.keyNewHint": "n: new",
|
|
452
|
+
"project.keyEditHint": "e: edit",
|
|
453
|
+
"project.keyDeleteHint": "d: delete",
|
|
454
|
+
"project.error.nameRequired": "Project name is required",
|
|
455
|
+
"project.error.nameEmpty": "Project name cannot be empty",
|
|
456
|
+
"project.wizard.namePrompt": "What is the project name?",
|
|
457
|
+
"project.wizard.nameHint": "A short name for this project",
|
|
458
|
+
"project.wizard.colorPrompt": "Pick a color for this project",
|
|
459
|
+
"project.wizard.colorHint": "Choose a color to identify this project",
|
|
460
|
+
"project.wizard.directoryPrompt": "Working directory? (optional)",
|
|
461
|
+
"project.wizard.directoryHint": "Default directory for loops in this project. Leave blank to inherit",
|
|
462
|
+
"project.wizard.githubSourcePrompt": "GitHub Source? (optional)",
|
|
463
|
+
"project.wizard.githubSourceHint": "Repository in owner/repo format, e.g. CKGrafico/loop-task",
|
|
464
|
+
"project.error.updateFailed": "Failed to update project",
|
|
465
|
+
"project.error.deleteFailed": "Failed to delete project",
|
|
466
|
+
"project.toastCreated": "Project \"{name}\" created",
|
|
467
|
+
"project.toastUpdated": "Project \"{name}\" updated",
|
|
468
|
+
"project.toastDeleted": "Project \"{name}\" deleted",
|
|
469
|
+
"project.filterHasLoopsTitle": " Loops l ",
|
|
470
|
+
"project.filterHasLoopsAll": "all",
|
|
471
|
+
"project.filterHasLoopsWithLoops": "with loops",
|
|
472
|
+
"project.filterHasLoopsEmpty": "empty",
|
|
473
|
+
"project.filterIsSystemTitle": " Type t ",
|
|
474
|
+
"project.filterIsSystemAll": "all",
|
|
475
|
+
"project.filterIsSystemSystem": "system",
|
|
476
|
+
"project.filterIsSystemUser": "user",
|
|
477
|
+
"project.sortTitle": " Order o ",
|
|
478
|
+
"project.sortName": "name",
|
|
479
|
+
"project.sortLoopCount": "loop count",
|
|
480
|
+
"project.sortCreatedDate": "created",
|
|
481
|
+
"project.navigatorTitle": " Projects {visible}/{total} sort:{sort} loops:{hasLoops} ",
|
|
482
|
+
"project.noMatch": " No projects match the current view",
|
|
483
|
+
"project.headerName": "NAME",
|
|
484
|
+
"project.headerLoops": "LOOPS",
|
|
485
|
+
"project.headerCreated": "CREATED",
|
|
486
|
+
"project.inspectorEmpty": " Select a project to view details",
|
|
487
|
+
"project.fieldId": "ID: ",
|
|
488
|
+
"project.fieldDirectory": "Dir: ",
|
|
489
|
+
"project.fieldCreated": "Created: ",
|
|
490
|
+
"project.fieldLoops": "Loops: ",
|
|
491
|
+
"project.hintSearch": "search",
|
|
492
|
+
"context.truncationWarning": "stdout exceeded 1MB - context was truncated",
|
|
493
|
+
"context.helpTitle": "Chain Context Sharing",
|
|
494
|
+
"context.helpRules": "JSON output merges its keys. JSONL merges each line as a separate key. Plain text is stored under the \"output\" key. Empty output produces no change.",
|
|
495
|
+
"context.helpTemplates": "Use {{key}} in commands and args - replaced with context values from earlier tasks in the chain.",
|
|
496
|
+
"context.helpCaveat": "Plain text stdout overwrites the \"output\" key. Use JSON with named keys when data must survive across tasks.",
|
|
497
|
+
"context.helpJqTip": "Tip: use --jq '{key: .field}' to wrap any value in a named JSON key",
|
|
498
|
+
"cmd.edit": "Edit selected loop",
|
|
499
|
+
"cmd.editTask": "Edit selected task",
|
|
500
|
+
"cmd.editProject": "Edit selected project",
|
|
501
|
+
"cmd.delete": "Delete selected loop",
|
|
502
|
+
"cmd.deleteTask": "Delete selected task",
|
|
503
|
+
"cmd.deleteProject": "Delete selected project",
|
|
504
|
+
"cmd.pause": "Pause selected loop",
|
|
505
|
+
"cmd.play": "Play resume loop",
|
|
506
|
+
"cmd.stop": "Stop selected loop",
|
|
507
|
+
"cmd.clone": "Clone selected loop",
|
|
508
|
+
"cmd.trigger": "Trigger run now",
|
|
509
|
+
"cmd.logs": "Open logs viewer",
|
|
510
|
+
"cmd.newLoop": "New loop",
|
|
511
|
+
"cmd.newTask": "New task",
|
|
512
|
+
"cmd.newProject": "New project",
|
|
513
|
+
"cmd.help": "Help show all commands",
|
|
514
|
+
"cmd.helpMe": "Help me with commands",
|
|
515
|
+
"cmd.allCommands": "All commands",
|
|
516
|
+
"cmd.search": "Find search filter",
|
|
517
|
+
"cmd.searchTasks": "Search tasks",
|
|
518
|
+
"cmd.searchProjects": "Search projects",
|
|
519
|
+
"cmd.setDefault": "Set as default project",
|
|
520
|
+
"cmd.show": "Show a hidden panel",
|
|
521
|
+
"cmd.hide": "Hide a panel",
|
|
522
|
+
"cmd.api": "API - Information",
|
|
523
|
+
"cmd.toggleApi": "API - Toggle on/off",
|
|
524
|
+
"cmd.mcp": "MCP - Information",
|
|
525
|
+
"cmd.toggleMcp": "MCP - Toggle on/off",
|
|
526
|
+
"board.toastApiEnabled": "HTTP API enabled",
|
|
527
|
+
"board.toastApiDisabled": "HTTP API disabled",
|
|
528
|
+
"board.toastApiToggleError": "Failed to toggle API: {message}",
|
|
529
|
+
"board.toastMcpEnabled": "MCP server enabled",
|
|
530
|
+
"board.toastMcpDisabled": "MCP server disabled",
|
|
531
|
+
"board.toastMcpToggleError": "Failed to toggle MCP: {message}",
|
|
532
|
+
"cmd.telemetry": "Telemetry - Information",
|
|
533
|
+
"cmd.toggleTelemetry": "Telemetry - Toggle on/off",
|
|
534
|
+
"cmd.telemetryDiagnostics": "Telemetry - Test connection",
|
|
535
|
+
"board.toastTelemetryEnabled": "OpenTelemetry enabled",
|
|
536
|
+
"board.toastTelemetryDisabled": "OpenTelemetry disabled",
|
|
537
|
+
"board.toastTelemetryToggleError": "Could not update OpenTelemetry: {message}",
|
|
538
|
+
"board.toastTelemetryNotConfigured": "OpenTelemetry: enabled but no endpoint configured",
|
|
539
|
+
"board.toastTelemetryTestSucceeded": "OpenTelemetry test succeeded: {endpoint}",
|
|
540
|
+
"board.toastTelemetryTestFailed": "OpenTelemetry test failed: {message}",
|
|
541
|
+
"telemetry.statusEnabled": "enabled",
|
|
542
|
+
"telemetry.statusDisabled": "disabled",
|
|
543
|
+
"telemetry.exportNotConfigured": "not configured",
|
|
544
|
+
"telemetry.exportConfigured": "configured",
|
|
545
|
+
"telemetry.exportHealthy": "connected",
|
|
546
|
+
"telemetry.exportUnavailable": "unavailable",
|
|
547
|
+
"telemetry.infoTitle": "OpenTelemetry",
|
|
548
|
+
"telemetry.infoEnabled": "OpenTelemetry: {status}",
|
|
549
|
+
"telemetry.infoExport": "Export: {state}",
|
|
550
|
+
"telemetry.infoEndpoint": "Endpoint: {endpoint}",
|
|
551
|
+
"telemetry.infoProtocol": "Protocol: {protocol}",
|
|
552
|
+
"telemetry.infoAgents": "Agent auto-instrumentation: {status}",
|
|
553
|
+
"telemetry.infoCapture": "Content capture: {status}",
|
|
554
|
+
"telemetry.infoHeaders": "Headers: {status}",
|
|
555
|
+
"telemetry.infoService": "Service name: {name}",
|
|
556
|
+
"cmd.filterStatus": "Filter by status",
|
|
557
|
+
"cmd.sort": "Order sort by field",
|
|
558
|
+
"cmd.project": "Filter by project",
|
|
559
|
+
"cmd.debug": "Debug toggle panel",
|
|
560
|
+
"cmd.export": "Export loops JSON",
|
|
561
|
+
"cmd.import": "Import loops JSON",
|
|
562
|
+
"import.missingVersion": "Missing export version. Expected: 2",
|
|
563
|
+
"import.unsupportedVersion": "Unsupported export version: {version}. Expected: 2",
|
|
564
|
+
"import.missingKeys": "Missing required keys: {keys}",
|
|
565
|
+
"import.nonArrayKey": "field '{key}' must be an array",
|
|
566
|
+
"import.invalidFile": "Invalid export file: expected a JSON object",
|
|
567
|
+
"import.writeFailed": "Failed to write store: {error}",
|
|
568
|
+
"import.rolledBack": "Rolled back previously written stores.",
|
|
569
|
+
"import.success": "Imported {loops} loops, {tasks} tasks, {projects} projects",
|
|
570
|
+
"import.hotReload": "Daemon will hot-reload automatically.",
|
|
571
|
+
"export.modalTitle": "Export Loops JSON",
|
|
572
|
+
"export.filePath": "Saved to: {path}",
|
|
573
|
+
"export.error": "Export failed: {message}",
|
|
574
|
+
"export.truncated": "[truncated, {total} lines]",
|
|
575
|
+
"export.hint": "up/down:scroll c:copy esc:close",
|
|
576
|
+
"cmd.quit": "Exit loop-task",
|
|
577
|
+
"cmd.save": "Save changes",
|
|
578
|
+
"cmd.cancel": "Discard changes",
|
|
579
|
+
"cmd.change": "Change a field value",
|
|
580
|
+
"cmd.changeInterval": "Change interval",
|
|
581
|
+
"cmd.changeCommand": "Change command",
|
|
582
|
+
"cmd.changeCwd": "Change working directory",
|
|
583
|
+
"cmd.changeDescription": "Change description",
|
|
584
|
+
"cmd.changeRunNow": "Change run-now setting",
|
|
585
|
+
"cmd.changeMaxRuns": "Change max runs",
|
|
586
|
+
"cmd.changeProject": "Change project",
|
|
587
|
+
"cmd.changeName": "Change name",
|
|
588
|
+
"cmd.changeOnSuccess": "Change on-success chain",
|
|
589
|
+
"cmd.changeOnFailure": "Change on-failure chain",
|
|
590
|
+
"cmdInput.placeholder": "Type a command, or help",
|
|
591
|
+
"cmdInput.welcomeHint": "type 'help' for commands, 'all' to browse",
|
|
592
|
+
"cmdInput.noMatches": "No commands match",
|
|
593
|
+
"commandBuilder.executableLabel": "Executable",
|
|
594
|
+
"commandBuilder.executableHint": "e.g. npm, pnpm, dotnet, docker",
|
|
595
|
+
"commandBuilder.argsLabel": "Arguments",
|
|
596
|
+
"commandBuilder.argsHint": "run, build, test...",
|
|
597
|
+
"commandBuilder.previewLabel": "Preview:",
|
|
598
|
+
"commandBuilder.copyHint": "Ctrl+Y copy",
|
|
599
|
+
"commandBuilder.navHint": "Tab/Enter next field . Esc done",
|
|
600
|
+
"commandBuilder.templatesLabel": "Templates (↑/↓ to select, Enter to apply):",
|
|
601
|
+
"commandBuilder.templateNpmRun": "npm run",
|
|
602
|
+
"commandBuilder.templateNpmTest": "npm test",
|
|
603
|
+
"commandBuilder.templatePnpmBuild": "pnpm build",
|
|
604
|
+
"commandBuilder.templatePnpmTest": "pnpm test",
|
|
605
|
+
"commandBuilder.templateDockerCompose": "docker compose up",
|
|
606
|
+
"wizard.chainNone": "None",
|
|
607
|
+
"cmdInput.searchPlaceholder": "Write something to filter about...",
|
|
608
|
+
"cmdInput.confirmYes": "yes",
|
|
609
|
+
"cmdInput.confirmCancel": "cancel",
|
|
610
|
+
"confirm.deleteLoop": "Type yes to delete \"{name}\"",
|
|
611
|
+
"confirm.deleteTask": "Type yes to delete task \"{id}\"",
|
|
612
|
+
"confirm.deleteProject": "Type yes to delete project \"{name}\"",
|
|
613
|
+
"confirm.stopLoop": "Type yes to stop \"{name}\"",
|
|
614
|
+
"confirm.quit": "Type yes to exit loop-task",
|
|
615
|
+
"wizard.newLoop": "New loop",
|
|
616
|
+
"wizard.editLoop": "Edit loop",
|
|
617
|
+
"wizard.newTask": "New task",
|
|
618
|
+
"wizard.stepOf": "Step {current} of {total}",
|
|
619
|
+
"wizard.intervalPrompt": "How often should it run?",
|
|
620
|
+
"wizard.intervalHint": "e.g. 30s, 5m, 30m, 1h, 1d, or manual for trigger-only",
|
|
621
|
+
"wizard.commandPrompt": "What command should run?",
|
|
622
|
+
"wizard.commandHint": "Full command line. Quote args with spaces",
|
|
623
|
+
"wizard.taskModePrompt": "Inline command or existing task?",
|
|
624
|
+
"wizard.taskModeInline": "Inline command",
|
|
625
|
+
"wizard.taskModeExisting": "Existing task",
|
|
626
|
+
"wizard.runNowPrompt": "Run immediately or wait for first interval?",
|
|
627
|
+
"wizard.runNowWait": "Wait for the first interval",
|
|
628
|
+
"wizard.runNowNow": "Run now, then every interval",
|
|
629
|
+
"wizard.cwdPrompt": "Working directory? (optional)",
|
|
630
|
+
"wizard.cwdHint": "Leave blank to inherit from project, or set a specific directory",
|
|
631
|
+
"wizard.descriptionPrompt": "Description?",
|
|
632
|
+
"wizard.descriptionHint": "Short label shown in the list",
|
|
633
|
+
"wizard.maxRunsPrompt": "Max runs? (optional)",
|
|
634
|
+
"wizard.maxRunsHint": "Stop after N runs. Leave blank to run forever",
|
|
635
|
+
"wizard.projectPrompt": "Which project?",
|
|
636
|
+
"wizard.projectHint": "Assign this loop to a project",
|
|
637
|
+
"wizard.taskNamePrompt": "Name for this task?",
|
|
638
|
+
"wizard.taskNameHint": "Short name to identify this task",
|
|
639
|
+
"wizard.taskCommandPrompt": "What command should this task run?",
|
|
640
|
+
"wizard.onSuccessPrompt": "On success, chain to? (optional)",
|
|
641
|
+
"wizard.onFailurePrompt": "On failure, chain to? (optional)",
|
|
642
|
+
"wizard.silentChainPrompt": "Silent chain? (suppress log output)",
|
|
643
|
+
"wizard.silentChainHint": "If true, this task won't appear in logs",
|
|
644
|
+
"wizard.taskMaxRunsPrompt": "Max runs per loop session?",
|
|
645
|
+
"wizard.taskMaxRunsHint": "Fail task after N executions within one loop session. Default: 5",
|
|
646
|
+
"wizard.contextPrompt": "Initial context? (optional)",
|
|
647
|
+
"wizard.contextHint": "JSON object with string values, e.g. {\"env\":\"staging\"}",
|
|
648
|
+
"wizard.contextInvalid": "Invalid context: must be a flat JSON object with non-nested, non-array values",
|
|
649
|
+
"wizard.created": "Created",
|
|
650
|
+
"wizard.filled": "{filled}/{total} filled",
|
|
651
|
+
"wizard.footerHints": "tab next . ctrl+s save . esc cancel",
|
|
652
|
+
"wizard.ctrlSave": "Ctrl+S to save with defaults",
|
|
653
|
+
"wizard.escBack": "Esc to go back",
|
|
654
|
+
"wizard.validationError": "Invalid value",
|
|
655
|
+
"patch.pendingChanges": "{count} pending changes",
|
|
656
|
+
"patch.noChanges": "No changes",
|
|
657
|
+
"patch.hintNavigation": "↑/↓ navigate fields . Enter to edit . Esc to cancel",
|
|
658
|
+
"patch.hintEditing": "Enter to confirm . Esc to cancel",
|
|
659
|
+
"patch.hintCopy": "Ctrl+Y copy field value",
|
|
660
|
+
"patch.hintNavPending": "↑/↓ navigate . Ctrl+S save . Esc cancel",
|
|
661
|
+
"patch.hintNavIdle": "↑/↓ navigate . Ctrl+Y copy",
|
|
662
|
+
"patch.enterEdit": "Enter to edit",
|
|
663
|
+
"patch.escapeCancel": "Esc to cancel",
|
|
664
|
+
"patch.save": "Save",
|
|
665
|
+
"patch.cancel": "Cancel",
|
|
666
|
+
"patch.field": "Field",
|
|
667
|
+
"patch.value": "Value",
|
|
668
|
+
"patch.validationError": "Invalid: {error}",
|
|
669
|
+
"api.title": "API Endpoints",
|
|
670
|
+
"api.daemonSocket": "Daemon socket",
|
|
671
|
+
"api.statusEndpoint": "Get daemon status",
|
|
672
|
+
"api.exportEndpoint": "Export loops",
|
|
673
|
+
"api.importEndpoint": "Import loops",
|
|
674
|
+
"api.closeHint": "Press Escape or q to close",
|
|
675
|
+
"helpGuide.title": "How loop-task works",
|
|
676
|
+
"helpGuide.intro": "This is a command-first terminal app. Instead of clicking buttons, you type commands at the bottom input.",
|
|
677
|
+
"helpGuide.commands": "Type a command and press Enter. Start typing to see matching commands - like fuzzy search.",
|
|
678
|
+
"helpGuide.examples": "Try: 'new' to create, 'edit' to modify, 'delete' to remove, 'pause' / 'play' to control loops.",
|
|
679
|
+
"helpGuide.confirm": "Destructive commands ask you to type 'yes' to confirm. This prevents accidents.",
|
|
680
|
+
"helpGuide.navigation": "Use Tab to switch between the left list and right detail. Use 1/2/3 to switch tabs (Loops/Tasks/Projects).",
|
|
681
|
+
"helpGuide.ctrl": "Ctrl+E = edit, Ctrl+D = delete - shortcuts that bypass typing.",
|
|
682
|
+
"helpGuide.allCommands": "Type 'all' or 'all commands' to browse every command grouped by category.",
|
|
683
|
+
"helpGuide.esc": "Press Escape or 'q' to close this window.",
|
|
684
|
+
"cmdsBrowser.title": "All Commands",
|
|
685
|
+
"cmdsBrowser.groupGlobal": "Global",
|
|
686
|
+
"cmdsBrowser.groupFilters": "Filters",
|
|
687
|
+
"cmdsBrowser.groupActions": "Actions",
|
|
688
|
+
"cmdsBrowser.groupLoop": "Loop Actions",
|
|
689
|
+
"cmdsBrowser.groupTask": "Task Actions",
|
|
690
|
+
"cmdsBrowser.groupProject": "Project Actions",
|
|
691
|
+
"cmdsBrowser.hint": "Up/Down to navigate, Enter to execute, Esc to close",
|
|
692
|
+
"errors.recipeDeleteRejected": "Recipe loops cannot be deleted; remove the recipe file instead",
|
|
693
|
+
"errors.recipeTaskImmutable": "Recipe tasks are immutable and cannot be modified",
|
|
694
|
+
"errors.recipeFieldLocked": "Recipe loops only allow editing interval, maxRuns, and context",
|
|
695
|
+
"board.recipeBadge": "R",
|
|
696
|
+
"board.recipeFile": "Recipe",
|
|
697
|
+
"board.recipeTooltip": "Recipe loops are managed by .loops/recipes/*.json",
|
|
698
|
+
"cmd.diagram": "View loop diagram",
|
|
699
|
+
"diagram.modalTitle": "Loop Diagram",
|
|
700
|
+
"diagram.hint": "up/down:scroll c:copy esc:close",
|
|
701
|
+
"diagram.noTaskChain": "This loop has no task chain.",
|
|
702
|
+
"diagram.loopNotFound": "Loop not found: {id}",
|
|
703
|
+
"diagram.noTaskLinked": "Loop {id} has no task chain",
|
|
704
|
+
"diagram.noDiagramInRecipe": "This recipe has no diagram field. Add a diagram: section to the YAML file.",
|
|
705
|
+
"diagram.notARecipe": "Only recipe loops have diagrams. This loop was created manually.",
|
|
706
|
+
"diagram.readError": "Failed to read recipe diagram: {message}",
|
|
707
|
+
"task.recipeImmutable": "Recipe tasks are immutable. Edit the .loops/recipes/*.yaml file instead.",
|
|
708
|
+
"task.recipeImmutableShort": "Recipe task — edit the .yaml file"
|
|
709
|
+
}
|