Initial vault commit: second brain for Oliver projects
- 35 project notes (PARA structure, 1:1 disk mapping) - CLAUDE.md session protocol - Projects Index MOC - Templates: Daily, Meeting, Project - 03 Resources, 02 Areas structure - .gitignore excludes credentials, workspace files, smart-env Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
commit
7251967b64
117 changed files with 72969 additions and 0 deletions
18
.gitignore
vendored
Normal file
18
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
# Obsidian app config (device-specific)
|
||||
.obsidian/workspace.json
|
||||
.obsidian/workspace-mobile.json
|
||||
.obsidian/plugins/obsidian-git/data.json
|
||||
|
||||
# Smart Connections embeddings (large, auto-regenerated)
|
||||
.smart-env/
|
||||
|
||||
# Obsidian trash
|
||||
.trash/
|
||||
|
||||
# Sensitive credentials — NEVER commit these
|
||||
05 Aimpress LTD/Credentials.md
|
||||
01 Projects/NotebookLlama env back.md
|
||||
01 Projects/for script.md
|
||||
|
||||
# macOS
|
||||
.DS_Store
|
||||
9
.obsidian/app.json
vendored
Normal file
9
.obsidian/app.json
vendored
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"promptDelete": false,
|
||||
"newFileLocation": "current",
|
||||
"readableLineLength": false,
|
||||
"strictLineBreaks": false,
|
||||
"foldHeading": true,
|
||||
"showLineNumber": true,
|
||||
"alwaysUpdateLinks": true
|
||||
}
|
||||
3
.obsidian/appearance.json
vendored
Normal file
3
.obsidian/appearance.json
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"showRibbon": true
|
||||
}
|
||||
3
.obsidian/backlink.json
vendored
Normal file
3
.obsidian/backlink.json
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"backlinkInDocument": true
|
||||
}
|
||||
13
.obsidian/community-plugins.json
vendored
Normal file
13
.obsidian/community-plugins.json
vendored
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
[
|
||||
"calendar",
|
||||
"obsidian-kanban",
|
||||
"templater-obsidian",
|
||||
"obsidian-tasks-plugin",
|
||||
"dataview",
|
||||
"nldates-obsidian",
|
||||
"obsidian-outliner",
|
||||
"mermaid-tools",
|
||||
"obsidian-html-plugin",
|
||||
"obsidian-git",
|
||||
"omnisearch"
|
||||
]
|
||||
33
.obsidian/core-plugins.json
vendored
Normal file
33
.obsidian/core-plugins.json
vendored
Normal 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
|
||||
}
|
||||
5
.obsidian/daily-notes.json
vendored
Normal file
5
.obsidian/daily-notes.json
vendored
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"format": "YYYY-MM-DD",
|
||||
"folder": "99 Daily",
|
||||
"template": "Templates/Daily Template"
|
||||
}
|
||||
22
.obsidian/graph.json
vendored
Normal file
22
.obsidian/graph.json
vendored
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"collapse-filter": true,
|
||||
"search": "",
|
||||
"showTags": false,
|
||||
"showAttachments": false,
|
||||
"hideUnresolved": false,
|
||||
"showOrphans": true,
|
||||
"collapse-color-groups": true,
|
||||
"colorGroups": [],
|
||||
"collapse-display": true,
|
||||
"showArrow": false,
|
||||
"textFadeMultiplier": 0,
|
||||
"nodeSizeMultiplier": 1,
|
||||
"lineSizeMultiplier": 1,
|
||||
"collapse-forces": true,
|
||||
"centerStrength": 0.518713248970312,
|
||||
"repelStrength": 10,
|
||||
"linkStrength": 1,
|
||||
"linkDistance": 250,
|
||||
"scale": 0.45971825916974024,
|
||||
"close": true
|
||||
}
|
||||
10
.obsidian/plugins/calendar/data.json
vendored
Normal file
10
.obsidian/plugins/calendar/data.json
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"shouldConfirmBeforeCreate": true,
|
||||
"weekStart": "locale",
|
||||
"wordsPerDot": 250,
|
||||
"showWeeklyNote": true,
|
||||
"weeklyNoteFormat": "",
|
||||
"weeklyNoteTemplate": "",
|
||||
"weeklyNoteFolder": "",
|
||||
"localeOverride": "en-gb"
|
||||
}
|
||||
4459
.obsidian/plugins/calendar/main.js
vendored
Normal file
4459
.obsidian/plugins/calendar/main.js
vendored
Normal file
File diff suppressed because it is too large
Load diff
10
.obsidian/plugins/calendar/manifest.json
vendored
Normal file
10
.obsidian/plugins/calendar/manifest.json
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"id": "calendar",
|
||||
"name": "Calendar",
|
||||
"description": "Calendar view of your daily notes",
|
||||
"version": "1.5.10",
|
||||
"author": "Liam Cain",
|
||||
"authorUrl": "https://github.com/liamcain/",
|
||||
"isDesktopOnly": false,
|
||||
"minAppVersion": "0.9.11"
|
||||
}
|
||||
27
.obsidian/plugins/dataview/data.json
vendored
Normal file
27
.obsidian/plugins/dataview/data.json
vendored
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
{
|
||||
"renderNullAs": "\\-",
|
||||
"taskCompletionTracking": false,
|
||||
"taskCompletionUseEmojiShorthand": false,
|
||||
"taskCompletionText": "completion",
|
||||
"taskCompletionDateFormat": "yyyy-MM-dd",
|
||||
"recursiveSubTaskCompletion": false,
|
||||
"warnOnEmptyResult": true,
|
||||
"refreshEnabled": true,
|
||||
"refreshInterval": 2500,
|
||||
"defaultDateFormat": "YYYY-MM-DD",
|
||||
"defaultDateTimeFormat": "h:mm a - MMMM dd, yyyy",
|
||||
"maxRecursiveRenderDepth": 4,
|
||||
"tableIdColumnName": "File",
|
||||
"tableGroupColumnName": "Group",
|
||||
"showResultCount": true,
|
||||
"allowHtml": true,
|
||||
"inlineQueryPrefix": "=",
|
||||
"inlineJsQueryPrefix": "$=",
|
||||
"inlineQueriesInCodeblocks": true,
|
||||
"enableInlineDataview": true,
|
||||
"enableDataviewJs": true,
|
||||
"enableInlineDataviewJs": true,
|
||||
"prettyRenderInlineFields": true,
|
||||
"prettyRenderInlineFieldsInLivePreview": true,
|
||||
"dataviewJsKeyword": "dataviewjs"
|
||||
}
|
||||
20876
.obsidian/plugins/dataview/main.js
vendored
Normal file
20876
.obsidian/plugins/dataview/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
11
.obsidian/plugins/dataview/manifest.json
vendored
Normal file
11
.obsidian/plugins/dataview/manifest.json
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"id": "dataview",
|
||||
"name": "Dataview",
|
||||
"version": "0.5.68",
|
||||
"minAppVersion": "0.13.11",
|
||||
"description": "Complex data views for the data-obsessed.",
|
||||
"author": "Michael Brenan <blacksmithgu@gmail.com>",
|
||||
"authorUrl": "https://github.com/blacksmithgu",
|
||||
"helpUrl": "https://blacksmithgu.github.io/obsidian-dataview/",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
141
.obsidian/plugins/dataview/styles.css
vendored
Normal file
141
.obsidian/plugins/dataview/styles.css
vendored
Normal file
|
|
@ -0,0 +1,141 @@
|
|||
.block-language-dataview {
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
/*****************/
|
||||
/** Table Views **/
|
||||
/*****************/
|
||||
|
||||
/* List View Default Styling; rendered internally as a table. */
|
||||
.table-view-table {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.table-view-table > thead > tr, .table-view-table > tbody > tr {
|
||||
margin-top: 1em;
|
||||
margin-bottom: 1em;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.table-view-table > tbody > tr:hover {
|
||||
background-color: var(--table-row-background-hover);
|
||||
}
|
||||
|
||||
.table-view-table > thead > tr > th {
|
||||
font-weight: 700;
|
||||
font-size: larger;
|
||||
border-top: none;
|
||||
border-left: none;
|
||||
border-right: none;
|
||||
border-bottom: solid;
|
||||
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.table-view-table > tbody > tr > td {
|
||||
text-align: left;
|
||||
border: none;
|
||||
font-weight: 400;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.table-view-table ul, .table-view-table ol {
|
||||
margin-block-start: 0.2em !important;
|
||||
margin-block-end: 0.2em !important;
|
||||
}
|
||||
|
||||
/** Rendered value styling for any view. */
|
||||
.dataview-result-list-root-ul {
|
||||
padding: 0em !important;
|
||||
margin: 0em !important;
|
||||
}
|
||||
|
||||
.dataview-result-list-ul {
|
||||
margin-block-start: 0.2em !important;
|
||||
margin-block-end: 0.2em !important;
|
||||
}
|
||||
|
||||
/** Generic grouping styling. */
|
||||
.dataview.result-group {
|
||||
padding-left: 8px;
|
||||
}
|
||||
|
||||
/*******************/
|
||||
/** Inline Fields **/
|
||||
/*******************/
|
||||
|
||||
.dataview.inline-field-key {
|
||||
padding-left: 8px;
|
||||
padding-right: 8px;
|
||||
font-family: var(--font-monospace);
|
||||
background-color: var(--background-primary-alt);
|
||||
color: var(--nav-item-color-selected);
|
||||
}
|
||||
|
||||
.dataview.inline-field-value {
|
||||
padding-left: 8px;
|
||||
padding-right: 8px;
|
||||
font-family: var(--font-monospace);
|
||||
background-color: var(--background-secondary-alt);
|
||||
color: var(--nav-item-color-selected);
|
||||
}
|
||||
|
||||
.dataview.inline-field-standalone-value {
|
||||
padding-left: 8px;
|
||||
padding-right: 8px;
|
||||
font-family: var(--font-monospace);
|
||||
background-color: var(--background-secondary-alt);
|
||||
color: var(--nav-item-color-selected);
|
||||
}
|
||||
|
||||
/***************/
|
||||
/** Task View **/
|
||||
/***************/
|
||||
|
||||
.dataview.task-list-item, .dataview.task-list-basic-item {
|
||||
margin-top: 3px;
|
||||
margin-bottom: 3px;
|
||||
transition: 0.4s;
|
||||
}
|
||||
|
||||
.dataview.task-list-item:hover, .dataview.task-list-basic-item:hover {
|
||||
background-color: var(--text-selection);
|
||||
box-shadow: -40px 0 0 var(--text-selection);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/*****************/
|
||||
/** Error Views **/
|
||||
/*****************/
|
||||
|
||||
div.dataview-error-box {
|
||||
width: 100%;
|
||||
min-height: 150px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border: 4px dashed var(--background-secondary);
|
||||
}
|
||||
|
||||
.dataview-error-message {
|
||||
color: var(--text-muted);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/*************************/
|
||||
/** Additional Metadata **/
|
||||
/*************************/
|
||||
|
||||
.dataview.small-text {
|
||||
font-size: smaller;
|
||||
color: var(--text-muted);
|
||||
margin-left: 3px;
|
||||
}
|
||||
|
||||
.dataview.small-text::before {
|
||||
content: "(";
|
||||
}
|
||||
|
||||
.dataview.small-text::after {
|
||||
content: ")";
|
||||
}
|
||||
2633
.obsidian/plugins/mermaid-tools/main.js
vendored
Normal file
2633
.obsidian/plugins/mermaid-tools/main.js
vendored
Normal file
File diff suppressed because it is too large
Load diff
11
.obsidian/plugins/mermaid-tools/manifest.json
vendored
Normal file
11
.obsidian/plugins/mermaid-tools/manifest.json
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"id": "mermaid-tools",
|
||||
"name": "Mermaid Tools",
|
||||
"version": "1.3.0",
|
||||
"minAppVersion": "1.4.0",
|
||||
"description": "Improved Mermaid.js experience for Obsidian: visual toolbar with common elements & more",
|
||||
"author": "dartungar",
|
||||
"authorUrl": "https://dartungar.com",
|
||||
"fundingUrl": "https://www.paypal.com/paypalme/dartungar",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
149
.obsidian/plugins/mermaid-tools/styles.css
vendored
Normal file
149
.obsidian/plugins/mermaid-tools/styles.css
vendored
Normal file
|
|
@ -0,0 +1,149 @@
|
|||
.mermaid-toolbar-container, .mermaid-toolbar-container * {
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
}
|
||||
|
||||
.mermaid-toolbar-top-row {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.mermaid-toolbar-elements-container {
|
||||
padding-top: 1rem;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.mermaid-toolbar-element {
|
||||
font-size: var(--font-ui-small);
|
||||
cursor: pointer;
|
||||
padding: 2px 2px 2px 5px;
|
||||
border-radius: 3px;
|
||||
flex: 1 0 auto;
|
||||
}
|
||||
|
||||
.mermaid-toolbar-element:hover {
|
||||
background-color: var(--interactive-hover);
|
||||
}
|
||||
|
||||
.mermaid-tools-element-category-header::before {
|
||||
content: "▼ ";
|
||||
font-size: 70%;
|
||||
padding-bottom: 2px;
|
||||
}
|
||||
|
||||
.mermaid-tools-element-category-header.collapsed::before {
|
||||
content: "▶ ";
|
||||
font-size: 70%;
|
||||
padding-bottom: 2px;
|
||||
}
|
||||
|
||||
.mermaid-tools-element-container {
|
||||
padding-top: 6px;
|
||||
border-bottom: var(--border-width) solid var(--color-base-35);
|
||||
}
|
||||
|
||||
.mermaid-tools-edit-element-modal > div {
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.mermaid-tools-edit-element-modal label {
|
||||
margin-right: 1rem;
|
||||
}
|
||||
|
||||
/* Custom Category Management Styles */
|
||||
.mermaid-tools-category-management {
|
||||
margin-bottom: 2rem;
|
||||
padding: 1rem;
|
||||
border: 1px solid var(--color-base-25);
|
||||
border-radius: 8px;
|
||||
background-color: var(--color-base-00);
|
||||
}
|
||||
|
||||
.mermaid-tools-category-management h3 {
|
||||
margin-top: 1rem;
|
||||
margin-bottom: 0.5rem;
|
||||
color: var(--text-accent);
|
||||
}
|
||||
|
||||
.mermaid-tools-category-management button.mod-cta {
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
/* Edit Category Modal Styles */
|
||||
.mermaid-tools-edit-category-modal {
|
||||
min-width: 500px;
|
||||
}
|
||||
|
||||
.mermaid-tools-edit-category-modal .setting-item {
|
||||
padding: 8px 0;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.mermaid-tools-edit-category-modal .setting-item-info {
|
||||
flex-grow: 1;
|
||||
margin-right: 12px;
|
||||
}
|
||||
|
||||
.mermaid-tools-edit-category-modal .setting-item-name {
|
||||
font-weight: 600;
|
||||
color: var(--text-normal);
|
||||
}
|
||||
|
||||
.mermaid-tools-edit-category-modal .setting-item-description {
|
||||
color: var(--text-muted);
|
||||
font-size: var(--font-ui-smaller);
|
||||
}
|
||||
|
||||
.mermaid-tools-edit-category-modal input,
|
||||
.mermaid-tools-edit-category-modal textarea {
|
||||
width: 100%;
|
||||
padding: 4px 8px;
|
||||
border: 1px solid var(--color-base-30);
|
||||
border-radius: 4px;
|
||||
background-color: var(--color-base-00);
|
||||
color: var(--text-normal);
|
||||
}
|
||||
|
||||
.mermaid-tools-edit-category-modal input:focus,
|
||||
.mermaid-tools-edit-category-modal textarea:focus {
|
||||
border-color: var(--color-accent);
|
||||
outline: none;
|
||||
box-shadow: 0 0 0 2px var(--color-accent-2);
|
||||
}
|
||||
|
||||
.modal-button-container {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 10px;
|
||||
margin-top: 20px;
|
||||
padding-top: 16px;
|
||||
border-top: 1px solid var(--color-base-25);
|
||||
}
|
||||
|
||||
.modal-button-container button {
|
||||
padding: 6px 16px;
|
||||
border: 1px solid var(--color-base-30);
|
||||
border-radius: 4px;
|
||||
background-color: var(--color-base-10);
|
||||
color: var(--text-normal);
|
||||
cursor: pointer;
|
||||
font-size: var(--font-ui-small);
|
||||
}
|
||||
|
||||
.modal-button-container button:hover {
|
||||
background-color: var(--color-base-20);
|
||||
}
|
||||
|
||||
.modal-button-container button.mod-cta {
|
||||
background-color: var(--color-accent);
|
||||
color: var(--text-on-accent);
|
||||
border-color: var(--color-accent);
|
||||
}
|
||||
|
||||
.modal-button-container button.mod-cta:hover {
|
||||
background-color: var(--color-accent-hover);
|
||||
}
|
||||
9562
.obsidian/plugins/nldates-obsidian/main.js
vendored
Normal file
9562
.obsidian/plugins/nldates-obsidian/main.js
vendored
Normal file
File diff suppressed because it is too large
Load diff
10
.obsidian/plugins/nldates-obsidian/manifest.json
vendored
Normal file
10
.obsidian/plugins/nldates-obsidian/manifest.json
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"id": "nldates-obsidian",
|
||||
"name": "Natural Language Dates",
|
||||
"description": "Create date-links based on natural language",
|
||||
"version": "0.6.2",
|
||||
"author": "Argentina Ortega Sainz",
|
||||
"authorUrl": "https://argentinaos.com/",
|
||||
"isDesktopOnly": false,
|
||||
"minAppVersion": "1.0.0"
|
||||
}
|
||||
452
.obsidian/plugins/obsidian-git/main.js
vendored
Normal file
452
.obsidian/plugins/obsidian-git/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
10
.obsidian/plugins/obsidian-git/manifest.json
vendored
Normal file
10
.obsidian/plugins/obsidian-git/manifest.json
vendored
Normal 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.38.1"
|
||||
}
|
||||
23
.obsidian/plugins/obsidian-git/obsidian_askpass.sh
vendored
Executable file
23
.obsidian/plugins/obsidian-git/obsidian_askpass.sh
vendored
Executable file
|
|
@ -0,0 +1,23 @@
|
|||
#!/bin/sh
|
||||
|
||||
PROMPT="$1"
|
||||
TEMP_FILE="$OBSIDIAN_GIT_CREDENTIALS_INPUT"
|
||||
|
||||
cleanup() {
|
||||
rm -f "$TEMP_FILE" "$TEMP_FILE.response"
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
echo "$PROMPT" > "$TEMP_FILE"
|
||||
|
||||
while [ ! -e "$TEMP_FILE.response" ]; do
|
||||
if [ ! -e "$TEMP_FILE" ]; then
|
||||
echo "Trigger file got removed: Abort" >&2
|
||||
exit 1
|
||||
fi
|
||||
sleep 0.1
|
||||
done
|
||||
|
||||
RESPONSE=$(cat "$TEMP_FILE.response")
|
||||
|
||||
echo "$RESPONSE"
|
||||
710
.obsidian/plugins/obsidian-git/styles.css
vendored
Normal file
710
.obsidian/plugins/obsidian-git/styles.css
vendored
Normal file
|
|
@ -0,0 +1,710 @@
|
|||
@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%;
|
||||
}
|
||||
|
||||
/* Re-enable wrapping of nav buttns to prevent overflow on smaller screens #*/
|
||||
.workspace-drawer .git-view .nav-buttons-container {
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.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;
|
||||
}
|
||||
9
.obsidian/plugins/obsidian-html-plugin/data.json
vendored
Normal file
9
.obsidian/plugins/obsidian-html-plugin/data.json
vendored
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"bgColorEnabled": false,
|
||||
"bgColor": "#ffffff",
|
||||
"opMode": "UnestrictedMode",
|
||||
"zoomByWheelAndGesture": true,
|
||||
"zoomValue": 1,
|
||||
"extraFileExt": "",
|
||||
"mhtmlSupport": false
|
||||
}
|
||||
24070
.obsidian/plugins/obsidian-html-plugin/main.js
vendored
Normal file
24070
.obsidian/plugins/obsidian-html-plugin/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
10
.obsidian/plugins/obsidian-html-plugin/manifest.json
vendored
Normal file
10
.obsidian/plugins/obsidian-html-plugin/manifest.json
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"id": "obsidian-html-plugin",
|
||||
"name": "HTML Reader",
|
||||
"version": "1.0.13",
|
||||
"minAppVersion": "0.15.3",
|
||||
"description": "This is a HTML file reader plugin for Obsidian. Can open document with \".html\" and \".htm\" file extensions.",
|
||||
"author": "Nuthrash",
|
||||
"authorUrl": "https://github.com/nuthrash/obsidian-html-plugin",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
5
.obsidian/plugins/obsidian-kanban/data.json
vendored
Normal file
5
.obsidian/plugins/obsidian-kanban/data.json
vendored
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"show-checkboxes": true,
|
||||
"new-note-folder": "01 Projects",
|
||||
"move-dates": true
|
||||
}
|
||||
153
.obsidian/plugins/obsidian-kanban/main.js
vendored
Normal file
153
.obsidian/plugins/obsidian-kanban/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
11
.obsidian/plugins/obsidian-kanban/manifest.json
vendored
Normal file
11
.obsidian/plugins/obsidian-kanban/manifest.json
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"id": "obsidian-kanban",
|
||||
"name": "Kanban",
|
||||
"version": "2.0.51",
|
||||
"minAppVersion": "1.0.0",
|
||||
"description": "Create markdown-backed Kanban boards in Obsidian.",
|
||||
"author": "mgmeyers",
|
||||
"authorUrl": "https://github.com/mgmeyers/obsidian-kanban",
|
||||
"helpUrl": "https://publish.obsidian.md/kanban/Obsidian+Kanban+Plugin",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
1
.obsidian/plugins/obsidian-kanban/styles.css
vendored
Normal file
1
.obsidian/plugins/obsidian-kanban/styles.css
vendored
Normal file
File diff suppressed because one or more lines are too long
3418
.obsidian/plugins/obsidian-outliner/main.js
vendored
Normal file
3418
.obsidian/plugins/obsidian-outliner/main.js
vendored
Normal file
File diff suppressed because it is too large
Load diff
10
.obsidian/plugins/obsidian-outliner/manifest.json
vendored
Normal file
10
.obsidian/plugins/obsidian-outliner/manifest.json
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"id": "obsidian-outliner",
|
||||
"name": "Outliner",
|
||||
"version": "4.9.0",
|
||||
"minAppVersion": "1.8.7",
|
||||
"description": "Work with your lists like in Workflowy or RoamResearch.",
|
||||
"author": "Viacheslav Slinko",
|
||||
"authorUrl": "https://github.com/vslinko",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
105
.obsidian/plugins/obsidian-outliner/styles.css
vendored
Normal file
105
.obsidian/plugins/obsidian-outliner/styles.css
vendored
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
/* lists and bullets */
|
||||
.outliner-plugin-better-lists .cm-s-obsidian .HyperMD-list-line {
|
||||
/* padding-top: 0.4em; */
|
||||
}
|
||||
|
||||
.outliner-plugin-better-lists .cm-formatting-list-ul {
|
||||
margin-right: 0.3em;
|
||||
}
|
||||
|
||||
.outliner-plugin-better-lists .list-bullet::after {
|
||||
width: 0.4em;
|
||||
height: 0.4em;
|
||||
background-color: var(--text-muted);
|
||||
}
|
||||
|
||||
/* lines */
|
||||
.outliner-plugin-list-lines-scroller {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
padding: var(--file-margins);
|
||||
padding-left: 0;
|
||||
pointer-events: none;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.outliner-plugin-list-lines-content-container {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.outliner-plugin-list-line {
|
||||
pointer-events: auto;
|
||||
position: absolute;
|
||||
width: 5px;
|
||||
margin-left: 0.5ch;
|
||||
margin-top: 1em;
|
||||
z-index: 1;
|
||||
cursor: pointer;
|
||||
background: transparent;
|
||||
background-image: linear-gradient(
|
||||
to right,
|
||||
var(--text-faint) 1px,
|
||||
transparent 1px
|
||||
);
|
||||
background-position-x: 2px;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
.outliner-plugin-better-bullets .outliner-plugin-list-line {
|
||||
margin-top: 1.4em;
|
||||
}
|
||||
|
||||
.markdown-source-view.mod-cm6.is-readable-line-width
|
||||
.outliner-plugin-list-lines-content-container {
|
||||
max-width: 700px;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
.outliner-plugin-list-line:hover {
|
||||
background: var(--text-faint);
|
||||
}
|
||||
|
||||
.outliner-plugin-vertical-lines
|
||||
.markdown-source-view.mod-cm6
|
||||
.cm-hmd-list-indent
|
||||
.cm-indent::before {
|
||||
content: none;
|
||||
}
|
||||
|
||||
/* drag-n-drop */
|
||||
.outliner-plugin-dropping-line {
|
||||
background-color: hsla(var(--interactive-accent-hsl), 0.4);
|
||||
}
|
||||
|
||||
.outliner-plugin-dragging-line {
|
||||
opacity: 0.5;
|
||||
background-color: hsla(var(--interactive-accent-hsl), 0.2);
|
||||
}
|
||||
|
||||
.outliner-plugin-drop-zone {
|
||||
width: 300px;
|
||||
height: 4px;
|
||||
background: var(--color-accent);
|
||||
z-index: 999;
|
||||
position: absolute;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.outliner-plugin-drop-zone-padding {
|
||||
position: absolute;
|
||||
height: 4px;
|
||||
}
|
||||
|
||||
body.outliner-plugin-dnd:not(.outliner-plugin-dragging) .cm-formatting-list,
|
||||
body.outliner-plugin-dnd:not(.outliner-plugin-dragging)
|
||||
.cm-fold-indicator
|
||||
.collapse-indicator {
|
||||
cursor: grab !important;
|
||||
}
|
||||
|
||||
html body.outliner-plugin-dnd.outliner-plugin-dragging {
|
||||
cursor: grabbing !important;
|
||||
}
|
||||
504
.obsidian/plugins/obsidian-tasks-plugin/main.js
vendored
Normal file
504
.obsidian/plugins/obsidian-tasks-plugin/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
12
.obsidian/plugins/obsidian-tasks-plugin/manifest.json
vendored
Normal file
12
.obsidian/plugins/obsidian-tasks-plugin/manifest.json
vendored
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"id": "obsidian-tasks-plugin",
|
||||
"name": "Tasks",
|
||||
"version": "7.22.0",
|
||||
"minAppVersion": "1.4.0",
|
||||
"description": "Track tasks across your vault. Supports due dates, recurring tasks, done dates, sub-set of checklist items, and filtering.",
|
||||
"helpUrl": "https://publish.obsidian.md/tasks/",
|
||||
"author": "Clare Macrae and Ilyas Landikov (created by Martin Schenck)",
|
||||
"authorUrl": "https://github.com/obsidian-tasks-group",
|
||||
"fundingUrl": "https://github.com/sponsors/claremacrae",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
1
.obsidian/plugins/obsidian-tasks-plugin/styles.css
vendored
Normal file
1
.obsidian/plugins/obsidian-tasks-plugin/styles.css
vendored
Normal file
File diff suppressed because one or more lines are too long
42
.obsidian/plugins/omnisearch/data.json
vendored
Normal file
42
.obsidian/plugins/omnisearch/data.json
vendored
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
{
|
||||
"useCache": true,
|
||||
"hideExcluded": false,
|
||||
"recencyBoost": "0",
|
||||
"downrankedFoldersFilters": [],
|
||||
"ignoreDiacritics": true,
|
||||
"ignoreArabicDiacritics": false,
|
||||
"indexedFileTypes": [],
|
||||
"displayTitle": "",
|
||||
"PDFIndexing": false,
|
||||
"officeIndexing": false,
|
||||
"imagesIndexing": false,
|
||||
"aiImageIndexing": false,
|
||||
"unsupportedFilesIndexing": "default",
|
||||
"splitCamelCase": false,
|
||||
"openInNewPane": false,
|
||||
"vimLikeNavigationShortcut": false,
|
||||
"ribbonIcon": true,
|
||||
"showExcerpt": true,
|
||||
"maxEmbeds": 5,
|
||||
"renderLineReturnInExcerpts": true,
|
||||
"showCreateButton": false,
|
||||
"highlight": true,
|
||||
"showPreviousQueryResults": true,
|
||||
"simpleSearch": false,
|
||||
"tokenizeUrls": false,
|
||||
"fuzziness": "1",
|
||||
"weightBasename": 10,
|
||||
"weightDirectory": 7,
|
||||
"weightH1": 6,
|
||||
"weightH2": 5,
|
||||
"weightH3": 4,
|
||||
"weightUnmarkedTags": 2,
|
||||
"weightCustomProperties": [],
|
||||
"httpApiEnabled": false,
|
||||
"httpApiPort": "51361",
|
||||
"httpApiNotice": true,
|
||||
"welcomeMessage": "1.21.0",
|
||||
"verboseLogging": false,
|
||||
"DANGER_httpHost": null,
|
||||
"DANGER_forceSaveCache": false
|
||||
}
|
||||
171
.obsidian/plugins/omnisearch/main.js
vendored
Normal file
171
.obsidian/plugins/omnisearch/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
14
.obsidian/plugins/omnisearch/manifest.json
vendored
Normal file
14
.obsidian/plugins/omnisearch/manifest.json
vendored
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
{
|
||||
"id": "omnisearch",
|
||||
"name": "Omnisearch",
|
||||
"version": "1.28.2",
|
||||
"minAppVersion": "1.7.2",
|
||||
"description": "A search engine that just works",
|
||||
"author": "Simon Cambier",
|
||||
"authorUrl": "https://github.com/scambier/obsidian-omnisearch",
|
||||
"fundingUrl": {
|
||||
"Github": "https://github.com/sponsors/scambier",
|
||||
"Ko-fi": "https://ko-fi.com/scambier"
|
||||
},
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
135
.obsidian/plugins/omnisearch/styles.css
vendored
Normal file
135
.obsidian/plugins/omnisearch/styles.css
vendored
Normal file
|
|
@ -0,0 +1,135 @@
|
|||
.omnisearch-modal {
|
||||
}
|
||||
|
||||
.omnisearch-result {
|
||||
white-space: normal;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
/* justify-content: space-between; */
|
||||
flex-wrap: nowrap;
|
||||
}
|
||||
|
||||
.omnisearch-result__title-container {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
column-gap: 5px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.omnisearch-result__title {
|
||||
white-space: pre-wrap;
|
||||
align-items: center;
|
||||
display: flex;
|
||||
gap: 5px;
|
||||
}
|
||||
|
||||
.omnisearch-result__title > span {
|
||||
}
|
||||
|
||||
.omnisearch-result__folder-path {
|
||||
font-size: 0.75rem;
|
||||
align-items: center;
|
||||
display: flex;
|
||||
gap: 5px;
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
.omnisearch-result__extension {
|
||||
font-size: 0.7rem;
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
.omnisearch-result__counter {
|
||||
font-size: 0.7rem;
|
||||
color: var(--text-muted);
|
||||
}
|
||||
|
||||
.omnisearch-result__body {
|
||||
white-space: normal;
|
||||
font-size: small;
|
||||
word-wrap: normal;
|
||||
|
||||
overflow: hidden;
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 3;
|
||||
-webkit-box-orient: vertical;
|
||||
|
||||
color: var(--text-muted);
|
||||
margin-inline-start: 0.5em;
|
||||
}
|
||||
|
||||
.omnisearch-result__embed {
|
||||
margin-left: 1em;
|
||||
}
|
||||
|
||||
|
||||
.omnisearch-result__image-container {
|
||||
flex-basis: 20%;
|
||||
text-align: end;
|
||||
}
|
||||
|
||||
.omnisearch-highlight {
|
||||
}
|
||||
|
||||
.omnisearch-default-highlight {
|
||||
text-decoration: underline;
|
||||
text-decoration-color: var(--text-highlight-bg);
|
||||
text-decoration-thickness: 3px;
|
||||
text-underline-offset: -1px;
|
||||
text-decoration-skip-ink: none;
|
||||
}
|
||||
|
||||
.omnisearch-input-container {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-direction: row;
|
||||
gap: 5px;
|
||||
}
|
||||
|
||||
.omnisearch-result__icon {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
.omnisearch-result__icon svg {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.omnisearch-result__icon--emoji {
|
||||
font-size: 16px;
|
||||
vertical-align: middle;
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 600px) {
|
||||
.omnisearch-input-container {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.omnisearch-input-container__buttons {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
width: 100%;
|
||||
padding: 0 1em 0 1em;
|
||||
gap: 1em;
|
||||
}
|
||||
.omnisearch-input-container__buttons > button {
|
||||
flex-grow: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 600px) {
|
||||
.omnisearch-input-container__buttons {
|
||||
margin-inline-end: 1em;
|
||||
}
|
||||
}
|
||||
|
||||
.omnisearch-input-field {
|
||||
position: relative;
|
||||
flex-grow: 1;
|
||||
}
|
||||
38
.obsidian/plugins/templater-obsidian/data.json
vendored
Normal file
38
.obsidian/plugins/templater-obsidian/data.json
vendored
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
{
|
||||
"command_timeout": 5,
|
||||
"templates_folder": "Templates",
|
||||
"templates_pairs": [
|
||||
[
|
||||
"",
|
||||
""
|
||||
]
|
||||
],
|
||||
"trigger_on_file_creation": true,
|
||||
"auto_jump_to_cursor": true,
|
||||
"enable_system_commands": false,
|
||||
"shell_path": "",
|
||||
"user_scripts_folder": "",
|
||||
"enable_folder_templates": true,
|
||||
"folder_templates": [
|
||||
{
|
||||
"folder": "",
|
||||
"template": ""
|
||||
}
|
||||
],
|
||||
"enable_file_templates": false,
|
||||
"file_templates": [
|
||||
{
|
||||
"regex": ".*",
|
||||
"template": ""
|
||||
}
|
||||
],
|
||||
"syntax_highlighting": true,
|
||||
"syntax_highlighting_mobile": false,
|
||||
"enabled_templates_hotkeys": [
|
||||
""
|
||||
],
|
||||
"startup_templates": [
|
||||
""
|
||||
],
|
||||
"intellisense_render": 1
|
||||
}
|
||||
45
.obsidian/plugins/templater-obsidian/main.js
vendored
Normal file
45
.obsidian/plugins/templater-obsidian/main.js
vendored
Normal file
File diff suppressed because one or more lines are too long
11
.obsidian/plugins/templater-obsidian/manifest.json
vendored
Normal file
11
.obsidian/plugins/templater-obsidian/manifest.json
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"id": "templater-obsidian",
|
||||
"name": "Templater",
|
||||
"version": "2.18.1",
|
||||
"description": "Create and use templates",
|
||||
"minAppVersion": "1.5.0",
|
||||
"author": "SilentVoid",
|
||||
"authorUrl": "https://github.com/SilentVoid13",
|
||||
"helpUrl": "https://silentvoid13.github.io/Templater/",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
226
.obsidian/plugins/templater-obsidian/styles.css
vendored
Normal file
226
.obsidian/plugins/templater-obsidian/styles.css
vendored
Normal file
|
|
@ -0,0 +1,226 @@
|
|||
.templater_search {
|
||||
width: calc(100% - 20px);
|
||||
}
|
||||
|
||||
.templater_div {
|
||||
border-top: 1px solid var(--background-modifier-border);
|
||||
}
|
||||
|
||||
.templater_div > .setting-item {
|
||||
border-top: none !important;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.templater_div > .setting-item > .setting-item-control {
|
||||
justify-content: space-around;
|
||||
padding: 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.templater_div
|
||||
> .setting-item
|
||||
> .setting-item-control
|
||||
> .setting-editor-extra-setting-button {
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.templater_donating {
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
.templater_title {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
margin-top: 5px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.templater_template {
|
||||
align-self: center;
|
||||
margin-left: 5px;
|
||||
margin-right: 5px;
|
||||
width: 70%;
|
||||
}
|
||||
|
||||
.templater_cmd {
|
||||
margin-left: 5px;
|
||||
margin-right: 5px;
|
||||
font-size: 14px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.templater_div2 > .setting-item {
|
||||
align-content: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.templater-prompt-div,
|
||||
.templater-multisuggester-div {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.templater-prompt-form {
|
||||
display: flex;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.templater-prompt-input,
|
||||
.templater-multisuggester-input {
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.templater-button-div {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
textarea.templater-prompt-input {
|
||||
height: 10rem;
|
||||
}
|
||||
|
||||
textarea.templater-prompt-input:focus {
|
||||
border-color: var(--interactive-accent);
|
||||
}
|
||||
|
||||
.templater-multisuggester-list {
|
||||
margin: 1.5em 0;
|
||||
}
|
||||
|
||||
.cm-s-obsidian .templater-command-bg {
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
background-color: var(--background-primary-alt);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command {
|
||||
font-size: 0.85em;
|
||||
font-family: var(--font-monospace);
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
.cm-s-obsidian .templater-inline .cm-templater-command {
|
||||
background-color: var(--background-primary-alt);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-templater-opening-tag {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-templater-closing-tag {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-templater-interpolation-tag {
|
||||
color: var(--code-property, #008bff);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-templater-execution-tag {
|
||||
color: var(--code-function, #c0d700);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-keyword {
|
||||
color: var(--code-keyword, #00a7aa);
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-atom {
|
||||
color: var(--code-normal, #f39b35);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-value,
|
||||
.cm-s-obsidian .cm-templater-command.cm-number,
|
||||
.cm-s-obsidian .cm-templater-command.cm-type {
|
||||
color: var(--code-value, #a06fca);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-def,
|
||||
.cm-s-obsidian .cm-templater-command.cm-type.cm-def {
|
||||
color: var(--code-normal, var(--text-normal));
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-property,
|
||||
.cm-s-obsidian .cm-templater-command.cm-property.cm-def,
|
||||
.cm-s-obsidian .cm-templater-command.cm-attribute {
|
||||
color: var(--code-function, #98e342);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-variable,
|
||||
.cm-s-obsidian .cm-templater-command.cm-variable-2,
|
||||
.cm-s-obsidian .cm-templater-command.cm-variable-3,
|
||||
.cm-s-obsidian .cm-templater-command.cm-meta {
|
||||
color: var(--code-property, #d4d4d4);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-callee,
|
||||
.cm-s-obsidian .cm-templater-command.cm-operator,
|
||||
.cm-s-obsidian .cm-templater-command.cm-qualifier,
|
||||
.cm-s-obsidian .cm-templater-command.cm-builtin {
|
||||
color: var(--code-operator, #fc4384);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-tag {
|
||||
color: var(--code-tag, #fc4384);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-comment,
|
||||
.cm-s-obsidian .cm-templater-command.cm-comment.cm-tag,
|
||||
.cm-s-obsidian .cm-templater-command.cm-comment.cm-attribute {
|
||||
color: var(--code-comment, #696d70);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-string,
|
||||
.cm-s-obsidian .cm-templater-command.cm-string-2 {
|
||||
color: var(--code-string, #e6db74);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-header,
|
||||
.cm-s-obsidian .cm-templater-command.cm-hr {
|
||||
color: var(--code-keyword, #da7dae);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-link {
|
||||
color: var(--code-normal, #696d70);
|
||||
}
|
||||
|
||||
.cm-s-obsidian .cm-templater-command.cm-error {
|
||||
border-bottom: 1px solid #c42412;
|
||||
}
|
||||
|
||||
.CodeMirror-hints {
|
||||
position: absolute;
|
||||
z-index: 10;
|
||||
overflow: hidden;
|
||||
list-style: none;
|
||||
|
||||
margin: 0;
|
||||
padding: 2px;
|
||||
|
||||
-webkit-box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
|
||||
-moz-box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
|
||||
box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
|
||||
border-radius: 3px;
|
||||
border: 1px solid silver;
|
||||
|
||||
background: white;
|
||||
font-size: 90%;
|
||||
font-family: monospace;
|
||||
|
||||
max-height: 20em;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.CodeMirror-hint {
|
||||
margin: 0;
|
||||
padding: 0 4px;
|
||||
border-radius: 2px;
|
||||
white-space: pre;
|
||||
color: black;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
li.CodeMirror-hint-active {
|
||||
background: #08f;
|
||||
color: white;
|
||||
}
|
||||
3
.obsidian/templates.json
vendored
Normal file
3
.obsidian/templates.json
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"folder": "Templates"
|
||||
}
|
||||
28
.obsidian/types.json
vendored
Normal file
28
.obsidian/types.json
vendored
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
{
|
||||
"types": {
|
||||
"aliases": "aliases",
|
||||
"cssclasses": "multitext",
|
||||
"tags": "tags",
|
||||
"TQ_explain": "checkbox",
|
||||
"TQ_extra_instructions": "text",
|
||||
"TQ_short_mode": "checkbox",
|
||||
"TQ_show_backlink": "checkbox",
|
||||
"TQ_show_cancelled_date": "checkbox",
|
||||
"TQ_show_created_date": "checkbox",
|
||||
"TQ_show_depends_on": "checkbox",
|
||||
"TQ_show_done_date": "checkbox",
|
||||
"TQ_show_due_date": "checkbox",
|
||||
"TQ_show_edit_button": "checkbox",
|
||||
"TQ_show_id": "checkbox",
|
||||
"TQ_show_on_completion": "checkbox",
|
||||
"TQ_show_postpone_button": "checkbox",
|
||||
"TQ_show_priority": "checkbox",
|
||||
"TQ_show_recurrence_rule": "checkbox",
|
||||
"TQ_show_scheduled_date": "checkbox",
|
||||
"TQ_show_start_date": "checkbox",
|
||||
"TQ_show_tags": "checkbox",
|
||||
"TQ_show_task_count": "checkbox",
|
||||
"TQ_show_tree": "checkbox",
|
||||
"TQ_show_urgency": "checkbox"
|
||||
}
|
||||
}
|
||||
78
01 Projects/3m-portal/3M OMG Portal.md
Normal file
78
01 Projects/3m-portal/3M OMG Portal.md
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
---
|
||||
name: "3M OMG Portal"
|
||||
client: 3M
|
||||
status: active
|
||||
tech: [Node.js, Vanilla JS, HTML/CSS, One2Edit API]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/3m-portal
|
||||
deploy: npm start / node server.js
|
||||
url: http://localhost:3000
|
||||
tags: [3m, one2edit, translation, proxy, nodejs]
|
||||
created: 2026-04-14
|
||||
last_commit: 2026-03-11
|
||||
commits: 7
|
||||
---
|
||||
|
||||
## Overview
|
||||
Lightweight portal wrapping the One2Edit API for 3M translation job management. Node.js acts as a CORS proxy to `https://oliver.one2edit.com/v3/Api.php`.
|
||||
|
||||
**Page flow:**
|
||||
1. `login.html` — Two-step auth: username→userId, then externSessionId
|
||||
2. `dashboard.html` — Fetch jobs (STARTED/RUNNING), render progress, PDF export
|
||||
3. `editor.html` — Embed One2Edit JS SDK with externSessionId
|
||||
|
||||
**Two auth modes:**
|
||||
- Credential-based: portal service account (`portal@oliver.agency`) for job listing
|
||||
- Session-based: `externSessionId` for embedded editor
|
||||
|
||||
## Tech Stack
|
||||
- **Frontend:** Vanilla JS + HTML/CSS (no transpilation, no build step)
|
||||
- **Backend:** Node.js (`server.js`) — static files + `/api` CORS proxy
|
||||
- **API:** One2Edit v3 (`oliver.one2edit.com/v3/Api.php`)
|
||||
- **Session:** `sessionStorage` (cleared on browser close)
|
||||
- **Infrastructure:** No Docker
|
||||
|
||||
## Architecture
|
||||
```
|
||||
Browser → localhost:3000 (static files)
|
||||
Browser → localhost:3000/api → oliver.one2edit.com/v3/Api.php (CORS proxy)
|
||||
```
|
||||
**server.js proxy behavior:**
|
||||
- Strips/rewrites Location headers on 301/302 → returns 401 (prevents auth redirect loops)
|
||||
- Injects CORS headers on all /api responses
|
||||
- Masks passwords in logs
|
||||
|
||||
## Dev Commands
|
||||
```bash
|
||||
npm start # or: node server.js → http://localhost:3000
|
||||
# No build step, no test suite
|
||||
```
|
||||
|
||||
## Key Files
|
||||
| File | Purpose |
|
||||
|------|---------|
|
||||
| `server.js` | HTTP server: static + /api proxy |
|
||||
| `auth.js` | Login logic (Oliver + 3M auth buttons) |
|
||||
| `dashboard.js` | Job list, filtering, PDF export |
|
||||
| `editor.html` | One2Edit SDK wrapper |
|
||||
|
||||
## Deployment
|
||||
- **Run:** `node server.js` → http://localhost:3000
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/3m-portal`
|
||||
|
||||
## Timeline / Git History
|
||||
| Date | Change |
|
||||
|------|--------|
|
||||
| 2026-03-11 | Add missing image assets (3M_Splash.jpg, login_logo.png) |
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain with full details.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-03-11 | Missing images | Add 3M_Splash.jpg, login_logo.png | assets/ |
|
||||
|
||||
## Related
|
||||
- [[hm-o2e-tool/HM O2E Tool]] (same One2Edit platform)
|
||||
27
01 Projects/APAC ops Bot/APAC Ops Bot.md
Normal file
27
01 Projects/APAC ops Bot/APAC Ops Bot.md
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
---
|
||||
name: "APAC Ops Bot"
|
||||
client: Oliver Internal
|
||||
status: active
|
||||
tech: []
|
||||
local_path: "/Volumes/SSD/Projects/Oliver/APAC ops Bot"
|
||||
deploy: TBD
|
||||
url:
|
||||
tags: [oliver, apac, bot, ops]
|
||||
created: 2026-04-14
|
||||
---
|
||||
|
||||
## Overview
|
||||
APAC operations bot. No README — details to be filled in during working sessions.
|
||||
|
||||
## Deployment
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/APAC ops Bot`
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-04-14 | Initial setup | Note created | — |
|
||||
99
01 Projects/Claude code.md
Normal file
99
01 Projects/Claude code.md
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
[[how to]]
|
||||
[[how to_en]]
|
||||
|
||||
|
||||
|
||||
Based on the provided video guide, here is detailed process documentation designed for training new users on how to effectively build applications using Claude Code.
|
||||
|
||||
---
|
||||
|
||||
# Standard Operating Procedure: Application Development with Claude Code
|
||||
|
||||
## **1. Objective**
|
||||
|
||||
To build high-quality, bug-free applications using Claude Code by avoiding generic prompts ("slop") and utilizing a structured, iterative development cycle.
|
||||
|
||||
## **2. Prerequisites**
|
||||
|
||||
- Access to the Claude Code terminal interface.
|
||||
- A basic plan file or concept for the application (e.g., "A meditation app").
|
||||
|
||||
---
|
||||
|
||||
## **3. The Process**
|
||||
|
||||
### **Phase 1: Detailed Specification (The Interview Method)**
|
||||
|
||||
Do not begin by asking Claude to "build the app" immediately. Instead, force the AI to identify constraints and technical requirements first.
|
||||
|
||||
**Step 1.1: Initiate the Interrogation** Open your terminal and input the following prompt exactly. This commands Claude to use the `AskUserQuestionTool` to interview you about the project.
|
||||
|
||||
**Command:**
|
||||
|
||||
```text
|
||||
> Read this plan file and interview me in detail using AskUserQuestionTool about literally anything: technical implementation, UI & UX, concerns, tradeoffs, etc.
|
||||
```
|
||||
|
||||
**Step 1.2: Answer Technical Inquiries** Claude will pause and ask a series of specific questions to generate a specification. You must answer these to define the scope. Expect questions regarding:
|
||||
|
||||
- **Technical Details:** (e.g., "iOS, Android, or Web?", "React Native or Flutter?")
|
||||
- **Audio/Data Handling:** (e.g., "Stream or download?", "Offline mode required?")
|
||||
- **Edge Cases:** (e.g., "What happens if a phone call interrupts a session?", "Does the music loop?")
|
||||
- **Trade-offs:** (e.g., "Monetization vs. User Experience")
|
||||
|
||||
**Outcome:** A fully fleshed-out technical blueprint that accounts for edge cases before any code is written.
|
||||
|
||||
---
|
||||
|
||||
### **Phase 2: Modular Development (Feature Segmentation)**
|
||||
|
||||
Do not attempt to generate the entire codebase in a single prompt.
|
||||
|
||||
**Step 2.1: Break Down Features** Divide your application specification into distinct, isolated features.
|
||||
|
||||
- _Example:_ Instead of "Meditation App," break it down into:
|
||||
- Feature A: Audio Library
|
||||
- Feature B: Session Timer
|
||||
- Feature C: Progress Dashboard
|
||||
|
||||
**Step 2.2: Build and Test Sequentially** Instruct Claude to build one feature at a time.
|
||||
|
||||
1. **Build** Feature A.
|
||||
2. **Test** Feature A to ensure it works perfectly.
|
||||
3. Only after Feature A is verified, move on to Feature B.
|
||||
|
||||
> **Rule:** Never move to the next feature until the current feature is fully functional and tested.
|
||||
|
||||
---
|
||||
|
||||
### **Phase 3: Context Window Management**
|
||||
|
||||
AI models degrade in performance and "forget" instructions as the conversation gets too long. You must actively manage the context window.
|
||||
|
||||
**Step 3.1: Monitor Context Usage** Frequently check your token usage by running the context command.
|
||||
|
||||
**Command:**
|
||||
|
||||
```text
|
||||
/context
|
||||
```
|
||||
|
||||
**Step 3.2: The 50% Rule** Watch the "Context Usage" percentage.
|
||||
|
||||
- **The Danger Zone:** Although the model may support 200k tokens, instruction adherence drops significantly after **40% - 50% usage** (approx. 80k - 100k tokens).
|
||||
- **Symptoms:** The AI will start ignoring previous instructions, introducing bugs, or hallucinating code.
|
||||
|
||||
**Step 3.3: Session Reset** When you hit the 40-50% mark:
|
||||
|
||||
1. **Stop** the current session.
|
||||
2. **Start a new session.**
|
||||
3. **Resume** building the next feature (e.g., Feature C) in the fresh session.
|
||||
|
||||
---
|
||||
|
||||
## **Summary Checklist**
|
||||
|
||||
1. [ ] **Prompt:** Did you use the `AskUserQuestionTool` prompt to force a technical interview?
|
||||
2. [ ] **Scope:** Did you answer all questions regarding edge cases and tech stack?
|
||||
3. [ ] **Segmentation:** Are you building one isolated feature at a time?
|
||||
4. [ ] **Context:** Is your context usage below 50%? If not, have you started a new session?
|
||||
266
01 Projects/Deploy to Server.md
Normal file
266
01 Projects/Deploy to Server.md
Normal file
|
|
@ -0,0 +1,266 @@
|
|||
[[for script]]
|
||||
[[bitbacket ssh setup]]
|
||||
[[setup redirect url]]
|
||||
|
||||
|
||||
|
||||
|
||||
### **Introduction**
|
||||
|
||||
This guide provides a detailed walkthrough for deploying the APAC Ops Bot. The process involves cloning the application's repository, using an AI assistant (Claude) to generate a deployment script, preparing the server environment, and implementing production-ready authentication. This documentation is designed to be followed step-by-step, ensuring a successful deployment even for new users.
|
||||
|
||||
### **Part 1: Prepare the Local Environment**
|
||||
|
||||
The first phase involves setting up the project on your local machine and preparing the context for generating deployment scripts.
|
||||
|
||||
#### 1.1. Clone the Application Repository
|
||||
|
||||
Obtain a local copy of the application's source code from its Git repository.
|
||||
|
||||
1. **Navigate to the Repository:** Open your web browser and go to the `APAC ops Bot` repository page.
|
||||
|
||||
2. **Copy the Repository URL:** Click the green **`< > Code`** button. In the dropdown that appears, copy the HTTPS URL provided.
|
||||
|
||||
```
|
||||
https://bitbucket.org/your-workspace/apac-ops-bot.git
|
||||
```
|
||||
|
||||
3. **Clone the Repository Locally:** Open a terminal window on your local machine. Use the `git clone` command followed by the URL you just copied.
|
||||
|
||||
```bash
|
||||
git clone https://bitbucket.org/your-workspace/apac-ops-bot.git
|
||||
```
|
||||
|
||||
_Note: If you have previously cloned the repository, you will see a message indicating that the destination path already exists._
|
||||
|
||||
4. **Navigate into the Project Directory:** Change your current directory to the newly created project folder.
|
||||
|
||||
```bash
|
||||
cd apac-ops-bot/
|
||||
```
|
||||
|
||||
5. **Update the Repository:** Ensure your local copy is up-to-date with the latest changes from the remote repository by running `git pull`.
|
||||
|
||||
```bash
|
||||
git pull
|
||||
```
|
||||
|
||||
The output should indicate that your local repository is "Already up to date."
|
||||
|
||||
|
||||
#### 1.2. Initialize the Claude AI Environment
|
||||
|
||||
To generate the deployment script, we will use the Claude Command-Line Interface (CLI). We need to provide the AI with the context of our project structure and key files.
|
||||
|
||||
1. **Start the Claude CLI:** In your terminal, within the project's root directory, start the Claude interactive session.
|
||||
|
||||
```bash
|
||||
claude
|
||||
```
|
||||
|
||||
2. **Provide Project Context to Claude:** Execute the following `claude explore` commands one by one. These commands read the specified files and directories, allowing the AI to understand the project's architecture, dependencies, and configuration.
|
||||
|
||||
- **Explore the entire project directory structure:**
|
||||
|
||||
```bash
|
||||
claude explore . --name "root" --type "tree" --verbose
|
||||
```
|
||||
|
||||
- **Explore key configuration and source code files:** `bash claude explore .env.sample --name ".env.sample" --type "file" claude explore backend/app/main.py --name "backend/app/main.py" --type "file" claude explore backend/app/config.py --name "backend/app/config.py" --type "file" claude explore backend/app/database.py --name "backend/app/database.py" --type "file" claude explore frontend/package.json --name "frontend/package.json" --type "file" claude explore frontend/src/App.tsx --name "frontend/src/App.tsx" --type "file" claude explore backend/Dockerfile --name "backend/Dockerfile" --type "file" claude explore frontend/Dockerfile --name "frontend/Dockerfile" --type "file" claude explore docker-compose.yml --name "docker-compose.yml" --type "file" claude explore backend/app/authentication/main.py --name "backend/app/authentication/main.py" --type "file" claude explore backend/app/dependencies.py --name "backend/app/dependencies.py" --type "file"` After running these commands, Claude will have a comprehensive understanding of the project's layout and will create a `CLAUDE.md` file summarizing the explored context.
|
||||
|
||||
|
||||
### **Part 2: Implement Azure AD Authentication**
|
||||
|
||||
After the initial deployment, the application may use a basic email/password form for testing. The next step is to switch to the production authentication method, which uses Azure Active Directory (AD).
|
||||
|
||||
#### 2.1. Modify Frontend Code for Azure AD Login
|
||||
|
||||
The frontend application code needs to be modified to display the "Sign in with Microsoft" button instead of the email/password form.
|
||||
|
||||
1. **Navigate to the Login Component:** Open the source code for the login page component in your code editor. In the video, this appears to be `frontend/src/components/Login/Login.jsx`.
|
||||
|
||||
2. **Update Conditional Rendering:** Locate the section responsible for rendering the login forms. The code uses conditional rendering to switch between the standard login and the Azure AD login. You need to modify the condition to show the Azure AD component by default.
|
||||
|
||||
An equivalent change to what is shown in the video would be to invert the `when` condition:
|
||||
|
||||
```diff
|
||||
// src/components/Login/Login.jsx
|
||||
|
||||
// ...
|
||||
<Show
|
||||
- when={!isAzureAuthLoginPage}
|
||||
+ when={isAzureAuthLoginPage}
|
||||
fallback={<AzureLoginComponent />}
|
||||
>
|
||||
<form onSubmit={handleLogin}>
|
||||
{/* Email/Password form content */}
|
||||
</form>
|
||||
</Show>
|
||||
//...
|
||||
```
|
||||
|
||||
This change makes the `AzureLoginComponent` the default and the email/password form the fallback, effectively enabling the Azure AD login.
|
||||
|
||||
3. **Commit and Push Changes:** Save the file and commit the changes to your Git repository.
|
||||
|
||||
```bash
|
||||
# Add the changed file to the staging area
|
||||
git add frontend/src/components/Login/Login.jsx
|
||||
|
||||
# Commit the changes with a descriptive message
|
||||
git commit -m "feat: add Azure AD login support"
|
||||
|
||||
# Push the changes to the remote repository
|
||||
git push
|
||||
```
|
||||
|
||||
|
||||
#### 2.2. Configure Frontend Environment Variables
|
||||
|
||||
The frontend needs specific environment variables to connect to Azure AD.
|
||||
|
||||
1. **Open the Backend Environment File:** View the contents of the backend's environment file to find the required variables.
|
||||
|
||||
```bash
|
||||
cat backend/.env
|
||||
```
|
||||
|
||||
2. **Identify and Copy Azure AD Variables:** Locate the variables related to Azure AD. They will look similar to this:
|
||||
|
||||
```env
|
||||
# Azure AD Configuration (Example Values)
|
||||
REACT_APP_AD_TENANT=your-tenant-id
|
||||
REACT_APP_AD_CLIENT_ID=your-client-id
|
||||
REACT_APP_AD_REDIRECT_URI=https://your-app-url/.auth/login/aad/callback
|
||||
```
|
||||
|
||||
3. **Update the Frontend Environment File:** Open the frontend's environment file in an editor (like `vim`).
|
||||
|
||||
```bash
|
||||
vim frontend/.env
|
||||
```
|
||||
|
||||
4. **Add the Azure AD Variables:** Paste the copied variables into the `frontend/.env` file and save it. The file should now contain these variables along with any others.
|
||||
|
||||
```env
|
||||
# frontend/.env
|
||||
|
||||
# API Configuration
|
||||
REACT_APP_API_URL=http://sb-random.silver.solutions/api/v1/task/ops/
|
||||
# ... other variables
|
||||
|
||||
# Azure AD Configuration
|
||||
REACT_APP_AD_TENANT=...
|
||||
REACT_APP_AD_CLIENT_ID=...
|
||||
REACT_APP_AD_REDIRECT_URI=...
|
||||
```
|
||||
|
||||
|
||||
#### 2.3. Rebuild and Deploy the Application
|
||||
|
||||
With the code and configuration updated, you need to rebuild the frontend and redeploy the application.
|
||||
|
||||
1. **Navigate to the Project Root:** Make sure you are in the main project directory (`apac-ops-bot`).
|
||||
|
||||
2. **Build the Frontend:** Run the build script to compile the React application.
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
|
||||
3. **Deploy to Google App Engine:** Deploy the application. `gcloud` will deploy all services defined in the `app.yaml` files, including the updated frontend and any backend changes.
|
||||
|
||||
```bash
|
||||
gcloud app deploy
|
||||
```
|
||||
|
||||
|
||||
### **Part 3: Final Troubleshooting and Verification**
|
||||
|
||||
After deployment, it's crucial to test the application to ensure all changes work as expected and to fix any remaining bugs.
|
||||
|
||||
#### 3.1. Fixing a CORS (Cross-Origin Resource Sharing) Error
|
||||
|
||||
1. **Test the New Login:** Open your web browser and navigate to the application's URL. Perform a hard refresh (Cmd+Shift+R on Mac, Ctrl+F5 on Windows) to ensure you are loading the latest version. The page should now display the "Sign in with Microsoft" button.
|
||||
|
||||
2. **Identify the Error:** Click the "Sign in with Microsoft" button and complete the authentication process. You may notice that after authentication, you are redirected back to the login page instead of the main application. Open the browser's Developer Tools (F12) and go to the **Console** tab. You will likely see a CORS or mixed content error.
|
||||
|
||||
```
|
||||
Blocked loading active content at "http://sb-random.silver.solutions/api/v1/task/ops/..."
|
||||
```
|
||||
|
||||
This error occurs because the frontend, served over **HTTPS**, is trying to make a request to a backend API served over **HTTP**. Browsers block these "mixed content" requests for security reasons.
|
||||
|
||||
3. **Correct the API URL:** The fix is to ensure the frontend calls the API using the same protocol (HTTPS).
|
||||
|
||||
- Open the frontend environment file again: `bash vim frontend/.env`
|
||||
|
||||
- Locate the `REACT_APP_API_URL` variable and change the protocol from `http` to `https`.
|
||||
|
||||
```diff
|
||||
- REACT_APP_API_URL=http://sb-random.silver.solutions/api/v1/task/ops/
|
||||
+ REACT_APP_API_URL=https://sb-random.silver.solutions/api/v1/task/ops/
|
||||
```
|
||||
|
||||
- Save the file.
|
||||
|
||||
4. **Rebuild and Redeploy:** Repeat the build and deploy process one more time to apply the environment variable change.
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
gcloud app deploy
|
||||
```
|
||||
|
||||
5. **Verify Successful Login:** Once the deployment is complete, perform another hard refresh on the application page. Click "Sign in with Microsoft" and authenticate. This time, you should be successfully logged in and see the "Welcome to Scopic Ops Bot" chat interface.
|
||||
|
||||
|
||||
#### 3.2. Fixing a Backend Chat Error
|
||||
|
||||
Even after logging in, the application might have runtime bugs.
|
||||
|
||||
1. **Test the Chat Functionality:** Try sending a message through the chatbot interface (e.g., "where's COSMICC?").
|
||||
|
||||
2. **Identify the Error:** The application may fail to get a response. Check the browser's Developer Console again. You may see a `500 Internal Server Error` for the API request that sends the message.
|
||||
|
||||
3. **Analyze Backend Logs:** To understand the server error, check the backend service logs in Google App Engine.
|
||||
|
||||
```bash
|
||||
gcloud app logs tail -s backend
|
||||
```
|
||||
|
||||
Look for recent error messages. In the video, a traceback shows an `InvalidRequestError`, indicating that the code `can't find a previous_response_id`. This suggests the application is trying to continue a conversation that doesn't exist, especially on the first message of a new chat.
|
||||
|
||||
4. **Implement the Backend Fix:** The solution is to make the backend code resilient to cases where there is no previous response.
|
||||
|
||||
- Open the relevant backend file, which appears to be `backend/app/services/response_service.py`.
|
||||
- Locate the code that accesses `previous_response_id`.
|
||||
- Wrap this logic in a `try...except` block to gracefully handle the error when the ID is not found.
|
||||
|
||||
```python
|
||||
# backend/app/services/response_service.py
|
||||
|
||||
# ... inside a method like generate_response ...
|
||||
try:
|
||||
# Code that might fail
|
||||
previous_response_id = request.payload.get("previous_response_id")
|
||||
# ... logic that uses previous_response_id
|
||||
except AttributeError: # Or the appropriate exception type for a missing ID
|
||||
# Handle the error, e.g., by creating a new conversation
|
||||
# or proceeding without the previous response context.
|
||||
logger.warning("Previous response ID not found, starting new conversation.")
|
||||
response = self.apps.client.responses.create(request.payload)
|
||||
```
|
||||
|
||||
5. **Commit and Redeploy the Final Fix:**
|
||||
|
||||
- Commit the changes to your backend code. `bash git add backend/app/services/response_service.py git commit -m "fix: handle missing previous response in chat" git push`
|
||||
- Run the deployment command for the final time. `bash gcloud app deploy`
|
||||
|
||||
#### 3.3. Final Verification
|
||||
|
||||
1. **Perform a Full Test:** After the final deployment finishes, go back to the application in your browser.
|
||||
2. **Start a New Chat:** Click the "New Chat" button to ensure you start with a clean state.
|
||||
3. **Send a Message:** Type your query (e.g., "where's COSMICC?") and send it.
|
||||
4. **Confirm Success:** The chatbot should now process the request and return a valid response, confirming that both the authentication and backend logic are working correctly.
|
||||
|
||||
The application is now fully deployed and functional.
|
||||
44
01 Projects/DevOps_Click_UP_sync/DevOps ClickUp Sync.md
Normal file
44
01 Projects/DevOps_Click_UP_sync/DevOps ClickUp Sync.md
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
---
|
||||
name: "DevOps ↔ ClickUp Sync"
|
||||
client: Oliver Internal
|
||||
status: active
|
||||
tech: [Python, FastAPI, SQLAlchemy, SQLite, httpx, Tailwind, Docker]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/DevOps_Click_UP_sync
|
||||
deploy: docker compose up --build
|
||||
url: http://localhost:8080
|
||||
tags: [oliver, devops, ado, clickup, sync, webhook]
|
||||
created: 2026-04-14
|
||||
---
|
||||
|
||||
## Overview
|
||||
Full two-way sync between Azure DevOps (ADO) and ClickUp. Webhook-driven, real-time. Tailwind CSS monitoring dashboard.
|
||||
|
||||
## Tech Stack
|
||||
- **Backend:** Python + FastAPI + SQLAlchemy async
|
||||
- **Database:** SQLite
|
||||
- **HTTP:** httpx (async)
|
||||
- **Frontend:** Vanilla JS + Tailwind CDN
|
||||
- **Infrastructure:** Docker + docker-compose
|
||||
|
||||
## Deployment
|
||||
- **Run:** `docker compose up --build`
|
||||
- **Entry:** `src/main.py` (uvicorn, port 8080)
|
||||
- **Config:** Copy `.env.example` → `.env`
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/DevOps_Click_UP_sync`
|
||||
|
||||
## Key Files
|
||||
| File | Purpose |
|
||||
|------|---------|
|
||||
| `src/sync/engine.py` | Core sync logic |
|
||||
| `src/sync/dedup.py` | Loop prevention |
|
||||
| `src/sync/mapper.py` | ADO ↔ ClickUp field mapping |
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-04-14 | Initial setup | Note created | — |
|
||||
39
01 Projects/Oliver-ai-bot_2.0/Oliver AI Bot 2.0.md
Normal file
39
01 Projects/Oliver-ai-bot_2.0/Oliver AI Bot 2.0.md
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
---
|
||||
name: "Oliver AI Bot 2.0 (Nexus MVP)"
|
||||
client: Oliver Internal
|
||||
status: active
|
||||
tech: [Next.js, FastAPI, Python, Docker, RAG]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/Oliver-ai-bot_2.0
|
||||
deploy: docker compose up --build
|
||||
url:
|
||||
tags: [oliver, ai, rag, nexus, executive-assistant, notebook]
|
||||
created: 2026-04-14
|
||||
---
|
||||
|
||||
## Overview
|
||||
Enterprise AI Hub "Nexus" MVP. 3 modes: RAG (knowledge retrieval), Executive Assistant (calendar/email/tasks), Notebook.
|
||||
|
||||
Status: MVP Complete — Frontend 100%, Backend 85%
|
||||
|
||||
## Tech Stack
|
||||
- **Frontend:** Next.js
|
||||
- **Backend:** FastAPI + Python
|
||||
- **Infrastructure:** Docker + docker-compose
|
||||
|
||||
## Deployment
|
||||
- **Run:** `docker compose up --build`
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/Oliver-ai-bot_2.0`
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-04-14 | Initial setup | Note created | — |
|
||||
|
||||
## Related
|
||||
- [[enterprise-ai-hub-nexus/Enterprise AI Hub Nexus]]
|
||||
- [[oliver-ai-assistant/Oliver AI Assistant]]
|
||||
63
01 Projects/Projects Index.md
Normal file
63
01 Projects/Projects Index.md
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
---
|
||||
name: "Projects Index"
|
||||
type: hub
|
||||
updated: 2026-04-14
|
||||
tags: [index, oliver, projects]
|
||||
---
|
||||
|
||||
# Oliver Agency — Projects Index
|
||||
> Code: `/Volumes/SSD/Projects/Oliver/`
|
||||
> Vault: one folder per project, matching disk structure
|
||||
|
||||
## Client Projects
|
||||
|
||||
| Project | Client | Stack | Deploy | Live URL |
|
||||
|---------|--------|-------|--------|----------|
|
||||
| [[3m-portal/3M OMG Portal]] | 3M | JS + Node.js | npm | — |
|
||||
| [[baic_dashboard/BAIC Dashboard]] | BAIC | Flask + React | dev servers | — |
|
||||
| [[modcomms/Mod Comms]] | Barclays | FastAPI + Docker | docker compose | — |
|
||||
| [[wsj-filenaming/WSJ File Naming Tool]] | Dow Jones | Python + Gemini | python | — |
|
||||
| [[ferrero-ac-creator/Ferrero AC Booking Tool]] | Ferrero | Node.js + Box | node server.js | localhost:3456 |
|
||||
| [[ford_qc/Ford QC System]] | Ford | Python + Box | python | — |
|
||||
| [[ford-gechub-sftp/Ford SFTP Transfer]] | Ford | Python + SFTP | python | — |
|
||||
| [[hm_ems_report/HM EMS Report Tool]] | H&M | Python + JS | python | — |
|
||||
| [[hm-o2e-tool/HM O2E Tool]] | H&M | JS + One2Edit | static | — |
|
||||
| [[loreal-global-kickoff/Loreal Global Kickoff]] | L'Oréal | PHP + Box | php | — |
|
||||
| [[loreal-sla-calculator/Loreal SLA Calculator]] | L'Oréal | JS + Docker | docker compose | — |
|
||||
| [[lusa-back-planner/LUSA Back Planner]] | LUSA | React + TS | npm | — |
|
||||
| [[pimco-charts/PIMCO Chart Generator]] | PIMCO | FastAPI + Claude | docker compose | — |
|
||||
| [[solventum-image-metadata/Solventum Image Metadata]] | Solventum | FastAPI + OpenAI | docker compose | — |
|
||||
|
||||
## Oliver Internal Tools
|
||||
|
||||
| Project | Stack | Deploy | Live URL |
|
||||
|---------|-------|--------|----------|
|
||||
| [[ac-helper/AC Helper]] | Python + Gemini + Docker | docker compose | — |
|
||||
| [[ac-tool/AC Tool]] | Docker | docker compose | — |
|
||||
| [[APAC ops Bot/APAC Ops Bot]] | TBD | TBD | — |
|
||||
| [[build-a-squad/Build A Squad]] | React + TS + Gemini | npm | — |
|
||||
| [[cc-dashboard/CC Dashboard]] | Docker | docker compose | — |
|
||||
| [[cinema-studio-pro/Cinema Studio Pro]] | JS + Imagen 3 + Veo 3.1 | static | https://ai-sandbox.oliver.solutions/lux-studio/ |
|
||||
| [[DevOps_Click_UP_sync/DevOps ClickUp Sync]] | FastAPI + SQLite + Docker | docker compose | localhost:8080 |
|
||||
| [[enterprise-ai-hub-nexus/Enterprise AI Hub Nexus]] | Next.js 14 + FastAPI + Azure AD | docker compose | — |
|
||||
| [[gmal-scope-builder/GMAL Scope Builder]] | FastAPI + React + PG + Claude | docker compose | — |
|
||||
| [[homepage/Homepage Dashboard]] | Node.js + Docker | docker compose | — |
|
||||
| [[md to word/MD to Word]] | Python | python | — |
|
||||
| [[olivas/OliVAS]] | FastAPI + DeepGaze + Claude | docker compose | — |
|
||||
| [[oliver-ai-assistant/Oliver AI Assistant]] | TBD | TBD | — |
|
||||
| [[Oliver-ai-bot_2.0/Oliver AI Bot 2.0]] | Next.js + FastAPI + Docker | docker compose | — |
|
||||
| [[pdf-accessibility/PDF Accessibility Checker]] | FastAPI + AI + Docker | docker compose | — |
|
||||
| [[ppt-tool/PPT Tool DeckForge]] | Next.js + FastAPI + nginx | docker compose | — |
|
||||
| [[presenton/Presenton]] | Node.js + Docker | docker compose | — |
|
||||
| [[sandbox-notebookllamalm-nextjs/Sandbox NotebookLM]] | Next.js + LlamaIndex + Docker | docker compose | https://ai-sandbox.oliver.solutions/notebookllama/ |
|
||||
| [[semblance/Semblance]] | Node.js + Docker | docker compose | — |
|
||||
| [[smartcrop26/SmartCrop26]] | React + TS + Lovable | npm | — |
|
||||
| [[video-accessibility/Video Accessibility Platform]] | FastAPI + Gemini + Docker | docker compose | — |
|
||||
|
||||
## Infrastructure Notes
|
||||
- [[bitbacket ssh setup]] — Bitbucket SSH config
|
||||
- [[Deploy to Server]] — General deployment guide
|
||||
- [[SSH Servers]] — Server access credentials
|
||||
|
||||
## Daily Logs
|
||||
See `99 Daily/` for session-by-session logs.
|
||||
197
01 Projects/SSH Servers.md
Normal file
197
01 Projects/SSH Servers.md
Normal file
|
|
@ -0,0 +1,197 @@
|
|||
|
||||
| Server name | ip | port | username | Private key |
|
||||
| -------------- | -------------- | ---- | ---------------- | ------------ |
|
||||
| Optical | 10.220.168.5 | 22 | vadym.samoilenko | id_rsa_vadym |
|
||||
| box-cli | 10.220.176.3 | 22 | vadym.samoilenko | id_rsa_vadym |
|
||||
| librechat_dev | 10.220.168.2 | 22 | vadym.samoilenko | id_rsa_vadym |
|
||||
| librechat_prod | 10.220.168.4 | 22 | vadym.samoilenko | id_rsa_vadym |
|
||||
| modocmms dev | 10.220.168.6 | 22 | vadym.samoilenko | id_rsa_vadym |
|
||||
| BAIC | 10.220.72.13 | 22 | vadym.samoilenko | id_rsa_vadym |
|
||||
| optical-dev | 10.220.168.9 | 22 | vadym.samoilenko | id_rsa_vadym |
|
||||
| optical-prod | 10.220.168.8 | 22 | vadym.samoilenko | id_rsa_vadym |
|
||||
| Aimpress | 57.128.160.249 | 1220 | ubuntu | |
|
||||
Vim
|
||||
|
||||
# Vim — шпаргалка
|
||||
|
||||
## Открыть файл
|
||||
|
||||
```bash
|
||||
vim filename.txt # открыть файл
|
||||
vim +42 filename.txt # открыть на строке 42
|
||||
vim +/pattern file.txt # открыть с поиском по слову
|
||||
sudo vim /etc/nginx/nginx.conf # редактировать системный файл
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Режимы
|
||||
|
||||
| Режим | Как войти | Индикатор внизу |
|
||||
|---|---|---|
|
||||
| **Normal** | `Esc` | ничего |
|
||||
| **Insert** | `i` | `-- INSERT --` |
|
||||
| **Visual** | `v` | `-- VISUAL --` |
|
||||
| **Command** | `:` | `:` внизу |
|
||||
|
||||
> Всегда жми `Esc` перед командами если не уверен в текущем режиме.
|
||||
|
||||
---
|
||||
|
||||
## Движение (Normal mode)
|
||||
|
||||
```
|
||||
h j k l ← ↓ ↑ →
|
||||
w / b следующее / предыдущее слово
|
||||
0 / $ начало / конец строки
|
||||
gg / G начало / конец файла
|
||||
42G перейти на строку 42
|
||||
Ctrl+d вниз на полэкрана
|
||||
Ctrl+u вверх на полэкрана
|
||||
Ctrl+f вниз на экран
|
||||
Ctrl+b вверх на экран
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Вставка текста (→ Insert mode)
|
||||
|
||||
```
|
||||
i вставить перед курсором
|
||||
a вставить после курсора
|
||||
I вставить в начало строки
|
||||
A вставить в конец строки
|
||||
o новая строка ниже
|
||||
O новая строка выше
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Редактирование (Normal mode)
|
||||
|
||||
```
|
||||
x удалить символ под курсором
|
||||
dd удалить строку
|
||||
d3d / 3dd удалить 3 строки
|
||||
dw удалить слово
|
||||
D удалить до конца строки
|
||||
yy скопировать строку
|
||||
y3y / 3yy скопировать 3 строки
|
||||
p вставить после курсора
|
||||
P вставить перед курсором
|
||||
u отменить (undo)
|
||||
Ctrl+r повторить (redo)
|
||||
. повторить последнее действие
|
||||
r<char> заменить символ под курсором
|
||||
cw изменить слово (удаляет + переходит в Insert)
|
||||
cc изменить всю строку
|
||||
C изменить до конца строки
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Поиск и замена
|
||||
|
||||
```
|
||||
/pattern искать вперёд
|
||||
?pattern искать назад
|
||||
n следующее совпадение
|
||||
N предыдущее совпадение
|
||||
* искать слово под курсором
|
||||
|
||||
:%s/old/new/g заменить всё в файле
|
||||
:%s/old/new/gc заменить с подтверждением каждого
|
||||
:10,20s/old/new/g заменить в строках 10–20
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Сохранение и выход (Command mode)
|
||||
|
||||
```
|
||||
:w сохранить
|
||||
:w filename сохранить как другой файл
|
||||
:q выйти (если нет изменений)
|
||||
:q! выйти без сохранения
|
||||
:wq сохранить и выйти
|
||||
:x сохранить и выйти (только если были изменения)
|
||||
ZZ сохранить и выйти (без двоеточия)
|
||||
ZQ выйти без сохранения (без двоеточия)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Работа с несколькими файлами
|
||||
|
||||
```
|
||||
:e filename открыть другой файл
|
||||
:tabe file открыть в новой вкладке
|
||||
gt / gT следующая / предыдущая вкладка
|
||||
:split file горизонтальное разделение
|
||||
:vsplit file вертикальное разделение
|
||||
Ctrl+w w переключиться между панелями
|
||||
Ctrl+w q закрыть панель
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Визуальный режим (выделение)
|
||||
|
||||
```
|
||||
v выделение посимвольно
|
||||
V выделение построчно
|
||||
Ctrl+v блочное выделение (колонки)
|
||||
|
||||
После выделения:
|
||||
d удалить
|
||||
y скопировать
|
||||
> сдвинуть вправо (отступ)
|
||||
< сдвинуть влево
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Полезные команды
|
||||
|
||||
```
|
||||
:set number показать номера строк
|
||||
:set nonumber скрыть номера строк
|
||||
:set paste режим вставки без автоотступов (для Ctrl+V из буфера)
|
||||
:set nopaste выключить paste-режим
|
||||
:syntax on/off включить / выключить подсветку синтаксиса
|
||||
:noh убрать подсветку поиска
|
||||
gg=G автоформатировать весь файл
|
||||
|
||||
:%y+ скопировать весь файл в системный буфер
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Типичный сценарий на сервере
|
||||
|
||||
```bash
|
||||
# 1. Открыть конфиг
|
||||
sudo vim /etc/nginx/sites-available/mysite.conf
|
||||
|
||||
# 2. Найти нужное место
|
||||
/server_name
|
||||
|
||||
# 3. Перейти в Insert
|
||||
i
|
||||
|
||||
# 4. Внести правки, выйти из Insert
|
||||
Esc
|
||||
|
||||
# 5. Сохранить и выйти
|
||||
:wq
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Если завис / не знаешь что делать
|
||||
|
||||
```
|
||||
Esc Esc вернуться в Normal mode
|
||||
:q! выйти без сохранения
|
||||
u отменить последнее действие
|
||||
```
|
||||
38
01 Projects/ac-helper/AC Helper.md
Normal file
38
01 Projects/ac-helper/AC Helper.md
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
---
|
||||
name: "Activation Calendar Helper"
|
||||
client: Oliver Internal
|
||||
status: active
|
||||
tech: [Python, Docker, Google Gemini, HTML/JS, Tailwind]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/ac-helper
|
||||
deploy: docker compose up --build
|
||||
url:
|
||||
tags: [oliver, activation-calendar, ai, gemini, deliverables]
|
||||
created: 2026-04-14
|
||||
---
|
||||
|
||||
## Overview
|
||||
Marketing deliverables management with AI automation. Natural language commands (Gemini), interactive spreadsheet grid, multi-sheet support, strict 3-level hierarchy (Category → Media → Sub-media), CSV export.
|
||||
|
||||
## Tech Stack
|
||||
- **Frontend:** HTML/JS + Tailwind CDN
|
||||
- **Backend:** Python
|
||||
- **AI:** Google Gemini
|
||||
- **Infrastructure:** Docker + docker-compose
|
||||
|
||||
## Deployment
|
||||
- **Run:** `docker compose up --build`
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/ac-helper`
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-04-14 | Initial setup | Note created | — |
|
||||
|
||||
## Related
|
||||
- [[ac-tool/AC Tool]]
|
||||
- [[gmal-scope-builder/GMAL Scope Builder]]
|
||||
31
01 Projects/ac-tool/AC Tool.md
Normal file
31
01 Projects/ac-tool/AC Tool.md
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
---
|
||||
name: "AC Tool"
|
||||
client: Oliver Internal
|
||||
status: active
|
||||
tech: [Docker]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/ac-tool
|
||||
deploy: docker compose up --build
|
||||
url:
|
||||
tags: [oliver, activation-calendar]
|
||||
created: 2026-04-14
|
||||
---
|
||||
|
||||
## Overview
|
||||
Activation Calendar tool. Docker-based. No README — see [[ac-helper/AC Helper]] for context.
|
||||
|
||||
## Deployment
|
||||
- **Run:** `docker compose up --build`
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/ac-tool`
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-04-14 | Initial setup | Note created | — |
|
||||
|
||||
## Related
|
||||
- [[ac-helper/AC Helper]]
|
||||
81
01 Projects/baic_dashboard/BAIC Dashboard.md
Normal file
81
01 Projects/baic_dashboard/BAIC Dashboard.md
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
---
|
||||
name: "BAIC Dashboard"
|
||||
client: BAIC
|
||||
status: active
|
||||
tech: [Python, Flask, Hypercorn, React, Vite, Recharts, PapaParse, Azure AD, Make.com]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/baic_dashboard
|
||||
deploy: python + npm run dev
|
||||
url:
|
||||
server: TBD (BASE_PATH=/dashboard/)
|
||||
tags: [baic, analytics, dashboard, flask, react, recharts, make, azure-ad]
|
||||
created: 2026-04-14
|
||||
last_commit: 2025-11-19
|
||||
commits: 11
|
||||
---
|
||||
|
||||
## Overview
|
||||
Oliver Agency Reporting Module — analytics dashboard for conversation and message volumes. Backend fetches from Make.com webhook, enriches data, serves via REST API. Frontend filters client-side.
|
||||
|
||||
**Data flow:**
|
||||
Make.com webhook → Flask API → enrich messages with conversation metadata → React SPA → Recharts visualization
|
||||
|
||||
## Tech Stack
|
||||
- **Frontend:** React + Vite SPA (`/frontend/`) + Recharts + PapaParse (CSV export)
|
||||
- **Backend:** Python Flask (`/backend/app.py`) + Hypercorn ASGI
|
||||
- **Auth:** Azure AD (MSAL) — requires Azure App Registration
|
||||
- **Data source:** Make.com webhook URL
|
||||
- **Infrastructure:** No Docker
|
||||
|
||||
## Env Config (`.env`)
|
||||
```
|
||||
DOMAIN=
|
||||
BASE_PATH=/dashboard/
|
||||
AZURE_TENANT_ID=
|
||||
AZURE_CLIENT_ID=
|
||||
MAKE_WEBHOOK_URL=
|
||||
# Duplicate all with VITE_ prefix for frontend
|
||||
```
|
||||
|
||||
## Architecture
|
||||
```
|
||||
Make.com webhook (data source)
|
||||
↓
|
||||
Flask backend (/backend/app.py)
|
||||
↓ message enrichment (+ conversation metadata, assistant name mapping)
|
||||
React SPA (client-side filtering + CSV export)
|
||||
└── Recharts (visualization)
|
||||
└── PapaParse (CSV export)
|
||||
```
|
||||
|
||||
**Assistant ID mapping:** `assistantMapping.js` maps IDs → friendly display names.
|
||||
|
||||
## Dev Commands
|
||||
```bash
|
||||
cp .env.example .env # Configure Azure AD + Make.com URL
|
||||
# Start both:
|
||||
cd backend && python app.py
|
||||
cd frontend && npm run dev
|
||||
```
|
||||
|
||||
## Deployment
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/baic_dashboard`
|
||||
- **Server base path:** `/dashboard/`
|
||||
- **Last deploy:** 2025-11-19 (restart backend service fix)
|
||||
|
||||
## Timeline / Git History
|
||||
| Date | Change |
|
||||
|------|--------|
|
||||
| 2025-11-19 | Update deploy script to restart backend service instead of start |
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain with full details.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2025-11-19 | Deploy fix | Restart backend instead of start | deploy script |
|
||||
|
||||
## Related
|
||||
- [[cc-dashboard/CC Dashboard]]
|
||||
31
01 Projects/bitbacket ssh setup.md
Normal file
31
01 Projects/bitbacket ssh setup.md
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
# 1. Create a key
|
||||
|
||||
ssh-keygen -t ed25519 -C ‘vadymsamoilenko@oliver,agency’ -f ~/.ssh/id_bitbucket
|
||||
|
||||
# 2. Display the public key (copy it)
|
||||
|
||||
cat ~/.ssh/id_bitbucket.pub
|
||||
|
||||
# 3. Add the key to Bitbucket via your browser
|
||||
|
||||
# 4. Create an SSH config
|
||||
|
||||
cat > ~/.ssh/config << "EOF"
|
||||
Host bitbucket.org
|
||||
HostName bitbucket.org
|
||||
User git
|
||||
IdentityFile ~/.ssh/id_bitbucket
|
||||
IdentitiesOnly yes
|
||||
EOF
|
||||
|
||||
# 5. Set permissions
|
||||
|
||||
chmod 700 ~/.ssh
|
||||
|
||||
chmod 600 ~/.ssh/id_bitbucket
|
||||
|
||||
chmod 600 ~/.ssh/config
|
||||
|
||||
# 6. Verify
|
||||
|
||||
ssh -T git@bitbucket.org
|
||||
40
01 Projects/build-a-squad/Build A Squad.md
Normal file
40
01 Projects/build-a-squad/Build A Squad.md
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
---
|
||||
name: "Build-A-Squad"
|
||||
client: Oliver Internal
|
||||
status: active
|
||||
tech: [React, TypeScript, Vite, Google Gemini]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/build-a-squad
|
||||
deploy: npm run dev
|
||||
url:
|
||||
tags: [oliver, staffing, fte, calculator, gemini]
|
||||
created: 2026-04-14
|
||||
---
|
||||
|
||||
## Overview
|
||||
Client-side staffing calculator. Paste brief → Gemini analyzes → suggests 30+ creative assets from catalog → instant FTE breakdown by discipline and role. No backend needed.
|
||||
|
||||
3-tab workflow: **Scoping** → **Configurator** → **Squad Projection**
|
||||
|
||||
## Tech Stack
|
||||
- **Frontend:** React 19 + TypeScript + Vite
|
||||
- **AI:** Google Gemini
|
||||
- **Infrastructure:** No Docker
|
||||
|
||||
## Deployment
|
||||
- **Dev:** `npm run dev`
|
||||
- **Build:** `npm run build`
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/build-a-squad`
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-04-14 | Initial setup | Note created | — |
|
||||
|
||||
## Related
|
||||
- [[gmal-scope-builder/GMAL Scope Builder]]
|
||||
- [[lusa-back-planner/LUSA Back Planner]]
|
||||
31
01 Projects/cc-dashboard/CC Dashboard.md
Normal file
31
01 Projects/cc-dashboard/CC Dashboard.md
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
---
|
||||
name: "CC Dashboard"
|
||||
client: Oliver Internal
|
||||
status: active
|
||||
tech: [Docker]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/cc-dashboard
|
||||
deploy: docker compose up --build
|
||||
url:
|
||||
tags: [oliver, dashboard, cc]
|
||||
created: 2026-04-14
|
||||
---
|
||||
|
||||
## Overview
|
||||
CC Dashboard — internal reporting/analytics. Docker-based. No README — details to be filled in during working sessions.
|
||||
|
||||
## Deployment
|
||||
- **Run:** `docker compose up --build`
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/cc-dashboard`
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-04-14 | Initial setup | Note created | — |
|
||||
|
||||
## Related
|
||||
- [[baic_dashboard/BAIC Dashboard]]
|
||||
90
01 Projects/cinema-studio-pro/Cinema Studio Pro.md
Normal file
90
01 Projects/cinema-studio-pro/Cinema Studio Pro.md
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
---
|
||||
name: "Cinema Studio Pro (Lux Studio)"
|
||||
client: Oliver Internal
|
||||
status: active
|
||||
tech: [React, Vite, PHP, Azure AD, MSAL, Imagen 3, Veo 3.1, Kling, IndexedDB, Docker]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/cinema-studio-pro
|
||||
deploy: ./setup.sh (local) / FileZilla + SSH (prod)
|
||||
url: https://ai-sandbox.oliver.solutions/lux-studio/
|
||||
server: ai-sandbox.oliver.solutions (same as NotebookLM, optical-web-1)
|
||||
tags: [oliver, ai, image-generation, video, cinematography, php, react, azure-ad]
|
||||
created: 2026-04-14
|
||||
last_commit: 2026-03-23
|
||||
commits: 50
|
||||
---
|
||||
|
||||
## Overview
|
||||
AI cinematography suite for professional image and video generation. Physics-based prompt engineering + Google Imagen 3 + Google Veo 3.1 + Kling. Project-first workflow with storyboard annotation.
|
||||
|
||||
**Live:** https://ai-sandbox.oliver.solutions/lux-studio/
|
||||
|
||||
## Tech Stack
|
||||
- **Frontend:** React + Vite (port from .env, default 3000)
|
||||
- **Backend:** PHP (api.php, video_api.php, enhance_prompt.php)
|
||||
- **Storage:** IndexedDB (browser-local project data)
|
||||
- **Auth:** Azure AD via MSAL + JWTValidator.php
|
||||
- **AI:** Google Imagen 3, Google Veo 3.1, Kling
|
||||
- **Infrastructure:** PHP server (no Docker for backend)
|
||||
|
||||
## Directory Structure
|
||||
```
|
||||
cinema-studio-pro/
|
||||
├── frontend/ ← React + Vite
|
||||
│ ├── src/
|
||||
│ │ ├── authConfig.js ← MSAL config
|
||||
│ │ └── App.jsx
|
||||
│ ├── .env.local ← local dev vars
|
||||
│ └── .env.production ← prod vars
|
||||
├── backend/ ← PHP APIs
|
||||
│ ├── api.php ← Image generation
|
||||
│ ├── video_api.php ← Video generation
|
||||
│ ├── enhance_prompt.php ← Prompt optimizer
|
||||
│ ├── session_manager.php ← Multi-user sessions
|
||||
│ ├── AuthMiddleware.php ← SSO (required by api.php)
|
||||
│ └── JWTValidator.php ← Azure AD token validation
|
||||
├── setup.sh ← Auto local dev setup
|
||||
├── stop.sh ← Auto-generated by setup.sh
|
||||
└── NEW_DEPLOYMENT.md ← Production deploy guide (FileZilla + SSH)
|
||||
```
|
||||
|
||||
## Dev Commands
|
||||
```bash
|
||||
./setup.sh # Auto-detect ports, start both servers, generate stop.sh
|
||||
./stop.sh # Stop servers
|
||||
./status.sh # Check status + last 3 log lines
|
||||
|
||||
# Manual frontend
|
||||
cd frontend && npm install && npm run dev
|
||||
|
||||
# Manual PHP backend
|
||||
cd backend && php -S localhost:8001
|
||||
```
|
||||
|
||||
## Deployment
|
||||
- **Local:** `./setup.sh`
|
||||
- **Production:** FileZilla + SSH (see `NEW_DEPLOYMENT.md`)
|
||||
- **Live URL:** https://ai-sandbox.oliver.solutions/lux-studio/
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/cinema-studio-pro`
|
||||
|
||||
## Timeline / Git History
|
||||
| Date | Change |
|
||||
|------|--------|
|
||||
| 2026-03-23 | Add Kling integration + prompt optimizer rework + stability fixes |
|
||||
| 2026-03-09 | Major UI restyling (typography: Space Grotesk → JetBrains Mono for data) |
|
||||
| 2026-03-09 | 5-tone dark scale (950/900/800/700/600), invert depth |
|
||||
| 2026-03-09 | Tabs flush left, generous logo spacing, 14px base font |
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain with full details.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-03-23 | Add Kling video model | Kling integration | video_api.php, frontend |
|
||||
| 2026-03-09 | UI redesign | Typography + color scale overhaul | CSS, components |
|
||||
|
||||
## Related
|
||||
- [[sandbox-notebookllamalm-nextjs/Sandbox NotebookLM]] (same server: ai-sandbox.oliver.solutions)
|
||||
- [[olivas/OliVAS]]
|
||||
|
|
@ -0,0 +1,89 @@
|
|||
---
|
||||
name: "Enterprise AI Hub Nexus"
|
||||
client: Oliver Internal
|
||||
status: production
|
||||
tech: [Next.js 14, FastAPI, Python 3.11, PostgreSQL, Redis, Qdrant, Azure AD, Docker, Celery, Firecrawl]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/enterprise-ai-hub-nexus
|
||||
deploy: docker compose up --build
|
||||
url:
|
||||
server: TBD
|
||||
tags: [oliver, ai, rag, nextjs, fastapi, azure-ad, m365, qdrant, firecrawl, production]
|
||||
created: 2026-04-14
|
||||
last_commit: 2026-04-01
|
||||
commits: 216
|
||||
---
|
||||
|
||||
## Overview
|
||||
Secure AI platform for OLIVER Agency — knowledge management, RAG chat, and Microsoft 365 productivity. Azure AD PKCE authentication. Production status.
|
||||
|
||||
Key features:
|
||||
- **RAG Chat** — vector search over uploaded knowledge base (Qdrant)
|
||||
- **M365 Integration** — SharePoint sync, To-Do tasks, email (delegated scopes)
|
||||
- **Recursive Site Crawl** — via Firecrawl /v1/crawl
|
||||
- **AI Content Structuring** — before RAG indexing
|
||||
- **Notebook Mode** — structured note-taking with AI
|
||||
|
||||
## Tech Stack
|
||||
- **Frontend:** Next.js 14
|
||||
- **Backend:** FastAPI + Python 3.11 + Celery workers
|
||||
- **Database:** PostgreSQL 16 (Alembic migrations, 30+ revisions)
|
||||
- **Vector DB:** Qdrant (with orphaned vector cleanup)
|
||||
- **Cache/Queue:** Redis 7
|
||||
- **Auth:** Azure AD PKCE (delegated scopes + offline_access)
|
||||
- **Crawling:** Firecrawl /v1/crawl (recursive site crawl)
|
||||
- **Infrastructure:** Docker + docker-compose
|
||||
|
||||
## Architecture
|
||||
```
|
||||
Next.js 14 frontend
|
||||
↓ Azure AD PKCE auth
|
||||
FastAPI backend
|
||||
├── Celery beat (SharePoint sync, scheduled tasks)
|
||||
├── Qdrant (vector search / RAG)
|
||||
├── PostgreSQL (data + migrations)
|
||||
└── Redis (queue + cache)
|
||||
```
|
||||
|
||||
## Docker Services
|
||||
- `nexus-postgres` (PostgreSQL 16)
|
||||
- `nexus-redis` (Redis 7)
|
||||
- `nexus-qdrant` (Qdrant vector DB)
|
||||
- `nexus-backend` (FastAPI)
|
||||
- frontend (Next.js 14)
|
||||
|
||||
## Deployment
|
||||
- **Run:** `docker compose up --build`
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/enterprise-ai-hub-nexus`
|
||||
- **Status:** Production
|
||||
|
||||
## Key Handover Documents
|
||||
The project has extensive context handover docs in root:
|
||||
`CONTEXT_HANDOVER_PHASE4.md`, `PHASE5.md`, `PHASE6_*.md`, etc.
|
||||
|
||||
## Timeline / Git History
|
||||
| Date | Change |
|
||||
|------|--------|
|
||||
| 2026-04-01 | Fix To-Do tasks filter (MS API rejects complex OR + orderby) |
|
||||
| 2026-04-01 | Add M365 delegated scopes + offline_access to PKCE login |
|
||||
| 2026-03-31 | Purge orphaned Qdrant vectors button |
|
||||
| 2026-03-31 | Batch AI merge (10 pages), doc search, updated user guide |
|
||||
| 2026-03-31 | Proactive Graph token refresh + needs_reconsent flag |
|
||||
| 2026-03-31 | SharePoint sync reliability — celery beat, token refresh, scopes |
|
||||
| 2026-03-31 | AI content structuring before RAG indexing |
|
||||
| 2026-03-31 | Recursive site crawl via Firecrawl /v1/crawl |
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain with full details from git history.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-04-01 | Fix MS To-Do filter | Simplify API filter | tasks endpoint |
|
||||
| 2026-03-31 | Add site crawl | Firecrawl recursive crawl integration | backend |
|
||||
|
||||
## Related
|
||||
- [[Oliver-ai-bot_2.0/Oliver AI Bot 2.0]] (earlier version)
|
||||
- [[sandbox-notebookllamalm-nextjs/Sandbox NotebookLM]] (same server cluster)
|
||||
- [[DevOps_Click_UP_sync/DevOps ClickUp Sync]]
|
||||
35
01 Projects/ferrero-ac-creator/Ferrero AC Booking Tool.md
Normal file
35
01 Projects/ferrero-ac-creator/Ferrero AC Booking Tool.md
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
---
|
||||
name: "Ferrero AC Booking Tool"
|
||||
client: Ferrero
|
||||
status: active
|
||||
tech: [Node.js, HTML/JS, Box API]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/ferrero-ac-creator
|
||||
deploy: node server.js
|
||||
url: http://localhost:3456
|
||||
tags: [ferrero, booking, omg, csv, box]
|
||||
created: 2026-04-14
|
||||
---
|
||||
|
||||
## Overview
|
||||
Browser-based booking tool for Ferrero communication assets. Produces CSV files for OMG media booking system import. Box API integration for direct folder saves ("Send to OMG").
|
||||
|
||||
## Tech Stack
|
||||
- **Frontend:** HTML/JS
|
||||
- **Backend:** Node.js (`server.js`)
|
||||
- **Integrations:** Box API
|
||||
- **Infrastructure:** No Docker
|
||||
|
||||
## Deployment
|
||||
- **Run:** `node server.js` → http://localhost:3456
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/ferrero-ac-creator`
|
||||
- **Note:** "Download CSV" works without server (open `index.html` directly)
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-04-14 | Initial setup | Note created | — |
|
||||
44
01 Projects/ford-gechub-sftp/Ford SFTP Transfer.md
Normal file
44
01 Projects/ford-gechub-sftp/Ford SFTP Transfer.md
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
---
|
||||
name: "Ford Asset Pack SFTP Transfer"
|
||||
client: Ford
|
||||
status: active
|
||||
tech: [Python, Box API, SFTP, Mailgun]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/ford-gechub-sftp
|
||||
deploy: python main.py [--daemon]
|
||||
url:
|
||||
tags: [ford, sftp, box, gechub, automation, mailgun]
|
||||
created: 2026-04-14
|
||||
---
|
||||
|
||||
## Overview
|
||||
Automated Box → GECHUB SFTP transfer for Ford asset pack ZIPs. Monitors 3 Box folders (PROD, EDU, QA), downloads, uploads to SFTP, archives, sends email via Mailgun. One-shot or daemon mode.
|
||||
|
||||
## Tech Stack
|
||||
- **Backend:** Python
|
||||
- **Integrations:** Box API, SFTP (paramiko), Mailgun
|
||||
- **Infrastructure:** No Docker
|
||||
|
||||
## Deployment
|
||||
- **One-shot:** `python main.py`
|
||||
- **Daemon:** `python main.py --daemon`
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/ford-gechub-sftp`
|
||||
|
||||
## Environments
|
||||
| Env | Box Folder | SFTP |
|
||||
|-----|-----------|------|
|
||||
| PROD | Box/PROD | GECHUB PROD |
|
||||
| EDU | Box/EDU | GECHUB EDU |
|
||||
| QA | Box/QA | GECHUB QA |
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-04-14 | Initial setup | Note created | — |
|
||||
|
||||
## Related
|
||||
- [[ford_qc/Ford QC System]]
|
||||
84
01 Projects/ford_qc/Ford QC System.md
Normal file
84
01 Projects/ford_qc/Ford QC System.md
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
---
|
||||
name: "Ford QC System"
|
||||
client: Ford
|
||||
status: active
|
||||
tech: [Python, Box API, HTML, systemd]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/ford_qc
|
||||
deploy: systemd service (ford-qc-hotfolder.service) / python qc_engine.py
|
||||
url:
|
||||
server: Production server with systemd
|
||||
tags: [ford, qc, quality-control, box, bnp, systemd, hotfolder]
|
||||
created: 2026-04-14
|
||||
last_commit: 2026-03-16
|
||||
commits: 18
|
||||
---
|
||||
|
||||
## Overview
|
||||
QC system for Ford Build and Price (BnP) asset packs. Two modes:
|
||||
- **Hotfolder daemon** — monitors Box folder 332861865120, auto-processes new ZIPs
|
||||
- **CLI** — manual QC run on specific file
|
||||
|
||||
13 QC check modules covering image resolution, format, file size, layer depth, colour existence, linking validation, MEC/BAU compliance, powertrain validation, lifestyle inventory.
|
||||
|
||||
## Tech Stack
|
||||
- **Backend:** Python
|
||||
- **Storage:** Box API (JWT auth via `ford_box_config.json`)
|
||||
- **HTML Reports:** `checks/html_reporter.py`, `html_error_reporter.py`
|
||||
- **Infrastructure:** systemd service (production)
|
||||
|
||||
## Architecture
|
||||
```
|
||||
qc_engine.py (CLI) / ford_qc_box_hotfolder_process.py (daemon)
|
||||
↓ QC profile (JSON config)
|
||||
qc_module.py → 13 check modules in checks/
|
||||
↓
|
||||
JSON results → HTML report
|
||||
↓
|
||||
Box: upload reports to 332864939558, archive to 332861653811
|
||||
```
|
||||
|
||||
## Box Folder IDs
|
||||
| Folder | ID |
|
||||
|--------|-----|
|
||||
| Input (hotfolder) | 332861865120 |
|
||||
| Reports output | 332864939558 |
|
||||
| Archive (processed) | 332861653811 |
|
||||
|
||||
## Dev Commands
|
||||
```bash
|
||||
# Run QC checks
|
||||
python qc_engine.py profiles/ford_bnp.json --input_file <zip> --reports_dir reports
|
||||
|
||||
# Box hotfolder daemon
|
||||
python ford_qc_box_hotfolder_process.py
|
||||
|
||||
# Generate HTML report from JSON
|
||||
python -m checks.html_reporter <input_json> <output_dir>
|
||||
|
||||
# Systemd service
|
||||
sudo systemctl start ford-qc-hotfolder.service
|
||||
sudo systemctl status ford-qc-hotfolder.service
|
||||
```
|
||||
|
||||
## Deployment
|
||||
- **Daemon:** `sudo systemctl start ford-qc-hotfolder.service`
|
||||
- **CLI:** `python qc_engine.py`
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/ford_qc`
|
||||
|
||||
## Timeline / Git History
|
||||
| Date | Change |
|
||||
|------|--------|
|
||||
| 2026-03-16 | Make Ranger ptvl pattern configurable via profile |
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain with full details.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-03-16 | Configurable pattern | Ranger ptvl pattern via profile JSON | qc_engine.py |
|
||||
|
||||
## Related
|
||||
- [[ford-gechub-sftp/Ford SFTP Transfer]]
|
||||
90
01 Projects/gmal-scope-builder/GMAL Scope Builder.md
Normal file
90
01 Projects/gmal-scope-builder/GMAL Scope Builder.md
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
---
|
||||
name: "GMAL Scope Builder"
|
||||
client: Oliver Internal
|
||||
status: active
|
||||
tech: [Python, FastAPI, React, TypeScript, Vite, PostgreSQL, Claude Opus 4.6, Docker, Azure SSO]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/gmal-scope-builder
|
||||
deploy: docker compose up --build
|
||||
url:
|
||||
server: Deployed (base path /gsb)
|
||||
tags: [oliver, gmal, ratecard, fte, ai, claude, postgres, azure-sso]
|
||||
created: 2026-04-14
|
||||
last_commit: 2026-03-31
|
||||
commits: 23
|
||||
---
|
||||
|
||||
## Overview
|
||||
AI-powered scoping tool matching client deliverables against GMAL master asset database. Builds ratecards with hours per role and calculates FTE headcount.
|
||||
|
||||
**Workflow:**
|
||||
1. Upload client brief (Word/Excel) → Claude Opus 4.6 parses it
|
||||
2. AI matches deliverables to GMAL asset catalog
|
||||
3. System builds ratecard (hours per role) + FTE model
|
||||
4. Excel export with GMAL standard caveats
|
||||
|
||||
## Tech Stack
|
||||
- **Frontend:** React 18 + TypeScript + Vite + React Router + Axios (port 3010)
|
||||
- **Backend:** FastAPI + SQLAlchemy async + asyncpg + Uvicorn (port 8001)
|
||||
- **Database:** PostgreSQL 16 (port 5433)
|
||||
- **AI:** Claude Opus 4.6 via Anthropic SDK (tool_use for structured output)
|
||||
- **Auth:** Azure SSO (MSAL v5) + `DEV_AUTH_BYPASS` env var for local dev
|
||||
- **Infrastructure:** Docker + docker-compose (3 services)
|
||||
|
||||
## Ports
|
||||
| Service | Port |
|
||||
|---------|------|
|
||||
| Frontend (Vite) | 3010 |
|
||||
| Backend API | 8001 |
|
||||
| PostgreSQL | 5433 |
|
||||
|
||||
## Dev Commands
|
||||
```bash
|
||||
# Docker (primary)
|
||||
cp .env.example .env # Add ANTHROPIC_API_KEY
|
||||
docker compose build
|
||||
docker compose up -d
|
||||
docker compose logs backend --tail 50
|
||||
|
||||
# One-time: populate GMAL catalog (place Excel in data/)
|
||||
curl -X POST http://localhost:8001/api/gmal/ingest
|
||||
|
||||
# DB backup
|
||||
docker compose exec db pg_dump -U scope_user -d scope_builder > backups/dump.sql
|
||||
|
||||
# Without Docker
|
||||
cd frontend && npm install && npm run dev
|
||||
cd backend && uvicorn app.main:app --reload --port 8000
|
||||
```
|
||||
|
||||
## Deployment
|
||||
- **Run:** `docker compose up --build`
|
||||
- **Deploy script:** `deploy.sh`
|
||||
- **Base path:** `/gsb`
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/gmal-scope-builder`
|
||||
|
||||
## Timeline / Git History
|
||||
| Date | Change |
|
||||
|------|--------|
|
||||
| 2026-03-31 | Add GMAL standard caveats to ratecard Excel export |
|
||||
| 2026-03-30 | Fix 401: send ID token instead of Graph access token |
|
||||
| 2026-03-30 | Fix logout for MSAL v5: use clearCache() |
|
||||
| 2026-03-30 | Fix 504 timeouts on upload/match + broken exports |
|
||||
| 2026-03-28 | Add Azure SSO + production deployment config |
|
||||
| 2026-03-28 | Add deploy.sh + fix TS build errors |
|
||||
| 2026-03-28 | Add DEV_AUTH_BYPASS for local dev |
|
||||
| 2026-03-28 | Increase Vite proxy timeout to 5min for long AI calls |
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain with full details.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-03-31 | Add caveats to export | GMAL standard caveats row in Excel | export.py |
|
||||
| 2026-03-28 | Add Azure SSO | MSAL v5 auth + production config | frontend, backend |
|
||||
|
||||
## Related
|
||||
- [[build-a-squad/Build A Squad]] (same FTE scoping concept)
|
||||
- [[ac-helper/AC Helper]]
|
||||
37
01 Projects/hm-o2e-tool/HM O2E Tool.md
Normal file
37
01 Projects/hm-o2e-tool/HM O2E Tool.md
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
---
|
||||
name: "H&M O2E Tool (OMG Static)"
|
||||
client: H&M
|
||||
status: active
|
||||
tech: [HTML/JS, One2Edit API]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/hm-o2e-tool
|
||||
deploy: static / python -m http.server
|
||||
url:
|
||||
tags: [hm, one2edit, image-relinking, o2e]
|
||||
created: 2026-04-14
|
||||
---
|
||||
|
||||
## Overview
|
||||
One2Edit API tool for H&M documents. Automated image relinking (by File or by Folder), document exporting, image status checking.
|
||||
|
||||
## Tech Stack
|
||||
- **Frontend:** HTML/JS
|
||||
- **Integrations:** One2Edit API
|
||||
- **Infrastructure:** Static (no backend)
|
||||
|
||||
## Deployment
|
||||
- **Run:** Open `index.html` or `python -m http.server`
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/hm-o2e-tool`
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-04-14 | Initial setup | Note created | — |
|
||||
|
||||
## Related
|
||||
- [[hm_ems_report/HM EMS Report Tool]]
|
||||
- [[3m-portal/3M OMG Portal]] (same One2Edit platform)
|
||||
37
01 Projects/hm_ems_report/HM EMS Report Tool.md
Normal file
37
01 Projects/hm_ems_report/HM EMS Report Tool.md
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
---
|
||||
name: "H&M EMS Product Review Tool"
|
||||
client: H&M
|
||||
status: active
|
||||
tech: [Python, HTML/JS, JSON]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/hm_ems_report
|
||||
deploy: python server.py
|
||||
url:
|
||||
tags: [hm, ems, product-review, multilanguage, json]
|
||||
created: 2026-04-14
|
||||
---
|
||||
|
||||
## Overview
|
||||
Web review tool for H&M EMS product data. Clients review product names and prices across up to 4 languages simultaneously, edit inline, approve → saves back to master JSON. Full change log. Campaign images with enlarge preview.
|
||||
|
||||
## Tech Stack
|
||||
- **Frontend:** HTML/JS
|
||||
- **Backend:** Python
|
||||
- **Data:** Master JSON (`Master_Json/` folder)
|
||||
- **Infrastructure:** No Docker
|
||||
|
||||
## Deployment
|
||||
- **Run:** `python server.py`
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/hm_ems_report`
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-04-14 | Initial setup | Note created | — |
|
||||
|
||||
## Related
|
||||
- [[hm-o2e-tool/HM O2E Tool]]
|
||||
33
01 Projects/homepage/Homepage Dashboard.md
Normal file
33
01 Projects/homepage/Homepage Dashboard.md
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
---
|
||||
name: "Homepage Dashboard"
|
||||
client: Oliver Internal
|
||||
status: active
|
||||
tech: [Node.js, Docker, YAML]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/homepage
|
||||
deploy: docker compose up --build
|
||||
url:
|
||||
tags: [oliver, dashboard, homepage, selfhosted]
|
||||
created: 2026-04-14
|
||||
---
|
||||
|
||||
## Overview
|
||||
Self-hosted application dashboard with 100+ service integrations, multi-language support. Configured via YAML files or Docker label discovery. Fully static, fast, proxied.
|
||||
|
||||
## Tech Stack
|
||||
- **Frontend:** Node.js (static)
|
||||
- **Config:** YAML or Docker labels
|
||||
- **Infrastructure:** Docker + docker-compose
|
||||
|
||||
## Deployment
|
||||
- **Run:** `docker compose up --build`
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/homepage`
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-04-14 | Initial setup | Note created | — |
|
||||
137
01 Projects/how to.md
Normal file
137
01 Projects/how to.md
Normal file
|
|
@ -0,0 +1,137 @@
|
|||
Ниже представлена **Универсальная инструкция по разработке с использованием Claude Code (CLI)**. Она составлена на основе предоставленных вами данных и адаптирована для реального использования в профессиональной среде.
|
||||
|
||||
Эта инструкция (SOP) предназначена для устранения «галлюцинаций», потери контекста и создания некачественного кода («slop»).
|
||||
|
||||
---
|
||||
|
||||
# 📘 SOP: Профессиональная разработка с Claude Code
|
||||
|
||||
**Цель:** Создание чистого, протестированного и поддерживаемого кода с минимальным количеством ошибок за счет строгого управления контекстом и итеративного подхода.
|
||||
|
||||
---
|
||||
|
||||
## 🏗 Этап 0: Подготовка (Pre-flight Check)
|
||||
|
||||
Перед запуском терминала убедитесь, что у вас есть:
|
||||
1. **Базовая идея:** Файл `idea.md` или `spec.md` с кратким описанием сути приложения (2-3 абзаца).
|
||||
2. **Доступ:** Установленный и авторизованный Claude Code.
|
||||
|
||||
---
|
||||
|
||||
## 🕵️ Этап 1: Детальная спецификация (Метод допроса)
|
||||
|
||||
**Принцип:** Никогда не просите ИИ «просто написать код». Вы не знаете всех ограничений, но ИИ может их предсказать. Заставьте его вытянуть из вас техническое задание.
|
||||
|
||||
**Действие:**
|
||||
Запустите Claude Code и подайте ему ваш файл с идеей. Используйте специальный промпт для инициации интервью.
|
||||
|
||||
**📝 Универсальный Промпт (Скопируйте и вставьте):**
|
||||
```text
|
||||
Read the file [имя_файла_с_идеей] and interview me in detail using AskUserQuestionTool about literally anything regarding this project: technical implementation stack, UI/UX patterns, edge cases, data handling, error states, and tradeoffs. Do not write any code yet. Just ask questions to build a perfect mental model.
|
||||
```
|
||||
|
||||
**Ваша задача:**
|
||||
Отвечайте на вопросы максимально подробно.
|
||||
* *Технологии:* (React vs Vue? SQL vs NoSQL?)
|
||||
* *Пограничные случаи:* (Что если пропадет интернет? Что если API вернет 404?)
|
||||
* *Ограничения:* (Бюджет токенов, сроки, производительность).
|
||||
|
||||
**Результат этапа:** Claude имеет полное понимание задачи *до* написания первой строчки кода.
|
||||
|
||||
---
|
||||
|
||||
## 🗺 Этап 2: Архитектура и Декомпозиция
|
||||
|
||||
**Принцип:** Разделяй и властвуй. Монолитные промпты ведут к ошибкам.
|
||||
|
||||
**Действие:**
|
||||
Попросите Claude создать план разработки, разбив его на изолированные, независимые шаги.
|
||||
|
||||
**📝 Универсальный Промпт:**
|
||||
```text
|
||||
Based on our interview, create a detailed step-by-step implementation plan (TODO list). Break the project down into isolated features (e.g., 1. Project Setup, 2. Database Schema, 3. Auth Module).
|
||||
Save this plan to a file named 'implementation_plan.md'.
|
||||
```
|
||||
|
||||
**Результат этапа:** У вас есть файл `implementation_plan.md`, который служит картой. Вы будете вычеркивать пункты по одному.
|
||||
|
||||
---
|
||||
|
||||
## 🧱 Этап 3: Модульная разработка (Цикл сборки)
|
||||
|
||||
**Принцип:** Один промпт = Одна фича. Не переходите к шагу B, пока шаг A не работает идеально.
|
||||
|
||||
**Алгоритм цикла:**
|
||||
|
||||
1. **Выбор задачи:** Посмотрите в `implementation_plan.md`.
|
||||
2. **Команда на сборку:** Дайте команду реализовать *только* этот пункт.
|
||||
3. **Тестирование:** Проверьте работоспособность.
|
||||
|
||||
**📝 Промпт для реализации (Пример для фичи "Авторизация"):**
|
||||
```text
|
||||
Focus ONLY on item #3 from implementation_plan.md ("User Authentication").
|
||||
1. Implement the necessary backend logic.
|
||||
2. Create the UI components.
|
||||
3. Verify that it handles errors (e.g., wrong password) correctly.
|
||||
DO NOT touch any other features yet.
|
||||
```
|
||||
|
||||
**📝 Промпт для тестирования (если Claude сам не запустил тесты):**
|
||||
```text
|
||||
Create and run a test script to verify the feature we just built. Ensure it handles the edge cases we discussed.
|
||||
```
|
||||
|
||||
> **Правило:** Если возникла ошибка, исправляйте её немедленно. Не накапливайте технический долг.
|
||||
|
||||
---
|
||||
|
||||
## 🧠 Этап 4: Гигиена контекста (Правило 50%)
|
||||
|
||||
**Принцип:** ИИ начинает «глупеть» и забывать инструкции, когда контекстное окно переполняется. Вы должны действовать превентивно.
|
||||
|
||||
**Действие:**
|
||||
Регулярно (каждые 3-5 запросов) проверяйте использование токенов.
|
||||
|
||||
**Команда:**
|
||||
```text
|
||||
/context
|
||||
```
|
||||
|
||||
**Красная зона:**
|
||||
Как только использование контекста достигает **40-50%** (примерно 80k-100k токенов), качество кода резко падает.
|
||||
|
||||
**Процедура сброса (The Reset Protocol):**
|
||||
|
||||
1. **Сохранение знаний:** Попросите Claude создать файл-памятку для "следующего себя".
|
||||
**Промпт:**
|
||||
```text
|
||||
We are resetting the session. Create a file named 'CONTEXT_HANDOVER.md'. Summarize:
|
||||
1. Current project status.
|
||||
2. What was just built and verified.
|
||||
3. What is the immediate next step from implementation_plan.md.
|
||||
4. Important technical decisions made so far.
|
||||
```
|
||||
2. **Сброс:** Закройте терминал или введите команду выхода.
|
||||
3. **Новая сессия:** Откройте терминал снова.
|
||||
4. **Восстановление:**
|
||||
**Промпт:**
|
||||
```text
|
||||
Read 'CONTEXT_HANDOVER.md' and 'implementation_plan.md'. We are resuming development. I am ready to start the next feature.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ Чек-лист разработчика (Summary Checklist)
|
||||
|
||||
Распечатайте или держите перед глазами:
|
||||
|
||||
1. [ ] **Начало:** Использовал ли я `AskUserQuestionTool`, чтобы ИИ "допросил" меня перед стартом?
|
||||
2. [ ] **План:** Есть ли у меня файл с пошаговым планом (roadmap)?
|
||||
3. [ ] **Фокус:** Реализую ли я сейчас только одну изолированную функцию?
|
||||
4. [ ] **Контекст:** Проверял ли я `/context`? Если >45%, пора делать рестарт.
|
||||
5. [ ] **Передача:** Перед рестартом создал ли я файл `CONTEXT_HANDOVER.md`?
|
||||
|
||||
### Почему это работает?
|
||||
* **Интервью** исключает догадки ИИ.
|
||||
* **Модульность** упрощает отладку.
|
||||
* **Сброс контекста** гарантирует, что ИИ всегда работает на пике своих когнитивных способностей, а не в состоянии "цифровой усталости".
|
||||
140
01 Projects/how to_en.md
Normal file
140
01 Projects/how to_en.md
Normal file
|
|
@ -0,0 +1,140 @@
|
|||
# 📘 SOP: Professional Development with Claude Code
|
||||
|
||||
Below is a **Universal Guide for Development Using Claude Code (CLI)**. It is compiled based on the data you provided and adapted for real-world use in a professional environment.
|
||||
|
||||
This instruction (SOP) is designed to eliminate "hallucinations," context loss, and the creation of low-quality code ("slop").
|
||||
|
||||
---
|
||||
|
||||
# 📘 SOP: Professional Development with Claude Code
|
||||
|
||||
**Goal:** Creating clean, tested, and maintainable code with minimal errors through strict context management and an iterative approach.
|
||||
|
||||
---
|
||||
|
||||
## 🏗 Stage 0: Preparation (Pre-flight Check)
|
||||
|
||||
Before launching the terminal, make sure you have:
|
||||
|
||||
1. **Basic idea:** An `idea.md` or `spec.md` file with a brief description of the application's essence (2-3 paragraphs).
|
||||
2. **Access:** Claude Code installed and authorized.
|
||||
|
||||
---
|
||||
|
||||
## 🕵️ Stage 1: Detailed Specification (Interrogation Method)
|
||||
|
||||
**Principle:** Never ask the AI to "just write code." You don't know all the constraints, but the AI can predict them. Force it to extract the technical requirements from you.
|
||||
|
||||
**Action:** Launch Claude Code and provide it with your idea file. Use a special prompt to initiate the interview.
|
||||
|
||||
**📝 Universal Prompt (Copy and paste):**
|
||||
|
||||
```text
|
||||
Read the file [idea_file_name] and interview me in detail using AskUserQuestionTool about literally anything regarding this project: technical implementation stack, UI/UX patterns, edge cases, data handling, error states, and tradeoffs. Do not write any code yet. Just ask questions to build a perfect mental model.
|
||||
```
|
||||
|
||||
**Your task:** Answer questions in as much detail as possible.
|
||||
|
||||
- _Technologies:_ (React vs Vue? SQL vs NoSQL?)
|
||||
- _Edge cases:_ (What if internet is lost? What if API returns 404?)
|
||||
- _Constraints:_ (Token budget, deadlines, performance).
|
||||
|
||||
**Stage result:** Claude has a complete understanding of the task _before_ writing the first line of code.
|
||||
|
||||
---
|
||||
|
||||
## 🗺 Stage 2: Architecture and Decomposition
|
||||
|
||||
**Principle:** Divide and conquer. Monolithic prompts lead to errors.
|
||||
|
||||
**Action:** Ask Claude to create a development plan, breaking it down into isolated, independent steps.
|
||||
|
||||
**📝 Universal Prompt:**
|
||||
|
||||
```text
|
||||
Based on our interview, create a detailed step-by-step implementation plan (TODO list). Break the project down into isolated features (e.g., 1. Project Setup, 2. Database Schema, 3. Auth Module).
|
||||
Save this plan to a file named 'implementation_plan.md'.
|
||||
```
|
||||
|
||||
**Stage result:** You have an `implementation_plan.md` file that serves as a roadmap. You will check off items one by one.
|
||||
|
||||
---
|
||||
|
||||
## 🧱 Stage 3: Modular Development (Build Cycle)
|
||||
|
||||
**Principle:** One prompt = One feature. Don't move to step B until step A works perfectly.
|
||||
|
||||
**Cycle algorithm:**
|
||||
|
||||
1. **Task selection:** Look at `implementation_plan.md`.
|
||||
2. **Build command:** Give a command to implement _only_ this item.
|
||||
3. **Testing:** Verify functionality.
|
||||
|
||||
**📝 Implementation Prompt (Example for "Authentication" feature):**
|
||||
|
||||
```text
|
||||
Focus ONLY on item #3 from implementation_plan.md ("User Authentication").
|
||||
1. Implement the necessary backend logic.
|
||||
2. Create the UI components.
|
||||
3. Verify that it handles errors (e.g., wrong password) correctly.
|
||||
DO NOT touch any other features yet.
|
||||
```
|
||||
|
||||
**📝 Testing Prompt (if Claude didn't run tests itself):**
|
||||
|
||||
```text
|
||||
Create and run a test script to verify the feature we just built. Ensure it handles the edge cases we discussed.
|
||||
```
|
||||
|
||||
> **Rule:** If an error occurs, fix it immediately. Don't accumulate technical debt.
|
||||
|
||||
---
|
||||
|
||||
## 🧠 Stage 4: Context Hygiene (50% Rule)
|
||||
|
||||
**Principle:** AI starts to "dumb down" and forget instructions when the context window gets overloaded. You must act preventively.
|
||||
|
||||
**Action:** Regularly (every 3-5 requests) check token usage.
|
||||
|
||||
**Command:**
|
||||
|
||||
```text
|
||||
/context
|
||||
```
|
||||
|
||||
**Red zone:** As soon as context usage reaches **40-50%** (approximately 80k-100k tokens), code quality drops sharply.
|
||||
|
||||
**Reset Procedure (The Reset Protocol):**
|
||||
|
||||
1. **Saving knowledge:** Ask Claude to create a memo file for the "next version of itself." **Prompt:**
|
||||
|
||||
```text
|
||||
We are resetting the session. Create a file named 'CONTEXT_HANDOVER.md'. Summarize:1. Current project status.2. What was just built and verified.3. What is the immediate next step from implementation_plan.md.4. Important technical decisions made so far.
|
||||
```
|
||||
|
||||
2. **Reset:** Close the terminal or enter the exit command.
|
||||
3. **New session:** Open the terminal again.
|
||||
4. **Recovery:** **Prompt:**
|
||||
|
||||
```text
|
||||
Read 'CONTEXT_HANDOVER.md' and 'implementation_plan.md'. We are resuming development. I am ready to start the next feature.
|
||||
```
|
||||
|
||||
|
||||
---
|
||||
|
||||
## ✅ Developer Checklist (Summary Checklist)
|
||||
|
||||
Print out or keep in front of you:
|
||||
|
||||
1. [ ] **Start:** Did I use `AskUserQuestionTool` to have the AI "interrogate" me before starting?
|
||||
2. [ ] **Plan:** Do I have a file with a step-by-step plan (roadmap)?
|
||||
3. [ ] **Focus:** Am I currently implementing only one isolated feature?
|
||||
4. [ ] **Context:** Did I check `/context`? If >45%, it's time to restart.
|
||||
5. [ ] **Handover:** Before restart, did I create a `CONTEXT_HANDOVER.md` file?
|
||||
|
||||
### Why does this work?
|
||||
|
||||
- **Interview** eliminates AI guesswork.
|
||||
- **Modularity** simplifies debugging.
|
||||
- **Context reset** ensures that the AI always operates at peak cognitive capacity, rather than in a state of "digital fatigue."
|
||||
41
01 Projects/loreal-global-kickoff/Loreal Global Kickoff.md
Normal file
41
01 Projects/loreal-global-kickoff/Loreal Global Kickoff.md
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
---
|
||||
name: "L'Oréal OMG Assistant Global"
|
||||
client: L'Oréal
|
||||
status: active
|
||||
tech: [PHP, Box API, Make.com, Webhook]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/loreal-global-kickoff
|
||||
deploy: PHP server
|
||||
url:
|
||||
tags: [loreal, box, campaign, global-to-local, php, make]
|
||||
created: 2026-04-14
|
||||
---
|
||||
|
||||
## Overview
|
||||
PHP web app for L'Oréal campaign asset management:
|
||||
1. **Master Global Asset Submission** — submit Box assets with metadata, auto-populate campaign number from folder hierarchy
|
||||
2. **Global to Local** — transform global campaign CSVs into regional market CSVs
|
||||
|
||||
Webhook integration to Make.com on submission.
|
||||
|
||||
## Tech Stack
|
||||
- **Frontend/Backend:** PHP (server-rendered)
|
||||
- **Integrations:** Box API, Make.com webhook
|
||||
- **Infrastructure:** PHP server (MAMP/XAMPP or standalone)
|
||||
|
||||
## Deployment
|
||||
- **Run:** PHP web server
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/loreal-global-kickoff`
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-04-14 | Initial setup | Note created | — |
|
||||
|
||||
## Related
|
||||
- [[loreal-sla-calculator/Loreal SLA Calculator]]
|
||||
- [[Loreal/Loreal automation]]
|
||||
39
01 Projects/loreal-sla-calculator/Loreal SLA Calculator.md
Normal file
39
01 Projects/loreal-sla-calculator/Loreal SLA Calculator.md
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
---
|
||||
name: "L'Oréal SLA Calculator"
|
||||
client: L'Oréal
|
||||
status: active
|
||||
tech: [HTML/JS, Docker, Node.js]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/loreal-sla-calculator
|
||||
deploy: docker compose up --build
|
||||
url:
|
||||
tags: [loreal, sla, timeline, gantt, ecom]
|
||||
created: 2026-04-14
|
||||
---
|
||||
|
||||
## Overview
|
||||
SLA calculator for eCom Content Factory PMs. Replaces Excel. 4-step wizard: select brief type → configure stages → enter dates → view Gantt + verdict.
|
||||
|
||||
Two versions:
|
||||
- `index.html` — Full Calculator (9 brief types × 8 stages, Gantt, CSV/iCal export)
|
||||
- `client.html` — Client Estimator (4 inputs, SLA defaults)
|
||||
|
||||
## Tech Stack
|
||||
- **Frontend:** HTML/JS + Gantt rendering
|
||||
- **Infrastructure:** Docker + docker-compose
|
||||
|
||||
## Deployment
|
||||
- **Run:** `docker compose up --build`
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/loreal-sla-calculator`
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-04-14 | Initial setup | Note created | — |
|
||||
|
||||
## Related
|
||||
- [[loreal-global-kickoff/Loreal Global Kickoff]]
|
||||
35
01 Projects/lusa-back-planner/LUSA Back Planner.md
Normal file
35
01 Projects/lusa-back-planner/LUSA Back Planner.md
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
---
|
||||
name: "LUSA Back Planner"
|
||||
client: LUSA
|
||||
status: active
|
||||
tech: [React, TypeScript, Vite, Tailwind, shadcn/ui, pdfjs, jsPDF]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/lusa-back-planner
|
||||
deploy: npm run dev
|
||||
url:
|
||||
tags: [lusa, timeline, planner, pdf, react, typescript]
|
||||
created: 2026-04-14
|
||||
---
|
||||
|
||||
## Overview
|
||||
Production timeline generator. Set a deadline, pick a production lane → instant timeline. PDF brief parsing, change requests, PDF export.
|
||||
|
||||
## Tech Stack
|
||||
- **Frontend:** React 19 + TypeScript + Vite
|
||||
- **Styling:** Tailwind CSS + shadcn/ui
|
||||
- **PDF:** pdfjs-dist (parsing) + jsPDF + html2canvas (export)
|
||||
- **Infrastructure:** No Docker
|
||||
|
||||
## Deployment
|
||||
- **Dev:** `npm run dev`
|
||||
- **Build:** `npm run build`
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/lusa-back-planner`
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-04-14 | Initial setup | Note created | — |
|
||||
28
01 Projects/md to word/MD to Word.md
Normal file
28
01 Projects/md to word/MD to Word.md
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
---
|
||||
name: "MD to Word Converter"
|
||||
client: Oliver Internal
|
||||
status: active
|
||||
tech: [Python]
|
||||
local_path: "/Volumes/SSD/Projects/Oliver/md to word"
|
||||
deploy: python
|
||||
url:
|
||||
tags: [oliver, markdown, word, converter, utility]
|
||||
created: 2026-04-14
|
||||
---
|
||||
|
||||
## Overview
|
||||
Utility for converting Markdown files to Word (.docx). Python-based. No README.
|
||||
|
||||
## Deployment
|
||||
- **Run:** `python convert.py` (or similar entry point)
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/md to word`
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-04-14 | Initial setup | Note created | — |
|
||||
106
01 Projects/modcomms/Mod Comms.md
Normal file
106
01 Projects/modcomms/Mod Comms.md
Normal file
|
|
@ -0,0 +1,106 @@
|
|||
---
|
||||
name: "Mod Comms"
|
||||
client: Barclays
|
||||
status: active
|
||||
tech: [Python, FastAPI, React, Vite, TypeScript, PostgreSQL, Gemini, Docker]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/modcomms
|
||||
deploy: docker compose up --build
|
||||
url:
|
||||
server: GCP (Google Cloud Platform)
|
||||
tags: [barclays, ai, compliance, proof-review, multi-agent, gcp]
|
||||
created: 2026-04-14
|
||||
last_commit: 2026-04-14
|
||||
commits: 201
|
||||
---
|
||||
|
||||
## Overview
|
||||
AI-powered proof review tool for Barclays marketing materials. Multi-agent system analyzes uploaded proofs (images/PDFs) for:
|
||||
- Legal compliance
|
||||
- Brand adherence
|
||||
- Tone of voice
|
||||
- Channel suitability
|
||||
|
||||
4 specialist AI agents run in parallel, lead agent synthesizes the final verdict. Real-time WebSocket streaming (switched to REST polling due to GCP LB 30s timeout).
|
||||
|
||||
Backup: `modcomms_backup/`
|
||||
|
||||
## Tech Stack
|
||||
- **Frontend:** React 18 + Vite + TypeScript (port 3000)
|
||||
- **Backend:** Python + FastAPI + Uvicorn (port 8000)
|
||||
- **Database:** PostgreSQL 16 (Alembic migrations)
|
||||
- **AI:** Google Gemini Pro (primary) + Flash (fallback)
|
||||
- **Auth:** Azure AD (MSAL)
|
||||
- **Infrastructure:** Docker + docker-compose
|
||||
- **Deployed on:** GCP (Google Cloud Platform)
|
||||
|
||||
## Architecture
|
||||
```
|
||||
Frontend (React/Vite :3000)
|
||||
↓ REST polling (switched from WebSocket due to GCP 30s LB timeout)
|
||||
Backend (FastAPI :8000)
|
||||
↓
|
||||
4 AI Agents (Gemini) → Lead Agent → Final Verdict
|
||||
↓
|
||||
PostgreSQL + File Storage
|
||||
```
|
||||
|
||||
## Deployment
|
||||
- **Run:** `docker compose up --build`
|
||||
- **Local:** Frontend :3000, Backend :8000
|
||||
- **Server:** GCP (Google Cloud Platform)
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/modcomms`
|
||||
|
||||
### Environment Variables
|
||||
**Frontend (`frontend/.env.local`)**
|
||||
```
|
||||
GEMINI_API_KEY=
|
||||
VITE_BACKEND_WS_URL=ws://localhost:8000/ws/analyze
|
||||
VITE_BACKEND_URL=http://localhost:8000
|
||||
```
|
||||
**Backend (`backend/.env`)**
|
||||
```
|
||||
GEMINI_API_KEY=
|
||||
DATABASE_URL=postgresql+asyncpg://user:pass@localhost:5432/modcomms
|
||||
AZURE_TENANT_ID=
|
||||
AZURE_CLIENT_ID=
|
||||
CORS_ORIGINS=http://localhost:3000
|
||||
DISABLE_AUTH=true # local dev only
|
||||
```
|
||||
|
||||
### Dev Commands
|
||||
```bash
|
||||
# Frontend
|
||||
cd frontend && npm install && npm run dev
|
||||
|
||||
# Backend
|
||||
cd backend && uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
|
||||
|
||||
# Database migrations
|
||||
cd backend && alembic upgrade head
|
||||
```
|
||||
|
||||
## Timeline / Git History
|
||||
| Date | Change |
|
||||
|------|--------|
|
||||
| 2026-04-14 | Replace logo with v6 SVG across Sidebar and PDF Report |
|
||||
| 2026-03-19 | Add CSV export of campaign data for super_admin and oversight_admin |
|
||||
| 2026-03-18 | **Critical:** Switch WebSocket → REST polling (GCP LB 30s timeout fix) |
|
||||
| 2026-03-18 | Switch AI model: Pro primary, Flash fallback |
|
||||
| 2026-03-18 | Fix WebSocket keepalive + 25s→10s heartbeat |
|
||||
| 2026-03-16 | Fix PDF logo URL with Vite base path in production |
|
||||
| 2026-03-16 | Fix LlamaParse 401 + update logo to v5 |
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain with full details from CLAUDE.md and git history.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-04-14 | Logo update | Replace logo with v6 SVG | Sidebar, PDF Report |
|
||||
| 2026-03-18 | Fix dropped connections on GCP | WebSocket → REST polling | backend, frontend |
|
||||
|
||||
## Related
|
||||
- [[enterprise-ai-hub-nexus/Enterprise AI Hub Nexus]] (similar AI platform)
|
||||
- [[semblance/Semblance]] (same GCP deployment issues)
|
||||
42
01 Projects/olivas/OliVAS.md
Normal file
42
01 Projects/olivas/OliVAS.md
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
---
|
||||
name: "OliVAS — Visual Attention Software"
|
||||
client: Oliver Internal
|
||||
status: active
|
||||
tech: [Python, FastAPI, Docker, Claude API, DeepGaze]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/olivas
|
||||
deploy: docker compose up --build
|
||||
url:
|
||||
tags: [oliver, visual-attention, ai, heatmap, saliency, design-analysis]
|
||||
created: 2026-04-14
|
||||
---
|
||||
|
||||
## Overview
|
||||
Open-source Visual Attention Suite — predicts where humans look in an image during first 3-5 seconds. Built for creative teams at OLIVER. No physical eye-tracking needed.
|
||||
|
||||
Features: saliency heatmap, gaze sequence (numbered fixation points), hotspot detection (top 5), attention score (0-100), Areas of Interest (AOI), rule-based insights, Claude Sonnet 4.6 AI design analysis, PDF reports.
|
||||
|
||||
Models: DeepGaze I, DeepGaze IIE (recommended), DeepGaze III.
|
||||
|
||||
## Tech Stack
|
||||
- **Backend:** Python + FastAPI
|
||||
- **Vision:** DeepGaze I/IIE/III
|
||||
- **AI Analysis:** Claude Sonnet 4.6
|
||||
- **Infrastructure:** Docker + docker-compose
|
||||
|
||||
## Deployment
|
||||
- **Run:** `docker compose up --build`
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/olivas`
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-04-14 | Initial setup | Note created | — |
|
||||
|
||||
## Related
|
||||
- [[cinema-studio-pro/Cinema Studio Pro]]
|
||||
- [[semblance/Semblance]]
|
||||
31
01 Projects/oliver-ai-assistant/Oliver AI Assistant.md
Normal file
31
01 Projects/oliver-ai-assistant/Oliver AI Assistant.md
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
---
|
||||
name: "Oliver AI Assistant"
|
||||
client: Oliver Internal
|
||||
status: active
|
||||
tech: []
|
||||
local_path: /Volumes/SSD/Projects/Oliver/oliver-ai-assistant
|
||||
deploy: TBD
|
||||
url:
|
||||
tags: [oliver, ai, assistant]
|
||||
created: 2026-04-14
|
||||
---
|
||||
|
||||
## Overview
|
||||
Oliver AI Assistant. No README — details to be filled in during working sessions.
|
||||
|
||||
## Deployment
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/oliver-ai-assistant`
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-04-14 | Initial setup | Note created | — |
|
||||
|
||||
## Related
|
||||
- [[Oliver-ai-bot_2.0/Oliver AI Bot 2.0]]
|
||||
- [[enterprise-ai-hub-nexus/Enterprise AI Hub Nexus]]
|
||||
101
01 Projects/pdf-accessibility/PDF Accessibility Checker.md
Normal file
101
01 Projects/pdf-accessibility/PDF Accessibility Checker.md
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
---
|
||||
name: "PDF Accessibility Checker"
|
||||
client: Oliver Internal
|
||||
status: active
|
||||
tech: [Python, PHP, PostgreSQL, Redis, Docker, Claude, Google Cloud Vision, pypdf, pdfplumber]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/pdf-accessibility
|
||||
deploy: docker-compose up (dev) / docker-compose -f docker-compose.prod.yml up -d (prod)
|
||||
url:
|
||||
server: TBD
|
||||
tags: [oliver, pdf, accessibility, wcag, ai, php, redis, postgresql]
|
||||
created: 2026-04-14
|
||||
last_commit: 2026-03-18
|
||||
commits: 69
|
||||
---
|
||||
|
||||
## Overview
|
||||
Production-ready PDF accessibility checker — WCAG 2.1 Level A & AA validation. ~95% automated coverage via traditional PDF analysis + AI. Branded for Oliver (Montserrat font, black/#FFC407).
|
||||
|
||||
Recent (Feb 2026): API authentication added, production readiness enhancements.
|
||||
|
||||
## Tech Stack
|
||||
- **Web UI:** Vanilla JS + HTML/CSS (drag-drop, visual inspector)
|
||||
- **REST API:** PHP (`api.php`) + `auth.php` (Bearer/X-API-Key)
|
||||
- **Core engine:** Python (`enterprise_pdf_checker.py`) — 30+ WCAG checks
|
||||
- **AI Analysis:** Anthropic Claude + Google Cloud Vision (image analysis)
|
||||
- **PDF libs:** pypdf + pdfplumber
|
||||
- **Queue:** Redis (`pdf:queue`)
|
||||
- **Database:** PostgreSQL (job tracking + history)
|
||||
- **Worker:** `worker.py` (background daemon — Redis queue consumer)
|
||||
- **Infrastructure:** Docker + docker-compose (dev + prod variants)
|
||||
- **Remediation:** `pdf_remediation.py` (auto-fix output)
|
||||
|
||||
## Architecture
|
||||
```
|
||||
Web UI / REST API (PHP)
|
||||
↓ auth.php validates Bearer/X-API-Key
|
||||
api.php → uploads/ → Redis queue (pdf:queue)
|
||||
↓
|
||||
worker.py (daemon)
|
||||
└── EnterprisePDFChecker.check_all() → 30+ WCAG checks
|
||||
├── Traditional: pypdf, pdfplumber
|
||||
└── AI: Claude + Google Cloud Vision
|
||||
→ results/{job_id}.result.json + PostgreSQL
|
||||
↓
|
||||
Client polls api.php?action=status → fetch results
|
||||
```
|
||||
|
||||
## Dev Commands
|
||||
```bash
|
||||
# Tests
|
||||
source venv/bin/activate
|
||||
pytest tests/ -v # 31 tests
|
||||
pytest tests/ --cov=. --cov-report=html
|
||||
|
||||
# Run locally
|
||||
php -S localhost:8000 # PHP dev server
|
||||
|
||||
# Docker
|
||||
docker-compose up # Dev
|
||||
docker-compose -f docker-compose.prod.yml up -d # Prod
|
||||
docker-compose exec worker pytest tests/ -v # Tests in container
|
||||
|
||||
# CLI usage
|
||||
python enterprise_pdf_checker.py doc.pdf --output report.json
|
||||
python enterprise_pdf_checker.py doc.pdf --quick # Skip AI checks
|
||||
python pdf_remediation.py doc.pdf --output fixed.pdf --all
|
||||
```
|
||||
|
||||
## Key Files
|
||||
| File | Purpose |
|
||||
|------|---------|
|
||||
| `enterprise_pdf_checker.py` | Core engine — 30+ WCAG checks |
|
||||
| `api.php` | REST API — file handling, job queue |
|
||||
| `auth.php` | Authentication — Bearer/X-API-Key |
|
||||
| `worker.py` | Background daemon — Redis queue consumer |
|
||||
| `pdf_remediation.py` | Auto-fix accessibility issues |
|
||||
|
||||
## Timeline / Git History
|
||||
| Date | Change |
|
||||
|------|--------|
|
||||
| 2026-03-18 | Fix CP14 heading detection via RoleMap + manual pass support |
|
||||
| 2026-03-18 | Persist adjusted score to server on Recalculate |
|
||||
| 2026-03-18 | Address client feedback: WCAG badges, table grouping, history UX |
|
||||
| 2026-03-16 | PDF report reflects adjusted score + manual pass |
|
||||
| 2026-03-13 | Move document history to separate history.html page |
|
||||
| 2026-03-13 | Fix history: read jobs from data.data.jobs |
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain with full details.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-03-18 | Fix heading detection | CP14 via RoleMap + manual pass | enterprise_pdf_checker.py |
|
||||
| 2026-03-13 | Separate history page | Move to history.html | history.html, api.php |
|
||||
|
||||
## Related
|
||||
- [[video-accessibility/Video Accessibility Platform]]
|
||||
- [[solventum-image-metadata/Solventum Image Metadata]]
|
||||
34
01 Projects/pimco-charts/PIMCO Chart Generator.md
Normal file
34
01 Projects/pimco-charts/PIMCO Chart Generator.md
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
---
|
||||
name: "PIMCO Chart Generator"
|
||||
client: PIMCO
|
||||
status: active
|
||||
tech: [Python, FastAPI, Docker, SVG, Claude API]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/pimco-charts
|
||||
deploy: docker compose up --build
|
||||
url:
|
||||
tags: [pimco, charts, svg, ai, publication-quality]
|
||||
created: 2026-04-14
|
||||
---
|
||||
|
||||
## Overview
|
||||
Publication-quality SVG chart generator matching PIMCO's InDesign visual style. Upload Excel/CSV + plain-English description → pixel-perfect SVG. Iterate with natural language commands.
|
||||
|
||||
## Tech Stack
|
||||
- **Backend:** Python + FastAPI
|
||||
- **AI:** Claude API
|
||||
- **Output:** SVG
|
||||
- **Infrastructure:** Docker + docker-compose
|
||||
|
||||
## Deployment
|
||||
- **Run:** `docker compose up --build`
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/pimco-charts`
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-04-14 | Initial setup | Note created | — |
|
||||
39
01 Projects/ppt-tool/PPT Tool DeckForge.md
Normal file
39
01 Projects/ppt-tool/PPT Tool DeckForge.md
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
---
|
||||
name: "Oliver DeckForge"
|
||||
client: Oliver Internal
|
||||
status: active
|
||||
tech: [Next.js, FastAPI, Python, nginx, Docker]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/ppt-tool
|
||||
deploy: docker compose up --build
|
||||
url:
|
||||
tags: [oliver, presentation, ai, nextjs, multi-tenant, rbac]
|
||||
created: 2026-04-14
|
||||
---
|
||||
|
||||
## Overview
|
||||
AI-powered enterprise presentation generator. Multi-tenant architecture, custom templates, RBAC.
|
||||
|
||||
Architecture: `nginx :80` → `Next.js :3000` + `FastAPI :8000`
|
||||
|
||||
## Tech Stack
|
||||
- **Frontend:** Next.js (:3000)
|
||||
- **Backend:** FastAPI (:8000)
|
||||
- **Proxy:** nginx (:80)
|
||||
- **Infrastructure:** Docker + docker-compose
|
||||
|
||||
## Deployment
|
||||
- **Run:** `docker compose up --build`
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/ppt-tool`
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-04-14 | Initial setup | Note created | — |
|
||||
|
||||
## Related
|
||||
- [[presenton/Presenton]]
|
||||
35
01 Projects/presenton/Presenton.md
Normal file
35
01 Projects/presenton/Presenton.md
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
---
|
||||
name: "Presenton"
|
||||
client: Oliver Internal
|
||||
status: active
|
||||
tech: [Node.js, Docker]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/presenton
|
||||
deploy: docker compose up --build
|
||||
url:
|
||||
tags: [oliver, presentation, ai, open-source]
|
||||
created: 2026-04-14
|
||||
---
|
||||
|
||||
## Overview
|
||||
Open-source AI Presentation Generator and API — alternative to Gamma, Beautiful.AI, Decktopus. Community: Discord + Twitter/X.
|
||||
|
||||
## Tech Stack
|
||||
- **Frontend:** Node.js
|
||||
- **Infrastructure:** Docker + docker-compose
|
||||
|
||||
## Deployment
|
||||
- **Run:** `docker compose up --build`
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/presenton`
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-04-14 | Initial setup | Note created | — |
|
||||
|
||||
## Related
|
||||
- [[ppt-tool/PPT Tool DeckForge]]
|
||||
|
|
@ -0,0 +1,97 @@
|
|||
---
|
||||
name: "Sandbox NotebookLM"
|
||||
client: Oliver Internal
|
||||
status: active
|
||||
tech: [Next.js 15, FastAPI, Python 3.13, uv, PostgreSQL, Redis, ElevenLabs, Docker]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/sandbox-notebookllamalm-nextjs
|
||||
deploy: docker compose up --build
|
||||
url: https://ai-sandbox.oliver.solutions/notebookllama/
|
||||
server: optical-web-1 at /opt/sandbox-notebookllamalm-nextjs
|
||||
tags: [oliver, ai, notebooklm, llamaindex, rag, multi-user, nextjs15, elevenlabs]
|
||||
created: 2026-04-14
|
||||
last_commit: 2026-03-31
|
||||
commits: 169
|
||||
---
|
||||
|
||||
## Overview
|
||||
Enterprise-ready alternative to Google NotebookLM. Multi-user, self-hosted, with AI Studio generators and podcast generation.
|
||||
|
||||
**Live:** https://ai-sandbox.oliver.solutions/notebookllama/
|
||||
**Backend API docs:** https://ai-sandbox.oliver.solutions/notebookllama-back/api/docs
|
||||
**Repo:** https://bitbucket.org/zlalani/sandbox-notebookllamalm-nextjs
|
||||
|
||||
## Tech Stack
|
||||
- **Frontend:** Next.js 15 App Router + React 19 + TypeScript + Tailwind 4
|
||||
- **Backend:** FastAPI + Python 3.13 + `uv` package manager
|
||||
- **Database:** PostgreSQL 18
|
||||
- **Cache:** Redis 7
|
||||
- **AI:** LlamaIndex + LLM factory (multi-model)
|
||||
- **Audio:** ElevenLabs (podcast generation)
|
||||
- **Auth:** Microsoft SSO + signup/login
|
||||
- **Infrastructure:** Docker + docker-compose
|
||||
|
||||
## Architecture
|
||||
```
|
||||
Next.js 15 (App Router)
|
||||
src/app/notebooks/[id]/page.tsx ← main notebook page (~1600 lines)
|
||||
src/lib/api.ts ← all API calls (axios)
|
||||
store/authStore.ts ← Zustand auth (localStorage)
|
||||
|
||||
FastAPI backend
|
||||
api/routes/
|
||||
auth.py ← signup, login, Microsoft SSO
|
||||
notebooks.py ← CRUD, synthesis, podcast, Studio
|
||||
documents.py ← upload, task status
|
||||
chat.py ← WebSocket chat
|
||||
admin.py ← admin dashboard
|
||||
notebookllama/
|
||||
studio_generators.py ← 7 LLM generators (flashcards, quiz, mindmap, slides, report, infographic, datatable)
|
||||
audio.py ← ElevenLabs podcast (saves to PODCAST_DATA_DIR)
|
||||
llm_factory.py ← get_llm_by_type(), get_structured_llm()
|
||||
```
|
||||
|
||||
## Deployment
|
||||
- **Server:** `optical-web-1` at `/opt/sandbox-notebookllamalm-nextjs`
|
||||
- **Run:** `docker compose up --build`
|
||||
- **Live URL:** https://ai-sandbox.oliver.solutions/notebookllama/
|
||||
|
||||
### Deploy Commands (Server)
|
||||
```bash
|
||||
git pull origin main
|
||||
docker compose build backend # or frontend or both
|
||||
docker compose up -d
|
||||
|
||||
# Rebuild only backend (faster)
|
||||
docker compose build backend && docker compose up -d backend
|
||||
|
||||
# Logs
|
||||
docker compose logs backend --tail=50
|
||||
docker compose logs frontend --tail=50
|
||||
```
|
||||
|
||||
## Timeline / Git History
|
||||
| Date | Change |
|
||||
|------|--------|
|
||||
| 2026-03-31 | Update LLM models to latest versions |
|
||||
| 2026-03-16 | Fix Studio tiles losing state after chat navigation |
|
||||
| 2026-03-16 | Replace indigo → brand amber #FFC407 across app |
|
||||
| 2026-03-15 | Add PPTX-from-template preview + download panel |
|
||||
| 2026-03-15 | Fix from-template: better filename, style fidelity |
|
||||
| 2026-03-15 | Increase from-template max_tokens 8192→16000 |
|
||||
| 2026-03-15 | Pin python-pptx to 0.6.23 |
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain with full details.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-03-16 | Brand color update | Indigo → amber #FFC407 | global styles |
|
||||
| 2026-03-15 | PPTX from template | New from-template workflow | notebooks.py, frontend |
|
||||
|
||||
## Related
|
||||
- [[enterprise-ai-hub-nexus/Enterprise AI Hub Nexus]]
|
||||
- [[cinema-studio-pro/Cinema Studio Pro]] (same ai-sandbox.oliver.solutions server)
|
||||
- [[Oliver-ai-bot_2.0/Oliver AI Bot 2.0]]
|
||||
96
01 Projects/semblance/Semblance.md
Normal file
96
01 Projects/semblance/Semblance.md
Normal file
|
|
@ -0,0 +1,96 @@
|
|||
---
|
||||
name: "Semblance — Synthetic Society"
|
||||
client: Oliver Internal
|
||||
status: active
|
||||
tech: [Python, Quart, Socket.IO, MongoDB, React, TypeScript, Tailwind, shadcn/ui, Docker, Gemini, OpenAI]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/semblance
|
||||
deploy: docker compose up --build
|
||||
url:
|
||||
server: GCP (same issue as Mod Comms — 30s LB timeout)
|
||||
tags: [oliver, ai, synthetic-personas, focus-group, insights, gcp, socketio]
|
||||
created: 2026-04-14
|
||||
last_commit: 2026-03-30
|
||||
commits: 109
|
||||
---
|
||||
|
||||
## Overview
|
||||
AI platform for creating synthetic consumer personas and running autonomous focus group sessions. Real-time multi-persona AI conversations.
|
||||
|
||||
**Key capabilities:**
|
||||
- AI persona generation from audience briefs (Gemini 3 Pro Preview, GPT-4.1, GPT-5.2)
|
||||
- Live focus group sessions (manual or fully autonomous AI moderation)
|
||||
- Document uploads (PDF, DOCX, TXT) as focus group assets
|
||||
- Analytics + theme extraction
|
||||
- Bulk export (PDF)
|
||||
|
||||
Backup: `semblance_backup/`
|
||||
|
||||
## Tech Stack
|
||||
- **Frontend:** React + TypeScript + Vite + Tailwind + shadcn/ui (port 5137 or build)
|
||||
- **Backend:** Python + Quart (async Flask) + Hypercorn ASGI (port 5137)
|
||||
- **Database:** MongoDB (PyMongo)
|
||||
- **Real-time:** python-socketio + AsyncServer (ASGI wrapped)
|
||||
- **AI:** Gemini 3 Pro Preview (default), GPT-4.1, GPT-5.2
|
||||
- **Auth:** Custom JWT (Quart-compatible, NOT Flask-JWT-Extended)
|
||||
- **Infrastructure:** Docker + docker-compose
|
||||
|
||||
## Architecture
|
||||
```
|
||||
React SPA (TypeScript + shadcn/ui)
|
||||
↓ Socket.IO (WebSocketContext)
|
||||
Quart backend (python-socketio AsyncServer)
|
||||
├── ai_runner_service.py (background task execution)
|
||||
├── autonomous_conversation_controller.py (multi-persona orchestration)
|
||||
├── conversation_decision_service.py (next speaker logic)
|
||||
├── conversation_context_service.py (state + history)
|
||||
└── llm_service.py (multi-model: Gemini/GPT)
|
||||
↓
|
||||
MongoDB (personas, sessions, messages)
|
||||
```
|
||||
|
||||
### Known Issue — GCP 30s Load Balancer Timeout
|
||||
All async LLM routes were fixed to bypass GCP 30s LB timeout (same issue as Mod Comms).
|
||||
Tasks migrated from WebSocket delivery → HTTP polling.
|
||||
|
||||
## Dev Commands
|
||||
```bash
|
||||
# Frontend
|
||||
npm run build # Production build (use for testing)
|
||||
npm run build:dev # Dev build
|
||||
npm run lint
|
||||
npm run preview
|
||||
|
||||
# Backend
|
||||
cd backend && python run.py # Starts on port 5137
|
||||
```
|
||||
|
||||
## Deployment
|
||||
- **Run:** `docker compose up --build`
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/semblance`
|
||||
- **Backend port:** 5137 (Hypercorn)
|
||||
|
||||
## Timeline / Git History
|
||||
| Date | Change |
|
||||
|------|--------|
|
||||
| 2026-03-30 | Fix: task result not stored in useTaskPolling (false 'no personas' error) |
|
||||
| 2026-03-23 | Fix AI autonomous mode: cross-loop WebSocket emit + polling fallback |
|
||||
| 2026-03-23 | Allow document uploads (PDF, DOCX, TXT) as focus group assets |
|
||||
| 2026-03-23 | **Critical:** Migrate task delivery WebSocket → HTTP polling (GCP 30s timeout) |
|
||||
| 2026-03-23 | Fix all async LLM routes: bypass GCP 30s LB timeout |
|
||||
| 2026-03-23 | Fix naive vs aware datetime crash + stuck AI mode |
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain with full details.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-03-23 | Fix AI mode hanging on GCP | WebSocket → HTTP polling for all LLM routes | backend |
|
||||
| 2026-03-23 | Add document upload support | PDF/DOCX/TXT as focus group assets | backend, frontend |
|
||||
|
||||
## Related
|
||||
- [[modcomms/Mod Comms]] (same GCP timeout issue)
|
||||
- [[olivas/OliVAS]]
|
||||
- [[build-a-squad/Build A Squad]]
|
||||
19
01 Projects/setup redirect url.md
Normal file
19
01 Projects/setup redirect url.md
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
ServiceDesk, Lloyd, Dave
|
||||
|
||||
Hi Lloyd,
|
||||
|
||||
Could you please add the following redirect URLs to Entra app AI Portal (SPA please)
|
||||
|
||||
[https://ai-sandbox.oliver.solutions/](https://ai-sandbox.oliver.solutions/compliance-hub/)pdf-accessibility
|
||||
|
||||
[http://localhost:8888](http://localhost:8888/compliance-hub/)/pdf-accessibility
|
||||
|
||||
And
|
||||
|
||||
[https://ai-sandbox.oliver.solutions/](https://ai-sandbox.oliver.solutions/compliance-hub/)nexus
|
||||
|
||||
[http://localhost:8888](http://localhost:8888/compliance-hub/)/nexus
|
||||
|
||||
|
||||
Thanks,
|
||||
Vadym
|
||||
32
01 Projects/smartcrop26/SmartCrop26.md
Normal file
32
01 Projects/smartcrop26/SmartCrop26.md
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
---
|
||||
name: "SmartCrop26"
|
||||
client: Oliver Internal
|
||||
status: active
|
||||
tech: [React, TypeScript, Vite, Lovable]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/smartcrop26
|
||||
deploy: npm run dev
|
||||
url:
|
||||
tags: [oliver, smartcrop, image, lovable, react]
|
||||
created: 2026-04-14
|
||||
---
|
||||
|
||||
## Overview
|
||||
Smart image cropping tool built via Lovable.dev. Changes committed automatically from Lovable visual editor.
|
||||
|
||||
## Tech Stack
|
||||
- **Frontend:** React + TypeScript + Vite
|
||||
- **Platform:** Lovable.dev
|
||||
|
||||
## Deployment
|
||||
- **Dev:** `npm run dev`
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/smartcrop26`
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-04-14 | Initial setup | Note created | — |
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
---
|
||||
name: "Solventum Image Metadata Tool v3.1"
|
||||
client: Solventum
|
||||
status: active
|
||||
tech: [Python, FastAPI, Docker, OpenAI, HTML/JS]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/solventum-image-metadata
|
||||
deploy: docker compose up --build
|
||||
url:
|
||||
tags: [solventum, metadata, ai, openai, enterprise]
|
||||
created: 2026-04-14
|
||||
---
|
||||
|
||||
## Overview
|
||||
Universal metadata creation and management tool (Enterprise Edition v3.1). Supports CSV/Excel/JSON import, AI-powered generation (OpenAI), manual entry. User authentication included.
|
||||
|
||||
Developer: Vadym Samoilenko | License: Corporate — Oliver Marketing
|
||||
|
||||
## Tech Stack
|
||||
- **Frontend:** HTML/JS
|
||||
- **Backend:** Python + FastAPI
|
||||
- **AI:** OpenAI
|
||||
- **Auth:** Built-in
|
||||
- **Infrastructure:** Docker + docker-compose
|
||||
|
||||
## Deployment
|
||||
- **Run:** `docker compose up --build`
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/solventum-image-metadata`
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-04-14 | Initial setup | Note created | — |
|
||||
|
|
@ -0,0 +1,95 @@
|
|||
---
|
||||
name: "Accessible Video Processing Platform"
|
||||
client: Oliver Internal
|
||||
status: active
|
||||
tech: [Python, FastAPI, Celery, MongoDB, Redis, React, TypeScript, Vite, Gemini, Google TTS, ElevenLabs, Docker]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/video-accessibility
|
||||
deploy: docker compose up --build
|
||||
url:
|
||||
server: TBD
|
||||
tags: [oliver, video, accessibility, ai, captions, audio-description, tts, celery, mongodb]
|
||||
created: 2026-04-14
|
||||
last_commit: 2026-03-27
|
||||
commits: 212
|
||||
---
|
||||
|
||||
## Overview
|
||||
Comprehensive AI-powered platform for generating accessible video content. Full pipeline from upload to delivery with QC workflow.
|
||||
|
||||
**Features implemented (85% production-ready):**
|
||||
- Closed captions (Gemini 2.5 Pro)
|
||||
- Audio descriptions (AI-generated + TTS)
|
||||
- SDH captions (Subtitles for Deaf and Hard of Hearing)
|
||||
- Descriptive transcripts
|
||||
- 50+ language translation (Google Translate + cultural transcreation)
|
||||
- QC workflow (reviewer approval/rejection, VTT editing)
|
||||
- DCMP compliance
|
||||
|
||||
**20,471 lines of code** (12,198 backend + 8,273 frontend)
|
||||
|
||||
## Tech Stack
|
||||
- **Frontend:** React 18 + Vite + TypeScript (SPA)
|
||||
- **Backend:** FastAPI + Python 3.11 + Celery workers
|
||||
- **Database:** MongoDB Atlas
|
||||
- **Storage:** Google Cloud Storage (signed URLs)
|
||||
- **Queue:** Redis + Celery
|
||||
- **AI:** Gemini 2.5 Pro
|
||||
- **Translation:** Google Cloud Translate API
|
||||
- **TTS:** Google Cloud TTS + ElevenLabs
|
||||
- **Auth:** JWT + HttpOnly refresh cookies (RBAC)
|
||||
- **Infrastructure:** Docker + docker-compose
|
||||
|
||||
## Architecture
|
||||
```
|
||||
React SPA (TypeScript)
|
||||
↓ JWT auth (RBAC)
|
||||
FastAPI backend
|
||||
├── Celery workers (video processing pipeline)
|
||||
├── MongoDB Atlas (jobs, users, assets)
|
||||
├── Google Cloud Storage (video files, VTT)
|
||||
└── Redis (task queue)
|
||||
|
||||
Pipeline phases:
|
||||
1. Upload → Ingestion worker
|
||||
2. Gemini 2.5 Pro → VTT captions
|
||||
3. Audio Description generation
|
||||
4. QC review (approve/reject/edit VTT)
|
||||
5. Translation → 50+ languages
|
||||
6. TTS synthesis (GCP TTS + ElevenLabs)
|
||||
7. Final delivery
|
||||
```
|
||||
|
||||
### Critical Dev Note
|
||||
**Always read `video_accessibility_development_plan.txt` before any dev work** — it's the authoritative source for all technical specs, API contracts, DB models.
|
||||
|
||||
## Deployment
|
||||
- **Run:** `docker compose up --build`
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/video-accessibility`
|
||||
|
||||
## Timeline / Git History
|
||||
| Date | Change |
|
||||
|------|--------|
|
||||
| 2026-03-27 | Add ElevenLabs API key to production env |
|
||||
| 2026-03-27 | Fix VTT charset=utf-8 (prevent ♪ encoding issues) |
|
||||
| 2026-03-27 | Add SDH captions + descriptive transcript to QC Downloads |
|
||||
| 2026-03-27 | DCMP compliance, new languages, QA bug fixes |
|
||||
| 2026-03-24 | Fix MP3/VTT desync, crashes, notifications |
|
||||
| 2026-03-20 | Fix case-insensitive Microsoft user lookup (prevent duplicate key) |
|
||||
| 2026-03-18 | Add SDH (Subtitles for Deaf and Hard of Hearing) |
|
||||
| 2026-03-18 | Add brand context + ethics guidelines to AD prompt |
|
||||
| 2026-03-03 | Add download assets panel + VTT file upload to QC review |
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain with full details.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-03-27 | Fix ♪ encoding in VTT | Add charset=utf-8 to content-type | backend |
|
||||
| 2026-03-18 | Add SDH captions | New SDH caption output type | pipeline |
|
||||
|
||||
## Related
|
||||
- [[pdf-accessibility/PDF Accessibility Checker]]
|
||||
- [[sandbox-notebookllamalm-nextjs/Sandbox NotebookLM]] (same infrastructure approach)
|
||||
36
01 Projects/wsj-filenaming/WSJ File Naming Tool.md
Normal file
36
01 Projects/wsj-filenaming/WSJ File Naming Tool.md
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
---
|
||||
name: "WSJ File Naming Tool"
|
||||
client: Dow Jones / WSJ
|
||||
status: active
|
||||
tech: [Python, HTML/JS, Google Gemini]
|
||||
local_path: /Volumes/SSD/Projects/Oliver/wsj-filenaming
|
||||
deploy: python server.py
|
||||
url:
|
||||
tags: [dowjones, wsj, filenaming, gemini]
|
||||
created: 2026-04-14
|
||||
---
|
||||
|
||||
## Overview
|
||||
Standardized job naming tool for Dow Jones naming convention. AI command bar (Gemini) + interactive spreadsheet UI.
|
||||
|
||||
**Format:** `[OMGID] - [Domain]-[Subteam]-[Brand]-[Initiative]-[YY]-[Seq]_[AssetName]_v[Version]`
|
||||
|
||||
## Tech Stack
|
||||
- **Frontend:** Vanilla JS + HTML
|
||||
- **Backend:** Python
|
||||
- **AI:** Google Gemini
|
||||
- **Infrastructure:** No Docker
|
||||
|
||||
## Deployment
|
||||
- **Run:** `python server.py`
|
||||
- **Local path:** `/Volumes/SSD/Projects/Oliver/wsj-filenaming`
|
||||
|
||||
## Sessions
|
||||
### 2026-04-14 – Project catalogued
|
||||
**Done:** Added to Obsidian second brain.
|
||||
|
||||
---
|
||||
## Change Log
|
||||
| Date | Requested | Changed | Files |
|
||||
|------|-----------|---------|-------|
|
||||
| 2026-04-14 | Initial setup | Note created | — |
|
||||
2
01 Projects/Заметки по работе с терминалом.md
Normal file
2
01 Projects/Заметки по работе с терминалом.md
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
![[linux_docker_apache_vim_cheatsheet.html]]
|
||||
|
||||
26
02 Areas/Pending Commands.md
Normal file
26
02 Areas/Pending Commands.md
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
---
|
||||
name: "Pending Commands"
|
||||
type: tracking
|
||||
updated: 2026-04-14
|
||||
tags: [commands, server, todo, tracking]
|
||||
---
|
||||
|
||||
# Pending Commands & Server Actions
|
||||
|
||||
> Commands I gave Vadym to run on a server or locally that need to be tracked.
|
||||
> Move to **Done** once executed. Link to the project note.
|
||||
|
||||
## 🔴 Pending
|
||||
|
||||
| Date | Project | Command / Action | Context |
|
||||
|------|---------|-----------------|---------|
|
||||
| | | | |
|
||||
|
||||
---
|
||||
|
||||
## ✅ Done
|
||||
|
||||
| Date | Project | Command | Result |
|
||||
|------|---------|---------|--------|
|
||||
| 2026-04-14 | Obsidian CLI | `sudo ln -sf "/Applications/Obsidian.app/Contents/MacOS/Obsidian" /usr/local/bin/obsidian` | CLI installed, v1.12.7 |
|
||||
|
||||
4
02 Areas/Work/Access to work application.md
Normal file
4
02 Areas/Work/Access to work application.md
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
|
||||
Oliver - Your application reference is V44J12GV. - [[2025-08-05]] - 203 дня / 29 недель -4-6 weeks
|
||||
Personal - Your application reference is 5OPPQR1V. - [[2025-06-24]] - 245 дней / 35 недель
|
||||
![[Pasted image 20260224132635.png]]
|
||||
40
02 Areas/Work/ClickUp meeting.md
Normal file
40
02 Areas/Work/ClickUp meeting.md
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
|
||||
# 🤝 Meeting: ClickUp meeting
|
||||
📅 Date: [[2026-02-04]]
|
||||
👥 Attendees:
|
||||
|
||||
---
|
||||
> [!question] Agenda / Goal
|
||||
> ClickUp as a reasonable adjustment for ADHD
|
||||
|
||||
## 📝 Notes
|
||||
- Generated by AI. Be sure to check for accuracy.
|
||||
|
||||
Meeting notes:
|
||||
|
||||
- **Request for ClickUp Subscription as Reasonable Adjustment:** Vadym explained to Aimee their need for a ClickUp subscription to manage tasks and meetings efficiently in their new role with the DevOps and optical teams, and requested this as a reasonable adjustment, referencing previous discussions with managers Dave Porter and Paul Jones.
|
||||
- **ClickUp Tool Benefits:** Vadym described ClickUp as a useful tool for recording meetings, creating tasks from emails, and managing dashboards using AI, which helps them stay organized given the large number of tasks and meetings in their current role.
|
||||
- **Role Change Impact:** Vadym clarified that the need for ClickUp has become more significant due to their transition from a project manager in the Solventum team to working with the DevOps and optical teams, resulting in increased task volume and complexity.
|
||||
- **Previous Request and Manager Discussions:** Vadym stated they had previously requested similar software but it was not accepted in their former role; they have now discussed the ClickUp subscription with Dave Porter and report to both Dave Porter and Michael Clary, while Paul Jones is listed as their manager on paper.
|
||||
- **Disability Passport Update:** Vadym confirmed that they need to update their disability passport to reflect the request for ClickUp, and shared their screen with Aimee to review the current status and details of their reasonable adjustments.
|
||||
- **Action to Follow Up:** Aimee agreed to investigate the previous response from the people team, asked Vadym to forward relevant emails (specifically mentioning Lawrence Rigby from IT), and committed to speaking with the team about the ClickUp request.
|
||||
- **Discussion of Other Reasonable Adjustments and Equipment:** Vadym outlined the adjustments and equipment they currently have, such as a Copilot license and flexible working hours, and noted that they personally purchased items like noise cancelling headphones and use free tools, while Aimee offered to review what additional support the company can provide.
|
||||
- **Current Adjustments Provided:** Vadym listed the reasonable adjustments already in place, including a Copilot license, flexible working hours, and recovery time, and mentioned that Dave Porter provided a Grammarly Pro license.
|
||||
- **Self-Funded Equipment:** Vadym explained that they purchased noise cancelling headphones themselves and use free tools like Pomodori for visual timers, as the company does not provide these items.
|
||||
- **Additional Needs:** Vadym identified further needs such as a task management system, voice-to-text tools, and ergonomic equipment like an adjustable desk and chair, which would help them work more comfortably given their remote work setup and long hours.
|
||||
- **Company Support Review:** Aimee stated that she will double check the company's position on providing tools and equipment, referencing previous communication from Florence Rigby that such items may not be provided, but will confirm if any changes or exceptions can be made.
|
||||
- **Access to Work Government Application Status:** Vadym informed Aimee that they applied for government Access to Work support about six months ago for both their employment and business, but have not received any updates, and Aimee encouraged them to follow up with the helpline while offering to support company-side adjustments in the meantime.
|
||||
- **Application Timeline and Status:** Vadym reported applying for Access to Work in June and August 2025, with no decision or update received after nearly eight months, and noted that the government does not provide status updates on applications.
|
||||
- **Follow-Up Actions:** Aimee suggested Vadym contact the Access to Work helpline to check the status, acknowledging Vadym's discomfort with phone calls but emphasizing the importance of following up given the long wait.
|
||||
- **Potential Benefits from Access to Work:** Aimee explained that Access to Work can provide funding for adjustments such as ergonomic equipment and technology, and shared examples of employees who have benefited from the program in the past.
|
||||
- **Deadline Clarification:** Vadym found an email stating that the government would contact them within 30 weeks of the August application, setting a deadline around March 2026, and agreed to try calling to check the status.
|
||||
- **Multiple Applications:** Vadym clarified that they submitted two applications—one for their employment and one for their own business—and hope to combine any grants received to cover necessary adjustments.
|
||||
|
||||
Follow-up tasks:
|
||||
|
||||
- **ClickUp Subscription Request:** Investigate the previous response from the people team regarding the ClickUp subscription request and clarify the company's current position on providing this software as a reasonable adjustment. (Aimee)
|
||||
- **ClickUp Subscription Request:** Forward the previous email correspondence with Lawrence Rigby about the ClickUp subscription request to Aimee for review. (Vadym)
|
||||
- **Access to Work Application Status:** Contact Access to Work to follow up on the status of the application submitted in June and August 2025 and obtain an update on the decision timeline. (Vadym)
|
||||
|
||||
## ✅ Action Items
|
||||
- [ ]
|
||||
1
02 Areas/Work/Time tracking.md
Normal file
1
02 Areas/Work/Time tracking.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
![[Pasted image 20260324155227.png]]
|
||||
5
02 Areas/Work/solventum notes.md
Normal file
5
02 Areas/Work/solventum notes.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
Content author
|
||||
|
||||
Marketing
|
||||
|
||||
Marketing Communications
|
||||
16
03 Resources/Claude code setup Azure.md
Normal file
16
03 Resources/Claude code setup Azure.md
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
-Чтобы переключиться на Anthropic:
|
||||
|
||||
1. Установите переменную окружения:
|
||||
export CLAUDE_CODE_USE_FOUNDRY=0
|
||||
2. Добавьте в конфигурацию shell (чтобы сохранялось между сессиями):
|
||||
echo 'export CLAUDE_CODE_USE_FOUNDRY=0' >> ~/.zshrc
|
||||
3. Перезапустите терминал или выполните:
|
||||
source ~/.zshrc
|
||||
4. Возможно, потребуется залогиниться заново:
|
||||
claude auth login
|
||||
5. Проверьте статус:
|
||||
claude auth status
|
||||
|
||||
❯ у меня есть задача, давай составим план реализации. я хочу создать ИИ агента, который будет работать в фоне на моем сервере и управлтья по АПИ quickbooks и Revolut business, сверять транзакции, при
|
||||
появлении транзакции в револют - искать инвойс на моем почтовом сервере, скачивать его и загружать в квикбукс, так же проверять балансы счетов и выполнять функциии буккипера, он должен мониторить данные и
|
||||
отправлять действия для подтверждения моему телеграмм боту. Задай все уточняюшие вопросы и внеси предложения перед написанием плана.
|
||||
BIN
03 Resources/Images/Pasted image 20260224132635.png
Normal file
BIN
03 Resources/Images/Pasted image 20260224132635.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 308 KiB |
366
03 Resources/claude code best practice.md
Normal file
366
03 Resources/claude code best practice.md
Normal file
|
|
@ -0,0 +1,366 @@
|
|||
Вот полный текст исследования (в нормальной кодировке, можно копировать как UTF‑8‑markdown):
|
||||
|
||||
***
|
||||
|
||||
# Лучшие практики работы с Claude Code (февраль 2026)
|
||||
|
||||
Это исследование собирает актуальные best practices по использованию Claude Code для разработки приложений на февраль 2026 года: как настраивать среду, как организовать работу с проектом, какие инструкции давать, и какая структура планирования и реализации наиболее эффективна.
|
||||
|
||||
***
|
||||
|
||||
## 1. Философия Claude Code
|
||||
|
||||
### 1.1. Ключевая идея
|
||||
|
||||
Claude Code построен по принципу «дать ИИ полноценный компьютер»:
|
||||
|
||||
- доступ к файловой системе проекта;
|
||||
- возможность читать, создавать и изменять файлы;
|
||||
- запускать команды терминала и тесты;
|
||||
- работать с Git (ветки, коммиты, PR и т.д.);
|
||||
- подключать внешние инструменты через MCP, плагины и LSP.
|
||||
|
||||
Это отличает Claude Code от «подсказчиков кода»: он действует как полноценный агент‑разработчик, а не просто генератор сниппетов.
|
||||
|
||||
### 1.2. Иерархия инструкций
|
||||
|
||||
Важная иерархия, с которой нужно работать осознанно:
|
||||
|
||||
1. **CLAUDE.md** – «системный контракт» проекта. Самый приоритетный источник правил.
|
||||
2. **Skills / плагины / hooks** – специализация и автоматизация поведения.
|
||||
3. **Промпты пользователя** – тактические инструкции в рамках CLAUDE.md.
|
||||
|
||||
Вывод: вместо длинных промптов из раза в раз вкладывайте усилия в грамотный CLAUDE.md и skills.
|
||||
|
||||
***
|
||||
|
||||
## 2. Базовая настройка Claude Code
|
||||
|
||||
### 2.1. Минимально необходимый набор
|
||||
|
||||
**1) Language Server (LSP) под ваш стек**
|
||||
|
||||
- Даёт Claude структурированное понимание кода (типы, символы, ошибки).
|
||||
- Существенно повышает качество рефакторинга и навигации.
|
||||
|
||||
Примеры (зависят от конкретного хоста/IDE, но общий принцип такой):
|
||||
|
||||
- Python: `pyright`, `pylsp` или аналог.
|
||||
- TypeScript/JS: `typescript-language-server`.
|
||||
- Go: `gopls`.
|
||||
- Java: `jdtls`.
|
||||
|
||||
**2) Базовые плагины (если доступны в вашей сборке Claude Code)**
|
||||
|
||||
Плагин/набор для:
|
||||
|
||||
- запуска тестов и форматирования;
|
||||
- работы с Git (коммиты, ветки, PR);
|
||||
- доступа к документации/справке.
|
||||
|
||||
Рекомендация: начать с минимального набора и расширять только по реальным нуждам, чтобы не раздувать контекст и когнитивную сложность.
|
||||
|
||||
### 2.2. Общие рекомендации по конфигурации
|
||||
|
||||
- Включите **Plan / разрешённый режим по умолчанию** (plan‑mode) для сложных задач.
|
||||
- Настройте отображение текущего контекста (команда вида `/context`), чтобы понимать, какие файлы и правила Claude учитывает.
|
||||
- Стандартизируйте расположение конфигурации: `.claude/`, `.claude-plugin/`, `.mcp.json`, `.lsp.json` и т.п.
|
||||
|
||||
***
|
||||
|
||||
## 3. CLAUDE.md – основной рычаг управления
|
||||
|
||||
### 3.1. Назначение CLAUDE.md
|
||||
|
||||
CLAUDE.md – это «паспорт» проекта для Claude:
|
||||
|
||||
- объясняет архитектуру и структуру кода;
|
||||
- фиксирует правила стиля и качества;
|
||||
- задаёт ограничения (что нельзя трогать);
|
||||
- описывает команды сборки/тестов и workflow команды;
|
||||
- вводит доменную терминологию.
|
||||
|
||||
Claude **автоматически** ищет этот файл в корне проекта и следует ему гораздо строже, чем одноразовым промптам.
|
||||
|
||||
### 3.2. Как создать начальный CLAUDE.md
|
||||
|
||||
Типичный подход:
|
||||
|
||||
1. Запустите Claude Code в корне проекта.
|
||||
2. Дайте команду вроде `/init` или явный промпт:
|
||||
«Проанализируй структуру проекта и сгенерируй базовый CLAUDE.md».
|
||||
3. Полученный черновик **обязательно отредактируйте вручную**.
|
||||
|
||||
Не относитесь к автогенерации как к финальному варианту – это всего лишь старт.
|
||||
|
||||
### 3.3. Рекомендуемая структура CLAUDE.md
|
||||
|
||||
Пример логической структуры, которая хорошо масштабируется:
|
||||
|
||||
1. **Project Overview**
|
||||
- назначение проекта;
|
||||
- техстек;
|
||||
- общая архитектура.
|
||||
2. **Build & Test**
|
||||
- команды сборки, тестов, линтеров;
|
||||
- что должно выполняться перед коммитом/деплоем.
|
||||
3. **Project Structure**
|
||||
- карта директорий и их назначения;
|
||||
- важные entry‑points.
|
||||
4. **Code Style & Patterns**
|
||||
- форматирование (Prettier/Black, длина строки, отступы);
|
||||
- соглашения по именованию;
|
||||
- рекомендуемые паттерны (React Query, Zod, CQRS и т.п.).
|
||||
5. **Protected Paths (Do not touch)**
|
||||
- миграции БД;
|
||||
- CI/CD пайплайны;
|
||||
- конфигурация продакшена.
|
||||
6. **Dependencies & Impact Map**
|
||||
- какие модули критичны и кого они затрагивают.
|
||||
7. **Workflow & Rules**
|
||||
- требования к тестам и покрытию;
|
||||
- правила коммитов и PR;
|
||||
- требования к документации.
|
||||
8. **Domain Glossary**
|
||||
- термины предметной области;
|
||||
- где они реализованы в коде.
|
||||
|
||||
Важно держать CLAUDE.md компактным (желательно < 2–3k токенов) и переносить узкоспециализированные вещи в **skills**.
|
||||
|
||||
### 3.4. Эволюция CLAUDE.md
|
||||
|
||||
Лучшая практика – относиться к CLAUDE.md как к живому документу:
|
||||
|
||||
- после каждой серьёзной фичи/инцидента добавляйте в него lessons learned и новые правила;
|
||||
- выносите стабильные паттерны из промптов в этот файл;
|
||||
- регулярно рефакторьте его, убирая устаревшие или дублирующие разделы.
|
||||
|
||||
***
|
||||
|
||||
## 4. Режимы работы: Plan, Auto‑accept и проверки
|
||||
|
||||
### 4.1. Plan Mode (режим планирования)
|
||||
|
||||
Используется когда:
|
||||
|
||||
- задача затрагивает много файлов/слоёв системы;
|
||||
- требуется глубокое понимание архитектуры;
|
||||
- нужен безопасный обзор и план без немедленных изменений кода.
|
||||
|
||||
Поведение в Plan Mode:
|
||||
|
||||
- Claude читает файлы, анализирует, задаёт уточняющие вопросы;
|
||||
- строит детальный план шагов (с перечнем файлов и изменений);
|
||||
- **не вносит изменения**, пока вы явно не согласитесь.
|
||||
|
||||
Рекомендация: для любой нетривиальной задачи начинать с Plan Mode и добиться хорошего, понятного плана, а только потом переходить к модификации кода.
|
||||
|
||||
### 4.2. Auto‑accept / execution mode
|
||||
|
||||
Когда план согласован, можно:
|
||||
|
||||
- переключить режим на автоматическое принятие изменений (auto‑accept), чтобы не подтверждать каждое редактирование;
|
||||
- либо разрешать только отдельные группы изменений.
|
||||
|
||||
Практика от команды Claude Code: при хорошем плане часто удаётся сделать «one‑shot» реализацию фичи.
|
||||
|
||||
### 4.3. Новая стратегия 2026: Block‑at‑Submit, а не Block‑at‑Write
|
||||
|
||||
Вместо того чтобы блокировать каждую запись файла hooks’ами:
|
||||
|
||||
- дайте агенту завершить план и пакет изменений;
|
||||
- валидируйте и фильтруйте уже итоговый дифф или финальные действия.
|
||||
|
||||
Это уменьшает количество прерываний и делает опыт работы с агентом более плавным.
|
||||
|
||||
***
|
||||
|
||||
## 5. Skills, Slash Commands и Hooks
|
||||
|
||||
### 5.1. Skills
|
||||
|
||||
**Skills** – это модули экспертизы, описанные в отдельных `SKILL.md`:
|
||||
|
||||
- Claude читает их метаданные при старте (экономно по токенам);
|
||||
- подгружает полный контент только при необходимости (когда задача релевантна описанию).
|
||||
|
||||
Использование:
|
||||
|
||||
- выделять повторяющиеся типы задач (security review, performance audit, API design review);
|
||||
- описывать там:
|
||||
- когда skill применять;
|
||||
- пошаговый процесс;
|
||||
- чеклисты и примеры кода «хорошо/плохо».
|
||||
|
||||
Рекомендация: заводить skill всякий раз, когда определённую проверку/процедуру приходится повторять регулярно.
|
||||
|
||||
### 5.2. Slash Commands (`/command`)
|
||||
|
||||
Slash‑команды – способ «зашить» часто используемые промпты и последовательности действий в компактные команды:
|
||||
|
||||
- `/commit-push-pr` – подготовить коммит, протестировать, запушить и создать PR согласно стандарту;
|
||||
- `/test-all` – прогнать типизацию, линтер и все тесты;
|
||||
- `/refactor-fn` – стандартный сценарий безопасного рефакторинга функции.
|
||||
|
||||
Хороший стиль:
|
||||
|
||||
- описывать в команде процесс (шаги) и ожидаемый формат вывода;
|
||||
- использовать примеры ввода/вывода;
|
||||
- минимизировать необходимость «болтать» с агентом по мелочам.
|
||||
|
||||
### 5.3. Hooks
|
||||
|
||||
Hooks запускают скрипты/проверки на определённых событиях, например:
|
||||
|
||||
- `PreToolUse` – перед вызовом инструмента записи/запуска кода;
|
||||
- `Stop` – при завершении сессии;
|
||||
- `UserPromptSubmit` – при отправке промпта.
|
||||
|
||||
Лучшие практики:
|
||||
|
||||
- вместо жёсткого блокирования корректировать входные данные (input modification);
|
||||
- автоматизировать форматирование/линтинг перед записью файлов;
|
||||
- использовать hooks для синхронизации документации, обновления README/CHANGELOG, лёгких метрик.
|
||||
|
||||
***
|
||||
|
||||
## 6. Структура планирования и реализация (Spec‑Driven Development)
|
||||
|
||||
### 6.1. Spec / PRD сначала
|
||||
|
||||
Эффективный современный подход (особенно с AI‑агентом):
|
||||
|
||||
1. Сначала – **спецификация** (PRD), а не сразу код.
|
||||
2. Затем – разбиение на фазы/итерации.
|
||||
3. И только потом – реализация с помощью Claude Code по этой спецификации.
|
||||
|
||||
PRD обычно включает:
|
||||
|
||||
- описание проблемы и цели;
|
||||
- user stories и задачи;
|
||||
- ограничения (performance, security);
|
||||
- критерии приёмки;
|
||||
- риски и зависимости.
|
||||
|
||||
### 6.2. Работа с фазами
|
||||
|
||||
Шаги:
|
||||
|
||||
1. Попросить Claude разбить PRD на независимые фазы с явными зависимостями.
|
||||
2. В Plan Mode построить детальный план для фазы 1.
|
||||
3. Реализовать фазу 1 и прогнать тесты.
|
||||
4. Актуализировать план следующей фазы с учётом опыта и результатов.
|
||||
|
||||
Это уменьшает риск «раздутой» сессии и даёт точки контроля качества.
|
||||
|
||||
***
|
||||
|
||||
## 7. Параллельная разработка: Git worktrees и несколько сессий
|
||||
|
||||
### 7.1. Зачем параллелить
|
||||
|
||||
LLM‑модели по природе недетерминированы: один и тот же промпт может дать разные решения. Этим можно воспользоваться:
|
||||
|
||||
- запускать несколько сессий Claude Code параллельно на разных ветках/worktree;
|
||||
- получать несколько независимых реализаций одной задачи;
|
||||
- сравнивать и собирать из них лучший вариант.
|
||||
|
||||
### 7.2. Практика с Git worktrees
|
||||
|
||||
Подход:
|
||||
|
||||
- создаются несколько worktree одного репозитория, каждая с собственной веткой;
|
||||
- в каждой папке запускается Claude Code с одинаковым заданием;
|
||||
- после завершения работы агента сравниваются изменения по веткам;
|
||||
- выбирается или комбинируется лучшая реализация, затем лишние worktree удаляются.
|
||||
|
||||
Это особенно полезно для сложных архитектурных изменений или креативных задач (дизайн API, UI и т.д.).
|
||||
|
||||
***
|
||||
|
||||
## 8. Управление затратами и токенами
|
||||
|
||||
### 8.1. Понимание стоимости
|
||||
|
||||
Расход токенов складывается из:
|
||||
|
||||
- ваших промптов;
|
||||
- ответов Claude;
|
||||
- контекста (истории диалога);
|
||||
- прочитанных файлов;
|
||||
- CLAUDE.md и других системных подсказок.
|
||||
|
||||
Так как модель статична между запросами, **каждый новый запрос повторно включает весь релевантный контекст**, пока вы его не сократите (через `/compact`, новый чат, ограничение истории и т.п.).
|
||||
|
||||
### 8.2. Практики экономии
|
||||
|
||||
1. **Один чат – одна задача.** Не мешать несколько больших тем в один диалог.
|
||||
2. **Регулярная компактизация.** По мере накопления истории просить Claude сжать её в краткое резюме и начать новую сессию с этим резюме.
|
||||
3. **Краткие, точные промпты.** Не дублировать в промптах то, что уже описано в CLAUDE.md.
|
||||
4. **Подбор модели под задачу:**
|
||||
- простые правки/документация – дешёвая модель;
|
||||
- основная разработка – средняя модель (Sonnet‑класс);
|
||||
- сложная архитектура, безопасность – самая мощная (Opus‑класс).
|
||||
5. **Контроль стоимости.** Регулярно просматривать отчёт по стоимости/токенам (если платформа предоставляет `/cost` или аналог).
|
||||
|
||||
***
|
||||
|
||||
## 9. Практики от команды Claude Code и сообщества
|
||||
|
||||
### 9.1. От создателей Claude Code
|
||||
|
||||
Из публичных докладов и интервью (конец 2025 – начало 2026):
|
||||
|
||||
- акцент на **планировании**: хороший план + auto‑accept режим часто дают мгновенную реализацию фичи «с первого выстрела»;
|
||||
- активное использование **параллельных сессий** в отдельных worktree;
|
||||
- CLAUDE.md ведётся как журнал best practices, отражающий эволюцию проекта;
|
||||
- команда фокусируется на **code review и курсе развития системы**, а не на ручном написании каждой строки.
|
||||
|
||||
### 9.2. От опытных пользователей (open‑source и Reddit)
|
||||
|
||||
Часто повторяющиеся советы:
|
||||
|
||||
- не пытаться «настроить всё и сразу» – начинать с минимального CLAUDE.md и пары команд, затем обрастание по мере реальных нужд;
|
||||
- выделять время раз в неделю на ревизию CLAUDE.md, skills и slash‑команд;
|
||||
- для больших монорепо выносить knowledge в набор skills, а в CLAUDE.md оставлять только каркас и правила;
|
||||
- при миграции/рефакторинге legacy‑систем сначала строить карту модулей и зависимости (Claude отлично в этом помогает в Plan Mode).
|
||||
|
||||
***
|
||||
|
||||
## 10. Рекомендуемый поэтапный путь внедрения
|
||||
|
||||
### Этап 1 (1–2 недели): Базовое использование
|
||||
|
||||
- Установить Claude Code и LSP под ваш стек.
|
||||
- Создать минимальный CLAUDE.md: tech‑stack, команды сборки/тестов, структура директорий.
|
||||
- Использовать Claude для локальных задач: генерация кода, простые рефакторинги, написание тестов.
|
||||
|
||||
### Этап 2 (3–4 недели): Структурирование
|
||||
|
||||
- Перевести основные правила и паттерны в CLAUDE.md.
|
||||
- Создать 3–5 slash‑команд для частых действий: коммит, прогон тестов, подготовка PR, стандартный рефакторинг функции.
|
||||
- Ввести spec‑first подход: для каждой новой фичи сначала короткий PRD или хотя бы структурированный план.
|
||||
|
||||
### Этап 3 (2+ месяца): Продвинутое использование
|
||||
|
||||
- Завести skills под повторяющиеся виды анализа (security, performance, API‑дизайн, UX‑ревью).
|
||||
- Настроить hooks для автоматизации форматирования, базовой валидации и обновления документации.
|
||||
- Освоить работу с несколькими worktree и параллельными сессиями для сложных задач.
|
||||
- Регулярно анализировать затраты токенов и подстраивать стратегии.
|
||||
|
||||
***
|
||||
|
||||
## 11. Краткое резюме лучших практик
|
||||
|
||||
1. **Инвестируйте в CLAUDE.md.** Это главный рычаг качества и предсказуемости работы Claude.
|
||||
2. **Планируйте перед реализацией.** Используйте Plan Mode и PRD‑подход.
|
||||
3. **Выносите знания в skills и команды.** Повторяемые сценарии должны жить не в голове, а в конфигурации.
|
||||
4. **Разделяйте задачи по сессиям.** Один чат – одна цель.
|
||||
5. **Контролируйте контекст и стоимость.** `/compact`, короткие промпты, правильный выбор модели.
|
||||
6. **Экспериментируйте с параллельными реализациями.** Git worktrees + несколько сессий часто дают лучшие решения.
|
||||
7. **Постепенно эволюционируйте настройку.** Не пытайтесь сразу построить «идеальный» CLAUDE.md – он вырастет из практики.
|
||||
|
||||
***
|
||||
|
||||
Если хочешь, дальше можно сделать второй шаг: на основе этого исследования собрать именно твой кастомный `CLAUDE.md` под текущий стек/проект (React, backend, монорепа и т.п.) — просто опиши свой проект и требования, и будет конкретный файл под тебя.
|
||||
|
||||
4
05 Aimpress LTD/Links.md
Normal file
4
05 Aimpress LTD/Links.md
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
https://chat.ai-impress.com/home
|
||||
https://cal.ai-impress.com/event-types
|
||||
https://mail.ai-impress.com/SOGo/so/v.samoilenko@ai-impress.com/Mail/view#!/Mail/0/INBOX/9
|
||||
https://crm.ai-impress.com/objects/people?viewId=9512e54c-8402-4add-bade-fbf65fc49bcd
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue