knowzcode 0.3.3 → 0.3.7
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/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +1 -1
- package/agents/closer.md +102 -15
- package/agents/knowz-scribe.md +60 -35
- package/agents/project-advisor.md +4 -3
- package/commands/connect-mcp.md +5 -5
- package/commands/learn.md +6 -1
- package/commands/register.md +5 -5
- package/commands/status.md +1 -1
- package/commands/work.md +58 -14
- package/knowzcode/knowzcode_loop.md +16 -3
- package/knowzcode/knowzcode_vaults.md +37 -13
- package/knowzcode/platform_adapters.md +55 -29
- package/package.json +1 -1
- package/skills/alias-resolver.json +15 -15
- package/skills/architecture-diff.json +12 -12
- package/skills/check-installation-status.json +14 -14
- package/skills/environment-guard.json +12 -12
- package/skills/generate-workgroup-id.json +25 -25
- package/skills/install-knowzcode.json +21 -21
- package/skills/load-core-context.json +18 -18
- package/skills/log-entry-builder.json +15 -15
- package/skills/spec-quality-check.json +14 -14
- package/skills/spec-template.json +15 -15
- package/skills/spec-validator.json +25 -25
- package/skills/tracker-scan.json +12 -12
- package/skills/tracker-update.json +28 -28
- package/skills/validate-installation.json +14 -14
|
@@ -327,6 +327,8 @@ All phases work without MCP. MCP enhances analysis depth and organizational lear
|
|
|
327
327
|
|
|
328
328
|
## 7. Learning Capture (Optional)
|
|
329
329
|
|
|
330
|
+
> **Vault content must be detailed and self-contained.** Vault entries are retrieved via semantic search — not read directly like local files. Include full reasoning, specific technology names, code examples, and file paths. See `knowzcode/knowzcode_vaults.md` Content Detail Principle.
|
|
331
|
+
|
|
330
332
|
During finalization, scan the WorkGroup for insight-worthy patterns:
|
|
331
333
|
|
|
332
334
|
| Signal Type | Examples |
|
|
@@ -336,6 +338,9 @@ During finalization, scan the WorkGroup for insight-worthy patterns:
|
|
|
336
338
|
| Workaround | "workaround", "limitation", "can't do X so" |
|
|
337
339
|
| Performance | "optimized", "reduced from X to Y", "cache" |
|
|
338
340
|
| Security | "vulnerability", "sanitize", "authentication fix" |
|
|
341
|
+
| Convention | "established convention", "team standard", "naming pattern", "agreed to always" |
|
|
342
|
+
| Integration | "API integration", "upstream API changed", "service dependency", "webhook" |
|
|
343
|
+
| Scope | "included because", "excluded because", "out of scope", "deferred to" |
|
|
339
344
|
|
|
340
345
|
### Auto-Capture Triggers
|
|
341
346
|
|
|
@@ -351,13 +356,21 @@ At each quality gate, send a message to the knowz-scribe with the phase identifi
|
|
|
351
356
|
|
|
352
357
|
The knowz-scribe reads the WorkGroup file, extracts relevant data, checks for duplicates, and writes to the appropriate vault. No other agent should call `create_knowledge` when the scribe is active.
|
|
353
358
|
|
|
359
|
+
**Ad-hoc captures (any agent, any time):**
|
|
360
|
+
|
|
361
|
+
Any agent can send knowledge to the knowz-scribe outside phase boundaries:
|
|
362
|
+
- `"Log: {description}"` — explicit capture, scribe must write it (decides vault routing)
|
|
363
|
+
- `"Consider: {description}"` — soft capture, scribe evaluates whether to log and where
|
|
364
|
+
|
|
365
|
+
The scribe handles routing, dedup, and formatting for both modes. If MCP is unavailable, captures are queued to `knowzcode/pending_captures.md` for later sync.
|
|
366
|
+
|
|
354
367
|
**Single-agent / no scribe (direct MCP writes):**
|
|
355
368
|
|
|
356
369
|
If MCP is available but no knowz-scribe, resolve vault IDs from `knowzcode/knowzcode_vaults.md` before writing:
|
|
357
370
|
|
|
358
|
-
- After Phase 1A: `create_knowledge({ecosystem_vault}, title="Scope: {goal}", content="[
|
|
359
|
-
- After Phase 2A: Capture implementation patterns and workarounds discovered during TDD cycles
|
|
360
|
-
- After Phase 2B: `create_knowledge({ecosystem_vault}, title="Audit: {wgid} - {score}%", content="[
|
|
371
|
+
- After Phase 1A: `create_knowledge({ecosystem_vault}, title="Scope: {descriptive goal summary}", content="[CONTEXT] {problem description, what prompted this work, constraints}\n[INSIGHT] {scope decisions — what's included/excluded and why}\n[RATIONALE] {risk assessment with full reasoning, affected files, mitigation}\n[TAGS] scope, {domain}", tags=["scope", "{domain}"])`
|
|
372
|
+
- After Phase 2A: Capture implementation patterns and workarounds discovered during TDD cycles — include specific file paths, code examples, and the problem each pattern solves
|
|
373
|
+
- After Phase 2B: `create_knowledge({ecosystem_vault}, title="Audit: {wgid} - {score}% — {key finding summary}", content="[CONTEXT] {what was audited, scope of the review}\n[INSIGHT] {specific gaps with file paths and line references, security findings with severity reasoning}\n[RATIONALE] {gap resolution decisions — what was deferred vs fixed and why}\n[TAGS] audit, {domain}", tags=["audit", "{domain}"])`
|
|
361
374
|
- After Phase 2B (enterprise): If enterprise vault configured and compliance enabled, push audit results to enterprise vault
|
|
362
375
|
- After Phase 3: Capture architectural learnings and consolidation decisions (handled by closer agent)
|
|
363
376
|
|
|
@@ -124,16 +124,39 @@ On confirmation, each vault is created via the MCP `create_vault(name, descripti
|
|
|
124
124
|
|
|
125
125
|
Each vault type defines when it accepts writes (Write Conditions) and how content should be formatted (Content Filter).
|
|
126
126
|
|
|
127
|
+
### Content Detail Principle
|
|
128
|
+
|
|
129
|
+
Vault entries live in a vector search index — they are chunked and retrieved via semantic search. Unlike local files (specs, workgroups, logs) which are read directly and benefit from being scannable, vault entries must be **self-contained, detailed, and keyword-rich** because they are discovered by meaning, not by file path.
|
|
130
|
+
|
|
131
|
+
**Include in every vault entry:**
|
|
132
|
+
- Full reasoning and context — why, not just what
|
|
133
|
+
- Specific technology names, library versions, framework details
|
|
134
|
+
- Code examples, file paths, error messages where relevant
|
|
135
|
+
- Consequences and alternatives considered
|
|
136
|
+
|
|
137
|
+
**Anti-pattern** (poor search recall, useless when retrieved):
|
|
138
|
+
|
|
139
|
+
> `"[NodeIDs] AuthMiddleware\n[Risk] Medium"`
|
|
140
|
+
|
|
141
|
+
**Good pattern** (rich search matches, self-contained on retrieval):
|
|
142
|
+
|
|
143
|
+
> `[CONTEXT] During JWT authentication implementation for the Express API, the jsonwebtoken library's verify() method silently accepts expired tokens when clockTolerance is set above 0.`
|
|
144
|
+
> `[INSIGHT] Always set clockTolerance to 0 (default) and handle TokenExpiredError explicitly. Some tutorials suggest 30s tolerance which creates a security window where revoked tokens remain valid.`
|
|
145
|
+
> `[RATIONALE] A 30-second tolerance means stolen tokens stay usable after revocation. Our auth middleware in src/middleware/auth.ts now checks expiry with zero tolerance.`
|
|
146
|
+
> `[TAGS] security, jwt, express, authentication`
|
|
147
|
+
|
|
148
|
+
Write vault content as if the reader has no project context — they will find this entry via a search query months from now.
|
|
149
|
+
|
|
127
150
|
### code
|
|
128
151
|
|
|
129
152
|
**Write Conditions**: Learning category is Pattern, Workaround, or Performance.
|
|
130
153
|
|
|
131
154
|
**Content Filter**:
|
|
132
155
|
```
|
|
133
|
-
[CONTEXT] {
|
|
134
|
-
[PATTERN] {
|
|
135
|
-
[EXAMPLE] {
|
|
136
|
-
[TAGS] {learning category, domain, language}
|
|
156
|
+
[CONTEXT] {Where and why the pattern was encountered — include the component, framework, and problem being solved. Provide enough background for someone with no project familiarity.}
|
|
157
|
+
[PATTERN] {What was built or discovered — describe the approach, the key insight, and how it differs from the obvious/naive solution.}
|
|
158
|
+
[EXAMPLE] {Code snippet, usage example, or file path reference — concrete enough to be directly useful when retrieved.}
|
|
159
|
+
[TAGS] {learning category, domain, language, framework — include specific technology names for search discoverability}
|
|
137
160
|
```
|
|
138
161
|
|
|
139
162
|
### ecosystem
|
|
@@ -142,10 +165,10 @@ Each vault type defines when it accepts writes (Write Conditions) and how conten
|
|
|
142
165
|
|
|
143
166
|
**Content Filter**:
|
|
144
167
|
```
|
|
145
|
-
[CONTEXT] {
|
|
146
|
-
[INSIGHT] {
|
|
147
|
-
[RATIONALE] {
|
|
148
|
-
[TAGS] {learning category, domain}
|
|
168
|
+
[CONTEXT] {What prompted the decision — the problem, the alternatives considered, and the constraints. Include component names and file paths where relevant.}
|
|
169
|
+
[INSIGHT] {The decision, convention, security finding, or integration detail — state it clearly and completely so it stands alone without context.}
|
|
170
|
+
[RATIONALE] {Why this approach was chosen over alternatives — include trade-offs, risks of the rejected options, and any conditions that might change this decision.}
|
|
171
|
+
[TAGS] {learning category, domain, specific technology names — be generous with tags for search discoverability}
|
|
149
172
|
```
|
|
150
173
|
|
|
151
174
|
### finalizations
|
|
@@ -154,11 +177,12 @@ Each vault type defines when it accepts writes (Write Conditions) and how conten
|
|
|
154
177
|
|
|
155
178
|
**Content Filter**:
|
|
156
179
|
```
|
|
157
|
-
[GOAL] {
|
|
158
|
-
[OUTCOME] {success | partial | abandoned}
|
|
159
|
-
[NODES] {NodeIDs changed}
|
|
160
|
-
[DURATION] {
|
|
161
|
-
[
|
|
180
|
+
[GOAL] {Original goal from WorkGroup — restate fully, not just the WorkGroup slug}
|
|
181
|
+
[OUTCOME] {success | partial | abandoned — include what was delivered and what was deferred}
|
|
182
|
+
[NODES] {NodeIDs changed — list each with a one-line summary of what it covers}
|
|
183
|
+
[DURATION] {Phases completed (e.g. "1A-3"), total iterations, any notable delays or blockers}
|
|
184
|
+
[SUMMARY] {Key learnings from this WorkGroup — architectural discoveries, patterns established, gotchas encountered. This is the most valuable field for future search queries.}
|
|
185
|
+
[TAGS] {finalization, domain, outcome, key technology names}
|
|
162
186
|
```
|
|
163
187
|
|
|
164
188
|
---
|
|
@@ -58,17 +58,28 @@ Specialized agents handle each phase when using Agent Teams or subagent executio
|
|
|
58
58
|
If configured, agents use `search_knowledge`, `ask_question`, and `create_knowledge` for enhanced context.
|
|
59
59
|
All commands work without MCP — it enhances but never blocks.
|
|
60
60
|
|
|
61
|
-
###
|
|
62
|
-
|
|
63
|
-
|
|
61
|
+
### Knowledge Capture (CRITICAL — DO NOT SKIP)
|
|
62
|
+
Every piece of durable knowledge — decisions, patterns, gotchas, workarounds, convention changes —
|
|
63
|
+
**must** be captured. Knowledge lives in two places:
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
65
|
+
- **MCP vaults** (when connected): `knowzcode/knowzcode_vaults.md` defines vault IDs, routing rules,
|
|
66
|
+
and write conditions. Always pass `vaultId` when calling `create_knowledge` — omitting it saves
|
|
67
|
+
to the tenant default vault, NOT the project vault.
|
|
68
|
+
- **Local files** (always available): specs, workgroup files, log entries, architecture docs, and
|
|
69
|
+
`knowzcode/pending_captures.md` (scribe fallback queue when MCP is unavailable).
|
|
70
70
|
|
|
71
|
-
|
|
71
|
+
If MCP is not connected, knowledge still gets captured locally. Never let insights die in the conversation.
|
|
72
|
+
|
|
73
|
+
**Vault content detail**: Vault entries are retrieved via semantic search, not read directly like local files. Write detailed, self-contained entries with full reasoning, specific technology names, code examples, and file paths. Terse entries produce poor search results. See `knowzcode/knowzcode_vaults.md` Content Detail Principle.
|
|
74
|
+
|
|
75
|
+
### Knowz-Scribe Delegation
|
|
76
|
+
When knowz-scribe is active (Agent Teams mode), it owns all vault writes — do NOT call `create_knowledge` directly. Send knowledge to the scribe instead:
|
|
77
|
+
|
|
78
|
+
- **Phase captures**: Handled automatically at quality gates via task-tracked DMs
|
|
79
|
+
- **Explicit**: `"Log: {description}"` — scribe MUST write it; it decides routing (which vault or local file)
|
|
80
|
+
- **Soft**: `"Consider: {description}"` — scribe evaluates whether to capture and where; may skip if not insight-worthy or duplicative
|
|
81
|
+
|
|
82
|
+
Any agent can send ad-hoc knowledge to the scribe at any time. The scribe handles routing, dedup, and formatting. If MCP is unavailable, the scribe queues captures to `knowzcode/pending_captures.md` for later sync. When no scribe is active, use `/kc:learn "insight"` for automatic routing.
|
|
72
83
|
|
|
73
84
|
## WorkGroup Files
|
|
74
85
|
- Created in `knowzcode/workgroups/` (gitignored)
|
|
@@ -142,9 +153,12 @@ Read `knowzcode/knowzcode_loop.md` before starting any feature work.
|
|
|
142
153
|
- Every WorkGroup todo must start with `KnowzCode:` prefix
|
|
143
154
|
- Target <20 specs per project — consolidate when domains overlap
|
|
144
155
|
|
|
145
|
-
##
|
|
146
|
-
|
|
147
|
-
|
|
156
|
+
## Knowledge Capture (CRITICAL — DO NOT SKIP)
|
|
157
|
+
Every piece of durable knowledge — decisions, patterns, gotchas, workarounds — **must** be captured.
|
|
158
|
+
When MCP is connected, write to vaults per `knowzcode/knowzcode_vaults.md` — always pass `vaultId` with `create_knowledge`.
|
|
159
|
+
When MCP is unavailable, capture locally in specs, log entries, or docs. Never let insights die in the conversation.
|
|
160
|
+
Use `/kc:learn "insight"` for automatic routing.
|
|
161
|
+
Vault entries are retrieved via semantic search — write detailed, self-contained content. See `knowzcode/knowzcode_vaults.md` Content Detail Principle.
|
|
148
162
|
|
|
149
163
|
## Quick Fix (Micro-Fix)
|
|
150
164
|
For single-file, <50 line, no-ripple-effect changes:
|
|
@@ -258,9 +272,12 @@ Read these files before starting any feature work (use @import syntax for direct
|
|
|
258
272
|
- Log completions in `knowzcode/knowzcode_log.md`
|
|
259
273
|
- Target <20 specs — consolidate when domains overlap >50%
|
|
260
274
|
|
|
261
|
-
##
|
|
262
|
-
|
|
263
|
-
|
|
275
|
+
## Knowledge Capture (CRITICAL — DO NOT SKIP)
|
|
276
|
+
Every piece of durable knowledge — decisions, patterns, gotchas, workarounds — **must** be captured.
|
|
277
|
+
When MCP is connected, write to vaults per `knowzcode/knowzcode_vaults.md` — always pass `vaultId` with `create_knowledge`.
|
|
278
|
+
When MCP is unavailable, capture locally in specs, log entries, or docs. Never let insights die in the conversation.
|
|
279
|
+
Use `/kc:learn "insight"` for automatic routing.
|
|
280
|
+
Vault entries are retrieved via semantic search — write detailed, self-contained content. See `knowzcode/knowzcode_vaults.md` Content Detail Principle.
|
|
264
281
|
|
|
265
282
|
## Micro-Fix (for small changes)
|
|
266
283
|
Single file, <50 lines, no ripple effects:
|
|
@@ -330,9 +347,12 @@ Before any feature work, read:
|
|
|
330
347
|
- Read `knowzcode/knowzcode_tracker.md` for active work
|
|
331
348
|
- Log completions in `knowzcode/knowzcode_log.md`
|
|
332
349
|
|
|
333
|
-
##
|
|
334
|
-
|
|
335
|
-
|
|
350
|
+
## Knowledge Capture (CRITICAL — DO NOT SKIP)
|
|
351
|
+
Every piece of durable knowledge — decisions, patterns, gotchas, workarounds — **must** be captured.
|
|
352
|
+
When MCP is connected, write to vaults per `knowzcode/knowzcode_vaults.md` — always pass `vaultId` with `create_knowledge`.
|
|
353
|
+
When MCP is unavailable, capture locally in specs, log entries, or docs. Never let insights die in the conversation.
|
|
354
|
+
Use `/kc:learn "insight"` for automatic routing.
|
|
355
|
+
Vault entries are retrieved via semantic search — write detailed, self-contained content. See `knowzcode/knowzcode_vaults.md` Content Detail Principle.
|
|
336
356
|
```
|
|
337
357
|
|
|
338
358
|
---
|
|
@@ -426,9 +446,12 @@ Follow Red-Green-Refactor for every feature/criterion in the spec.
|
|
|
426
446
|
If configured in `.vscode/mcp.json`, use `search_knowledge` and `ask_question` tools
|
|
427
447
|
for enhanced context from knowledge vaults. All prompts work without MCP.
|
|
428
448
|
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
449
|
+
## Knowledge Capture (CRITICAL — DO NOT SKIP)
|
|
450
|
+
Every piece of durable knowledge — decisions, patterns, gotchas, workarounds — **must** be captured.
|
|
451
|
+
When MCP is connected, write to vaults per `knowzcode/knowzcode_vaults.md` — always pass `vaultId` with `create_knowledge`.
|
|
452
|
+
When MCP is unavailable, capture locally in specs, log entries, or docs. Never let insights die in the conversation.
|
|
453
|
+
Use `/kc:learn "insight"` for automatic routing.
|
|
454
|
+
Vault entries are retrieved via semantic search — write detailed, self-contained content. See `knowzcode/knowzcode_vaults.md` Content Detail Principle.
|
|
432
455
|
|
|
433
456
|
## Copilot Coding Agent
|
|
434
457
|
|
|
@@ -900,22 +923,22 @@ Optionally generated by `/kc:init` when Copilot is detected and MCP is configure
|
|
|
900
923
|
```json
|
|
901
924
|
{
|
|
902
925
|
"servers": {
|
|
903
|
-
"
|
|
926
|
+
"knowz": {
|
|
904
927
|
"type": "http",
|
|
905
|
-
"url": "${input:
|
|
928
|
+
"url": "${input:knowz_mcp_url}",
|
|
906
929
|
"headers": {
|
|
907
|
-
"x-api-key": "${input:
|
|
930
|
+
"x-api-key": "${input:knowz_api_key}"
|
|
908
931
|
}
|
|
909
932
|
}
|
|
910
933
|
},
|
|
911
934
|
"inputs": [
|
|
912
935
|
{
|
|
913
|
-
"id": "
|
|
936
|
+
"id": "knowz_mcp_url",
|
|
914
937
|
"description": "KnowzCode MCP server URL",
|
|
915
938
|
"type": "promptString"
|
|
916
939
|
},
|
|
917
940
|
{
|
|
918
|
-
"id": "
|
|
941
|
+
"id": "knowz_api_key",
|
|
919
942
|
"description": "KnowzCode API key",
|
|
920
943
|
"type": "promptString",
|
|
921
944
|
"password": true
|
|
@@ -1001,9 +1024,12 @@ Follow `knowzcode/knowzcode_loop.md` for all feature development.
|
|
|
1001
1024
|
- Target <20 specs per project
|
|
1002
1025
|
- Every WorkGroup todo starts with `KnowzCode:` prefix
|
|
1003
1026
|
|
|
1004
|
-
##
|
|
1005
|
-
|
|
1006
|
-
|
|
1027
|
+
## Knowledge Capture (CRITICAL — DO NOT SKIP)
|
|
1028
|
+
Every piece of durable knowledge — decisions, patterns, gotchas, workarounds — **must** be captured.
|
|
1029
|
+
When MCP is connected, write to vaults per `knowzcode/knowzcode_vaults.md` — always pass `vaultId` with `create_knowledge`.
|
|
1030
|
+
When MCP is unavailable, capture locally in specs, log entries, or docs. Never let insights die in the conversation.
|
|
1031
|
+
Use `/kc:learn "insight"` for automatic routing.
|
|
1032
|
+
Vault entries are retrieved via semantic search — write detailed, self-contained content. See `knowzcode/knowzcode_vaults.md` Content Detail Principle.
|
|
1007
1033
|
|
|
1008
1034
|
## Micro-Fix (for small changes)
|
|
1009
1035
|
Single file, <50 lines, no ripple effects:
|
package/package.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "alias-resolver",
|
|
3
|
-
"version": "0.3.
|
|
4
|
-
"description": "Resolves friendly natural-language aliases to KnowzCode canonical values (phase, audit, plan, workgroup_type).",
|
|
5
|
-
"parameters": [
|
|
6
|
-
{"name": "domain", "type": "string", "required": true},
|
|
7
|
-
{"name": "text", "type": "string", "required": false}
|
|
8
|
-
],
|
|
9
|
-
"actions": [
|
|
10
|
-
{
|
|
11
|
-
"type": "python",
|
|
12
|
-
"code": "domain = (inputs.get('domain') or '').strip().lower()\ntext = (inputs.get('text') or '').strip().lower()\nresult = {'value': None}\nphase_map = {\n '1a': {'agent': 'analyst', 'prompt': 'knowzcode/prompts/[LOOP_1A]__Propose_Change_Set.md'},\n '1b': {'agent': 'architect', 'prompt': 'knowzcode/prompts/[LOOP_1B]__Draft_Specs.md'},\n '2a': {'agent': 'builder', 'prompt': 'knowzcode/prompts/[LOOP_2A]__Implement_Change_Set.md'},\n '2b': {'agent': 'reviewer', 'prompt': 'knowzcode/prompts/[LOOP_2B]__Verify_Implementation.md'},\n '3': {'agent': 'closer', 'prompt': 'knowzcode/prompts/[LOOP_3]__Finalize_And_Commit.md'}\n}\nphase_synonyms = {\n '1a': ['1a','loop 1a','analyze','analysis','impact','scope','change set','proposal'],\n '1b': ['1b','loop 1b','spec','specs','draft','design','blueprint'],\n '2a': ['2a','loop 2a','implement','implementation','build','code','develop'],\n '2b': ['2b','loop 2b','verify','verification','audit','test','qa','review'],\n '3': ['3','loop 3','final','finalize','finalization','commit','wrap up','close']\n}\naudit_map = {\n 'spec': 'knowzcode/prompts/Spec_Verification_Checkpoint.md',\n 'implementation': 'knowzcode/prompts/[LOOP_2B]__Verify_Implementation.md',\n 'architecture': None,\n 'security': None,\n 'integration': None\n}\naudit_synonyms = {\n 'spec': ['spec','specs','specification','checkpoint'],\n 'implementation': ['implementation','code','verify implementation','loop 2b'],\n 'architecture': ['architecture','arch','diagram','flowchart','structure'],\n 'security': ['security','sec','owasp','vulnerability'],\n 'integration': ['integration','holistic','system','end to end','e2e']\n}\nworkgroup_map = {'feat': 'feat','feature': 'feat','fix': 'fix','bug': 'fix','bugfix': 'fix','refactor': 'refactor','cleanup': 'refactor','issue': 'issue','incident': 'issue'}\nif domain == 'phase':\n if not text:\n key = '1a'\n else:\n key = None\n for canonical, synonyms in phase_synonyms.items():\n if text == canonical or text in synonyms or any(s in text for s in synonyms):\n key = canonical\n break\n if key is None:\n for canonical in phase_map.keys():\n if text.replace(' ','') == canonical:\n key = canonical\n break\n if key is None:\n key = '1a'\n data = phase_map[key]\n result['value'] = key.upper()\n result['prompt'] = data['prompt']\n result['agent'] = data['agent']\n result['requires_workgroup'] = data['agent'] != 'analyst'\nelif domain == 'audit':\n if not text:\n key = 'spec'\n else:\n key = None\n for canonical, synonyms in audit_synonyms.items():\n if text == canonical or text in synonyms or any(s in text for s in synonyms):\n key = canonical\n break\n if key is None:\n key = 'spec'\n result['value'] = key\n result['prompt'] = audit_map.get(key)\n result['agent'] = 'reviewer'\nelif domain == 'plan':\n result['value'] = text or ''\n result['prompt'] = None\nelif domain == 'workgroup_type':\n if not text:\n value = 'feat'\n else:\n value = None\n for key, mapped in workgroup_map.items():\n if text == key or key in text:\n value = mapped\n break\n if value is None:\n value = workgroup_map.get(text, 'feat')\n result['value'] = value\nelse:\n result['value'] = text or ''\noutputs.update(result)\n"
|
|
13
|
-
}
|
|
14
|
-
]
|
|
15
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "alias-resolver",
|
|
3
|
+
"version": "0.3.7",
|
|
4
|
+
"description": "Resolves friendly natural-language aliases to KnowzCode canonical values (phase, audit, plan, workgroup_type).",
|
|
5
|
+
"parameters": [
|
|
6
|
+
{"name": "domain", "type": "string", "required": true},
|
|
7
|
+
{"name": "text", "type": "string", "required": false}
|
|
8
|
+
],
|
|
9
|
+
"actions": [
|
|
10
|
+
{
|
|
11
|
+
"type": "python",
|
|
12
|
+
"code": "domain = (inputs.get('domain') or '').strip().lower()\ntext = (inputs.get('text') or '').strip().lower()\nresult = {'value': None}\nphase_map = {\n '1a': {'agent': 'analyst', 'prompt': 'knowzcode/prompts/[LOOP_1A]__Propose_Change_Set.md'},\n '1b': {'agent': 'architect', 'prompt': 'knowzcode/prompts/[LOOP_1B]__Draft_Specs.md'},\n '2a': {'agent': 'builder', 'prompt': 'knowzcode/prompts/[LOOP_2A]__Implement_Change_Set.md'},\n '2b': {'agent': 'reviewer', 'prompt': 'knowzcode/prompts/[LOOP_2B]__Verify_Implementation.md'},\n '3': {'agent': 'closer', 'prompt': 'knowzcode/prompts/[LOOP_3]__Finalize_And_Commit.md'}\n}\nphase_synonyms = {\n '1a': ['1a','loop 1a','analyze','analysis','impact','scope','change set','proposal'],\n '1b': ['1b','loop 1b','spec','specs','draft','design','blueprint'],\n '2a': ['2a','loop 2a','implement','implementation','build','code','develop'],\n '2b': ['2b','loop 2b','verify','verification','audit','test','qa','review'],\n '3': ['3','loop 3','final','finalize','finalization','commit','wrap up','close']\n}\naudit_map = {\n 'spec': 'knowzcode/prompts/Spec_Verification_Checkpoint.md',\n 'implementation': 'knowzcode/prompts/[LOOP_2B]__Verify_Implementation.md',\n 'architecture': None,\n 'security': None,\n 'integration': None\n}\naudit_synonyms = {\n 'spec': ['spec','specs','specification','checkpoint'],\n 'implementation': ['implementation','code','verify implementation','loop 2b'],\n 'architecture': ['architecture','arch','diagram','flowchart','structure'],\n 'security': ['security','sec','owasp','vulnerability'],\n 'integration': ['integration','holistic','system','end to end','e2e']\n}\nworkgroup_map = {'feat': 'feat','feature': 'feat','fix': 'fix','bug': 'fix','bugfix': 'fix','refactor': 'refactor','cleanup': 'refactor','issue': 'issue','incident': 'issue'}\nif domain == 'phase':\n if not text:\n key = '1a'\n else:\n key = None\n for canonical, synonyms in phase_synonyms.items():\n if text == canonical or text in synonyms or any(s in text for s in synonyms):\n key = canonical\n break\n if key is None:\n for canonical in phase_map.keys():\n if text.replace(' ','') == canonical:\n key = canonical\n break\n if key is None:\n key = '1a'\n data = phase_map[key]\n result['value'] = key.upper()\n result['prompt'] = data['prompt']\n result['agent'] = data['agent']\n result['requires_workgroup'] = data['agent'] != 'analyst'\nelif domain == 'audit':\n if not text:\n key = 'spec'\n else:\n key = None\n for canonical, synonyms in audit_synonyms.items():\n if text == canonical or text in synonyms or any(s in text for s in synonyms):\n key = canonical\n break\n if key is None:\n key = 'spec'\n result['value'] = key\n result['prompt'] = audit_map.get(key)\n result['agent'] = 'reviewer'\nelif domain == 'plan':\n result['value'] = text or ''\n result['prompt'] = None\nelif domain == 'workgroup_type':\n if not text:\n value = 'feat'\n else:\n value = None\n for key, mapped in workgroup_map.items():\n if text == key or key in text:\n value = mapped\n break\n if value is None:\n value = workgroup_map.get(text, 'feat')\n result['value'] = value\nelse:\n result['value'] = text or ''\noutputs.update(result)\n"
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "architecture-diff",
|
|
3
|
-
"version": "0.3.
|
|
4
|
-
"description": "Highlights differences between specs and the Mermaid flowchart in knowzcode_architecture.md.",
|
|
5
|
-
"parameters": [],
|
|
6
|
-
"actions": [
|
|
7
|
-
{
|
|
8
|
-
"type": "python",
|
|
9
|
-
"code": "from pathlib import Path\nimport re\narch = Path('knowzcode/knowzcode_architecture.md').read_text()\nspec_paths = list(Path('knowzcode/specs').glob('*.md'))\nnode_ids = {p.stem for p in spec_paths}\nmermaid_nodes = set(re.findall(r'([A-Z]{2,}_[A-Za-z0-9]+)', arch))\nmissing_in_arch = sorted(node_ids - mermaid_nodes)\nmissing_in_specs = sorted(mermaid_nodes - node_ids)\noutputs['missing_in_architecture'] = missing_in_arch\noutputs['missing_specs'] = missing_in_specs\n"
|
|
10
|
-
}
|
|
11
|
-
]
|
|
12
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "architecture-diff",
|
|
3
|
+
"version": "0.3.7",
|
|
4
|
+
"description": "Highlights differences between specs and the Mermaid flowchart in knowzcode_architecture.md.",
|
|
5
|
+
"parameters": [],
|
|
6
|
+
"actions": [
|
|
7
|
+
{
|
|
8
|
+
"type": "python",
|
|
9
|
+
"code": "from pathlib import Path\nimport re\narch = Path('knowzcode/knowzcode_architecture.md').read_text()\nspec_paths = list(Path('knowzcode/specs').glob('*.md'))\nnode_ids = {p.stem for p in spec_paths}\nmermaid_nodes = set(re.findall(r'([A-Z]{2,}_[A-Za-z0-9]+)', arch))\nmissing_in_arch = sorted(node_ids - mermaid_nodes)\nmissing_in_specs = sorted(mermaid_nodes - node_ids)\noutputs['missing_in_architecture'] = missing_in_arch\noutputs['missing_specs'] = missing_in_specs\n"
|
|
10
|
+
}
|
|
11
|
+
]
|
|
12
|
+
}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "check-installation-status",
|
|
3
|
-
"version": "0.3.
|
|
4
|
-
"description": "Checks if KnowzCode is initialized in the current project and reports current status",
|
|
5
|
-
|
|
6
|
-
"parameters": [],
|
|
7
|
-
|
|
8
|
-
"actions": [
|
|
9
|
-
{
|
|
10
|
-
"type": "python",
|
|
11
|
-
"code": "from pathlib import Path\n\nknowzcode_dir = Path('knowzcode')\n\nif not knowzcode_dir.exists():\n outputs['initialized'] = False\n outputs['commands_count'] = 0\n outputs['skills_count'] = 0\n outputs['agents_count'] = 0\n outputs['has_required_files'] = False\n exit()\n\n# Check required files exist\nrequired_files = [\n 'knowzcode_loop.md',\n 'knowzcode_tracker.md',\n 'knowzcode_project.md',\n 'knowzcode_architecture.md'\n]\n\nmissing_files = [f for f in required_files if not (knowzcode_dir / f).exists()]\nhas_required_files = len(missing_files) == 0\n\n# Count components from various possible locations\n\n# Check .claude directory\nclaude_dir = Path('.claude')\ncommands_count = 0\nskills_count = 0\nagents_count = 0\n\nif claude_dir.exists():\n if (claude_dir / 'commands').exists():\n commands_count = len(list((claude_dir / 'commands').glob('*.md')))\n if (claude_dir / 'skills').exists():\n skills_count = len(list((claude_dir / 'skills').glob('*.json')))\n if (claude_dir / 'agents').exists():\n agents_count = len(list((claude_dir / 'agents').glob('*.md')))\n if (claude_dir / 'subagents').exists():\n agents_count += len(list((claude_dir / 'subagents').glob('*.yaml')))\n\n# Also check top-level directories (plugin installation)\nif Path('commands').exists():\n commands_count = max(commands_count, len(list(Path('commands').glob('*.md'))))\nif Path('skills').exists():\n skills_count = max(skills_count, len(list(Path('skills').glob('*.json'))))\nif Path('agents').exists():\n agents_count = max(agents_count, len(list(Path('agents').glob('*.md'))))\n\noutputs['initialized'] = has_required_files\noutputs['commands_count'] = commands_count\noutputs['skills_count'] = skills_count\noutputs['agents_count'] = agents_count\noutputs['has_required_files'] = has_required_files\noutputs['missing_files'] = missing_files if missing_files else None"
|
|
12
|
-
}
|
|
13
|
-
]
|
|
14
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "check-installation-status",
|
|
3
|
+
"version": "0.3.7",
|
|
4
|
+
"description": "Checks if KnowzCode is initialized in the current project and reports current status",
|
|
5
|
+
|
|
6
|
+
"parameters": [],
|
|
7
|
+
|
|
8
|
+
"actions": [
|
|
9
|
+
{
|
|
10
|
+
"type": "python",
|
|
11
|
+
"code": "from pathlib import Path\n\nknowzcode_dir = Path('knowzcode')\n\nif not knowzcode_dir.exists():\n outputs['initialized'] = False\n outputs['commands_count'] = 0\n outputs['skills_count'] = 0\n outputs['agents_count'] = 0\n outputs['has_required_files'] = False\n exit()\n\n# Check required files exist\nrequired_files = [\n 'knowzcode_loop.md',\n 'knowzcode_tracker.md',\n 'knowzcode_project.md',\n 'knowzcode_architecture.md'\n]\n\nmissing_files = [f for f in required_files if not (knowzcode_dir / f).exists()]\nhas_required_files = len(missing_files) == 0\n\n# Count components from various possible locations\n\n# Check .claude directory\nclaude_dir = Path('.claude')\ncommands_count = 0\nskills_count = 0\nagents_count = 0\n\nif claude_dir.exists():\n if (claude_dir / 'commands').exists():\n commands_count = len(list((claude_dir / 'commands').glob('*.md')))\n if (claude_dir / 'skills').exists():\n skills_count = len(list((claude_dir / 'skills').glob('*.json')))\n if (claude_dir / 'agents').exists():\n agents_count = len(list((claude_dir / 'agents').glob('*.md')))\n if (claude_dir / 'subagents').exists():\n agents_count += len(list((claude_dir / 'subagents').glob('*.yaml')))\n\n# Also check top-level directories (plugin installation)\nif Path('commands').exists():\n commands_count = max(commands_count, len(list(Path('commands').glob('*.md'))))\nif Path('skills').exists():\n skills_count = max(skills_count, len(list(Path('skills').glob('*.json'))))\nif Path('agents').exists():\n agents_count = max(agents_count, len(list(Path('agents').glob('*.md'))))\n\noutputs['initialized'] = has_required_files\noutputs['commands_count'] = commands_count\noutputs['skills_count'] = skills_count\noutputs['agents_count'] = agents_count\noutputs['has_required_files'] = has_required_files\noutputs['missing_files'] = missing_files if missing_files else None"
|
|
12
|
+
}
|
|
13
|
+
]
|
|
14
|
+
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "environment-guard",
|
|
3
|
-
"version": "0.3.
|
|
4
|
-
"description": "Verifies that knowzcode/environment_context.md no longer contains placeholder brackets.",
|
|
5
|
-
"parameters": [],
|
|
6
|
-
"actions": [
|
|
7
|
-
{
|
|
8
|
-
"type": "python",
|
|
9
|
-
"code": "from pathlib import Path\ntext = Path('knowzcode/environment_context.md').read_text()\nplaceholders = [line.strip() for line in text.splitlines() if '[' in line and ']' in line]\nif placeholders:\n raise ValueError('environment_context.md still contains placeholders: ' + ', '.join(placeholders[:5]))\n"
|
|
10
|
-
}
|
|
11
|
-
]
|
|
12
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "environment-guard",
|
|
3
|
+
"version": "0.3.7",
|
|
4
|
+
"description": "Verifies that knowzcode/environment_context.md no longer contains placeholder brackets.",
|
|
5
|
+
"parameters": [],
|
|
6
|
+
"actions": [
|
|
7
|
+
{
|
|
8
|
+
"type": "python",
|
|
9
|
+
"code": "from pathlib import Path\ntext = Path('knowzcode/environment_context.md').read_text()\nplaceholders = [line.strip() for line in text.splitlines() if '[' in line and ']' in line]\nif placeholders:\n raise ValueError('environment_context.md still contains placeholders: ' + ', '.join(placeholders[:5]))\n"
|
|
10
|
+
}
|
|
11
|
+
]
|
|
12
|
+
}
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "generate-workgroup-id",
|
|
3
|
-
"version": "0.3.
|
|
4
|
-
"description": "Generates a WorkGroupID following the KnowzCode convention [type]-[slug]-YYYYMMDD-HHMMSS. The slug is a 2-4 word descriptor extracted from the goal.",
|
|
5
|
-
"parameters": [
|
|
6
|
-
{
|
|
7
|
-
"name": "type",
|
|
8
|
-
"type": "string",
|
|
9
|
-
"required": true,
|
|
10
|
-
"description": "One of feat, fix, refactor, issue"
|
|
11
|
-
},
|
|
12
|
-
{
|
|
13
|
-
"name": "slug",
|
|
14
|
-
"type": "string",
|
|
15
|
-
"required": false,
|
|
16
|
-
"description": "A 2-4 word kebab-case descriptor (e.g., 'auth-jwt', 'dark-mode'). If not provided, generates ID without slug."
|
|
17
|
-
}
|
|
18
|
-
],
|
|
19
|
-
"actions": [
|
|
20
|
-
{
|
|
21
|
-
"type": "python",
|
|
22
|
-
"code": "import datetime\nimport re\nallowed = {'feat', 'fix', 'refactor', 'issue'}\nwg_type = inputs['type']\nif wg_type not in allowed:\n raise ValueError(f'Invalid type {wg_type!r}, expected one of {sorted(allowed)}')\ntimestamp = datetime.datetime.utcnow().strftime('%Y%m%d-%H%M%S')\nslug = inputs.get('slug', '')\nif slug:\n # Sanitize slug: lowercase, replace spaces with hyphens, remove non-alphanumeric\n slug = re.sub(r'[^a-z0-9-]', '', slug.lower().replace(' ', '-'))\n slug = re.sub(r'-+', '-', slug).strip('-')[:25] # Max 25 chars\n outputs['workgroup_id'] = f'{wg_type}-{slug}-{timestamp}'\nelse:\n outputs['workgroup_id'] = f'{wg_type}-{timestamp}'"
|
|
23
|
-
}
|
|
24
|
-
]
|
|
25
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "generate-workgroup-id",
|
|
3
|
+
"version": "0.3.7",
|
|
4
|
+
"description": "Generates a WorkGroupID following the KnowzCode convention [type]-[slug]-YYYYMMDD-HHMMSS. The slug is a 2-4 word descriptor extracted from the goal.",
|
|
5
|
+
"parameters": [
|
|
6
|
+
{
|
|
7
|
+
"name": "type",
|
|
8
|
+
"type": "string",
|
|
9
|
+
"required": true,
|
|
10
|
+
"description": "One of feat, fix, refactor, issue"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"name": "slug",
|
|
14
|
+
"type": "string",
|
|
15
|
+
"required": false,
|
|
16
|
+
"description": "A 2-4 word kebab-case descriptor (e.g., 'auth-jwt', 'dark-mode'). If not provided, generates ID without slug."
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"actions": [
|
|
20
|
+
{
|
|
21
|
+
"type": "python",
|
|
22
|
+
"code": "import datetime\nimport re\nallowed = {'feat', 'fix', 'refactor', 'issue'}\nwg_type = inputs['type']\nif wg_type not in allowed:\n raise ValueError(f'Invalid type {wg_type!r}, expected one of {sorted(allowed)}')\ntimestamp = datetime.datetime.utcnow().strftime('%Y%m%d-%H%M%S')\nslug = inputs.get('slug', '')\nif slug:\n # Sanitize slug: lowercase, replace spaces with hyphens, remove non-alphanumeric\n slug = re.sub(r'[^a-z0-9-]', '', slug.lower().replace(' ', '-'))\n slug = re.sub(r'-+', '-', slug).strip('-')[:25] # Max 25 chars\n outputs['workgroup_id'] = f'{wg_type}-{slug}-{timestamp}'\nelse:\n outputs['workgroup_id'] = f'{wg_type}-{timestamp}'"
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "install-knowzcode",
|
|
3
|
-
"version": "0.3.
|
|
4
|
-
"description": "Initializes KnowzCode directory structure and required files in the current project",
|
|
5
|
-
|
|
6
|
-
"parameters": [
|
|
7
|
-
{
|
|
8
|
-
"name": "force",
|
|
9
|
-
"type": "boolean",
|
|
10
|
-
"required": false,
|
|
11
|
-
"description": "Force reinstall even if knowzcode/ exists"
|
|
12
|
-
}
|
|
13
|
-
],
|
|
14
|
-
|
|
15
|
-
"actions": [
|
|
16
|
-
{
|
|
17
|
-
"type": "python",
|
|
18
|
-
"code": "import os\nimport json\nfrom pathlib import Path\nfrom datetime import datetime\n\n# Configuration\ntarget_dir = Path('knowzcode')\nforce = inputs.get('force', False)\n\n# Check if target exists\nif target_dir.exists() and not force:\n outputs['success'] = False\n outputs['error'] = 'knowzcode/ already exists. Use force=true to reinitialize'\n outputs['already_installed'] = True\n exit()\n\n# Create directory structure\ntarget_dir.mkdir(exist_ok=True)\n(target_dir / 'specs').mkdir(exist_ok=True)\n(target_dir / 'workgroups').mkdir(exist_ok=True)\n(target_dir / 'prompts').mkdir(exist_ok=True)\n(target_dir / 'planning').mkdir(exist_ok=True)\n\n# Create .gitignore if it doesn't exist\ngitignore_path = target_dir / '.gitignore'\nif not gitignore_path.exists():\n gitignore_content = '''# KnowzCode gitignore - protects environment-specific files\n\n# Environment-specific (contains local paths, commands)\nenvironment_context.md\n\n# Session-specific work (can be regenerated)\nworkgroups/\n\n# Personal notes and scratch files\n*.local.md\n.scratch/\n'''\n with open(gitignore_path, 'w') as f:\n f.write(gitignore_content)\n\n# Note: The actual template files (knowzcode_loop.md, etc.) should be copied\n# from the plugin template directory or created by the /kc:init command.\n# This skill creates the structure; the command copies the content.\n\noutputs['success'] = True\noutputs['target_dir'] = str(target_dir)\noutputs['directories_created'] = ['specs', 'workgroups', 'prompts', 'planning']\noutputs['gitignore_created'] = not gitignore_path.exists()\noutputs['message'] = f'KnowzCode directory structure created at {target_dir}/'"
|
|
19
|
-
}
|
|
20
|
-
]
|
|
21
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "install-knowzcode",
|
|
3
|
+
"version": "0.3.7",
|
|
4
|
+
"description": "Initializes KnowzCode directory structure and required files in the current project",
|
|
5
|
+
|
|
6
|
+
"parameters": [
|
|
7
|
+
{
|
|
8
|
+
"name": "force",
|
|
9
|
+
"type": "boolean",
|
|
10
|
+
"required": false,
|
|
11
|
+
"description": "Force reinstall even if knowzcode/ exists"
|
|
12
|
+
}
|
|
13
|
+
],
|
|
14
|
+
|
|
15
|
+
"actions": [
|
|
16
|
+
{
|
|
17
|
+
"type": "python",
|
|
18
|
+
"code": "import os\nimport json\nfrom pathlib import Path\nfrom datetime import datetime\n\n# Configuration\ntarget_dir = Path('knowzcode')\nforce = inputs.get('force', False)\n\n# Check if target exists\nif target_dir.exists() and not force:\n outputs['success'] = False\n outputs['error'] = 'knowzcode/ already exists. Use force=true to reinitialize'\n outputs['already_installed'] = True\n exit()\n\n# Create directory structure\ntarget_dir.mkdir(exist_ok=True)\n(target_dir / 'specs').mkdir(exist_ok=True)\n(target_dir / 'workgroups').mkdir(exist_ok=True)\n(target_dir / 'prompts').mkdir(exist_ok=True)\n(target_dir / 'planning').mkdir(exist_ok=True)\n\n# Create .gitignore if it doesn't exist\ngitignore_path = target_dir / '.gitignore'\nif not gitignore_path.exists():\n gitignore_content = '''# KnowzCode gitignore - protects environment-specific files\n\n# Environment-specific (contains local paths, commands)\nenvironment_context.md\n\n# Session-specific work (can be regenerated)\nworkgroups/\n\n# Personal notes and scratch files\n*.local.md\n.scratch/\n'''\n with open(gitignore_path, 'w') as f:\n f.write(gitignore_content)\n\n# Note: The actual template files (knowzcode_loop.md, etc.) should be copied\n# from the plugin template directory or created by the /kc:init command.\n# This skill creates the structure; the command copies the content.\n\noutputs['success'] = True\noutputs['target_dir'] = str(target_dir)\noutputs['directories_created'] = ['specs', 'workgroups', 'prompts', 'planning']\noutputs['gitignore_created'] = not gitignore_path.exists()\noutputs['message'] = f'KnowzCode directory structure created at {target_dir}/'"
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "load-core-context",
|
|
3
|
-
"version": "0.3.
|
|
4
|
-
"description": "Loads the KnowzCode project overview, architecture, tracker, log header, and automation manifest for downstream steps.",
|
|
5
|
-
"parameters": [],
|
|
6
|
-
"actions": [
|
|
7
|
-
{
|
|
8
|
-
"type": "read_file",
|
|
9
|
-
"paths": [
|
|
10
|
-
"knowzcode/knowzcode_project.md",
|
|
11
|
-
"knowzcode/knowzcode_architecture.md",
|
|
12
|
-
"knowzcode/knowzcode_tracker.md",
|
|
13
|
-
"knowzcode/knowzcode_log.md",
|
|
14
|
-
"knowzcode/automation_manifest.md"
|
|
15
|
-
]
|
|
16
|
-
}
|
|
17
|
-
]
|
|
18
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "load-core-context",
|
|
3
|
+
"version": "0.3.7",
|
|
4
|
+
"description": "Loads the KnowzCode project overview, architecture, tracker, log header, and automation manifest for downstream steps.",
|
|
5
|
+
"parameters": [],
|
|
6
|
+
"actions": [
|
|
7
|
+
{
|
|
8
|
+
"type": "read_file",
|
|
9
|
+
"paths": [
|
|
10
|
+
"knowzcode/knowzcode_project.md",
|
|
11
|
+
"knowzcode/knowzcode_architecture.md",
|
|
12
|
+
"knowzcode/knowzcode_tracker.md",
|
|
13
|
+
"knowzcode/knowzcode_log.md",
|
|
14
|
+
"knowzcode/automation_manifest.md"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
17
|
+
]
|
|
18
|
+
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "log-entry-builder",
|
|
3
|
-
"version": "0.3.
|
|
4
|
-
"description": "Appends structured entries to knowzcode/knowzcode_log.md with KnowzCode formatting.",
|
|
5
|
-
"parameters": [
|
|
6
|
-
{"name": "entry_type", "type": "string", "required": true},
|
|
7
|
-
{"name": "content", "type": "string", "required": true}
|
|
8
|
-
],
|
|
9
|
-
"actions": [
|
|
10
|
-
{
|
|
11
|
-
"type": "python",
|
|
12
|
-
"code": "from pathlib import Path\nentry_type = inputs['entry_type']\ncontent = inputs['content'].strip()\npath = Path('knowzcode/knowzcode_log.md')\ntext = path.read_text()\nmarker = '---\n**[NEWEST ENTRIES APPEAR HERE - DO NOT REMOVE THIS MARKER]**'\nidx = text.index(marker) + len(marker)\nnew_entry = f"\n---\n**Type:** {entry_type}\n{content}\n"\nupdated = text[:idx] + new_entry + text[idx:]\npath.write_text(updated)"
|
|
13
|
-
}
|
|
14
|
-
]
|
|
15
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "log-entry-builder",
|
|
3
|
+
"version": "0.3.7",
|
|
4
|
+
"description": "Appends structured entries to knowzcode/knowzcode_log.md with KnowzCode formatting.",
|
|
5
|
+
"parameters": [
|
|
6
|
+
{"name": "entry_type", "type": "string", "required": true},
|
|
7
|
+
{"name": "content", "type": "string", "required": true}
|
|
8
|
+
],
|
|
9
|
+
"actions": [
|
|
10
|
+
{
|
|
11
|
+
"type": "python",
|
|
12
|
+
"code": "from pathlib import Path\nentry_type = inputs['entry_type']\ncontent = inputs['content'].strip()\npath = Path('knowzcode/knowzcode_log.md')\ntext = path.read_text()\nmarker = '---\n**[NEWEST ENTRIES APPEAR HERE - DO NOT REMOVE THIS MARKER]**'\nidx = text.index(marker) + len(marker)\nnew_entry = f"\n---\n**Type:** {entry_type}\n{content}\n"\nupdated = text[:idx] + new_entry + text[idx:]\npath.write_text(updated)"
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
}
|