kushi-agents 3.4.1
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/.github/config/m365-auth.json.example +56 -0
- package/.github/config/m365-mutable.json.example +11 -0
- package/LICENSE +201 -0
- package/README.md +159 -0
- package/bin/cli.mjs +75 -0
- package/package.json +35 -0
- package/plugin/agents/kushi.agent.md +147 -0
- package/plugin/instructions/answer-from-evidence.instructions.md +73 -0
- package/plugin/instructions/auth-and-retry.instructions.md +116 -0
- package/plugin/instructions/az-auth-conditional.instructions.md +39 -0
- package/plugin/instructions/azure-auth-patterns.instructions.md +226 -0
- package/plugin/instructions/citation-ledger.instructions.md +52 -0
- package/plugin/instructions/engagement-root-resolution.instructions.md +82 -0
- package/plugin/instructions/evidence-thoroughness.instructions.md +62 -0
- package/plugin/instructions/side-by-side-config.instructions.md +56 -0
- package/plugin/instructions/snapshot-vs-stream.instructions.md +87 -0
- package/plugin/instructions/thoroughness-detector.instructions.md +105 -0
- package/plugin/instructions/workiq-first.instructions.md +47 -0
- package/plugin/plugin.json +96 -0
- package/plugin/prompts/aggregate.prompt.md +24 -0
- package/plugin/prompts/ask.prompt.md +16 -0
- package/plugin/prompts/bootstrap.prompt.md +23 -0
- package/plugin/prompts/consolidate.prompt.md +21 -0
- package/plugin/prompts/fde-intake.prompt.md +41 -0
- package/plugin/prompts/fde-report.prompt.md +46 -0
- package/plugin/prompts/fde-triage.prompt.md +46 -0
- package/plugin/prompts/refresh.prompt.md +17 -0
- package/plugin/prompts/state.prompt.md +17 -0
- package/plugin/prompts/status.prompt.md +17 -0
- package/plugin/reference-packs/README.md +74 -0
- package/plugin/reference-packs/fde/README.md +62 -0
- package/plugin/reference-packs/fde/core-fde-reference.md +427 -0
- package/plugin/reference-packs/fde/intake-questions.md +168 -0
- package/plugin/reference-packs/fde/report-doctrine.md +189 -0
- package/plugin/skills/aggregate-project/SKILL.md +72 -0
- package/plugin/skills/ask-project/SKILL.md +162 -0
- package/plugin/skills/bootstrap-project/SKILL.md +129 -0
- package/plugin/skills/build-state/SKILL.md +69 -0
- package/plugin/skills/consolidate-evidence/SKILL.md +47 -0
- package/plugin/skills/fde-intake/SKILL.md +147 -0
- package/plugin/skills/fde-report/SKILL.md +159 -0
- package/plugin/skills/fde-triage/SKILL.md +114 -0
- package/plugin/skills/intro/SKILL.md +449 -0
- package/plugin/skills/project-status/SKILL.md +61 -0
- package/plugin/skills/pull-ado/SKILL.md +77 -0
- package/plugin/skills/pull-crm/SKILL.md +75 -0
- package/plugin/skills/pull-email/SKILL.md +75 -0
- package/plugin/skills/pull-meetings/SKILL.md +77 -0
- package/plugin/skills/pull-onenote/SKILL.md +82 -0
- package/plugin/skills/pull-sharepoint/SKILL.md +85 -0
- package/plugin/skills/pull-teams/SKILL.md +75 -0
- package/plugin/skills/refresh-project/SKILL.md +89 -0
- package/plugin/skills/self-check/SKILL.md +166 -0
- package/plugin/skills/self-check/run.ps1 +517 -0
- package/plugin/skills/self-check/run.sh +33 -0
- package/plugin/templates/fde/intake.md +114 -0
- package/plugin/templates/fde/report-fitness.md +151 -0
- package/plugin/templates/fde/report-long.md +109 -0
- package/plugin/templates/fde/report-short.md +45 -0
- package/plugin/templates/fde/report-stage-readiness.md +70 -0
- package/plugin/templates/fde/report-weekly.md +73 -0
- package/plugin/templates/fde/triage-00-fde-analysis.md +78 -0
- package/plugin/templates/fde/triage-02-risk-analysis.md +76 -0
- package/plugin/templates/fde/triage-03-6Q.md +40 -0
- package/plugin/templates/fde/triage-04-readiness-checklist.md +82 -0
- package/plugin/templates/fde/triage-05-executive-consolidated.md +78 -0
- package/plugin/templates/fde/triage-06-global-opportunity.md +70 -0
- package/plugin/templates/fde/triage-07-validation-warnings.md +60 -0
- package/plugin/templates/init/ado-config.template.yml +21 -0
- package/plugin/templates/init/crm-config.template.yml +16 -0
- package/plugin/templates/init/kushi-projects.template.json +14 -0
- package/plugin/templates/init/m365-auth.template.json +67 -0
- package/plugin/templates/init/m365-mutable.template.json +19 -0
- package/plugin/templates/init/project-contributors.template.yml +27 -0
- package/plugin/templates/init/project-evidence.template.yml +32 -0
- package/plugin/templates/init/project-integrations.template.yml +34 -0
- package/plugin/templates/init/project-user-settings.template.yml +71 -0
- package/plugin/templates/paste-prompt.md +35 -0
- package/plugin/templates/snapshot/ado-item.template.md +45 -0
- package/plugin/templates/snapshot/crm-record.template.md +34 -0
- package/plugin/templates/snapshot/meetings-series-index.template.md +32 -0
- package/plugin/templates/snapshot/onenote-page.template.md +28 -0
- package/plugin/templates/snapshot/sharepoint-file.template.md +31 -0
- package/plugin/templates/snapshot/sharepoint-tree.template.md +39 -0
- package/plugin/templates/snapshot/teams-roster.template.md +27 -0
- package/plugin/templates/state/00_overview.template.md +44 -0
- package/plugin/templates/state/01_decisions.template.md +41 -0
- package/plugin/templates/state/02_stakeholders.template.md +48 -0
- package/plugin/templates/state/03_architecture-and-solution.template.md +56 -0
- package/plugin/templates/state/04_workshops-and-key-meetings.template.md +43 -0
- package/plugin/templates/state/05_action-items.template.md +29 -0
- package/plugin/templates/state/06_risks-and-issues.template.md +43 -0
- package/plugin/templates/state/07_timeline-and-milestones.template.md +45 -0
- package/plugin/templates/state/08_artifacts-and-deliverables.template.md +55 -0
- package/plugin/templates/state/09_open-questions.template.md +62 -0
- package/plugin/templates/state/README.md +41 -0
- package/plugin/templates/weekly/ado-stream.template.md +71 -0
- package/plugin/templates/weekly/consolidated.template.md +98 -0
- package/plugin/templates/weekly/crm-stream.template.md +74 -0
- package/plugin/templates/weekly/email-stream.template.md +103 -0
- package/plugin/templates/weekly/meetings-stream.template.md +182 -0
- package/plugin/templates/weekly/onenote-stream.template.md +106 -0
- package/plugin/templates/weekly/run-log.template.md +88 -0
- package/plugin/templates/weekly/sharepoint-stream.template.md +121 -0
- package/plugin/templates/weekly/teams-stream.template.md +121 -0
- package/src/constants.mjs +49 -0
- package/src/copy-assets.mjs +183 -0
- package/src/main.mjs +262 -0
- package/src/profile-resolver.mjs +168 -0
- package/src/prompt.mjs +42 -0
- package/src/settings.mjs +77 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# {{PROJECT_NAME}} — Weekly OneNote Summary
|
|
2
|
+
|
|
3
|
+
**Week:** {{WEEK_START_DATE}} (Mon) – {{WEEK_END_DATE}} (Sun)
|
|
4
|
+
**Project:** {{PROJECT_NAME}}
|
|
5
|
+
**Notebook:** {{NOTEBOOK_NAME}}
|
|
6
|
+
**Prepared:** {{PREPARED_DATE}}
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Executive Summary
|
|
11
|
+
|
|
12
|
+
_2–4 sentence overview of what was captured in OneNote this week for this project: notes taken, decisions logged, ideas, follow-ups._
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Pages Created or Updated
|
|
17
|
+
|
|
18
|
+
| Date | Section | Page Title | Type (New/Edit) | Summary |
|
|
19
|
+
|------|---------|------------|-----------------|---------|
|
|
20
|
+
| | | | | |
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Key Decisions Captured
|
|
25
|
+
|
|
26
|
+
- **{{DECISION_TITLE}}** — _Logged on {{DATE}} in {{SECTION}} > {{PAGE_TITLE}}._
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Action Items / TODOs
|
|
31
|
+
|
|
32
|
+
| # | Action | Owner | Due | Status | Source Page |
|
|
33
|
+
|---|--------|-------|-----|--------|-------------|
|
|
34
|
+
| 1 | | | | | |
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Open Questions / Parking Lot
|
|
39
|
+
|
|
40
|
+
- **{{QUESTION}}** — Captured {{DATE}} in {{PAGE_TITLE}}.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Meeting Notes
|
|
45
|
+
|
|
46
|
+
### {{MEETING_TITLE}} — {{DATE}}
|
|
47
|
+
- **Section / Page:** {{SECTION}} > {{PAGE_TITLE}}
|
|
48
|
+
- **Attendees:** {{PEOPLE}}
|
|
49
|
+
- **Key points:** _bullet summary._
|
|
50
|
+
- **Decisions:** _…_
|
|
51
|
+
- **Action items:** _…_
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Ideas & Drafts
|
|
56
|
+
|
|
57
|
+
- **{{IDEA_TITLE}}** ({{DATE}}, {{PAGE_TITLE}}) — _short summary._
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Daily Breakdown
|
|
62
|
+
|
|
63
|
+
### Monday — {{DATE}}
|
|
64
|
+
- **{{Section}} > {{Page}}** — _one-line summary of what was added._
|
|
65
|
+
|
|
66
|
+
### Tuesday — {{DATE}}
|
|
67
|
+
- **{{Section}} > {{Page}}** — _…_
|
|
68
|
+
|
|
69
|
+
### Wednesday — {{DATE}}
|
|
70
|
+
- **{{Section}} > {{Page}}** — _…_
|
|
71
|
+
|
|
72
|
+
### Thursday — {{DATE}}
|
|
73
|
+
- **{{Section}} > {{Page}}** — _…_
|
|
74
|
+
|
|
75
|
+
### Friday — {{DATE}}
|
|
76
|
+
- **{{Section}} > {{Page}}** — _…_
|
|
77
|
+
|
|
78
|
+
### Saturday — {{DATE}}
|
|
79
|
+
- _No notes._ / _…_
|
|
80
|
+
|
|
81
|
+
### Sunday — {{DATE}}
|
|
82
|
+
- _No notes._ / _…_
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Links, Attachments & References
|
|
87
|
+
|
|
88
|
+
- [{{LINK_OR_FILE}}]({{URL}}) — referenced in {{PAGE_TITLE}} on {{DATE}}.
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Carry-Over to Next Week
|
|
93
|
+
|
|
94
|
+
- _Unfinished notes, drafts to flesh out, follow-ups to schedule._
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
_Generated from OneNote notebook **{{NOTEBOOK_NAME}}**, pages matching project **{{PROJECT_NAME}}**, modified between {{WEEK_START_DATE}} and {{WEEK_END_DATE}}._
|
|
99
|
+
|
|
100
|
+
## Validation
|
|
101
|
+
|
|
102
|
+
> Thoroughness detector checklist — per `thoroughness-detector.instructions.md`. The skill ticks what it can verify automatically; `self-check` C12 scans these blocks.
|
|
103
|
+
|
|
104
|
+
- [ ] bodies-present
|
|
105
|
+
- [ ] no-link-only-stubs
|
|
106
|
+
- [ ] coverage-notes-explain-any-gaps
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# {{PROJECT_NAME}} — Weekly Summaries Run Log
|
|
2
|
+
|
|
3
|
+
**Project:** {{PROJECT_NAME}}
|
|
4
|
+
**Project folder:** {{PROJECT_FOLDER_PATH}}
|
|
5
|
+
**Evidence root:** {{PROJECT_FOLDER_PATH}}\Evidence
|
|
6
|
+
**Created:** {{CREATED_DATE}}
|
|
7
|
+
**Last updated:** {{LAST_UPDATED_DATETIME}}
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Folder Structure (multi-user)
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
{{PROJECT_FOLDER_PATH}}\
|
|
15
|
+
└── Evidence\
|
|
16
|
+
├── run-log.md ← this file (shared, append-only)
|
|
17
|
+
├── contributors.yml ← who contributes, which sources they own
|
|
18
|
+
├── _Consolidated\ ← merged team view per week
|
|
19
|
+
│ └── YYYY-MM-DD_consolidated.md
|
|
20
|
+
└── <alias>\ ← one folder per contributor (e.g. ushak\)
|
|
21
|
+
├── Email\
|
|
22
|
+
│ └── YYYY-MM-DD_email-summary.md (one per week, dated by Monday)
|
|
23
|
+
├── Teams-Chats\
|
|
24
|
+
│ └── YYYY-MM-DD_teams-summary.md
|
|
25
|
+
├── OneNote\
|
|
26
|
+
│ └── YYYY-MM-DD_onenote-summary.md
|
|
27
|
+
├── SharePoint\
|
|
28
|
+
│ └── YYYY-MM-DD_sharepoint-summary.md
|
|
29
|
+
└── Meetings\
|
|
30
|
+
└── YYYY-MM-DD_meetings-summary.md
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**Rules**
|
|
34
|
+
- Each contributor only writes to their own `<alias>\` subfolder (no SharePoint co-authoring conflicts).
|
|
35
|
+
- SharePoint folder content is shared; SharePoint summaries can be produced by any contributor.
|
|
36
|
+
- Consolidation is a separate, opt-in merge step performed by the owner listed in `contributors.yml`.
|
|
37
|
+
- Privacy: never run another person's mailbox/chat/OneNote against your tokens. The consolidator merges from each contributor's *summary*, not their raw data.
|
|
38
|
+
|
|
39
|
+
File-naming convention: each summary is named with the **Monday** of the covered week (ISO `YYYY-MM-DD`), e.g. `2026-05-04_email-summary.md` covers Mon 2026-05-04 → Sun 2026-05-10.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Run Status by (Week × Contributor)
|
|
44
|
+
|
|
45
|
+
Legend: ✅ done · ⏳ in progress · ⬜ not run · ⚠️ partial / errors · ➖ skipped (no data) · — N/A
|
|
46
|
+
|
|
47
|
+
| Week (Mon → Sun) | Contributor | Email | Teams Chats | OneNote | SharePoint | Meetings | Run on | Notes |
|
|
48
|
+
|------------------|-------------|-------|-------------|---------|------------|----------|--------|-------|
|
|
49
|
+
| {{YYYY-MM-DD}} → {{YYYY-MM-DD}} | {{alias}} | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | | |
|
|
50
|
+
| {{YYYY-MM-DD}} → {{YYYY-MM-DD}} | _consolidated_ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | | Awaiting ≥2 contributors. |
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Run History (most recent first)
|
|
55
|
+
|
|
56
|
+
### {{RUN_DATETIME}} — Week of {{WEEK_START}}
|
|
57
|
+
- **Triggered by:** {{user request / scheduled}}
|
|
58
|
+
- **Sources run:** {{Email, Teams, OneNote, SharePoint, Meetings}}
|
|
59
|
+
- **Result:**
|
|
60
|
+
- Email → ✅ `Email\{{file}}.md` ({{N}} emails)
|
|
61
|
+
- Teams Chats → ✅ `Teams-Chats\{{file}}.md` ({{N}} messages across {{M}} chats)
|
|
62
|
+
- OneNote → ➖ no pages updated this week
|
|
63
|
+
- SharePoint → ✅ `SharePoint\{{file}}.md` ({{N}} files touched)
|
|
64
|
+
- Meetings → ⚠️ recap generated, transcript missing for {{meeting}}
|
|
65
|
+
- **Notes / follow-ups:** _…_
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Known Gaps / To-Do
|
|
70
|
+
|
|
71
|
+
- _Weeks or sources still pending, e.g._ "Week of 2026-04-20 — Meetings transcripts not yet available, retry after {{date}}."
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Configuration Snapshot
|
|
76
|
+
|
|
77
|
+
| Setting | Value |
|
|
78
|
+
|---------|-------|
|
|
79
|
+
| Project name | {{PROJECT_NAME}} |
|
|
80
|
+
| SharePoint root | {{SHAREPOINT_ROOT}} |
|
|
81
|
+
| Matched project subfolder | {{MATCHED_SUBFOLDER}} (fuzzy score: {{SCORE}}) |
|
|
82
|
+
| OneNote notebook | {{NOTEBOOK_NAME}} |
|
|
83
|
+
| Week definition | Monday → Sunday |
|
|
84
|
+
| Templates source | `<kushi-install>/templates/` |
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
_This file is auto-maintained and lives at `{{PROJECT_FOLDER_PATH}}\Evidence\run-log.md`. Before each run, check the **Run Status by Week** table; skip any (week × source) cell already marked ✅ unless a re-run is explicitly requested. After each run, update the table, append a Run History entry, and bump **Last updated**._
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# {{PROJECT_NAME}} — Weekly SharePoint Folder Summary
|
|
2
|
+
|
|
3
|
+
**Week:** {{WEEK_START_DATE}} (Mon) – {{WEEK_END_DATE}} (Sun)
|
|
4
|
+
**Project:** {{PROJECT_NAME}}
|
|
5
|
+
**Root folder:** {{ROOT_FOLDER_PATH}}
|
|
6
|
+
**Matched project subfolder:** {{MATCHED_SUBFOLDER}} _(fuzzy match score: {{MATCH_SCORE}})_
|
|
7
|
+
**Prepared:** {{PREPARED_DATE}}
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Executive Summary
|
|
12
|
+
|
|
13
|
+
_2–4 sentence overview of activity in the project SharePoint folder this week: new docs, major edits, who was working on what._
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Files Added This Week
|
|
18
|
+
|
|
19
|
+
| Date | File | Type | Author | Path | Summary |
|
|
20
|
+
|------|------|------|--------|------|---------|
|
|
21
|
+
| | | | | | |
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Files Modified This Week
|
|
26
|
+
|
|
27
|
+
| Date | File | Modified By | Change Summary | Path |
|
|
28
|
+
|------|------|-------------|----------------|------|
|
|
29
|
+
| | | | | |
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Files Renamed / Moved / Deleted
|
|
34
|
+
|
|
35
|
+
- **{{FILE}}** — {{action}} by {{PERSON}} on {{DATE}}.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Notable Documents
|
|
40
|
+
|
|
41
|
+
### {{DOC_TITLE}}
|
|
42
|
+
- **Path:** {{RELATIVE_PATH}}
|
|
43
|
+
- **Type:** {{Word/PPT/Excel/PDF/…}}
|
|
44
|
+
- **Author / Last editor:** {{PERSON}}
|
|
45
|
+
- **Summary:** _what the doc contains and why it matters this week._
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Decisions / Sign-offs Captured in Documents
|
|
50
|
+
|
|
51
|
+
- **{{DECISION}}** — found in {{DOC_TITLE}} ({{DATE}}).
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Action Items Surfaced from Documents
|
|
56
|
+
|
|
57
|
+
| # | Action | Owner | Due | Source Doc |
|
|
58
|
+
|---|--------|-------|-----|------------|
|
|
59
|
+
| 1 | | | | |
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Daily Breakdown
|
|
64
|
+
|
|
65
|
+
### Monday — {{DATE}}
|
|
66
|
+
- **{{File}}** — {{added/modified}} by {{PERSON}}: _one-line summary._
|
|
67
|
+
|
|
68
|
+
### Tuesday — {{DATE}}
|
|
69
|
+
- _…_
|
|
70
|
+
|
|
71
|
+
### Wednesday — {{DATE}}
|
|
72
|
+
- _…_
|
|
73
|
+
|
|
74
|
+
### Thursday — {{DATE}}
|
|
75
|
+
- _…_
|
|
76
|
+
|
|
77
|
+
### Friday — {{DATE}}
|
|
78
|
+
- _…_
|
|
79
|
+
|
|
80
|
+
### Saturday — {{DATE}}
|
|
81
|
+
- _No file activity._ / _…_
|
|
82
|
+
|
|
83
|
+
### Sunday — {{DATE}}
|
|
84
|
+
- _No file activity._ / _…_
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Contributors This Week
|
|
89
|
+
|
|
90
|
+
| Person | # Files Touched | Notes |
|
|
91
|
+
|--------|-----------------|-------|
|
|
92
|
+
| | | |
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Folder Structure Snapshot
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
{{MATCHED_SUBFOLDER}}/
|
|
100
|
+
├── {{subfolder or file}}
|
|
101
|
+
├── {{subfolder or file}}
|
|
102
|
+
└── ...
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Carry-Over to Next Week
|
|
108
|
+
|
|
109
|
+
- _Drafts in progress, docs awaiting review, missing artifacts._
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
_Generated from SharePoint root **{{ROOT_FOLDER_PATH}}**, fuzzy-matched to subfolder **{{MATCHED_SUBFOLDER}}** for project **{{PROJECT_NAME}}**, file activity between {{WEEK_START_DATE}} and {{WEEK_END_DATE}}._
|
|
114
|
+
|
|
115
|
+
## Validation
|
|
116
|
+
|
|
117
|
+
> Thoroughness detector checklist — per `thoroughness-detector.instructions.md`. The skill ticks what it can verify automatically; `self-check` C12 scans these blocks.
|
|
118
|
+
|
|
119
|
+
- [ ] bodies-present
|
|
120
|
+
- [ ] no-link-only-stubs
|
|
121
|
+
- [ ] coverage-notes-explain-any-gaps
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# {{PROJECT_NAME}} — Weekly Teams Summary
|
|
2
|
+
|
|
3
|
+
**Week:** {{WEEK_START_DATE}} (Mon) – {{WEEK_END_DATE}} (Sun)
|
|
4
|
+
**Project:** {{PROJECT_NAME}}
|
|
5
|
+
**Prepared:** {{PREPARED_DATE}}
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Executive Summary
|
|
10
|
+
|
|
11
|
+
_2–4 sentence overview of the week across all Teams conversations: key decisions, biggest risks, notable progress._
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Key Decisions
|
|
16
|
+
|
|
17
|
+
- **{{DECISION_TITLE}}** — _Decided by {{PERSON}} on {{DATE}} in {{CHAT_OR_CHANNEL}}._
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Action Items
|
|
22
|
+
|
|
23
|
+
| # | Action | Owner | Due | Status | Source (Chat/Channel + Date) |
|
|
24
|
+
|---|--------|-------|-----|--------|------------------------------|
|
|
25
|
+
| 1 | | | | | |
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Open Questions / Blockers
|
|
30
|
+
|
|
31
|
+
- **{{QUESTION}}** — Raised by {{PERSON}} ({{DATE}}) in {{CHAT_OR_CHANNEL}}. Awaiting: {{OWNER}}.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Risks & Escalations
|
|
36
|
+
|
|
37
|
+
- **{{RISK}}** — Severity: {{LOW/MED/HIGH}}. Owner: {{PERSON}}. Source: {{CHAT_OR_CHANNEL}}.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Conversations Covered
|
|
42
|
+
|
|
43
|
+
| Type | Name | Messages | Participants |
|
|
44
|
+
|------|------|----------|--------------|
|
|
45
|
+
| Channel | {{Team > Channel}} | | |
|
|
46
|
+
| Group chat | {{Topic / members}} | | |
|
|
47
|
+
| 1:1 | {{Person}} | | |
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Daily Breakdown
|
|
52
|
+
|
|
53
|
+
### Monday — {{DATE}}
|
|
54
|
+
- **{{Chat/Channel}}** — {{Person}}: _one-line summary of what was discussed._
|
|
55
|
+
|
|
56
|
+
### Tuesday — {{DATE}}
|
|
57
|
+
- **{{Chat/Channel}}** — {{Person}}: _one-line summary._
|
|
58
|
+
|
|
59
|
+
### Wednesday — {{DATE}}
|
|
60
|
+
- **{{Chat/Channel}}** — {{Person}}: _one-line summary._
|
|
61
|
+
|
|
62
|
+
### Thursday — {{DATE}}
|
|
63
|
+
- **{{Chat/Channel}}** — {{Person}}: _one-line summary._
|
|
64
|
+
|
|
65
|
+
### Friday — {{DATE}}
|
|
66
|
+
- **{{Chat/Channel}}** — {{Person}}: _one-line summary._
|
|
67
|
+
|
|
68
|
+
### Saturday — {{DATE}}
|
|
69
|
+
- _No project chatter._ / _{{Chat/Channel}} — …_
|
|
70
|
+
|
|
71
|
+
### Sunday — {{DATE}}
|
|
72
|
+
- _No project chatter._ / _{{Chat/Channel}} — …_
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Threads of Note
|
|
77
|
+
|
|
78
|
+
### {{THREAD_TITLE / Channel post}}
|
|
79
|
+
- **Where:** {{Team > Channel}} or {{Chat name}}
|
|
80
|
+
- **Participants:** {{PEOPLE}}
|
|
81
|
+
- **Messages:** {{N}}
|
|
82
|
+
- **Outcome:** _summary of where the thread landed._
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## People Active This Week
|
|
87
|
+
|
|
88
|
+
| Person | Role | # Messages | Notes |
|
|
89
|
+
|--------|------|------------|-------|
|
|
90
|
+
| | | | |
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Files & Links Shared
|
|
95
|
+
|
|
96
|
+
- [{{FILE_OR_LINK_NAME}}]({{URL}}) — shared by {{PERSON}} in {{CHAT_OR_CHANNEL}} on {{DATE}}.
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Meetings Referenced in Chat
|
|
101
|
+
|
|
102
|
+
- **{{MEETING_TITLE}}** ({{DATE}}) — referenced in {{CHAT_OR_CHANNEL}}. Notes/recap link: {{URL}}.
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Carry-Over to Next Week
|
|
107
|
+
|
|
108
|
+
- _Open threads, pending replies, follow-ups needed._
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
_Generated from Teams chats and channel messages matching project: **{{PROJECT_NAME}}** between {{WEEK_START_DATE}} and {{WEEK_END_DATE}}._
|
|
113
|
+
|
|
114
|
+
## Validation
|
|
115
|
+
|
|
116
|
+
> Thoroughness detector checklist — per `thoroughness-detector.instructions.md`. The skill ticks what it can verify automatically; `self-check` C12 scans these blocks.
|
|
117
|
+
|
|
118
|
+
- [ ] bodies-present (full message-by-message reproduction; collapse only routine acks)
|
|
119
|
+
- [ ] participants-captured
|
|
120
|
+
- [ ] no-link-only-stubs (no `see Teams thread` without inline messages)
|
|
121
|
+
- [ ] coverage-notes-explain-any-gaps
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/** Default destination path relative to the user's project root (vscode target). */
|
|
2
|
+
export const DEFAULT_DEST = '.kushi';
|
|
3
|
+
|
|
4
|
+
/** Default destination for the `clawpilot` install target (absolute). */
|
|
5
|
+
export const CLAWPILOT_DEST_SUBPATH = '.copilot/m-skills/kushi';
|
|
6
|
+
|
|
7
|
+
/** Install target identifiers. */
|
|
8
|
+
export const TARGET_VSCODE = 'vscode';
|
|
9
|
+
export const TARGET_CLAWPILOT = 'clawpilot';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* In Clawpilot mode, the orchestrator agent file is duplicated as the
|
|
13
|
+
* top-level SKILL.md so Clawpilot's skill discovery (which expects
|
|
14
|
+
* `~/.copilot/m-skills/<name>/SKILL.md`) finds it.
|
|
15
|
+
*/
|
|
16
|
+
export const CLAWPILOT_AGENT_SOURCE = 'agents/kushi.agent.md';
|
|
17
|
+
export const CLAWPILOT_SKILL_DEST = 'SKILL.md';
|
|
18
|
+
|
|
19
|
+
/** Source directory inside the npm package that holds distributable assets. */
|
|
20
|
+
export const PLUGIN_SOURCE_DIR = 'plugin';
|
|
21
|
+
|
|
22
|
+
/** Asset subdirectories under plugin/ that get copied. */
|
|
23
|
+
export const ASSET_DIRS = ['agents', 'instructions', 'prompts', 'skills', 'templates', 'reference-packs'];
|
|
24
|
+
|
|
25
|
+
/** Files to exclude from consumer installs (relative to plugin/). */
|
|
26
|
+
export const EXCLUDED_FILES = [];
|
|
27
|
+
|
|
28
|
+
/** Directories to exclude from consumer installs (relative to plugin/). */
|
|
29
|
+
export const EXCLUDED_DIRS = [];
|
|
30
|
+
|
|
31
|
+
/** Files copied to the TARGET project's .github/ directory. */
|
|
32
|
+
export const PROJECT_GITHUB_FILES = [];
|
|
33
|
+
|
|
34
|
+
/** Directories copied to the TARGET project's .github/ directory. */
|
|
35
|
+
export const PROJECT_GITHUB_DIRS = ['config'];
|
|
36
|
+
|
|
37
|
+
/** Project-level .github files that must never be copied into consumer projects. */
|
|
38
|
+
export const PROJECT_GITHUB_EXCLUDED_FILES = [
|
|
39
|
+
'config/m365-auth.json',
|
|
40
|
+
'config/m365-mutable.json'
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
/** VS Code settings keys → the .kushi subdirectory they point at. */
|
|
44
|
+
export const SETTINGS_MAP = {
|
|
45
|
+
'chat.agentFilesLocations': 'agents',
|
|
46
|
+
'chat.promptFilesLocations': 'prompts',
|
|
47
|
+
'chat.instructionsFilesLocations': 'instructions',
|
|
48
|
+
'chat.agentSkillsLocations': 'skills'
|
|
49
|
+
};
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import {
|
|
4
|
+
ASSET_DIRS,
|
|
5
|
+
EXCLUDED_FILES,
|
|
6
|
+
EXCLUDED_DIRS,
|
|
7
|
+
PLUGIN_SOURCE_DIR,
|
|
8
|
+
PROJECT_GITHUB_FILES,
|
|
9
|
+
PROJECT_GITHUB_DIRS,
|
|
10
|
+
PROJECT_GITHUB_EXCLUDED_FILES,
|
|
11
|
+
} from './constants.mjs';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Recursively copy the four asset directories from the npm package
|
|
15
|
+
* into the absolute destination root, skipping files listed in EXCLUDED_FILES
|
|
16
|
+
* and (if an include filter is supplied) anything the profile doesn't want.
|
|
17
|
+
*
|
|
18
|
+
* @param {string} sourcePkgDir – root of the npm package (resolved via import.meta.url)
|
|
19
|
+
* @param {string} destAbsolute – absolute destination directory
|
|
20
|
+
* @param {(assetDir: string, relPath: string) => boolean} [includeFilter] – returns true to include a file/dir
|
|
21
|
+
* @returns {{ copied: number, details: Array<{ dir: string, count: number }> }}
|
|
22
|
+
*/
|
|
23
|
+
export function copyAssets(sourcePkgDir, destAbsolute, includeFilter) {
|
|
24
|
+
const destRoot = destAbsolute;
|
|
25
|
+
const srcGitHub = path.join(sourcePkgDir, PLUGIN_SOURCE_DIR);
|
|
26
|
+
|
|
27
|
+
let copied = 0;
|
|
28
|
+
const details = [];
|
|
29
|
+
|
|
30
|
+
for (const dir of ASSET_DIRS) {
|
|
31
|
+
const src = path.join(srcGitHub, dir);
|
|
32
|
+
const dest = path.join(destRoot, dir);
|
|
33
|
+
|
|
34
|
+
if (!fs.existsSync(src)) {
|
|
35
|
+
details.push({ dir, count: 0 });
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
copyDirFiltered(src, dest, dir, '', includeFilter);
|
|
40
|
+
|
|
41
|
+
const count = fs.existsSync(dest) ? countFiles(dest) : 0;
|
|
42
|
+
copied += count;
|
|
43
|
+
details.push({ dir, count });
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return { copied, details };
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Recursively copy a directory, skipping files that match EXCLUDED_FILES.
|
|
51
|
+
* @param {string} src – source directory
|
|
52
|
+
* @param {string} dest – destination directory
|
|
53
|
+
* @param {string} assetDir – the top-level asset dir name (e.g. 'agents')
|
|
54
|
+
* @param {string} [relPrefix=''] – relative path prefix within the asset dir
|
|
55
|
+
* @param {(assetDir: string, relPath: string) => boolean} [includeFilter]
|
|
56
|
+
*/
|
|
57
|
+
function copyDirFiltered(src, dest, assetDir, relPrefix = '', includeFilter) {
|
|
58
|
+
let dirCreated = false;
|
|
59
|
+
const ensureDir = () => {
|
|
60
|
+
if (!dirCreated) {
|
|
61
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
62
|
+
dirCreated = true;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
|
|
67
|
+
const srcPath = path.join(src, entry.name);
|
|
68
|
+
const destPath = path.join(dest, entry.name);
|
|
69
|
+
const relPath = relPrefix ? `${relPrefix}/${entry.name}` : entry.name;
|
|
70
|
+
const excludeKey = `${assetDir}/${relPath}`;
|
|
71
|
+
|
|
72
|
+
if (entry.isDirectory()) {
|
|
73
|
+
if (EXCLUDED_DIRS.includes(excludeKey)) continue;
|
|
74
|
+
if (includeFilter && !includeFilter(assetDir, relPath)) continue;
|
|
75
|
+
copyDirFiltered(srcPath, destPath, assetDir, relPath, includeFilter);
|
|
76
|
+
} else {
|
|
77
|
+
if (EXCLUDED_FILES.includes(excludeKey)) continue;
|
|
78
|
+
if (includeFilter && !includeFilter(assetDir, relPath)) continue;
|
|
79
|
+
ensureDir();
|
|
80
|
+
try {
|
|
81
|
+
fs.cpSync(srcPath, destPath, { force: true });
|
|
82
|
+
} catch (err) {
|
|
83
|
+
if (err.code === 'EACCES') {
|
|
84
|
+
console.error(`\n ✘ Permission denied writing to ${destPath}\n`);
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
throw err;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Recursively copy a project-level .github directory while excluding sensitive local-only files.
|
|
95
|
+
* @param {string} src
|
|
96
|
+
* @param {string} dest
|
|
97
|
+
* @param {string} projectDir
|
|
98
|
+
* @param {string} [relPrefix='']
|
|
99
|
+
*/
|
|
100
|
+
function copyProjectDirFiltered(src, dest, projectDir, relPrefix = '') {
|
|
101
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
102
|
+
|
|
103
|
+
for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
|
|
104
|
+
const srcPath = path.join(src, entry.name);
|
|
105
|
+
const destPath = path.join(dest, entry.name);
|
|
106
|
+
const relPath = relPrefix ? `${relPrefix}/${entry.name}` : entry.name;
|
|
107
|
+
const excludeKey = `${projectDir}/${relPath}`;
|
|
108
|
+
|
|
109
|
+
if (entry.isDirectory()) {
|
|
110
|
+
copyProjectDirFiltered(srcPath, destPath, projectDir, relPrefix ? `${relPrefix}/${entry.name}` : entry.name);
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (PROJECT_GITHUB_EXCLUDED_FILES.includes(excludeKey)) continue;
|
|
115
|
+
|
|
116
|
+
fs.cpSync(srcPath, destPath, { force: true });
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Count files recursively in a directory.
|
|
122
|
+
* @param {string} dir
|
|
123
|
+
* @returns {number}
|
|
124
|
+
*/
|
|
125
|
+
function countFiles(dir) {
|
|
126
|
+
let count = 0;
|
|
127
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
128
|
+
if (entry.isDirectory()) {
|
|
129
|
+
count += countFiles(path.join(dir, entry.name));
|
|
130
|
+
} else {
|
|
131
|
+
count++;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return count;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Copy project-level files (hooks, copilot-instructions) to the target
|
|
139
|
+
* project's .github/ directory. Does not overwrite existing files.
|
|
140
|
+
*
|
|
141
|
+
* @param {string} sourcePkgDir – root of the npm package
|
|
142
|
+
* @returns {{ copied: string[], skipped: string[] }}
|
|
143
|
+
*/
|
|
144
|
+
export function copyProjectFiles(sourcePkgDir) {
|
|
145
|
+
const projectGitHub = path.join(process.cwd(), '.github');
|
|
146
|
+
const srcGitHub = path.join(sourcePkgDir, '.github');
|
|
147
|
+
|
|
148
|
+
const copied = [];
|
|
149
|
+
const skipped = [];
|
|
150
|
+
|
|
151
|
+
for (const file of PROJECT_GITHUB_FILES) {
|
|
152
|
+
const src = path.join(srcGitHub, file);
|
|
153
|
+
const dest = path.join(projectGitHub, file);
|
|
154
|
+
|
|
155
|
+
if (!fs.existsSync(src)) continue;
|
|
156
|
+
|
|
157
|
+
if (fs.existsSync(dest)) {
|
|
158
|
+
skipped.push(`.github/${file}`);
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
163
|
+
fs.cpSync(src, dest);
|
|
164
|
+
copied.push(`.github/${file}`);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
for (const dir of PROJECT_GITHUB_DIRS) {
|
|
168
|
+
const src = path.join(srcGitHub, dir);
|
|
169
|
+
const dest = path.join(projectGitHub, dir);
|
|
170
|
+
|
|
171
|
+
if (!fs.existsSync(src)) continue;
|
|
172
|
+
|
|
173
|
+
if (fs.existsSync(dest)) {
|
|
174
|
+
skipped.push(`.github/${dir}/`);
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
copyProjectDirFiltered(src, dest, dir);
|
|
179
|
+
copied.push(`.github/${dir}/`);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
return { copied, skipped };
|
|
183
|
+
}
|