skillwiki 0.10.65 → 0.10.68
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/dist/{chunk-CKDF4DWU.js → chunk-R5SDVKHS.js} +91 -10
- package/dist/{chunk-SNHTWLGF.js → chunk-YKVJ2A3O.js} +1 -1
- package/dist/cli.js +3 -3
- package/dist/{managed-write-preflight-2MMVUXD3.js → managed-write-preflight-PUEJOXJO.js} +1 -1
- package/dist/skillwiki-mcp.js +2 -2
- package/package.json +1 -1
- package/skills/.claude-plugin/plugin.json +1 -1
- package/skills/.codex-plugin/plugin.json +1 -1
- package/skills/package.json +1 -1
- package/skills/skills/using-skillwiki/SKILL.md +2 -2
- package/skills/skills/wiki-add-task/SKILL.md +2 -1
- package/skills/skills/wiki-ingest/SKILL.md +1 -0
- package/skills/skills/wiki-init/SKILL.md +3 -1
- package/skills/using-skillwiki/SKILL.md +2 -2
- package/skills/wiki-add-task/SKILL.md +2 -1
- package/skills/wiki-ingest/SKILL.md +1 -0
- package/skills/wiki-init/SKILL.md +3 -1
- package/templates/SCHEMA.md +1 -0
|
@@ -5803,6 +5803,17 @@ async function runVaultSyncPullHelper(input) {
|
|
|
5803
5803
|
}
|
|
5804
5804
|
|
|
5805
5805
|
// src/commands/sync.ts
|
|
5806
|
+
function countAheadBehind(vault) {
|
|
5807
|
+
const revOutput = git(vault, ["rev-list", "--left-right", "--count", "origin/HEAD...HEAD"]);
|
|
5808
|
+
let ahead = 0;
|
|
5809
|
+
let behind = 0;
|
|
5810
|
+
if (revOutput) {
|
|
5811
|
+
const parts = revOutput.split(/\s+/);
|
|
5812
|
+
behind = parseInt(parts[0], 10) || 0;
|
|
5813
|
+
ahead = parseInt(parts[1], 10) || 0;
|
|
5814
|
+
}
|
|
5815
|
+
return { ahead, behind };
|
|
5816
|
+
}
|
|
5806
5817
|
function parseDirtyPaths(porcelain) {
|
|
5807
5818
|
if (!porcelain) return [];
|
|
5808
5819
|
return porcelain.split("\n").map((line) => line.trimEnd()).filter((line) => line.length >= 4).map((line) => {
|
|
@@ -5854,14 +5865,7 @@ function runSyncStatus(input) {
|
|
|
5854
5865
|
const dirty = porcelain ? porcelain.split("\n").filter((l) => l.trim().length > 0).length : 0;
|
|
5855
5866
|
const dirtyPaths = parseDirtyPaths(porcelain);
|
|
5856
5867
|
const untrackedPaths = splitNonEmptyLines(git(vault, ["ls-files", "--others", "--exclude-standard"]));
|
|
5857
|
-
const
|
|
5858
|
-
let ahead = 0;
|
|
5859
|
-
let behind = 0;
|
|
5860
|
-
if (revOutput) {
|
|
5861
|
-
const parts = revOutput.split(/\s+/);
|
|
5862
|
-
behind = parseInt(parts[0], 10) || 0;
|
|
5863
|
-
ahead = parseInt(parts[1], 10) || 0;
|
|
5864
|
-
}
|
|
5868
|
+
const { ahead, behind } = countAheadBehind(vault);
|
|
5865
5869
|
const tsRaw = git(vault, ["log", "-1", "--format=%ct"]);
|
|
5866
5870
|
let last_commit;
|
|
5867
5871
|
if (tsRaw) {
|
|
@@ -5961,14 +5965,91 @@ async function runSyncPush(input) {
|
|
|
5961
5965
|
const porcelain = git(vault, ["status", "--porcelain"]);
|
|
5962
5966
|
const dirtyFiles = porcelain ? porcelain.split("\n").filter((l) => l.trim().length > 0) : [];
|
|
5963
5967
|
if (dirtyFiles.length === 0) {
|
|
5968
|
+
const { ahead } = countAheadBehind(vault);
|
|
5969
|
+
if (ahead === 0) {
|
|
5970
|
+
return {
|
|
5971
|
+
exitCode: ExitCode.OK,
|
|
5972
|
+
result: ok({
|
|
5973
|
+
files_committed: 0,
|
|
5974
|
+
commit_message: "",
|
|
5975
|
+
pushed: false,
|
|
5976
|
+
path_fixes: pathFixes,
|
|
5977
|
+
humanHint: "nothing to commit, working tree clean"
|
|
5978
|
+
})
|
|
5979
|
+
};
|
|
5980
|
+
}
|
|
5981
|
+
let delta2 = { full_errors: 0, base_errors: 0, new_errors: 0, resolved_errors: 0 };
|
|
5982
|
+
const preferredBase2 = git(vault, ["rev-parse", "--verify", "origin/main"]) ? "origin/main" : git(vault, ["rev-parse", "--verify", "origin/HEAD"]) ? "origin/HEAD" : "";
|
|
5983
|
+
if (preferredBase2) {
|
|
5984
|
+
const deltaResult = await runSyncLintDelta({ vault, baseRef: preferredBase2 });
|
|
5985
|
+
if (!deltaResult.result.ok) {
|
|
5986
|
+
return {
|
|
5987
|
+
exitCode: ExitCode.LINT_HAS_ERRORS,
|
|
5988
|
+
result: err("LINT_DELTA_UNAVAILABLE", {
|
|
5989
|
+
message: "lint-delta evidence missing or failed \u2014 fail closed",
|
|
5990
|
+
detail: deltaResult.result
|
|
5991
|
+
})
|
|
5992
|
+
};
|
|
5993
|
+
}
|
|
5994
|
+
delta2 = deltaResult.result.data;
|
|
5995
|
+
if (delta2.new_errors > 0) {
|
|
5996
|
+
return {
|
|
5997
|
+
exitCode: ExitCode.LINT_HAS_ERRORS,
|
|
5998
|
+
result: err("LINT_NEW_ERRORS_BLOCK_PUSH", {
|
|
5999
|
+
full_errors: delta2.full_errors,
|
|
6000
|
+
base_errors: delta2.base_errors,
|
|
6001
|
+
new_errors: delta2.new_errors,
|
|
6002
|
+
resolved_errors: delta2.resolved_errors,
|
|
6003
|
+
new_fingerprints: deltaResult.result.data.new_fingerprints
|
|
6004
|
+
})
|
|
6005
|
+
};
|
|
6006
|
+
}
|
|
6007
|
+
} else {
|
|
6008
|
+
const lintResult = await runLint({ vault, days: 90, lines: 200, logThreshold: 500 });
|
|
6009
|
+
if (lintResult.result.ok) {
|
|
6010
|
+
const fullErrors = lintResult.result.data.summary.errors;
|
|
6011
|
+
delta2 = { full_errors: fullErrors, base_errors: 0, new_errors: fullErrors, resolved_errors: 0 };
|
|
6012
|
+
if (fullErrors > 0) {
|
|
6013
|
+
const buckets = "by_severity" in lintResult.result.data ? lintResult.result.data.by_severity.error : [];
|
|
6014
|
+
return {
|
|
6015
|
+
exitCode: ExitCode.LINT_HAS_ERRORS,
|
|
6016
|
+
result: err("LINT_ERRORS_BLOCK_PUSH", {
|
|
6017
|
+
errors: fullErrors,
|
|
6018
|
+
buckets,
|
|
6019
|
+
message: "no origin base ref for delta; absolute lint errors block push"
|
|
6020
|
+
})
|
|
6021
|
+
};
|
|
6022
|
+
}
|
|
6023
|
+
} else {
|
|
6024
|
+
delta2 = { full_errors: 0, base_errors: 0, new_errors: 0, resolved_errors: 0 };
|
|
6025
|
+
}
|
|
6026
|
+
}
|
|
6027
|
+
let pushed2 = false;
|
|
6028
|
+
try {
|
|
6029
|
+
gitStrict(vault, ["push", "origin", "HEAD"]);
|
|
6030
|
+
pushed2 = true;
|
|
6031
|
+
} catch (e) {
|
|
6032
|
+
return {
|
|
6033
|
+
exitCode: ExitCode.SYNC_PUSH_FAILED,
|
|
6034
|
+
result: err("SYNC_PUSH_FAILED", {
|
|
6035
|
+
pushed: false,
|
|
6036
|
+
message: `push failed: ${String(e)}`
|
|
6037
|
+
})
|
|
6038
|
+
};
|
|
6039
|
+
}
|
|
6040
|
+
const inheritedNote2 = delta2.full_errors > 0 ? `; lint full=${delta2.full_errors} base=${delta2.base_errors} new=${delta2.new_errors} resolved=${delta2.resolved_errors} (inherited debt only)` : `; lint full=0 new=0`;
|
|
5964
6041
|
return {
|
|
5965
6042
|
exitCode: ExitCode.OK,
|
|
5966
6043
|
result: ok({
|
|
5967
6044
|
files_committed: 0,
|
|
5968
6045
|
commit_message: "",
|
|
5969
|
-
pushed:
|
|
6046
|
+
pushed: pushed2,
|
|
5970
6047
|
path_fixes: pathFixes,
|
|
5971
|
-
|
|
6048
|
+
lint_full_errors: delta2.full_errors,
|
|
6049
|
+
lint_base_errors: delta2.base_errors,
|
|
6050
|
+
lint_new_errors: delta2.new_errors,
|
|
6051
|
+
lint_resolved_errors: delta2.resolved_errors,
|
|
6052
|
+
humanHint: `pushed ${ahead} commit(s) on clean working tree${pathFixes > 0 ? ` after ${pathFixes} long-path fix(es)` : ""}${inheritedNote2}`
|
|
5972
6053
|
})
|
|
5973
6054
|
};
|
|
5974
6055
|
}
|
package/dist/cli.js
CHANGED
|
@@ -50,7 +50,7 @@ import {
|
|
|
50
50
|
snapshotterHealthChecks,
|
|
51
51
|
upsertIndexEntry,
|
|
52
52
|
vectorIndexStatus
|
|
53
|
-
} from "./chunk-
|
|
53
|
+
} from "./chunk-YKVJ2A3O.js";
|
|
54
54
|
import {
|
|
55
55
|
normalizeDistTag,
|
|
56
56
|
readCache,
|
|
@@ -151,7 +151,7 @@ import {
|
|
|
151
151
|
supersedeStaleReviewRequiredJournals,
|
|
152
152
|
taxonomyCommentForPage,
|
|
153
153
|
writeDotenv
|
|
154
|
-
} from "./chunk-
|
|
154
|
+
} from "./chunk-R5SDVKHS.js";
|
|
155
155
|
import {
|
|
156
156
|
assertTargetInsideVault,
|
|
157
157
|
atomicWriteText,
|
|
@@ -10410,7 +10410,7 @@ async function emitManagedVaultWrite(vault, command, mutate, opts) {
|
|
|
10410
10410
|
if (dirty) {
|
|
10411
10411
|
return emit(dirty, void 0, { postCommit: false });
|
|
10412
10412
|
}
|
|
10413
|
-
const { runManagedWriteTransaction: runManagedWriteTransaction2 } = await import("./managed-write-preflight-
|
|
10413
|
+
const { runManagedWriteTransaction: runManagedWriteTransaction2 } = await import("./managed-write-preflight-PUEJOXJO.js");
|
|
10414
10414
|
const run = await runManagedWriteTransaction2({
|
|
10415
10415
|
vault,
|
|
10416
10416
|
command,
|
package/dist/skillwiki-mcp.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
runSkillwikiMcpStdio
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-YKVJ2A3O.js";
|
|
5
5
|
import "./chunk-7I2TPIV5.js";
|
|
6
6
|
import "./chunk-KFEOMMWK.js";
|
|
7
|
-
import "./chunk-
|
|
7
|
+
import "./chunk-R5SDVKHS.js";
|
|
8
8
|
import "./chunk-BPJ5KWIT.js";
|
|
9
9
|
import "./chunk-NPTIYO2S.js";
|
|
10
10
|
import "./chunk-OMO45AHI.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "skillwiki",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.68",
|
|
4
4
|
"skills": "./",
|
|
5
5
|
"description": "Project-aware Karpathy-style knowledge base for Claude Code: 20 prompt-only skills (wiki-*, proj-*, using-skillwiki) backed by the deterministic `skillwiki` CLI.",
|
|
6
6
|
"author": {
|
package/skills/package.json
CHANGED
|
@@ -76,7 +76,7 @@ raw/
|
|
|
76
76
|
├── archived/{articles,papers,transcripts}/
|
|
77
77
|
└── duplicates/{articles,papers,transcripts}/
|
|
78
78
|
```
|
|
79
|
-
Use explicit vault-root asset embeds such as `![[raw/assets/example/diagram.png]]`. Agents may choose flat or URL-friendly nested paths. Once an immutable capture references an asset, that path freezes; routine source archive/dedup never moves the asset. Remote images remain external dependencies unless separately captured.
|
|
79
|
+
Use explicit vault-root asset embeds such as `![[raw/assets/example/diagram.png]]`. Agents may choose flat or URL-friendly nested paths. Once an immutable capture references an asset, that path freezes; routine source archive/dedup never moves the asset. Remote images remain external dependencies unless separately captured. When storing binaries under `raw/assets/`, also write a sibling Markdown note (`listings.md`, `note.md`, or a dated `.md`) that embeds each file. Never use `.txt` as the only index; Obsidian opens Markdown notes.
|
|
80
80
|
Raw frontmatter:
|
|
81
81
|
```yaml
|
|
82
82
|
---
|
|
@@ -287,7 +287,7 @@ skillwiki has multiple distribution channels that can drift:
|
|
|
287
287
|
| Claude plugin | `~/.claude/plugins/cache/llm-wiki/` | `claude plugin update skillwiki@llm-wiki` |
|
|
288
288
|
| Codex plugin | `~/.codex/plugins/cache/llm-wiki/` | `codex plugin marketplace upgrade llm-wiki`, then reinstall or restart Codex as needed |
|
|
289
289
|
| Grok plugin | `~/.grok/installed-plugins/` (marketplace cache under `~/.grok/marketplace-cache/`) | `grok plugin update skillwiki`, then start a new session or reload plugins |
|
|
290
|
-
| Cursor / Grok Bot (
|
|
290
|
+
| Cursor / Grok Bot (user GitHub add) | `~/.cursor/plugins/cache/llm-wiki/` and `~/.cursor/plugins/marketplaces/github.com/karlorz/llm-wiki/<sha>/` | `cursor-github-marketplace-repin` (`status.sh`). Team Dashboard Refresh only for a Team admin row. Reinstall does not move a pinned snapshot. |
|
|
291
291
|
| Local git dev | source repo checkout | `npm link ./packages/cli` (from repo root) |
|
|
292
292
|
**Check versions:** `skillwiki doctor` reports Plugin/CLI version mismatch warnings when installed channels disagree. For Grok, also inspect `~/.grok/installed-plugins/*/.claude-plugin/plugin.json` version and agent frontmatter under `agents/*.md`.
|
|
293
293
|
**Plugin channel rule:** Plugin-managed skills and agents are not refreshed with `skillwiki install`. When Claude, Codex, or Grok plugin is installed and enabled, the plugin install root is the skill/agent provider; `skillwiki install` is only a legacy/standalone copier for `~/.claude/skills/`.
|
|
@@ -10,7 +10,7 @@ Capture ad-hoc ideas, bugs, tasks, and notes into the vault. Three entry points
|
|
|
10
10
|
| Filesystem drop | Hermes Agent compact mode (no slash commands available) | Same as above — create `.md` in `raw/transcripts/`, dev-loop discovers it |
|
|
11
11
|
| Filesystem drop | You're NOT in a Claude session (Obsidian, editor, sync) | Create a new `.md` file in `raw/transcripts/` using the vault template — dev-loop discovers it on next cycle |
|
|
12
12
|
| Dev-loop discovery | Automatic, next cycle | Scans `raw/transcripts/` for new files since last cycle, surfaces as claimable work |
|
|
13
|
-
**Path Rule:** Captures ALWAYS go to `$(skillwiki path)/raw/transcripts/` (Layer 1). Never under `projects/{slug}/raw/` — that violates SCHEMA.md Layer 1 immutability.
|
|
13
|
+
**Path Rule:** Captures ALWAYS go to `$(skillwiki path)/raw/transcripts/` (Layer 1). Never under `projects/{slug}/raw/` — that violates SCHEMA.md Layer 1 immutability. Text captures stay in `raw/transcripts/`. If the capture includes images or other binaries, store those files under `raw/assets/` with a sibling Markdown note that embeds them; never use a .txt sidecar (such as `README.txt`) as the only index; Obsidian opens Markdown notes.
|
|
14
14
|
### Exception: Explicit project task requests
|
|
15
15
|
When the user explicitly says "raise task to project X", "add a task for X", "create a feature request for X", or uses a directive structure like "raise task to {project} {description}", the intent is a **work item**, not a capture:
|
|
16
16
|
| User wording | Action | Target |
|
|
@@ -92,6 +92,7 @@ Ad-hoc captures may omit `sha256`; omission does not grant mutation authority. O
|
|
|
92
92
|
- Creating a work item — this is capture-only. Use `proj-work` for full work items.
|
|
93
93
|
- Writing to any Layer 2 or Layer 3 location. Captures are Layer 1 (raw).
|
|
94
94
|
- Writing live credentials, access keys, tokens, passwords, cookies, bearer headers, private keys, or other authenticating secrets to the vault.
|
|
95
|
+
- Indexing `raw/assets/` binaries with only a `.txt` sidecar.
|
|
95
96
|
## Filesystem drop (offline capture)
|
|
96
97
|
When you're not in a Claude session, drop files directly into `raw/transcripts/`:
|
|
97
98
|
1. Create a `.md` file in `raw/transcripts/` — name it descriptively (e.g., `2026-05-08-idea-fix-template.md`)
|
|
@@ -65,6 +65,7 @@ Raw ephemeral data (market feeds, logs, transient JSON) must be written to the *
|
|
|
65
65
|
- Writing raw ephemeral data directly to cloud-mounted wiki paths (`~/wiki/`).
|
|
66
66
|
- Writing host-local absolute paths as canonical durable source references (see `using-skillwiki` → Portable Source References).
|
|
67
67
|
- Writing `[[wikilinks]]` to pages that don't exist in the vault. Before linking, verify the target exists: check `index.md` or `ls` the target directory. If the target doesn't exist yet, use plain text instead of a wikilink.
|
|
68
|
+
- Indexing `raw/assets/` binaries with only a `.txt` sidecar. Write a sibling Markdown note that embeds each file with `![[ ]]`.
|
|
68
69
|
## Batch Mode
|
|
69
70
|
When the user provides multiple sources (a directory of files, a list of URLs, or a multi-document input):
|
|
70
71
|
1. **Loop per source.** Execute steps 1–8 for each source individually, using one `skillwiki ingest` command per source.
|
|
@@ -37,7 +37,9 @@ None for the first run.
|
|
|
37
37
|
images remain external dependencies. An attended local-asset capture may
|
|
38
38
|
choose any URL-friendly path under `raw/assets/`, but it must write the asset,
|
|
39
39
|
emit an explicit vault-qualified `![[raw/assets/...]]` embed, verify
|
|
40
|
-
resolution/preview, and only then finalize the immutable raw note.
|
|
40
|
+
resolution/preview, and only then finalize the immutable raw note. Also write
|
|
41
|
+
a sibling Markdown note (`listings.md`, `note.md`, or a dated `.md`) that
|
|
42
|
+
embeds each file. Never use `.txt` as the only index.
|
|
41
43
|
8. **Suggest first sources.** Propose 3–5 initial sources (URLs, papers, articles) appropriate to the domain. Prompt the user to provide the first one to ingest, then hand off to wiki-ingest.
|
|
42
44
|
|
|
43
45
|
## Stop conditions
|
|
@@ -76,7 +76,7 @@ raw/
|
|
|
76
76
|
├── archived/{articles,papers,transcripts}/
|
|
77
77
|
└── duplicates/{articles,papers,transcripts}/
|
|
78
78
|
```
|
|
79
|
-
Use explicit vault-root asset embeds such as `![[raw/assets/example/diagram.png]]`. Agents may choose flat or URL-friendly nested paths. Once an immutable capture references an asset, that path freezes; routine source archive/dedup never moves the asset. Remote images remain external dependencies unless separately captured.
|
|
79
|
+
Use explicit vault-root asset embeds such as `![[raw/assets/example/diagram.png]]`. Agents may choose flat or URL-friendly nested paths. Once an immutable capture references an asset, that path freezes; routine source archive/dedup never moves the asset. Remote images remain external dependencies unless separately captured. When storing binaries under `raw/assets/`, also write a sibling Markdown note (`listings.md`, `note.md`, or a dated `.md`) that embeds each file. Never use `.txt` as the only index; Obsidian opens Markdown notes.
|
|
80
80
|
Raw frontmatter:
|
|
81
81
|
```yaml
|
|
82
82
|
---
|
|
@@ -287,7 +287,7 @@ skillwiki has multiple distribution channels that can drift:
|
|
|
287
287
|
| Claude plugin | `~/.claude/plugins/cache/llm-wiki/` | `claude plugin update skillwiki@llm-wiki` |
|
|
288
288
|
| Codex plugin | `~/.codex/plugins/cache/llm-wiki/` | `codex plugin marketplace upgrade llm-wiki`, then reinstall or restart Codex as needed |
|
|
289
289
|
| Grok plugin | `~/.grok/installed-plugins/` (marketplace cache under `~/.grok/marketplace-cache/`) | `grok plugin update skillwiki`, then start a new session or reload plugins |
|
|
290
|
-
| Cursor / Grok Bot (
|
|
290
|
+
| Cursor / Grok Bot (user GitHub add) | `~/.cursor/plugins/cache/llm-wiki/` and `~/.cursor/plugins/marketplaces/github.com/karlorz/llm-wiki/<sha>/` | `cursor-github-marketplace-repin` (`status.sh`). Team Dashboard Refresh only for a Team admin row. Reinstall does not move a pinned snapshot. |
|
|
291
291
|
| Local git dev | source repo checkout | `npm link ./packages/cli` (from repo root) |
|
|
292
292
|
**Check versions:** `skillwiki doctor` reports Plugin/CLI version mismatch warnings when installed channels disagree. For Grok, also inspect `~/.grok/installed-plugins/*/.claude-plugin/plugin.json` version and agent frontmatter under `agents/*.md`.
|
|
293
293
|
**Plugin channel rule:** Plugin-managed skills and agents are not refreshed with `skillwiki install`. When Claude, Codex, or Grok plugin is installed and enabled, the plugin install root is the skill/agent provider; `skillwiki install` is only a legacy/standalone copier for `~/.claude/skills/`.
|
|
@@ -10,7 +10,7 @@ Capture ad-hoc ideas, bugs, tasks, and notes into the vault. Three entry points
|
|
|
10
10
|
| Filesystem drop | Hermes Agent compact mode (no slash commands available) | Same as above — create `.md` in `raw/transcripts/`, dev-loop discovers it |
|
|
11
11
|
| Filesystem drop | You're NOT in a Claude session (Obsidian, editor, sync) | Create a new `.md` file in `raw/transcripts/` using the vault template — dev-loop discovers it on next cycle |
|
|
12
12
|
| Dev-loop discovery | Automatic, next cycle | Scans `raw/transcripts/` for new files since last cycle, surfaces as claimable work |
|
|
13
|
-
**Path Rule:** Captures ALWAYS go to `$(skillwiki path)/raw/transcripts/` (Layer 1). Never under `projects/{slug}/raw/` — that violates SCHEMA.md Layer 1 immutability.
|
|
13
|
+
**Path Rule:** Captures ALWAYS go to `$(skillwiki path)/raw/transcripts/` (Layer 1). Never under `projects/{slug}/raw/` — that violates SCHEMA.md Layer 1 immutability. Text captures stay in `raw/transcripts/`. If the capture includes images or other binaries, store those files under `raw/assets/` with a sibling Markdown note that embeds them; never use a .txt sidecar (such as `README.txt`) as the only index; Obsidian opens Markdown notes.
|
|
14
14
|
### Exception: Explicit project task requests
|
|
15
15
|
When the user explicitly says "raise task to project X", "add a task for X", "create a feature request for X", or uses a directive structure like "raise task to {project} {description}", the intent is a **work item**, not a capture:
|
|
16
16
|
| User wording | Action | Target |
|
|
@@ -92,6 +92,7 @@ Ad-hoc captures may omit `sha256`; omission does not grant mutation authority. O
|
|
|
92
92
|
- Creating a work item — this is capture-only. Use `proj-work` for full work items.
|
|
93
93
|
- Writing to any Layer 2 or Layer 3 location. Captures are Layer 1 (raw).
|
|
94
94
|
- Writing live credentials, access keys, tokens, passwords, cookies, bearer headers, private keys, or other authenticating secrets to the vault.
|
|
95
|
+
- Indexing `raw/assets/` binaries with only a `.txt` sidecar.
|
|
95
96
|
## Filesystem drop (offline capture)
|
|
96
97
|
When you're not in a Claude session, drop files directly into `raw/transcripts/`:
|
|
97
98
|
1. Create a `.md` file in `raw/transcripts/` — name it descriptively (e.g., `2026-05-08-idea-fix-template.md`)
|
|
@@ -65,6 +65,7 @@ Raw ephemeral data (market feeds, logs, transient JSON) must be written to the *
|
|
|
65
65
|
- Writing raw ephemeral data directly to cloud-mounted wiki paths (`~/wiki/`).
|
|
66
66
|
- Writing host-local absolute paths as canonical durable source references (see `using-skillwiki` → Portable Source References).
|
|
67
67
|
- Writing `[[wikilinks]]` to pages that don't exist in the vault. Before linking, verify the target exists: check `index.md` or `ls` the target directory. If the target doesn't exist yet, use plain text instead of a wikilink.
|
|
68
|
+
- Indexing `raw/assets/` binaries with only a `.txt` sidecar. Write a sibling Markdown note that embeds each file with `![[ ]]`.
|
|
68
69
|
## Batch Mode
|
|
69
70
|
When the user provides multiple sources (a directory of files, a list of URLs, or a multi-document input):
|
|
70
71
|
1. **Loop per source.** Execute steps 1–8 for each source individually, using one `skillwiki ingest` command per source.
|
|
@@ -37,7 +37,9 @@ None for the first run.
|
|
|
37
37
|
images remain external dependencies. An attended local-asset capture may
|
|
38
38
|
choose any URL-friendly path under `raw/assets/`, but it must write the asset,
|
|
39
39
|
emit an explicit vault-qualified `![[raw/assets/...]]` embed, verify
|
|
40
|
-
resolution/preview, and only then finalize the immutable raw note.
|
|
40
|
+
resolution/preview, and only then finalize the immutable raw note. Also write
|
|
41
|
+
a sibling Markdown note (`listings.md`, `note.md`, or a dated `.md`) that
|
|
42
|
+
embeds each file. Never use `.txt` as the only index.
|
|
41
43
|
8. **Suggest first sources.** Propose 3–5 initial sources (URLs, papers, articles) appropriate to the domain. Prompt the user to provide the first one to ingest, then hand off to wiki-ingest.
|
|
42
44
|
|
|
43
45
|
## Stop conditions
|
package/templates/SCHEMA.md
CHANGED
|
@@ -117,6 +117,7 @@ project: # optional: "[[slug]]" for cross-reference
|
|
|
117
117
|
- **Stable asset pool:** binary assets may use any flat or URL-friendly nested path under `raw/assets/`; no fixed internal taxonomy such as papers/transcripts is required.
|
|
118
118
|
- Use explicit vault-root embeds such as `![[raw/assets/example/diagram.png]]` so Obsidian preview and GitHub browsing remain unambiguous.
|
|
119
119
|
- Resolve and preview a new local embed before finalizing its raw capture. Once referenced, the asset path freezes; source archive/dedup does not move it. Remote HTTP(S) images remain external dependencies unless separately captured.
|
|
120
|
+
- **Asset notes:** When storing binaries under `raw/assets/`, also write a sibling Markdown note (`listings.md`, `note.md`, or a dated `.md`) that embeds each file with `![[filename.png]]` or vault-root `![[raw/assets/<dir>/<file>]]`. A `.txt` sidecar is never the only index; Obsidian opens Markdown notes, not `.txt`.
|
|
120
121
|
- **Dataview queries** (read-only; do not replace index.md):
|
|
121
122
|
|
|
122
123
|
```dataview
|