javi-forge 0.1.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.releaserc +2 -1
- package/README.md +143 -31
- package/ai-config/commands/workflows/diagnose.md +70 -0
- package/ai-config/commands/workflows/discover.md +86 -0
- package/ci-local/ci-local.sh +18 -0
- package/ci-local/docker/node.Dockerfile +7 -0
- package/ci-local/hooks/commit-msg +0 -0
- package/ci-local/hooks/pre-commit +0 -0
- package/ci-local/hooks/pre-push +0 -0
- package/ci-local/install.sh +0 -0
- package/dist/commands/doctor.js +24 -1
- package/dist/commands/init.js +48 -1
- package/dist/commands/llmstxt.d.ts +9 -0
- package/dist/commands/llmstxt.js +93 -0
- package/dist/commands/llmstxt.test.d.ts +2 -0
- package/dist/commands/plugin.d.ts +24 -0
- package/dist/commands/plugin.js +78 -0
- package/dist/commands/plugin.test.d.ts +2 -0
- package/dist/constants.d.ts +8 -0
- package/dist/constants.js +8 -0
- package/dist/index.js +33 -4
- package/dist/lib/plugin.d.ts +39 -0
- package/dist/lib/plugin.js +228 -0
- package/dist/lib/plugin.test.d.ts +2 -0
- package/dist/types/index.d.ts +42 -0
- package/dist/ui/App.d.ts +2 -1
- package/dist/ui/App.js +2 -1
- package/dist/ui/LlmsTxt.d.ts +8 -0
- package/dist/ui/LlmsTxt.js +48 -0
- package/dist/ui/Plugin.d.ts +9 -0
- package/dist/ui/Plugin.js +96 -0
- package/lib/common.sh +183 -0
- package/modules/obsidian-brain/README.md +32 -0
- package/modules/obsidian-brain/core/templates/braindump.md +15 -0
- package/modules/obsidian-brain/core/templates/consolidation.md +42 -0
- package/modules/obsidian-brain/core/templates/daily-note.md +18 -0
- package/modules/obsidian-brain/core/templates/resource-capture.md +14 -0
- package/modules/obsidian-brain/developer/templates/adr.md +40 -0
- package/modules/obsidian-brain/developer/templates/coding-session.md +24 -0
- package/modules/obsidian-brain/developer/templates/debug-journal.md +22 -0
- package/modules/obsidian-brain/developer/templates/sdd-feedback.md +27 -0
- package/modules/obsidian-brain/developer/templates/tech-debt.md +20 -0
- package/modules/obsidian-brain/pm-lead/templates/daily-brief.md +25 -0
- package/modules/obsidian-brain/pm-lead/templates/meeting-notes.md +24 -0
- package/modules/obsidian-brain/pm-lead/templates/risk-registry.md +12 -0
- package/modules/obsidian-brain/pm-lead/templates/sprint-review.md +27 -0
- package/modules/obsidian-brain/pm-lead/templates/stakeholder-update.md +24 -0
- package/modules/obsidian-brain/pm-lead/templates/team-intelligence.md +19 -0
- package/modules/obsidian-brain/pm-lead/templates/weekly-brief.md +29 -0
- package/package.json +12 -12
- package/schemas/plugin.schema.json +62 -0
- package/dist/commands/analyze.d.ts.map +0 -1
- package/dist/commands/analyze.js.map +0 -1
- package/dist/commands/analyze.test.d.ts.map +0 -1
- package/dist/commands/analyze.test.js +0 -145
- package/dist/commands/analyze.test.js.map +0 -1
- package/dist/commands/doctor.d.ts.map +0 -1
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/doctor.test.d.ts.map +0 -1
- package/dist/commands/doctor.test.js +0 -200
- package/dist/commands/doctor.test.js.map +0 -1
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/init.test.d.ts.map +0 -1
- package/dist/commands/init.test.js +0 -271
- package/dist/commands/init.test.js.map +0 -1
- package/dist/commands/sync.d.ts.map +0 -1
- package/dist/commands/sync.js.map +0 -1
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js.map +0 -1
- package/dist/e2e/aggressive.e2e.test.d.ts.map +0 -1
- package/dist/e2e/aggressive.e2e.test.js +0 -350
- package/dist/e2e/aggressive.e2e.test.js.map +0 -1
- package/dist/e2e/commands.e2e.test.d.ts.map +0 -1
- package/dist/e2e/commands.e2e.test.js +0 -213
- package/dist/e2e/commands.e2e.test.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/common.d.ts.map +0 -1
- package/dist/lib/common.js.map +0 -1
- package/dist/lib/common.test.d.ts.map +0 -1
- package/dist/lib/common.test.js +0 -316
- package/dist/lib/common.test.js.map +0 -1
- package/dist/lib/frontmatter.d.ts.map +0 -1
- package/dist/lib/frontmatter.js.map +0 -1
- package/dist/lib/frontmatter.test.d.ts.map +0 -1
- package/dist/lib/frontmatter.test.js +0 -257
- package/dist/lib/frontmatter.test.js.map +0 -1
- package/dist/lib/template.d.ts.map +0 -1
- package/dist/lib/template.js.map +0 -1
- package/dist/lib/template.test.d.ts.map +0 -1
- package/dist/lib/template.test.js +0 -201
- package/dist/lib/template.test.js.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js.map +0 -1
- package/dist/ui/AnalyzeUI.d.ts.map +0 -1
- package/dist/ui/AnalyzeUI.js.map +0 -1
- package/dist/ui/App.d.ts.map +0 -1
- package/dist/ui/App.js.map +0 -1
- package/dist/ui/CIContext.d.ts.map +0 -1
- package/dist/ui/CIContext.js.map +0 -1
- package/dist/ui/CISelector.d.ts.map +0 -1
- package/dist/ui/CISelector.js.map +0 -1
- package/dist/ui/Doctor.d.ts.map +0 -1
- package/dist/ui/Doctor.js.map +0 -1
- package/dist/ui/Header.d.ts.map +0 -1
- package/dist/ui/Header.js.map +0 -1
- package/dist/ui/MemorySelector.d.ts.map +0 -1
- package/dist/ui/MemorySelector.js.map +0 -1
- package/dist/ui/NameInput.d.ts.map +0 -1
- package/dist/ui/NameInput.js.map +0 -1
- package/dist/ui/OptionSelector.d.ts.map +0 -1
- package/dist/ui/OptionSelector.js.map +0 -1
- package/dist/ui/Progress.d.ts.map +0 -1
- package/dist/ui/Progress.js.map +0 -1
- package/dist/ui/StackSelector.d.ts.map +0 -1
- package/dist/ui/StackSelector.js.map +0 -1
- package/dist/ui/Summary.d.ts.map +0 -1
- package/dist/ui/Summary.js.map +0 -1
- package/dist/ui/SyncUI.d.ts.map +0 -1
- package/dist/ui/SyncUI.js.map +0 -1
- package/dist/ui/Welcome.d.ts.map +0 -1
- package/dist/ui/Welcome.js.map +0 -1
- package/dist/ui/theme.d.ts.map +0 -1
- package/dist/ui/theme.js.map +0 -1
- package/src/commands/analyze.test.ts +0 -145
- package/src/commands/analyze.ts +0 -69
- package/src/commands/doctor.test.ts +0 -208
- package/src/commands/doctor.ts +0 -163
- package/src/commands/init.test.ts +0 -298
- package/src/commands/init.ts +0 -285
- package/src/constants.ts +0 -69
- package/src/e2e/aggressive.e2e.test.ts +0 -557
- package/src/e2e/commands.e2e.test.ts +0 -298
- package/src/index.tsx +0 -106
- package/src/lib/common.test.ts +0 -318
- package/src/lib/common.ts +0 -127
- package/src/lib/frontmatter.test.ts +0 -291
- package/src/lib/frontmatter.ts +0 -77
- package/src/lib/template.test.ts +0 -226
- package/src/lib/template.ts +0 -99
- package/src/types/index.ts +0 -53
- package/src/ui/AnalyzeUI.tsx +0 -133
- package/src/ui/App.tsx +0 -175
- package/src/ui/CIContext.tsx +0 -25
- package/src/ui/CISelector.tsx +0 -72
- package/src/ui/Doctor.tsx +0 -122
- package/src/ui/Header.tsx +0 -48
- package/src/ui/MemorySelector.tsx +0 -73
- package/src/ui/NameInput.tsx +0 -82
- package/src/ui/OptionSelector.tsx +0 -100
- package/src/ui/Progress.tsx +0 -88
- package/src/ui/StackSelector.tsx +0 -101
- package/src/ui/Summary.tsx +0 -134
- package/src/ui/Welcome.tsx +0 -54
- package/src/ui/theme.ts +0 -10
- package/stryker.config.json +0 -19
- package/tsconfig.json +0 -19
- package/vitest.config.ts +0 -16
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import React, { useState, useEffect } from 'react';
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
import Spinner from 'ink-spinner';
|
|
4
|
+
import { runPluginAdd, runPluginRemove, runPluginList, runPluginSearch, runPluginValidate } from '../commands/plugin.js';
|
|
5
|
+
import { theme } from './theme.js';
|
|
6
|
+
const STATUS_ICON = {
|
|
7
|
+
pending: '\u25cb',
|
|
8
|
+
done: '\u2713',
|
|
9
|
+
error: '\u2717',
|
|
10
|
+
skipped: '\u2013',
|
|
11
|
+
};
|
|
12
|
+
const STATUS_COLOR = {
|
|
13
|
+
pending: theme.muted,
|
|
14
|
+
running: theme.warning,
|
|
15
|
+
done: theme.success,
|
|
16
|
+
error: theme.error,
|
|
17
|
+
skipped: theme.muted,
|
|
18
|
+
};
|
|
19
|
+
export default function Plugin({ action, target, dryRun }) {
|
|
20
|
+
const [steps, setSteps] = useState([]);
|
|
21
|
+
const [done, setDone] = useState(false);
|
|
22
|
+
const onStep = (step) => {
|
|
23
|
+
setSteps(prev => {
|
|
24
|
+
const idx = prev.findIndex(s => s.id === step.id);
|
|
25
|
+
if (idx >= 0) {
|
|
26
|
+
const next = [...prev];
|
|
27
|
+
next[idx] = step;
|
|
28
|
+
return next;
|
|
29
|
+
}
|
|
30
|
+
return [...prev, step];
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
const run = async () => {
|
|
35
|
+
try {
|
|
36
|
+
switch (action) {
|
|
37
|
+
case 'add':
|
|
38
|
+
if (!target) {
|
|
39
|
+
onStep({ id: 'err', label: 'Error', status: 'error', detail: 'source required: javi-forge plugin add <org/repo>' });
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
await runPluginAdd(target, dryRun, onStep);
|
|
43
|
+
break;
|
|
44
|
+
case 'remove':
|
|
45
|
+
if (!target) {
|
|
46
|
+
onStep({ id: 'err', label: 'Error', status: 'error', detail: 'name required: javi-forge plugin remove <name>' });
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
await runPluginRemove(target, dryRun, onStep);
|
|
50
|
+
break;
|
|
51
|
+
case 'list':
|
|
52
|
+
await runPluginList(onStep);
|
|
53
|
+
break;
|
|
54
|
+
case 'search':
|
|
55
|
+
await runPluginSearch(target, onStep);
|
|
56
|
+
break;
|
|
57
|
+
case 'validate':
|
|
58
|
+
if (!target) {
|
|
59
|
+
onStep({ id: 'err', label: 'Error', status: 'error', detail: 'path required: javi-forge plugin validate <dir>' });
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
await runPluginValidate(target, onStep);
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
onStep({ id: 'fatal', label: 'Fatal error', status: 'error', detail: String(e) });
|
|
68
|
+
}
|
|
69
|
+
setDone(true);
|
|
70
|
+
};
|
|
71
|
+
run();
|
|
72
|
+
}, [action, target, dryRun]);
|
|
73
|
+
return (React.createElement(Box, { flexDirection: "column", padding: 1 },
|
|
74
|
+
React.createElement(Box, { marginBottom: 1 },
|
|
75
|
+
React.createElement(Text, { bold: true, color: theme.primary }, "javi-forge"),
|
|
76
|
+
React.createElement(Text, null,
|
|
77
|
+
" plugin ",
|
|
78
|
+
action),
|
|
79
|
+
dryRun && React.createElement(Text, { color: theme.warning }, " (dry-run)")),
|
|
80
|
+
steps.map(step => (React.createElement(Box, { key: step.id, marginLeft: 2 }, step.status === 'running' ? (React.createElement(Text, { color: theme.warning },
|
|
81
|
+
React.createElement(Spinner, { type: "dots" }),
|
|
82
|
+
' ',
|
|
83
|
+
step.label,
|
|
84
|
+
step.detail ? React.createElement(Text, { color: theme.muted, dimColor: true },
|
|
85
|
+
" ",
|
|
86
|
+
step.detail) : null)) : (React.createElement(Text, { color: STATUS_COLOR[step.status] },
|
|
87
|
+
STATUS_ICON[step.status],
|
|
88
|
+
" ",
|
|
89
|
+
step.label,
|
|
90
|
+
step.detail ? React.createElement(Text, { color: theme.muted, dimColor: true },
|
|
91
|
+
" ",
|
|
92
|
+
step.detail) : null))))),
|
|
93
|
+
done && (React.createElement(Box, { marginTop: 1 },
|
|
94
|
+
React.createElement(Text, { color: theme.muted }, "Done.")))));
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=Plugin.js.map
|
package/lib/common.sh
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# =============================================================================
|
|
3
|
+
# lib/common.sh - Shared functions for project-starter-framework
|
|
4
|
+
# =============================================================================
|
|
5
|
+
# Source from scripts: source "$(dirname "$0")/../lib/common.sh"
|
|
6
|
+
# Source from ci-local: source "$(dirname "$0")/../lib/common.sh"
|
|
7
|
+
# Source from hooks: source "$(dirname "$0")/../../lib/common.sh"
|
|
8
|
+
# =============================================================================
|
|
9
|
+
|
|
10
|
+
# Guard against double-sourcing
|
|
11
|
+
if [[ -n "${_COMMON_SH_LOADED:-}" ]]; then
|
|
12
|
+
return 0 2>/dev/null || true
|
|
13
|
+
fi
|
|
14
|
+
_COMMON_SH_LOADED=1
|
|
15
|
+
|
|
16
|
+
# =============================================================================
|
|
17
|
+
# Colors (exported for callers via source)
|
|
18
|
+
# =============================================================================
|
|
19
|
+
# shellcheck disable=SC2034
|
|
20
|
+
RED='\033[0;31m'
|
|
21
|
+
# shellcheck disable=SC2034
|
|
22
|
+
GREEN='\033[0;32m'
|
|
23
|
+
# shellcheck disable=SC2034
|
|
24
|
+
YELLOW='\033[1;33m'
|
|
25
|
+
# shellcheck disable=SC2034
|
|
26
|
+
CYAN='\033[0;36m'
|
|
27
|
+
# shellcheck disable=SC2034
|
|
28
|
+
BLUE='\033[0;34m'
|
|
29
|
+
# shellcheck disable=SC2034
|
|
30
|
+
NC='\033[0m'
|
|
31
|
+
|
|
32
|
+
# =============================================================================
|
|
33
|
+
# Shared logging helpers
|
|
34
|
+
# =============================================================================
|
|
35
|
+
log_ok() { echo -e " ${GREEN}[OK]${NC} $1"; }
|
|
36
|
+
log_warn() { echo -e " ${YELLOW}[WARN]${NC} $1"; }
|
|
37
|
+
log_fail() { echo -e " ${RED}[FAIL]${NC} $1"; }
|
|
38
|
+
log_info() { echo -e " ${CYAN}[INFO]${NC} $1"; }
|
|
39
|
+
log_step() { echo -e "${YELLOW}$1${NC}"; }
|
|
40
|
+
|
|
41
|
+
# =============================================================================
|
|
42
|
+
# sed_inplace - Portable sed -i (works on both GNU and BSD/macOS sed)
|
|
43
|
+
# =============================================================================
|
|
44
|
+
# Usage: sed_inplace "s/foo/bar/" file.txt
|
|
45
|
+
# =============================================================================
|
|
46
|
+
sed_inplace() {
|
|
47
|
+
if sed --version 2>/dev/null | grep -q GNU; then
|
|
48
|
+
sed -i "$@"
|
|
49
|
+
else
|
|
50
|
+
sed -i '' "$@"
|
|
51
|
+
fi
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
# =============================================================================
|
|
55
|
+
# escape_sed - Escape special characters for safe use in sed replacement
|
|
56
|
+
# =============================================================================
|
|
57
|
+
# Usage: escaped=$(escape_sed "$raw_string")
|
|
58
|
+
# Note: This escapes replacement-side characters (backslash, ampersand, slash).
|
|
59
|
+
# =============================================================================
|
|
60
|
+
escape_sed() {
|
|
61
|
+
printf '%s\n' "$1" | sed -e 's/[\\&/]/\\&/g'
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
# =============================================================================
|
|
65
|
+
# backup_if_exists - Create a .bak copy of a file before overwriting
|
|
66
|
+
# =============================================================================
|
|
67
|
+
# Usage: backup_if_exists "path/to/file"
|
|
68
|
+
# =============================================================================
|
|
69
|
+
backup_if_exists() {
|
|
70
|
+
local file="$1"
|
|
71
|
+
if [[ -f "$file" ]]; then
|
|
72
|
+
cp "$file" "${file}.bak"
|
|
73
|
+
echo -e "${YELLOW} Backed up existing ${file}${NC}"
|
|
74
|
+
fi
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
# =============================================================================
|
|
78
|
+
# detect_stack - Auto-detect project technology stack
|
|
79
|
+
# =============================================================================
|
|
80
|
+
# Sets: STACK_TYPE, BUILD_TOOL, JAVA_VERSION
|
|
81
|
+
# Detects: java-gradle, java-maven, node, python, go, rust
|
|
82
|
+
#
|
|
83
|
+
# Usage:
|
|
84
|
+
# detect_stack # Detects from current directory
|
|
85
|
+
# detect_stack "/path/to/project" # Detects from given directory
|
|
86
|
+
#
|
|
87
|
+
# NOTE: Does NOT set LINT_CMD/COMPILE_CMD/TEST_CMD. Those are CI-specific
|
|
88
|
+
# and should be configured by the caller (e.g., ci-local.sh).
|
|
89
|
+
# =============================================================================
|
|
90
|
+
# shellcheck disable=SC2034 # STACK_TYPE, BUILD_TOOL, JAVA_VERSION used by callers
|
|
91
|
+
detect_stack() {
|
|
92
|
+
local project_dir="${1:-.}"
|
|
93
|
+
|
|
94
|
+
STACK_TYPE="unknown"
|
|
95
|
+
BUILD_TOOL=""
|
|
96
|
+
JAVA_VERSION="21"
|
|
97
|
+
|
|
98
|
+
# Java + Gradle
|
|
99
|
+
if [[ -f "$project_dir/build.gradle" || -f "$project_dir/build.gradle.kts" ]]; then
|
|
100
|
+
STACK_TYPE="java-gradle"
|
|
101
|
+
BUILD_TOOL="gradle"
|
|
102
|
+
|
|
103
|
+
# Detect Java version from build files (compatible with macOS and Linux)
|
|
104
|
+
if [[ -f "$project_dir/build.gradle.kts" ]]; then
|
|
105
|
+
JAVA_VERSION=$(grep -E 'languageVersion\s*=\s*JavaLanguageVersion\.of\(' "$project_dir/build.gradle.kts" 2>/dev/null | grep -o '[0-9]\+' | head -1 || echo "21")
|
|
106
|
+
elif [[ -f "$project_dir/build.gradle" ]]; then
|
|
107
|
+
JAVA_VERSION=$(grep -E 'sourceCompatibility\s*=' "$project_dir/build.gradle" 2>/dev/null | grep -o '[0-9]\+' | head -1 || echo "21")
|
|
108
|
+
fi
|
|
109
|
+
[[ -z "$JAVA_VERSION" ]] && JAVA_VERSION="21"
|
|
110
|
+
return
|
|
111
|
+
fi
|
|
112
|
+
|
|
113
|
+
# Java + Maven
|
|
114
|
+
if [[ -f "$project_dir/pom.xml" ]]; then
|
|
115
|
+
STACK_TYPE="java-maven"
|
|
116
|
+
BUILD_TOOL="maven"
|
|
117
|
+
return
|
|
118
|
+
fi
|
|
119
|
+
|
|
120
|
+
# Node.js
|
|
121
|
+
if [[ -f "$project_dir/package.json" ]]; then
|
|
122
|
+
STACK_TYPE="node"
|
|
123
|
+
if [[ -f "$project_dir/pnpm-lock.yaml" ]]; then
|
|
124
|
+
BUILD_TOOL="pnpm"
|
|
125
|
+
elif [[ -f "$project_dir/yarn.lock" ]]; then
|
|
126
|
+
BUILD_TOOL="yarn"
|
|
127
|
+
else
|
|
128
|
+
BUILD_TOOL="npm"
|
|
129
|
+
fi
|
|
130
|
+
return
|
|
131
|
+
fi
|
|
132
|
+
|
|
133
|
+
# Python (detection order: uv > poetry > pipenv > pip)
|
|
134
|
+
if [[ -f "$project_dir/pyproject.toml" || -f "$project_dir/setup.py" || -f "$project_dir/requirements.txt" ]]; then
|
|
135
|
+
STACK_TYPE="python"
|
|
136
|
+
if [[ -f "$project_dir/uv.lock" ]]; then
|
|
137
|
+
BUILD_TOOL="uv"
|
|
138
|
+
elif [[ -f "$project_dir/poetry.lock" ]]; then
|
|
139
|
+
BUILD_TOOL="poetry"
|
|
140
|
+
elif [[ -f "$project_dir/Pipfile" ]]; then
|
|
141
|
+
BUILD_TOOL="pipenv"
|
|
142
|
+
else
|
|
143
|
+
BUILD_TOOL="pip"
|
|
144
|
+
fi
|
|
145
|
+
return
|
|
146
|
+
fi
|
|
147
|
+
|
|
148
|
+
# Go
|
|
149
|
+
if [[ -f "$project_dir/go.mod" ]]; then
|
|
150
|
+
STACK_TYPE="go"
|
|
151
|
+
BUILD_TOOL="go"
|
|
152
|
+
return
|
|
153
|
+
fi
|
|
154
|
+
|
|
155
|
+
# Rust
|
|
156
|
+
if [[ -f "$project_dir/Cargo.toml" ]]; then
|
|
157
|
+
STACK_TYPE="rust"
|
|
158
|
+
BUILD_TOOL="cargo"
|
|
159
|
+
return
|
|
160
|
+
fi
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
# =============================================================================
|
|
164
|
+
# detect_framework - Locate the project-starter-framework directory
|
|
165
|
+
# =============================================================================
|
|
166
|
+
# Sets: FRAMEWORK_DIR (path to framework root, or empty string)
|
|
167
|
+
# HAS_OPTIONAL (true/false if optional/ dir exists)
|
|
168
|
+
#
|
|
169
|
+
# Usage: detect_framework
|
|
170
|
+
# =============================================================================
|
|
171
|
+
# shellcheck disable=SC2034 # FRAMEWORK_DIR, HAS_OPTIONAL used by callers
|
|
172
|
+
detect_framework() {
|
|
173
|
+
FRAMEWORK_DIR=""
|
|
174
|
+
HAS_OPTIONAL=false
|
|
175
|
+
if [[ -d "templates" && -d ".ai-config" ]]; then
|
|
176
|
+
FRAMEWORK_DIR="."
|
|
177
|
+
elif [[ -d "../templates" && -d "../.ai-config" ]]; then
|
|
178
|
+
FRAMEWORK_DIR=".."
|
|
179
|
+
fi
|
|
180
|
+
if [[ -n "$FRAMEWORK_DIR" && -d "$FRAMEWORK_DIR/optional" ]]; then
|
|
181
|
+
HAS_OPTIONAL=true
|
|
182
|
+
fi
|
|
183
|
+
}
|
|
@@ -266,3 +266,35 @@ Si ya usas vibekanban:
|
|
|
266
266
|
3. Agregar frontmatter YAML a archivos existentes (CONTEXT, DECISIONS, etc.)
|
|
267
267
|
4. Agregar inline fields Dataview a ADRs y blockers existentes
|
|
268
268
|
5. Actualizar `.gitignore` con el snippet de Obsidian
|
|
269
|
+
|
|
270
|
+
## Role-Based Templates
|
|
271
|
+
|
|
272
|
+
Obsidian Brain includes role-based templates organized by persona, sourced from vault/Javi.Dots:
|
|
273
|
+
|
|
274
|
+
### Core Templates (`core/templates/`)
|
|
275
|
+
| Template | Purpose |
|
|
276
|
+
|----------|---------|
|
|
277
|
+
| `daily-note.md` | Daily focus, notes, reflections |
|
|
278
|
+
| `braindump.md` | Quick unstructured idea capture |
|
|
279
|
+
| `consolidation.md` | Weekly knowledge consolidation |
|
|
280
|
+
| `resource-capture.md` | Annotated resource bookmarking |
|
|
281
|
+
|
|
282
|
+
### Developer Templates (`developer/templates/`)
|
|
283
|
+
| Template | Purpose |
|
|
284
|
+
|----------|---------|
|
|
285
|
+
| `coding-session.md` | Goal, work log, blockers, decisions, next steps |
|
|
286
|
+
| `adr.md` | Architecture Decision Record with decision map |
|
|
287
|
+
| `debug-journal.md` | Structured debugging sessions |
|
|
288
|
+
| `sdd-feedback.md` | Spec-Driven Development feedback |
|
|
289
|
+
| `tech-debt.md` | Technical debt tracking |
|
|
290
|
+
|
|
291
|
+
### PM/Lead Templates (`pm-lead/templates/`)
|
|
292
|
+
| Template | Purpose |
|
|
293
|
+
|----------|---------|
|
|
294
|
+
| `daily-brief.md` | Daily standup summary |
|
|
295
|
+
| `weekly-brief.md` | Weekly progress report |
|
|
296
|
+
| `sprint-review.md` | Sprint retrospective |
|
|
297
|
+
| `meeting-notes.md` | Structured meeting notes |
|
|
298
|
+
| `risk-registry.md` | Risk tracking and mitigation |
|
|
299
|
+
| `stakeholder-update.md` | Stakeholder communication |
|
|
300
|
+
| `team-intelligence.md` | Team performance patterns |
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
title:
|
|
3
|
+
date: "{{date}}"
|
|
4
|
+
tags:
|
|
5
|
+
- consolidation
|
|
6
|
+
- weekly
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Period
|
|
10
|
+
|
|
11
|
+
## Top Insights
|
|
12
|
+
|
|
13
|
+
-
|
|
14
|
+
|
|
15
|
+
## Connections Made
|
|
16
|
+
|
|
17
|
+
-
|
|
18
|
+
|
|
19
|
+
## Open Questions
|
|
20
|
+
|
|
21
|
+
-
|
|
22
|
+
|
|
23
|
+
## Action Items
|
|
24
|
+
|
|
25
|
+
- [ ]
|
|
26
|
+
|
|
27
|
+
## Mind Map
|
|
28
|
+
|
|
29
|
+
```markmap
|
|
30
|
+
# Weekly Insights
|
|
31
|
+
|
|
32
|
+
## Theme A
|
|
33
|
+
- [[entity-1]]
|
|
34
|
+
- [[entity-2]]
|
|
35
|
+
|
|
36
|
+
## Theme B
|
|
37
|
+
- [[entity-3]]
|
|
38
|
+
- [[entity-4]]
|
|
39
|
+
|
|
40
|
+
## Connections
|
|
41
|
+
- [[entity-1]] ↔ [[entity-3]]
|
|
42
|
+
```
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
title:
|
|
3
|
+
date: "{{date}}"
|
|
4
|
+
tags:
|
|
5
|
+
- adr
|
|
6
|
+
- architecture
|
|
7
|
+
status:
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Context
|
|
11
|
+
|
|
12
|
+
## Decision
|
|
13
|
+
|
|
14
|
+
## Consequences
|
|
15
|
+
|
|
16
|
+
-
|
|
17
|
+
|
|
18
|
+
## Alternatives Considered
|
|
19
|
+
|
|
20
|
+
| Alternative | Pros | Cons |
|
|
21
|
+
|-------------|------|------|
|
|
22
|
+
| | | |
|
|
23
|
+
|
|
24
|
+
## Decision Map
|
|
25
|
+
|
|
26
|
+
```markmap
|
|
27
|
+
# Decision Title
|
|
28
|
+
|
|
29
|
+
## Option A
|
|
30
|
+
### Pros
|
|
31
|
+
- Low complexity
|
|
32
|
+
### Cons
|
|
33
|
+
- Limited scalability
|
|
34
|
+
|
|
35
|
+
## Option B
|
|
36
|
+
### Pros
|
|
37
|
+
- Future-proof
|
|
38
|
+
### Cons
|
|
39
|
+
- Higher effort
|
|
40
|
+
```
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
title:
|
|
3
|
+
date: "{{date}}"
|
|
4
|
+
tags:
|
|
5
|
+
- sdd
|
|
6
|
+
- feedback
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Change Name
|
|
10
|
+
|
|
11
|
+
## Phase Completed
|
|
12
|
+
|
|
13
|
+
## What Worked
|
|
14
|
+
|
|
15
|
+
-
|
|
16
|
+
|
|
17
|
+
## What Didn't
|
|
18
|
+
|
|
19
|
+
-
|
|
20
|
+
|
|
21
|
+
## Improvements
|
|
22
|
+
|
|
23
|
+
-
|
|
24
|
+
|
|
25
|
+
## Link to Engram
|
|
26
|
+
|
|
27
|
+
<!-- Optional: engram:// link -->
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
title:
|
|
3
|
+
date: "{{date}}"
|
|
4
|
+
tags:
|
|
5
|
+
- sprint
|
|
6
|
+
- review
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Sprint Goal
|
|
10
|
+
|
|
11
|
+
## Completed
|
|
12
|
+
|
|
13
|
+
-
|
|
14
|
+
|
|
15
|
+
## Not Completed
|
|
16
|
+
|
|
17
|
+
-
|
|
18
|
+
|
|
19
|
+
## Metrics
|
|
20
|
+
|
|
21
|
+
| Metric | Value |
|
|
22
|
+
|--------|-------|
|
|
23
|
+
| | |
|
|
24
|
+
|
|
25
|
+
## Retrospective Notes
|
|
26
|
+
|
|
27
|
+
-
|