vault backup: 2026-02-26 11:44:20

This commit is contained in:
OpenClaw Bot 2026-02-26 11:44:20 -06:00
parent 22aca2d095
commit d382ba1e0b
15 changed files with 1596 additions and 4 deletions

1
.obsidian/app.json vendored Normal file
View File

@ -0,0 +1 @@
{}

1
.obsidian/appearance.json vendored Normal file
View File

@ -0,0 +1 @@
{}

31
.obsidian/bookmarks.json vendored Normal file
View File

@ -0,0 +1,31 @@
{
"items": [
{
"type": "group",
"ctime": 1772127481693,
"items": [
{
"type": "file",
"ctime": 1772127471162,
"path": "AGENTS.md"
},
{
"type": "file",
"ctime": 1772127471162,
"path": "USER.md"
},
{
"type": "file",
"ctime": 1772127471162,
"path": "TOOLS.md"
},
{
"type": "file",
"ctime": 1772127471162,
"path": "MEMORY.md"
}
],
"title": "Control Docs"
}
]
}

3
.obsidian/community-plugins.json vendored Normal file
View File

@ -0,0 +1,3 @@
[
"obsidian-git"
]

33
.obsidian/core-plugins.json vendored Normal file
View File

@ -0,0 +1,33 @@
{
"file-explorer": true,
"global-search": true,
"switcher": true,
"graph": true,
"backlink": true,
"canvas": true,
"outgoing-link": true,
"tag-pane": true,
"footnotes": false,
"properties": true,
"page-preview": true,
"daily-notes": true,
"templates": true,
"note-composer": true,
"command-palette": true,
"slash-command": false,
"editor-status": true,
"bookmarks": true,
"markdown-importer": false,
"zk-prefixer": false,
"random-note": false,
"outline": true,
"word-count": true,
"slides": false,
"audio-recorder": false,
"workspaces": false,
"file-recovery": true,
"publish": false,
"sync": true,
"bases": true,
"webviewer": false
}

3
.obsidian/daily-notes.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"folder": "memory"
}

452
.obsidian/plugins/obsidian-git/main.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,10 @@
{
"author": "Vinzent",
"authorUrl": "https://github.com/Vinzent03",
"id": "obsidian-git",
"name": "Git",
"description": "Integrate Git version control with automatic backup and other advanced features.",
"isDesktopOnly": false,
"fundingUrl": "https://ko-fi.com/vinzent",
"version": "2.37.1"
}

View File

@ -0,0 +1,705 @@
@keyframes loading {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.git-signs-gutter {
.cm-gutterElement {
/* Needed to align the sign properly for different line heigts. Such as
* when having a heading or list item.
*/
padding-top: 0 !important;
}
}
.workspace-leaf-content[data-type="git-view"] .button-border {
border: 2px solid var(--interactive-accent);
border-radius: var(--radius-s);
}
.workspace-leaf-content[data-type="git-view"] .view-content {
padding-left: 0;
padding-top: 0;
padding-right: 0;
}
.workspace-leaf-content[data-type="git-history-view"] .view-content {
padding-left: 0;
padding-top: 0;
padding-right: 0;
}
.loading {
overflow: hidden;
}
.loading > svg {
animation: 2s linear infinite loading;
transform-origin: 50% 50%;
display: inline-block;
}
.obsidian-git-center {
margin: auto;
text-align: center;
width: 50%;
}
.obsidian-git-textarea {
display: block;
margin-left: auto;
margin-right: auto;
}
.obsidian-git-disabled {
opacity: 0.5;
}
.obsidian-git-center-button {
display: block;
margin: 20px auto;
}
.tooltip.mod-left {
overflow-wrap: break-word;
}
.tooltip.mod-right {
overflow-wrap: break-word;
}
/* Limits the scrollbar to the view body */
.git-view {
display: flex;
flex-direction: column;
position: relative;
height: 100%;
}
.git-tools {
display: flex;
margin-left: auto;
}
.git-tools .type {
padding-left: var(--size-2-1);
display: flex;
align-items: center;
justify-content: center;
width: 11px;
}
.git-tools .type[data-type="M"] {
color: orange;
}
.git-tools .type[data-type="D"] {
color: red;
}
.git-tools .buttons {
display: flex;
}
.git-tools .buttons > * {
padding: 0 0;
height: auto;
}
.workspace-leaf-content[data-type="git-view"] .tree-item-self,
.workspace-leaf-content[data-type="git-history-view"] .tree-item-self {
align-items: center;
}
.workspace-leaf-content[data-type="git-view"]
.tree-item-self:hover
.clickable-icon,
.workspace-leaf-content[data-type="git-history-view"]
.tree-item-self:hover
.clickable-icon {
color: var(--icon-color-hover);
}
/* Highlight an item as active if it's diff is currently opened */
.is-active .git-tools .buttons > * {
color: var(--nav-item-color-active);
}
.git-author {
color: var(--text-accent);
}
.git-date {
color: var(--text-accent);
}
.git-ref {
color: var(--text-accent);
}
/* ====== diff2html ======
The following styles are adapted from the obsidian-version-history plugin by
@kometenstaub https://github.com/kometenstaub/obsidian-version-history-diff/blob/main/src/styles.scss
which itself is adapted from the diff2html library with the following original license:
https://github.com/rtfpessoa/diff2html/blob/master/LICENSE.md
Copyright 2014-2016 Rodrigo Fernandes https://rtfpessoa.github.io/
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
.theme-dark,
.theme-light {
--git-delete-bg: #ff475040;
--git-delete-hl: #96050a75;
--git-insert-bg: #68d36840;
--git-insert-hl: #23c02350;
--git-change-bg: #ffd55840;
--git-selected: #3572b0;
--git-delete: #c33;
--git-insert: #399839;
--git-change: #d0b44c;
--git-move: #3572b0;
}
.git-diff {
.d2h-d-none {
display: none;
}
.d2h-wrapper {
text-align: left;
border-radius: 0.25em;
overflow: auto;
}
.d2h-file-header.d2h-file-header {
background-color: var(--background-secondary);
border-bottom: 1px solid var(--background-modifier-border);
font-family:
Source Sans Pro,
Helvetica Neue,
Helvetica,
Arial,
sans-serif;
height: 35px;
padding: 5px 10px;
}
.d2h-file-header,
.d2h-file-stats {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
}
.d2h-file-header {
display: none;
}
.d2h-file-stats {
font-size: 14px;
margin-left: auto;
}
.d2h-lines-added {
border: 1px solid var(--color-green);
border-radius: 5px 0 0 5px;
color: var(--color-green);
padding: 2px;
text-align: right;
vertical-align: middle;
}
.d2h-lines-deleted {
border: 1px solid var(--color-red);
border-radius: 0 5px 5px 0;
color: var(--color-red);
margin-left: 1px;
padding: 2px;
text-align: left;
vertical-align: middle;
}
.d2h-file-name-wrapper {
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
font-size: 15px;
width: 100%;
}
.d2h-file-name {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: var(--text-normal);
font-size: var(--h5-size);
}
.d2h-file-wrapper {
border: 1px solid var(--background-secondary-alt);
border-radius: 3px;
margin-bottom: 1em;
max-height: 100%;
}
.d2h-file-collapse {
-webkit-box-pack: end;
-ms-flex-pack: end;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
border: 1px solid var(--background-secondary-alt);
border-radius: 3px;
cursor: pointer;
display: none;
font-size: 12px;
justify-content: flex-end;
padding: 4px 8px;
}
.d2h-file-collapse.d2h-selected {
background-color: var(--git-selected);
}
.d2h-file-collapse-input {
margin: 0 4px 0 0;
}
.d2h-diff-table {
border-collapse: collapse;
font-family: var(--font-monospace);
font-size: var(--code-size);
width: 100%;
}
.d2h-files-diff {
width: 100%;
}
.d2h-file-diff {
/*
overflow-y: scroll;
*/
border-radius: 5px;
font-size: var(--font-text-size);
line-height: var(--line-height-normal);
}
.d2h-file-side-diff {
display: inline-block;
margin-bottom: -8px;
margin-right: -4px;
overflow-x: scroll;
overflow-y: hidden;
width: 50%;
}
.d2h-code-line {
padding-left: 6em;
padding-right: 1.5em;
}
.d2h-code-line,
.d2h-code-side-line {
display: inline-block;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
white-space: nowrap;
width: 100%;
}
.d2h-code-side-line {
/* needed to be changed */
padding-left: 0.5em;
padding-right: 0.5em;
}
.d2h-code-line-ctn {
word-wrap: normal;
background: none;
display: inline-block;
padding: 0;
-webkit-user-select: text;
-moz-user-select: text;
-ms-user-select: text;
user-select: text;
vertical-align: middle;
width: 100%;
/* only works for line-by-line */
white-space: pre-wrap;
}
.d2h-code-line del,
.d2h-code-side-line del {
background-color: var(--git-delete-hl);
color: var(--text-normal);
}
.d2h-code-line del,
.d2h-code-line ins,
.d2h-code-side-line del,
.d2h-code-side-line ins {
border-radius: 0.2em;
display: inline-block;
margin-top: -1px;
text-decoration: none;
vertical-align: middle;
}
.d2h-code-line ins,
.d2h-code-side-line ins {
background-color: var(--git-insert-hl);
text-align: left;
}
.d2h-code-line-prefix {
word-wrap: normal;
background: none;
display: inline;
padding: 0;
white-space: pre;
}
.line-num1 {
float: left;
}
.line-num1,
.line-num2 {
-webkit-box-sizing: border-box;
box-sizing: border-box;
overflow: hidden;
/*
padding: 0 0.5em;
*/
text-overflow: ellipsis;
width: 2.5em;
padding-left: 0;
}
.line-num2 {
float: right;
}
.d2h-code-linenumber {
background-color: var(--background-primary);
border: solid var(--background-modifier-border);
border-width: 0 1px;
-webkit-box-sizing: border-box;
box-sizing: border-box;
color: var(--text-faint);
cursor: pointer;
display: inline-block;
position: absolute;
text-align: right;
width: 5.5em;
}
.d2h-code-linenumber:after {
content: "\200b";
}
.d2h-code-side-linenumber {
background-color: var(--background-primary);
border: solid var(--background-modifier-border);
border-width: 0 1px;
-webkit-box-sizing: border-box;
box-sizing: border-box;
color: var(--text-faint);
cursor: pointer;
overflow: hidden;
padding: 0 0.5em;
text-align: right;
text-overflow: ellipsis;
width: 4em;
/* needed to be changed */
display: table-cell;
position: relative;
}
.d2h-code-side-linenumber:after {
content: "\200b";
}
.d2h-code-side-emptyplaceholder,
.d2h-emptyplaceholder {
background-color: var(--background-primary);
border-color: var(--background-modifier-border);
}
.d2h-code-line-prefix,
.d2h-code-linenumber,
.d2h-code-side-linenumber,
.d2h-emptyplaceholder {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.d2h-code-linenumber,
.d2h-code-side-linenumber {
direction: rtl;
}
.d2h-del {
background-color: var(--git-delete-bg);
border-color: var(--git-delete-hl);
}
.d2h-ins {
background-color: var(--git-insert-bg);
border-color: var(--git-insert-hl);
}
.d2h-info {
background-color: var(--background-primary);
border-color: var(--background-modifier-border);
color: var(--text-faint);
}
.d2h-del,
.d2h-ins,
.d2h-file-diff .d2h-change {
color: var(--text-normal);
}
.d2h-file-diff .d2h-del.d2h-change {
background-color: var(--git-change-bg);
}
.d2h-file-diff .d2h-ins.d2h-change {
background-color: var(--git-insert-bg);
}
.d2h-file-list-wrapper {
a {
text-decoration: none;
cursor: default;
-webkit-user-drag: none;
}
svg {
display: none;
}
}
.d2h-file-list-header {
text-align: left;
}
.d2h-file-list-title {
display: none;
}
.d2h-file-list-line {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
text-align: left;
}
.d2h-file-list {
}
.d2h-file-list > li {
border-bottom: 1px solid var(--background-modifier-border);
margin: 0;
padding: 5px 10px;
}
.d2h-file-list > li:last-child {
border-bottom: none;
}
.d2h-file-switch {
cursor: pointer;
display: none;
font-size: 10px;
}
.d2h-icon {
fill: currentColor;
margin-right: 10px;
vertical-align: middle;
}
.d2h-deleted {
color: var(--git-delete);
}
.d2h-added {
color: var(--git-insert);
}
.d2h-changed {
color: var(--git-change);
}
.d2h-moved {
color: var(--git-move);
}
.d2h-tag {
background-color: var(--background-secondary);
display: -webkit-box;
display: -ms-flexbox;
display: flex;
font-size: 10px;
margin-left: 5px;
padding: 0 2px;
}
.d2h-deleted-tag {
border: 1px solid var(--git-delete);
}
.d2h-added-tag {
border: 1px solid var(--git-insert);
}
.d2h-changed-tag {
border: 1px solid var(--git-change);
}
.d2h-moved-tag {
border: 1px solid var(--git-move);
}
/* needed for line-by-line*/
.d2h-diff-tbody {
position: relative;
}
}
/* ====================== Line Authoring Information ====================== */
.cm-gutterElement.obs-git-blame-gutter {
/* Add background color to spacing inbetween and around the gutter for better aesthetics */
border-width: 0px 2px 0.2px 2px;
border-style: solid;
border-color: var(--background-secondary);
background-color: var(--background-secondary);
}
.cm-gutterElement.obs-git-blame-gutter > div,
.line-author-settings-preview {
/* delegate text color to settings */
color: var(--obs-git-gutter-text);
font-family: monospace;
height: 100%; /* ensure, that age-based background color occupies entire parent */
text-align: right;
padding: 0px 6px 0px 6px;
white-space: pre; /* Keep spaces and do not collapse them. */
}
@media (max-width: 800px) {
/* hide git blame gutter not to superpose text */
.cm-gutterElement.obs-git-blame-gutter {
display: none;
}
}
.git-unified-diff-view,
.git-split-diff-view .cm-deletedLine .cm-changedText {
background-color: #ee443330;
}
.git-unified-diff-view,
.git-split-diff-view .cm-insertedLine .cm-changedText {
background-color: #22bb2230;
}
.git-obscure-prompt[git-is-obscured="true"] #git-show-password:after {
-webkit-mask-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svg-icon lucide-eye"><path d="M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0"></path><circle cx="12" cy="12" r="3"></circle></svg>');
}
.git-obscure-prompt[git-is-obscured="false"] #git-show-password:after {
-webkit-mask-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svg-icon lucide-eye-off"><path d="M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49"></path><path d="M14.084 14.158a3 3 0 0 1-4.242-4.242"></path><path d="M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143"></path><path d="m2 2 20 20"></path></svg>');
}
/* Override styling of Codemirror merge view "collapsed lines" indicator */
.git-split-diff-view .ͼ2 .cm-collapsedLines {
background: var(--interactive-normal);
border-radius: var(--radius-m);
color: var(--text-accent);
font-size: var(--font-small);
padding: var(--size-4-1) var(--size-4-1);
}
.git-split-diff-view .ͼ2 .cm-collapsedLines:hover {
background: var(--interactive-hover);
color: var(--text-accent-hover);
}
.git-signs-gutter {
.cm-gutterElement {
display: grid;
}
}
.git-gutter-marker:hover {
border-radius: 2px;
}
.git-gutter-marker.git-add {
background-color: var(--color-green);
justify-self: center;
height: inherit;
width: 0.2rem;
}
.git-gutter-marker.git-change {
background-color: var(--color-yellow);
justify-self: center;
height: inherit;
width: 0.2rem;
}
.git-gutter-marker.git-changedelete {
color: var(--color-yellow);
font-weight: var(--font-bold);
font-size: 1rem;
justify-self: center;
height: inherit;
}
.git-gutter-marker.git-delete {
background-color: var(--color-red);
height: 0.2rem;
width: 0.8rem;
align-self: end;
}
.git-gutter-marker.git-topdelete {
background-color: var(--color-red);
height: 0.2rem;
width: 0.8rem;
align-self: start;
}
div:hover > .git-gutter-marker.git-change {
width: 0.6rem;
}
div:hover > .git-gutter-marker.git-add {
width: 0.6rem;
}
div:hover > .git-gutter-marker.git-delete {
height: 0.6rem;
}
div:hover > .git-gutter-marker.git-topdelete {
height: 0.6rem;
}
div:hover > .git-gutter-marker.git-changedelete {
font-weight: var(--font-bold);
}
.git-gutter-marker.staged {
opacity: 0.5;
}
.git-diff {
.cm-merge-revert {
width: 4em;
}
/* Ensure that merge revert markers are positioned correctly */
.cm-merge-revert > * {
position: absolute;
background-color: var(--background-secondary);
display: flex;
}
}
/* Prevent shifting of the editor when git signs gutter is the only gutter present */
.cm-gutters.cm-gutters-before:has(> .git-signs-gutter:only-child) {
margin-inline-end: 0;
.git-signs-gutter {
margin-inline-start: -1rem;
}
}
.git-changes-status-bar-colored {
.git-add {
color: var(--color-green);
}
.git-change {
color: var(--color-yellow);
}
.git-delete {
color: var(--color-red);
}
}
.git-changes-status-bar .git-add {
margin-right: 0.3em;
}
.git-changes-status-bar .git-change {
margin-right: 0.3em;
}

197
.obsidian/workspace.json vendored Normal file
View File

@ -0,0 +1,197 @@
{
"main": {
"id": "15dce58866a4bb8b",
"type": "split",
"children": [
{
"id": "7997ffe733237642",
"type": "tabs",
"children": [
{
"id": "09c562b295be8994",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "TOOLS.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "TOOLS"
}
}
]
}
],
"direction": "vertical"
},
"left": {
"id": "b559806b35f21a16",
"type": "split",
"children": [
{
"id": "3f13faec3f8f35eb",
"type": "tabs",
"children": [
{
"id": "ded6fd0a7702fddd",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "Files"
}
},
{
"id": "b196c01fc28d3dbe",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "Search"
}
},
{
"id": "1914b3cb53aaf523",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "Bookmarks"
}
}
],
"currentTab": 2
}
],
"direction": "horizontal",
"width": 300
},
"right": {
"id": "4c1dcdbb6efbca4c",
"type": "split",
"children": [
{
"id": "82031abaf61991ed",
"type": "tabs",
"children": [
{
"id": "2f4440055db5fe67",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"file": "TOOLS.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Backlinks for TOOLS"
}
},
{
"id": "66dba253fb749a04",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"file": "TOOLS.md",
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "Outgoing links from TOOLS"
}
},
{
"id": "f45402d27597dc41",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-tags",
"title": "Tags"
}
},
{
"id": "0f6f4d4bd1b4e5a2",
"type": "leaf",
"state": {
"type": "all-properties",
"state": {
"sortOrder": "frequency",
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-archive",
"title": "All properties"
}
},
{
"id": "b39f10ce34ec8c7c",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"file": "TOOLS.md",
"followCursor": false,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-list",
"title": "Outline of TOOLS"
}
}
]
}
],
"direction": "horizontal",
"width": 300,
"collapsed": true
},
"left-ribbon": {
"hiddenItems": {
"switcher:Open quick switcher": false,
"graph:Open graph view": false,
"canvas:Create new canvas": false,
"daily-notes:Open today's daily note": false,
"templates:Insert template": false,
"command-palette:Open command palette": false,
"bases:Create new base": false
}
},
"active": "1914b3cb53aaf523",
"lastOpenFiles": [
"MEMORY.md",
"USER.md",
"AGENTS.md",
"TOOLS.md",
"Untitled 2.base",
"Untitled 1.base",
"Untitled.base"
]
}

3
Untitled 1.base Normal file
View File

@ -0,0 +1,3 @@
views:
- type: table
name: Table

3
Untitled 2.base Normal file
View File

@ -0,0 +1,3 @@
views:
- type: table
name: Table

3
Untitled.base Normal file
View File

@ -0,0 +1,3 @@
views:
- type: table
name: Table

View File

@ -7,4 +7,151 @@
- Tomorrow's priority: Hardening task (ed4bc5aa-8c84-4f95-b339-cf2ea17fd02b)—cron/Bob progress.
🎯 Suggestion:
Morning: Gantt Board for hardening (test if complete), git commit workspace. Builds reliable agents for iOS empire—rest well.
Morning: Gantt Board for hardening (test if complete), git commit workspace. Builds reliable agents for iOS empire—rest well.
---
## [2026-02-26 10:36] ✅ Completed - Shared auth-api skill integration
### What was requested
Matt asked to build/integrate/test a no-duplication auth API layer shared by `gantt-tasks` and `mission-control-docs`.
### What was decided
- Do NOT merge domain skills.
- Create shared `auth-api` transport skill/module and wire both domain skills to it.
### What was done
- Created new skill: `~/.agents/skills/auth-api/`
- `SKILL.md`
- `lib/auth_api.sh` with `api_call`, `api_preflight`, `api_require_token`
- Refactored `gantt-tasks/lib/tasks.sh`
- Added source to shared `auth_api.sh`
- Replaced local `_api_call` implementation to delegate to shared `api_call`
- Refactored `mission-control-docs/lib/docs.sh`
- Added source to shared `auth_api.sh`
- Replaced local `_api_call` implementation to delegate to shared `api_call`
- Updated both SKILL docs to reflect architecture:
- `Domain Skill -> auth-api transport -> API -> DB`
- Added tests:
- `~/.agents/skills/auth-api/tests/test_auth_api.sh` (mocked curl contract test)
- Ran tests:
- Initial fail due to grep pattern parsing; fixed with `grep -F --`
- Final: `PASS: auth-api transport tests`
- Smoke checks passed:
- both domain libs source/load correctly
- both `_api_call` functions route through shared transport layer
### Follow-ups
- Optionally add retry/backoff policy in `auth_api.sh` once behavior is agreed.
### Additional completed (2026-02-26 10:39)
- Added per-domain contract tests with mocked shared transport:
- `~/.agents/skills/gantt-tasks/tests/test_contract.sh`
- verifies `task_create` contract (`GET /sprints`, `POST /tasks`)
- verifies `task_update` contract (`GET /tasks`, `POST /tasks` with status change)
- `~/.agents/skills/mission-control-docs/tests/test_contract.sh`
- verifies `mc_doc_create` contract (`POST /documents` payload)
- verifies `mc_doc_update` contract (`GET /documents?id=...`, `PATCH /documents` payload)
- Improved mock-call logging by base64-encoding payloads for multiline-safe assertions.
- Ran full suite:
- `PASS: gantt-tasks contract tests`
- `PASS: mission-control-docs contract tests`
- `PASS: auth-api transport tests`
### Additional completed (2026-02-26 10:40)
- Fixed consuming workflow skill `url-research-to-documents-and-tasks` to remove duplicate/orphan logic path.
- Replaced `orchestrator.sh` implementation with a thin wrapper that delegates to hardened script only:
- `orchestrator.sh -> bin/url-research.sh`
- Updated skill docs to point production entrypoint to `orchestrator.sh` (single source of truth).
- Verified script syntax:
- `bash -n orchestrator.sh`
- `bash -n bin/url-research.sh`
- Verified wrapper execution path:
- no-arg usage correctly routes and prints hardened usage
- run with URL starts hardened workflow phases/logging
### Rationale
- Prevents workflow drift where old orchestrator code and hardened code diverge.
- Keeps one execution path for future fixes and reliability improvements.
### Additional completed (2026-02-26 10:53)
- Implemented new shared skill: `workflow-checkpoints`
- `~/.agents/skills/workflow-checkpoints/SKILL.md`
- `~/.agents/skills/workflow-checkpoints/lib/checkpoints.sh`
- `~/.agents/skills/workflow-checkpoints/tests/test_checkpoints.sh`
- Added URL-keyed stable checkpoint model with 7-day TTL:
- key = `sha256(normalized_url)`
- payload files by type:
- `<key>-content.json`
- `<key>-analysis.json`
- `<key>-plan.md`
- metadata file:
- `<key>-meta.json` (expiresAtEpoch, ttl, sourceUrl)
- Integrated checkpoints into URL research workflow (`bin/url-research.sh`):
- extract-content phase: reuse from checkpoint if present, else compute and save
- analyze-fit phase: reuse from checkpoint if present, else compute and save
- create-plan phase: reuse from checkpoint if present, else compute and save
- touch checkpoint TTL on reuse
- Verified tests and syntax:
- `PASS: workflow-checkpoints tests`
- `PASS: auth-api transport tests`
- `PASS: gantt-tasks contract tests`
- `PASS: mission-control-docs contract tests`
- `bash -n` for updated workflow script passed
### Follow-up suggestions
- Add explicit progress comment text when checkpoint is reused (e.g., "reused checkpoint") for user visibility.
- Optionally add `checkpoint_list <url>` helper for quick debugging of cached artifacts.
### Additional completed (2026-02-26 10:58-11:00)
- Fixed all phase progress comments in URL research workflow to show consistent phase numbering (0-5):
- Phase 0: Task created
- Phase 1: Content extraction
- Phase 2: Document creation
- Phase 3: Fit analysis
- Phase 4: Implementation plan
- Phase 5: Final review and handoff
- Added Phase 4 success comment immediately after plan attachment (was missing before).
- Added source indicators to progress comments:
- `[reused checkpoint]` when using cached data
- `[reused existing]` when reusing doc from task description
- Made Phase 2 idempotent by parsing task description for existing `Document ID`.
- Created workflow summary doc: `WORKFLOW_SUMMARY.md` showing complete phase flow.
- Verified script syntax: `bash -n url-research.sh`
### Result
Now every phase visibly updates the task comment with a checked box, and reruns efficiently skip completed work using checkpoints + task description parsing.
### Additional completed (2026-02-26 11:13)
- Implemented cleanup + doc consolidation for Alice workflow skill:
- Added `run.sh` unified entrypoint for standalone shell usage.
- Kept OpenClaw mode explicit in `SKILL.md`: always execute via Alice-Researcher (`sessions_spawn`).
- Updated mandatory read section to consolidated docs only:
- `SKILL.md`
- `WORKFLOW_SUMMARY.md`
- Removed legacy drift-prone docs:
- `ANTI-PATTERNS.md`
- `TASK-FIRST-WORKFLOW.md`
- Verified syntax:
- `bash -n run.sh`
- `bash -n orchestrator.sh`
### Outcome
- Inside OpenClaw: route to Alice.
- Outside OpenClaw: run `~/.agents/skills/url-research-to-documents-and-tasks/run.sh` directly.
- Fewer docs, less drift, clearer operational path.
### Additional completed (2026-02-26 11:16)
- Implemented dry-run mode (option C):
- `--dry-run` (mock generators when checkpoints missing)
- `--dry-run-real` (real generators, still no writes)
- Updated `bin/url-research.sh`:
- Added flags parsing for dry-run modes
- Added no-write behavior for task/doc/attachment/status operations
- Checkpoints are read-only in dry-run (no put/touch writes)
- Added dry-run summary output at end
- Updated docs:
- `run.sh` header examples for dry-run usage
- `SKILL.md` standalone section includes dry-run commands
- Validation:
- `bash -n` checks passed for modified scripts

View File

@ -1,12 +1,12 @@
{
"lastChecks": {
"missionControl": 1740576060,
"email": 1740504780,
"calendar": 1740576060,
"email": 1740584700,
"calendar": 1740585660,
"git": 1740576060,
"memoryMaintenance": 1740512400
},
"alertsGiven": [],
"version": 2,
"optimizedAt": "2026-02-26T07:21:00-06:00"
"optimizedAt": "2026-02-26T08:45:00-06:00"
}